MDescriptor 0.2.3__tar.gz → 0.2.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (423) hide show
  1. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/PKG-INFO +35 -3
  2. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/README.md +32 -2
  3. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/include/mdescriptor/descriptor.hpp +2 -2
  4. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/c00ps_mlff.cpp +17 -17
  5. mdescriptor-0.2.4/cpp/tests/CMakeLists.txt +19 -0
  6. mdescriptor-0.2.4/cpp/tests/test_public_api.cpp +106 -0
  7. mdescriptor-0.2.4/docs/numerical-baselines.md +49 -0
  8. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/pyproject.toml +35 -3
  9. mdescriptor-0.2.4/scripts/ace1_reference.jl +55 -0
  10. mdescriptor-0.2.4/scripts/check_numerical_baselines.py +293 -0
  11. mdescriptor-0.2.4/scripts/deepmd_reference.py +156 -0
  12. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/scripts/descriptor_reference.py +6 -2
  13. mdescriptor-0.2.4/scripts/external_reference.py +111 -0
  14. mdescriptor-0.2.4/scripts/generate_ace1_reference.py +225 -0
  15. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/scripts/generate_descriptor_goldens.py +22 -32
  16. mdescriptor-0.2.4/scripts/generate_external_c00ps_reference.py +327 -0
  17. mdescriptor-0.2.4/scripts/generate_external_static_goldens.py +793 -0
  18. mdescriptor-0.2.4/scripts/numerical_baselines.py +255 -0
  19. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/_version.py +3 -3
  20. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/_golden.py +24 -3
  21. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/contracts/test_capabilities.py +1 -0
  22. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/contracts/test_descriptor_info.py +1 -0
  23. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/contracts/test_public_api.py +2 -0
  24. mdescriptor-0.2.4/tests/data/mlip4_mtp6_carbon.json +1 -0
  25. mdescriptor-0.2.4/tests/external_reference/test_deepmd.py +119 -0
  26. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/external_reference/test_featomic.py +17 -3
  27. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/external_reference/test_nep_adapters.py +1 -1
  28. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/external_reference/test_pyxtalff.py +12 -3
  29. mdescriptor-0.2.4/tests/golden/ace/expected_output.npz +0 -0
  30. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/ace/manifest.json +29 -3
  31. mdescriptor-0.2.4/tests/golden/acsf/external_expected_output.npz +0 -0
  32. mdescriptor-0.2.4/tests/golden/acsf/external_input.npz +0 -0
  33. mdescriptor-0.2.4/tests/golden/acsf/external_manifest.json +179 -0
  34. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/acsf/manifest.json +14 -0
  35. mdescriptor-0.2.4/tests/golden/atomiccomposition/external_expected_output.npz +0 -0
  36. mdescriptor-0.2.4/tests/golden/atomiccomposition/external_input.npz +0 -0
  37. mdescriptor-0.2.4/tests/golden/atomiccomposition/external_manifest.json +83 -0
  38. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/atomiccomposition/manifest.json +14 -0
  39. mdescriptor-0.2.4/tests/golden/c00psmlff/expected_output.npz +0 -0
  40. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/c00psmlff/manifest.json +37 -7
  41. mdescriptor-0.2.4/tests/golden/coulombmatrix/external_expected_output.npz +0 -0
  42. mdescriptor-0.2.4/tests/golden/coulombmatrix/external_input.npz +0 -0
  43. mdescriptor-0.2.4/tests/golden/coulombmatrix/external_manifest.json +78 -0
  44. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/coulombmatrix/manifest.json +14 -0
  45. mdescriptor-0.2.4/tests/golden/dpa4/expected_output.npz +0 -0
  46. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/dpa4/manifest.json +21 -4
  47. mdescriptor-0.2.4/tests/golden/dpa4c/expected_output.npz +0 -0
  48. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/dpa4c/manifest.json +21 -4
  49. mdescriptor-0.2.4/tests/golden/ead/external_expected_output.npz +0 -0
  50. mdescriptor-0.2.4/tests/golden/ead/external_input.npz +0 -0
  51. mdescriptor-0.2.4/tests/golden/ead/external_manifest.json +88 -0
  52. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/ead/manifest.json +14 -0
  53. mdescriptor-0.2.4/tests/golden/ewaldsummatrix/external_expected_output.npz +0 -0
  54. mdescriptor-0.2.4/tests/golden/ewaldsummatrix/external_input.npz +0 -0
  55. mdescriptor-0.2.4/tests/golden/ewaldsummatrix/external_manifest.json +83 -0
  56. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/ewaldsummatrix/manifest.json +14 -0
  57. mdescriptor-0.2.4/tests/golden/lbispectrum/expected_output.npz +0 -0
  58. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/lbispectrum/manifest.json +27 -6
  59. mdescriptor-0.2.4/tests/golden/lmbtr/external_expected_output.npz +0 -0
  60. mdescriptor-0.2.4/tests/golden/lmbtr/external_input.npz +0 -0
  61. mdescriptor-0.2.4/tests/golden/lmbtr/external_manifest.json +155 -0
  62. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/lmbtr/manifest.json +14 -0
  63. mdescriptor-0.2.4/tests/golden/lodesphericalexpansion/external_expected_output.npz +0 -0
  64. mdescriptor-0.2.4/tests/golden/lodesphericalexpansion/external_input.npz +0 -0
  65. mdescriptor-0.2.4/tests/golden/lodesphericalexpansion/external_manifest.json +195 -0
  66. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/lodesphericalexpansion/manifest.json +14 -0
  67. mdescriptor-0.2.4/tests/golden/mbtr/external_expected_output.npz +0 -0
  68. mdescriptor-0.2.4/tests/golden/mbtr/external_input.npz +0 -0
  69. mdescriptor-0.2.4/tests/golden/mbtr/external_manifest.json +152 -0
  70. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/mbtr/manifest.json +14 -0
  71. mdescriptor-0.2.4/tests/golden/mtp/expected_output.npz +0 -0
  72. mdescriptor-0.2.4/tests/golden/mtp/manifest.json +146 -0
  73. mdescriptor-0.2.4/tests/golden/neighborlist/external_expected_output.npz +0 -0
  74. mdescriptor-0.2.4/tests/golden/neighborlist/external_input.npz +0 -0
  75. mdescriptor-0.2.4/tests/golden/neighborlist/external_manifest.json +77 -0
  76. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/neighborlist/manifest.json +14 -0
  77. mdescriptor-0.2.4/tests/golden/nep/external_expected_output.npz +0 -0
  78. mdescriptor-0.2.4/tests/golden/nep/external_input.npz +0 -0
  79. mdescriptor-0.2.4/tests/golden/nep/external_manifest.json +228 -0
  80. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/nep/manifest.json +14 -0
  81. mdescriptor-0.2.4/tests/golden/sinematrix/external_expected_output.npz +0 -0
  82. mdescriptor-0.2.4/tests/golden/sinematrix/external_input.npz +0 -0
  83. mdescriptor-0.2.4/tests/golden/sinematrix/external_manifest.json +78 -0
  84. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/sinematrix/manifest.json +14 -0
  85. mdescriptor-0.2.4/tests/golden/snap/external_expected_output.npz +0 -0
  86. mdescriptor-0.2.4/tests/golden/snap/external_input.npz +0 -0
  87. mdescriptor-0.2.4/tests/golden/snap/external_manifest.json +91 -0
  88. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/snap/manifest.json +14 -0
  89. mdescriptor-0.2.4/tests/golden/so3/external_expected_output.npz +0 -0
  90. mdescriptor-0.2.4/tests/golden/so3/external_input.npz +0 -0
  91. mdescriptor-0.2.4/tests/golden/so3/external_manifest.json +84 -0
  92. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/so3/manifest.json +14 -0
  93. mdescriptor-0.2.4/tests/golden/so4/external_expected_output.npz +0 -0
  94. mdescriptor-0.2.4/tests/golden/so4/external_input.npz +0 -0
  95. mdescriptor-0.2.4/tests/golden/so4/external_manifest.json +87 -0
  96. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/so4/manifest.json +14 -0
  97. mdescriptor-0.2.4/tests/golden/soap/external_expected_output.npz +0 -0
  98. mdescriptor-0.2.4/tests/golden/soap/external_input.npz +0 -0
  99. mdescriptor-0.2.4/tests/golden/soap/external_manifest.json +164 -0
  100. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/soap/manifest.json +14 -0
  101. mdescriptor-0.2.4/tests/golden/soappowerspectrum/external_expected_output.npz +0 -0
  102. mdescriptor-0.2.4/tests/golden/soappowerspectrum/external_input.npz +0 -0
  103. mdescriptor-0.2.4/tests/golden/soappowerspectrum/external_manifest.json +246 -0
  104. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/soappowerspectrum/manifest.json +14 -0
  105. mdescriptor-0.2.4/tests/golden/soapradialspectrum/external_expected_output.npz +0 -0
  106. mdescriptor-0.2.4/tests/golden/soapradialspectrum/external_input.npz +0 -0
  107. mdescriptor-0.2.4/tests/golden/soapradialspectrum/external_manifest.json +96 -0
  108. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/soapradialspectrum/manifest.json +14 -0
  109. mdescriptor-0.2.4/tests/golden/soapturbo/expected_output.npz +0 -0
  110. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/soapturbo/manifest.json +18 -6
  111. mdescriptor-0.2.4/tests/golden/sorteddistances/external_expected_output.npz +0 -0
  112. mdescriptor-0.2.4/tests/golden/sorteddistances/external_input.npz +0 -0
  113. mdescriptor-0.2.4/tests/golden/sorteddistances/external_manifest.json +91 -0
  114. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/sorteddistances/manifest.json +14 -0
  115. mdescriptor-0.2.4/tests/golden/sphericalexpansion/external_expected_output.npz +0 -0
  116. mdescriptor-0.2.4/tests/golden/sphericalexpansion/external_input.npz +0 -0
  117. mdescriptor-0.2.4/tests/golden/sphericalexpansion/external_manifest.json +192 -0
  118. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/sphericalexpansion/manifest.json +14 -0
  119. mdescriptor-0.2.4/tests/golden/sphericalexpansionbypair/external_expected_output.npz +0 -0
  120. mdescriptor-0.2.4/tests/golden/sphericalexpansionbypair/external_input.npz +0 -0
  121. mdescriptor-0.2.4/tests/golden/sphericalexpansionbypair/external_manifest.json +111 -0
  122. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/sphericalexpansionbypair/manifest.json +14 -0
  123. mdescriptor-0.2.4/tests/golden/valleoganov/external_expected_output.npz +0 -0
  124. mdescriptor-0.2.4/tests/golden/valleoganov/external_input.npz +0 -0
  125. mdescriptor-0.2.4/tests/golden/valleoganov/external_manifest.json +141 -0
  126. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/valleoganov/manifest.json +14 -0
  127. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_c00ps_mlff.py +6 -6
  128. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_coulombmatrix_openmp.py +3 -1
  129. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_descriptor_symmetry.py +2 -0
  130. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_dpa4_golden.py +4 -0
  131. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_dpa4c_golden.py +4 -0
  132. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_ewaldsummatrix_openmp.py +3 -1
  133. mdescriptor-0.2.4/tests/test_external_static_goldens.py +27 -0
  134. mdescriptor-0.2.4/tests/test_golden_independence.py +161 -0
  135. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_lmbtr_openmp.py +2 -1
  136. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_nep_golden.py +4 -0
  137. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_valleoganov_openmp.py +2 -1
  138. mdescriptor-0.2.3/tests/external_reference/test_deepmd.py +0 -113
  139. mdescriptor-0.2.3/tests/golden/ace/expected_output.npz +0 -0
  140. mdescriptor-0.2.3/tests/golden/c00psmlff/expected_output.npz +0 -0
  141. mdescriptor-0.2.3/tests/golden/dpa4/expected_output.npz +0 -0
  142. mdescriptor-0.2.3/tests/golden/dpa4c/expected_output.npz +0 -0
  143. mdescriptor-0.2.3/tests/golden/lbispectrum/expected_output.npz +0 -0
  144. mdescriptor-0.2.3/tests/golden/mtp/expected_output.npz +0 -0
  145. mdescriptor-0.2.3/tests/golden/mtp/manifest.json +0 -626
  146. mdescriptor-0.2.3/tests/golden/soapturbo/expected_output.npz +0 -0
  147. mdescriptor-0.2.3/tests/test_golden_independence.py +0 -20
  148. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/CMakeLists.txt +0 -0
  149. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/LICENSE +0 -0
  150. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/include/mdescriptor/ace.hpp +0 -0
  151. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/include/mdescriptor/detail/batch.hpp +0 -0
  152. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/include/mdescriptor/detail/blas.hpp +0 -0
  153. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/include/mdescriptor/detail/control.hpp +0 -0
  154. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/include/mdescriptor/detail/math3.hpp +0 -0
  155. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/include/mdescriptor/detail/species.hpp +0 -0
  156. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/include/mdescriptor/dpa4.hpp +0 -0
  157. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/include/mdescriptor/dpa4_wigner.hpp +0 -0
  158. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/include/mdescriptor/dpa4c.hpp +0 -0
  159. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/include/mdescriptor/extra.hpp +0 -0
  160. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/include/mdescriptor/local_descriptors.hpp +0 -0
  161. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/include/mdescriptor/mtp4.hpp +0 -0
  162. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/include/mdescriptor/mtp_cinf_coeffs.hpp +0 -0
  163. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/include/mdescriptor/neighbor.hpp +0 -0
  164. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/include/mdescriptor/nep.hpp +0 -0
  165. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/bindings/module.cpp +0 -0
  166. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/common/control.cpp +0 -0
  167. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/common/descriptor_common.hpp +0 -0
  168. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/common/extra_common.hpp +0 -0
  169. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/common/local_common.hpp +0 -0
  170. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/common/local_spherical_common.hpp +0 -0
  171. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/common/matrix_common.hpp +0 -0
  172. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/common/neighbor.cpp +0 -0
  173. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/common/nep.cpp +0 -0
  174. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/model_backed/dpa4.cpp +0 -0
  175. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/model_backed/dpa4_wigner.cpp +0 -0
  176. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/model_backed/dpa4c.cpp +0 -0
  177. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/ace.cpp +0 -0
  178. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/acsf.cpp +0 -0
  179. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/atomic_composition.cpp +0 -0
  180. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/coulomb_matrix.cpp +0 -0
  181. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/ead.cpp +0 -0
  182. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/ewald_sum_matrix.cpp +0 -0
  183. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/matrix_dispatch.cpp +0 -0
  184. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/mbtr.cpp +0 -0
  185. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/mtp.cpp +0 -0
  186. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/mtp4.cpp +0 -0
  187. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/neighbor_list.cpp +0 -0
  188. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/rotational_descriptors.cpp +0 -0
  189. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/sine_matrix.cpp +0 -0
  190. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/soap.cpp +0 -0
  191. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/soap_turbo.cpp +0 -0
  192. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/sorted_distances.cpp +0 -0
  193. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/spherical_expansion.cpp +0 -0
  194. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/spherical_expansion_by_pair.cpp +0 -0
  195. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/docs/descriptor-inventory.md +0 -0
  196. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/scripts/benchmark_dpa_native.py +0 -0
  197. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/scripts/benchmarking/__init__.py +0 -0
  198. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/scripts/benchmarking/benchmark_openmp_small.py +0 -0
  199. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/scripts/benchmarking/run_descriptor_benchmark.py +0 -0
  200. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/scripts/build_reference_wheel.py +0 -0
  201. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/scripts/check_descriptor_inventory.py +0 -0
  202. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/scripts/promote_descriptor_golden.py +0 -0
  203. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/scripts/run_benchmark.py +0 -0
  204. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/scripts/verify_wheel.py +0 -0
  205. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/__init__.py +0 -0
  206. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/_native.py +0 -0
  207. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/_native.pyi +0 -0
  208. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/core/__init__.py +0 -0
  209. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/core/adapter.py +0 -0
  210. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/core/control.py +0 -0
  211. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/core/descriptor.py +0 -0
  212. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/core/errors.py +0 -0
  213. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/core/input.py +0 -0
  214. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/core/json_value.py +0 -0
  215. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/core/model_adapter.py +0 -0
  216. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/core/options.py +0 -0
  217. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/core/result.py +0 -0
  218. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/core/species.py +0 -0
  219. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/__init__.py +0 -0
  220. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/__init__.py +0 -0
  221. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/ace.py +0 -0
  222. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/c00ps_mlff.py +0 -0
  223. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/core.py +0 -0
  224. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/dpa4.py +0 -0
  225. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/dpa4c.py +0 -0
  226. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/extra.py +0 -0
  227. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/local.py +0 -0
  228. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/mtp.py +0 -0
  229. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/nep.py +0 -0
  230. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/rotational.py +0 -0
  231. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/soap_turbo.py +0 -0
  232. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/__init__.py +0 -0
  233. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/LICENSE-LGPL-3.0-or-later.txt +0 -0
  234. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/NOTICE.md +0 -0
  235. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/__init__.py +0 -0
  236. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/__init__.py +0 -0
  237. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/api.py +0 -0
  238. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/common.py +0 -0
  239. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/__init__.py +0 -0
  240. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/array_api.py +0 -0
  241. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/common.py +0 -0
  242. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/__init__.py +0 -0
  243. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/base_descriptor.py +0 -0
  244. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4.py +0 -0
  245. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/__init__.py +0 -0
  246. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/activation.py +0 -0
  247. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/attention.py +0 -0
  248. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/attn_res.py +0 -0
  249. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/block.py +0 -0
  250. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/cartesian.py +0 -0
  251. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/edge_cache.py +0 -0
  252. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/embedding.py +0 -0
  253. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/ffn.py +0 -0
  254. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/grid_net.py +0 -0
  255. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/indexing.py +0 -0
  256. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/mlp.py +0 -0
  257. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/norm.py +0 -0
  258. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/projection.py +0 -0
  259. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/radial.py +0 -0
  260. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/so2.py +0 -0
  261. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/so3.py +0 -0
  262. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/utils.py +0 -0
  263. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/wignerd.py +0 -0
  264. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c.py +0 -0
  265. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/__init__.py +0 -0
  266. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/bispectrum.py +0 -0
  267. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/charge_state.py +0 -0
  268. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/geometry.py +0 -0
  269. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/pair_film.py +0 -0
  270. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/readout.py +0 -0
  271. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/spin.py +0 -0
  272. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/make_base_descriptor.py +0 -0
  273. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/__init__.py +0 -0
  274. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/env_mat.py +0 -0
  275. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/exclude_mask.py +0 -0
  276. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/lebedev.py +0 -0
  277. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/lebedev_rules.npz +0 -0
  278. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/__init__.py +0 -0
  279. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/builder.py +0 -0
  280. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/csr.py +0 -0
  281. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/from_ijs.py +0 -0
  282. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/graph.py +0 -0
  283. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/pairs.py +0 -0
  284. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/segment.py +0 -0
  285. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/network.py +0 -0
  286. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/nlist.py +0 -0
  287. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/region.py +0 -0
  288. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/safe_gradient.py +0 -0
  289. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/seed.py +0 -0
  290. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/spherical_harmonics.py +0 -0
  291. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/type_embed.py +0 -0
  292. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/env.py +0 -0
  293. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/utils/__init__.py +0 -0
  294. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/utils/charge_state.py +0 -0
  295. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/utils/plugin.py +0 -0
  296. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/utils/version.py +0 -0
  297. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/weights.py +0 -0
  298. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/dpa.py +0 -0
  299. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/dpa4/__init__.py +0 -0
  300. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/dpa4/descriptor.py +0 -0
  301. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/dpa4c/__init__.py +0 -0
  302. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/dpa4c/descriptor.py +0 -0
  303. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/graph.py +0 -0
  304. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/nep/__init__.py +0 -0
  305. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/nep/descriptor.py +0 -0
  306. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/__init__.py +0 -0
  307. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/ace.py +0 -0
  308. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/acsf.py +0 -0
  309. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/c00ps_mlff.py +0 -0
  310. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/local/__init__.py +0 -0
  311. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/many_body/__init__.py +0 -0
  312. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/matrices/__init__.py +0 -0
  313. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/mtp.py +0 -0
  314. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/rotational/__init__.py +0 -0
  315. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/soap.py +0 -0
  316. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/soap_turbo.py +0 -0
  317. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/models/__init__.py +0 -0
  318. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/models/assets/DPA4-Air-OMat24-v20260704.pt +0 -0
  319. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/models/assets/DPA4C-Air-OMat24-v20260819.pt +0 -0
  320. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/models/assets/nep89_20250409.txt +0 -0
  321. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/models/resolver.py +0 -0
  322. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/models/resource.py +0 -0
  323. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/models/session.py +0 -0
  324. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/registry/__init__.py +0 -0
  325. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/registry/builtins.py +0 -0
  326. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/registry/info.py +0 -0
  327. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/registry/model_defaults.py +0 -0
  328. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/registry/registry.py +0 -0
  329. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/registry/spec.py +0 -0
  330. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/__init__.py +0 -0
  331. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/_public.py +0 -0
  332. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/contracts/test_input_schema.py +0 -0
  333. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/contracts/test_model_resources.py +0 -0
  334. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/contracts/test_result_schema.py +0 -0
  335. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/data/mlip4_test_mtp.json +0 -0
  336. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/external_reference/__init__.py +0 -0
  337. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/external_reference/test_dscribe.py +0 -0
  338. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/ace/input.npz +0 -0
  339. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/acsf/expected_output.npz +0 -0
  340. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/acsf/input.npz +0 -0
  341. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/atomiccomposition/expected_output.npz +0 -0
  342. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/atomiccomposition/input.npz +0 -0
  343. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/c00psmlff/input.npz +0 -0
  344. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/coulombmatrix/expected_output.npz +0 -0
  345. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/coulombmatrix/input.npz +0 -0
  346. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/dpa4/input.npz +0 -0
  347. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/dpa4c/input.npz +0 -0
  348. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/ead/expected_output.npz +0 -0
  349. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/ead/input.npz +0 -0
  350. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/ewaldsummatrix/expected_output.npz +0 -0
  351. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/ewaldsummatrix/input.npz +0 -0
  352. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/lbispectrum/input.npz +0 -0
  353. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/lmbtr/expected_output.npz +0 -0
  354. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/lmbtr/input.npz +0 -0
  355. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/lodesphericalexpansion/expected_output.npz +0 -0
  356. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/lodesphericalexpansion/input.npz +0 -0
  357. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/mbtr/expected_output.npz +0 -0
  358. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/mbtr/input.npz +0 -0
  359. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/mtp/input.npz +0 -0
  360. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/neighborlist/expected_output.npz +0 -0
  361. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/neighborlist/input.npz +0 -0
  362. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/nep/expected_output.npz +0 -0
  363. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/nep/input.npz +0 -0
  364. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/sinematrix/expected_output.npz +0 -0
  365. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/sinematrix/input.npz +0 -0
  366. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/snap/expected_output.npz +0 -0
  367. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/snap/input.npz +0 -0
  368. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/so3/expected_output.npz +0 -0
  369. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/so3/input.npz +0 -0
  370. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/so4/expected_output.npz +0 -0
  371. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/so4/input.npz +0 -0
  372. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/soap/expected_output.npz +0 -0
  373. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/soap/input.npz +0 -0
  374. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/soappowerspectrum/expected_output.npz +0 -0
  375. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/soappowerspectrum/input.npz +0 -0
  376. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/soapradialspectrum/expected_output.npz +0 -0
  377. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/soapradialspectrum/input.npz +0 -0
  378. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/soapturbo/input.npz +0 -0
  379. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/sorteddistances/expected_output.npz +0 -0
  380. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/sorteddistances/input.npz +0 -0
  381. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/sphericalexpansion/expected_output.npz +0 -0
  382. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/sphericalexpansion/input.npz +0 -0
  383. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/sphericalexpansionbypair/expected_output.npz +0 -0
  384. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/sphericalexpansionbypair/input.npz +0 -0
  385. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/valleoganov/expected_output.npz +0 -0
  386. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/valleoganov/input.npz +0 -0
  387. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_ace.py +0 -0
  388. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_ace_golden.py +0 -0
  389. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_acsf_golden.py +0 -0
  390. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_all_descriptors.py +0 -0
  391. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_atomiccomposition_golden.py +0 -0
  392. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_c00psmlff_golden.py +0 -0
  393. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_coulombmatrix_golden.py +0 -0
  394. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_dpa4.py +0 -0
  395. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_dpa4c.py +0 -0
  396. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_ead_golden.py +0 -0
  397. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_ewaldsummatrix_golden.py +0 -0
  398. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_lbispectrum_golden.py +0 -0
  399. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_lmbtr_golden.py +0 -0
  400. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_lodesphericalexpansion_golden.py +0 -0
  401. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_mbtr_golden.py +0 -0
  402. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_mtp.py +0 -0
  403. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_mtp_golden.py +0 -0
  404. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_neighbor_graph.py +0 -0
  405. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_neighborlist_golden.py +0 -0
  406. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_nep.py +0 -0
  407. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_nonperiodic.py +0 -0
  408. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_openmp_support.py +0 -0
  409. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_reference.py +0 -0
  410. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_sinematrix_golden.py +0 -0
  411. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_sinematrix_openmp.py +0 -0
  412. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_snap_golden.py +0 -0
  413. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_so3_golden.py +0 -0
  414. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_so4_golden.py +0 -0
  415. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_soap_acsf_advanced.py +0 -0
  416. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_soap_golden.py +0 -0
  417. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_soappowerspectrum_golden.py +0 -0
  418. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_soapradialspectrum_golden.py +0 -0
  419. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_soapturbo_golden.py +0 -0
  420. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_sorteddistances_golden.py +0 -0
  421. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_sphericalexpansion_golden.py +0 -0
  422. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_sphericalexpansionbypair_golden.py +0 -0
  423. {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_valleoganov_golden.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: MDescriptor
3
- Version: 0.2.3
3
+ Version: 0.2.4
4
4
  Summary: Batch-oriented periodic atomic descriptors with C++17 kernels
5
5
  License: GNU GENERAL PUBLIC LICENSE
6
6
  Version 3, 29 June 2007
@@ -687,6 +687,7 @@ Provides-Extra: sparse
687
687
  Requires-Dist: scipy>=1.11; extra == "sparse"
688
688
  Provides-Extra: test
689
689
  Requires-Dist: pytest>=8; extra == "test"
690
+ Requires-Dist: pytest-cov>=7; extra == "test"
690
691
  Requires-Dist: ase>=3.22; extra == "test"
691
692
  Requires-Dist: scipy>=1.11; extra == "test"
692
693
  Provides-Extra: reference-dscribe
@@ -720,6 +721,7 @@ Requires-Dist: ase>=3.22; extra == "all"
720
721
  Requires-Dist: scipy>=1.11; extra == "all"
721
722
  Provides-Extra: dev
722
723
  Requires-Dist: pytest>=8; extra == "dev"
724
+ Requires-Dist: pytest-cov>=7; extra == "dev"
723
725
  Requires-Dist: ase>=3.22; extra == "dev"
724
726
  Requires-Dist: scipy>=1.11; extra == "dev"
725
727
  Requires-Dist: ruff>=0.8; extra == "dev"
@@ -747,8 +749,10 @@ src/mdescriptor/descriptors/
747
749
  model_backed/ graph seam plus NEP, DPA4, DPA4C
748
750
  src/mdescriptor/models/assets/ packaged, hash-verified model resources
749
751
  tests/golden/ descriptor-owned, benchmark-independent accuracy fixtures
752
+ docs/numerical-baselines.md static-golden and external-runtime oracle inventory
750
753
  scripts/benchmarking/ controlled local benchmark runners
751
- benchmarks/ local-only benchmark snapshots (ignored by Git)
754
+ benchmarks/ local benchmark snapshots (ignored except for tracked oracles)
755
+ benchmarks/_legacy_oracles/ pinned independent upstream oracle adapters
752
756
  ```
753
757
 
754
758
  `standalone` descriptors never require a model file. `model_backed` descriptors
@@ -781,6 +785,23 @@ installing Torch; the supported default graphs run through the C++17/OpenMP
781
785
  backend and specialised configurations retain the NumPy fallback. No network
782
786
  model download is performed.
783
787
 
788
+ 可选的外部数值对照固定使用 `deepmd-kit==3.2.0`:
789
+
790
+ ```bash
791
+ python -m pip install ".[reference-deepmd]"
792
+ python -m pytest -m deepmd tests/external_reference/test_deepmd.py
793
+ ```
794
+
795
+ 该对照同时覆盖周期和非周期输入;非周期帧按 DeepMD 的 `cells=None` 语义传入。
796
+ `tests/golden/dpa4*` 的 expected output(包括非周期行)也由该外部 evaluator 生成,
797
+ manifest 记录了 evaluator 脚本、模型 hash 和 `deepmd-kit` 版本;运行时仍只加载已
798
+ 提交的 NPZ,不要求安装 DeepMD。
799
+
800
+ 所有 28 个描述符都登记在[数值基线清单](docs/numerical-baselines.md),并都有外部
801
+ 静态 golden:7 个沿用独立上游/source NPZ,另外 21 个在对应目录的
802
+ `external_manifest.json` 中保存固定版本 provider 生成的数值。默认测试只依赖提交的
803
+ fixture;外部 provider 缺失或版本漂移会使 reference job 失败,而不会静默跳过。
804
+
784
805
  性能说明:DPA4 native 路径现在使用固定大小分块的 SGEMM、可复用的计算工作区,
785
806
  并只为每条边计算一次 attention logit;DPA4C 的类型对 MLP 采用每个 calculator
786
807
  实例独立的惰性缓存。OpenBLAS 仅作为构建依赖,官方 wheel 会内置 prefixed 的
@@ -957,7 +978,7 @@ For GUI configuration JSON, a model parameter may be an explicit path string
957
978
  or the tagged object returned by `ModelResource.to_dict()`; the latter is used
958
979
  for named/checksummed resources.
959
980
 
960
- The DPA4/DPA4C checkpoint readers and NumPy reference path remain isolated
981
+ The DPA4/DPA4C checkpoint readers and NumPy fallback path remain isolated
961
982
  vendor adapters. The default inference graphs are lowered into the private
962
983
  `mdescriptor._native` C++17/OpenMP extension.
963
984
 
@@ -966,8 +987,19 @@ vendor adapters. The default inference graphs are lowered into the private
966
987
  ```bash
967
988
  .venv/bin/python -m pip install -e . --no-build-isolation
968
989
  .venv/bin/python -m pytest --import-mode=importlib tests -q
990
+ .venv/bin/python -m pytest --cov=mdescriptor --cov-report=term-missing tests
991
+
992
+ .venv/bin/cmake -S cpp/tests -B build/cpp-tests -DCMAKE_BUILD_TYPE=Release
993
+ .venv/bin/cmake --build build/cpp-tests --config Release
994
+ .venv/bin/ctest --test-dir build/cpp-tests -C Release --output-on-failure
969
995
  ```
970
996
 
997
+ Coverage excludes the isolated vendored DPA implementation and enforces 75%
998
+ branch coverage for project-owned Python code. Tests marked `timing` record
999
+ repeatable timing samples but intentionally do not impose a runner-dependent
1000
+ speedup threshold; controlled performance reports are produced by
1001
+ `scripts/run_benchmark.py`.
1002
+
971
1003
  The extension is private (`mdescriptor._native`). C++ shared math and batch
972
1004
  helpers live in named headers under `cpp/include/mdescriptor/detail/`.
973
1005
 
@@ -19,8 +19,10 @@ src/mdescriptor/descriptors/
19
19
  model_backed/ graph seam plus NEP, DPA4, DPA4C
20
20
  src/mdescriptor/models/assets/ packaged, hash-verified model resources
21
21
  tests/golden/ descriptor-owned, benchmark-independent accuracy fixtures
22
+ docs/numerical-baselines.md static-golden and external-runtime oracle inventory
22
23
  scripts/benchmarking/ controlled local benchmark runners
23
- benchmarks/ local-only benchmark snapshots (ignored by Git)
24
+ benchmarks/ local benchmark snapshots (ignored except for tracked oracles)
25
+ benchmarks/_legacy_oracles/ pinned independent upstream oracle adapters
24
26
  ```
25
27
 
26
28
  `standalone` descriptors never require a model file. `model_backed` descriptors
@@ -53,6 +55,23 @@ installing Torch; the supported default graphs run through the C++17/OpenMP
53
55
  backend and specialised configurations retain the NumPy fallback. No network
54
56
  model download is performed.
55
57
 
58
+ 可选的外部数值对照固定使用 `deepmd-kit==3.2.0`:
59
+
60
+ ```bash
61
+ python -m pip install ".[reference-deepmd]"
62
+ python -m pytest -m deepmd tests/external_reference/test_deepmd.py
63
+ ```
64
+
65
+ 该对照同时覆盖周期和非周期输入;非周期帧按 DeepMD 的 `cells=None` 语义传入。
66
+ `tests/golden/dpa4*` 的 expected output(包括非周期行)也由该外部 evaluator 生成,
67
+ manifest 记录了 evaluator 脚本、模型 hash 和 `deepmd-kit` 版本;运行时仍只加载已
68
+ 提交的 NPZ,不要求安装 DeepMD。
69
+
70
+ 所有 28 个描述符都登记在[数值基线清单](docs/numerical-baselines.md),并都有外部
71
+ 静态 golden:7 个沿用独立上游/source NPZ,另外 21 个在对应目录的
72
+ `external_manifest.json` 中保存固定版本 provider 生成的数值。默认测试只依赖提交的
73
+ fixture;外部 provider 缺失或版本漂移会使 reference job 失败,而不会静默跳过。
74
+
56
75
  性能说明:DPA4 native 路径现在使用固定大小分块的 SGEMM、可复用的计算工作区,
57
76
  并只为每条边计算一次 attention logit;DPA4C 的类型对 MLP 采用每个 calculator
58
77
  实例独立的惰性缓存。OpenBLAS 仅作为构建依赖,官方 wheel 会内置 prefixed 的
@@ -229,7 +248,7 @@ For GUI configuration JSON, a model parameter may be an explicit path string
229
248
  or the tagged object returned by `ModelResource.to_dict()`; the latter is used
230
249
  for named/checksummed resources.
231
250
 
232
- The DPA4/DPA4C checkpoint readers and NumPy reference path remain isolated
251
+ The DPA4/DPA4C checkpoint readers and NumPy fallback path remain isolated
233
252
  vendor adapters. The default inference graphs are lowered into the private
234
253
  `mdescriptor._native` C++17/OpenMP extension.
235
254
 
@@ -238,8 +257,19 @@ vendor adapters. The default inference graphs are lowered into the private
238
257
  ```bash
239
258
  .venv/bin/python -m pip install -e . --no-build-isolation
240
259
  .venv/bin/python -m pytest --import-mode=importlib tests -q
260
+ .venv/bin/python -m pytest --cov=mdescriptor --cov-report=term-missing tests
261
+
262
+ .venv/bin/cmake -S cpp/tests -B build/cpp-tests -DCMAKE_BUILD_TYPE=Release
263
+ .venv/bin/cmake --build build/cpp-tests --config Release
264
+ .venv/bin/ctest --test-dir build/cpp-tests -C Release --output-on-failure
241
265
  ```
242
266
 
267
+ Coverage excludes the isolated vendored DPA implementation and enforces 75%
268
+ branch coverage for project-owned Python code. Tests marked `timing` record
269
+ repeatable timing samples but intentionally do not impose a runner-dependent
270
+ speedup threshold; controlled performance reports are produced by
271
+ `scripts/run_benchmark.py`.
272
+
243
273
  The extension is private (`mdescriptor._native`). C++ shared math and batch
244
274
  helpers live in named headers under `cpp/include/mdescriptor/detail/`.
245
275
 
@@ -86,7 +86,7 @@ struct C00PSMlffOptions {
86
86
  int n_radial = 8;
87
87
  int l_max = 4;
88
88
  int cutoff_function = 0; // 0: BP, 1: MO, 2: RJ, 3: WMC
89
- // Gaussian width sigma_atom in the VASP MLFF theory (Angstrom). A
89
+ // Gaussian width sigma_atom in the reference MLFF convention (Angstrom). A
90
90
  // positive value enables the Gaussian atomic distribution; zero keeps
91
91
  // the unsmoothed delta-distribution limit.
92
92
  double radial_sigma = 0.5;
@@ -97,7 +97,7 @@ struct C00PSMlffOptions {
97
97
  bool super_vector = false;
98
98
  double radial_weight = 1.0;
99
99
  double angular_weight = 1.0;
100
- // VASP 6.6.0 MLFF LSIC semantics: subtract self terms only from PS
100
+ // Reference MLFF LSIC semantics: subtract self terms only from PS
101
101
  // channels whose neighbour species is the centre species.
102
102
  bool exclude_self_interaction = true;
103
103
  int num_threads = 0;
@@ -21,10 +21,10 @@ using detail::run_parallel_structures;
21
21
 
22
22
  constexpr double kPi = 3.141592653589793238462643383279502884;
23
23
  constexpr double kSqrtFourPi = 3.544907701811032054596334966682290365;
24
- // VASP 6.6.0 constructs the radial basis on NR equally spaced points and
24
+ // The reference MLFF constructs the radial basis on NR equally spaced points and
25
25
  // normalizes it with the corresponding right-endpoint sum. The same grid is
26
26
  // used here for the one-time basis setup.
27
- constexpr int kVaspRadialGridPoints = 10000;
27
+ constexpr int kReferenceRadialGridPoints = 10000;
28
28
  constexpr int kRadialQuadraturePoints = 240;
29
29
 
30
30
  double spherical_bessel(int l, double x) {
@@ -136,7 +136,7 @@ double double_factorial_odd(int l) {
136
136
  return value;
137
137
  }
138
138
 
139
- // VASP's IL0 returns i_l(x) multiplied by exp(-W*s^2-W*r^2), evaluated in a
139
+ // The reference radial integral returns i_l(x) multiplied by exp(-W*s^2-W*r^2), evaluated in a
140
140
  // form that remains finite for the Gaussian broadening integral.
141
141
  double scaled_modified_spherical_bessel(int l, double x, double w, double sample, double radius) {
142
142
  const double gaussian = std::exp(-w * (sample * sample + radius * radius));
@@ -280,8 +280,8 @@ void prepare_basis(
280
280
  for (int n = 0; n < radial_counts[static_cast<std::size_t>(l)]; ++n) {
281
281
  const double root = zeros[static_cast<std::size_t>(l)][static_cast<std::size_t>(n)];
282
282
  double norm2 = 0.0;
283
- const double dr = options.r_cut / static_cast<double>(kVaspRadialGridPoints);
284
- for (int point = 1; point <= kVaspRadialGridPoints; ++point) {
283
+ const double dr = options.r_cut / static_cast<double>(kReferenceRadialGridPoints);
284
+ for (int point = 1; point <= kReferenceRadialGridPoints; ++point) {
285
285
  const double radius = static_cast<double>(point) * dr;
286
286
  const double basis = spherical_bessel(l, root * radius / options.r_cut);
287
287
  norm2 += radius * radius * basis * basis * dr;
@@ -294,11 +294,11 @@ void prepare_basis(
294
294
  return;
295
295
  }
296
296
 
297
- // RAD_FUNC in VASP first convolves every normalized spherical Bessel
297
+ // The reference radial routine first convolves every normalized spherical Bessel
298
298
  // function with the Gaussian atom distribution and then tabulates the
299
299
  // result on the same radial mesh. The integrand vanishes at both mesh
300
300
  // endpoints for the Bessel basis, so high-order Gauss integration matches
301
- // VASP's right-endpoint grid sum to the precision needed here while
301
+ // The right-endpoint grid sum is retained to the precision needed here while
302
302
  // avoiding an O(NR^2) setup.
303
303
  std::vector<double> nodes;
304
304
  std::vector<double> weights;
@@ -306,7 +306,7 @@ void prepare_basis(
306
306
  const double width_parameter = 0.5 / (options.radial_sigma * options.radial_sigma);
307
307
  const double prefactor = 4.0 * kPi * std::pow(width_parameter / kPi, 1.5);
308
308
  const double quadrature_scale = 0.5 * options.r_cut;
309
- const std::size_t table_width = static_cast<std::size_t>(kVaspRadialGridPoints + 1);
309
+ const std::size_t table_width = static_cast<std::size_t>(kReferenceRadialGridPoints + 1);
310
310
  for (int l = 0; l <= options.l_max; ++l) {
311
311
  const std::int32_t count = radial_counts[static_cast<std::size_t>(l)];
312
312
  auto& table = radial_values[static_cast<std::size_t>(l)];
@@ -323,9 +323,9 @@ void prepare_basis(
323
323
  = spherical_bessel(l, root * radius / options.r_cut) / norm;
324
324
  }
325
325
  }
326
- for (int point = 0; point <= kVaspRadialGridPoints; ++point) {
326
+ for (int point = 0; point <= kReferenceRadialGridPoints; ++point) {
327
327
  const double sample = options.r_cut * static_cast<double>(point)
328
- / static_cast<double>(kVaspRadialGridPoints);
328
+ / static_cast<double>(kReferenceRadialGridPoints);
329
329
  const double cutoff = cutoff_value(options.cutoff_function, sample, options.r_cut);
330
330
  for (int n = 0; n < count; ++n) {
331
331
  double integral = 0.0;
@@ -353,18 +353,18 @@ double radial_value(
353
353
  double distance
354
354
  ) {
355
355
  if (options.radial_sigma > 0.0) {
356
- const std::size_t table_width = static_cast<std::size_t>(kVaspRadialGridPoints + 1);
356
+ const std::size_t table_width = static_cast<std::size_t>(kReferenceRadialGridPoints + 1);
357
357
  const auto& table = radial_values[static_cast<std::size_t>(l)];
358
358
  const double coordinate = std::max(0.0, std::min(1.0, distance / options.r_cut))
359
- * static_cast<double>(kVaspRadialGridPoints);
360
- const int left = std::min(kVaspRadialGridPoints - 1, static_cast<int>(coordinate));
359
+ * static_cast<double>(kReferenceRadialGridPoints);
360
+ const int left = std::min(kReferenceRadialGridPoints - 1, static_cast<int>(coordinate));
361
361
  const double fraction = coordinate - static_cast<double>(left);
362
362
  const auto value = [&](int point) {
363
- const int bounded = std::max(0, std::min(kVaspRadialGridPoints, point));
363
+ const int bounded = std::max(0, std::min(kReferenceRadialGridPoints, point));
364
364
  return table[static_cast<std::size_t>(n) * table_width + static_cast<std::size_t>(bounded)];
365
365
  };
366
366
  // Four-point cubic interpolation keeps the tabulated path smooth and
367
- // mirrors the cubic spline evaluation used by VASP's SPLVAL_ML_NEW.
367
+ // mirrors the reference cubic spline evaluation.
368
368
  const double p0 = value(left - 1);
369
369
  const double p1 = value(left);
370
370
  const double p2 = value(left + 1);
@@ -603,7 +603,7 @@ void C00PSMlffCalculator::compute(
603
603
  * radial_count;
604
604
  const double addition = (2.0 * l + 1.0) / (4.0 * kPi);
605
605
  for (std::size_t neighbor = 0; neighbor < neighbor_count; ++neighbor) {
606
- // Match VASP 6.6.0 MLFF LSIC: only the centre
606
+ // Match the reference MLFF LSIC: only the centre
607
607
  // species receives a self-interaction correction.
608
608
  if (types[neighbor] != center_type) {
609
609
  continue;
@@ -651,7 +651,7 @@ void C00PSMlffCalculator::compute(
651
651
  total -= self_power[
652
652
  self_power_offsets[static_cast<std::size_t>(l)] + pair_index];
653
653
  }
654
- // VASP's WVAR distinguishes radial indices, not
654
+ // The reference WVAR distinguishes radial indices, not
655
655
  // flattened species/radial channels. Therefore
656
656
  // cross-species channels with equal radial index
657
657
  // retain weight 1.0.
@@ -0,0 +1,19 @@
1
+ cmake_minimum_required(VERSION 3.15...4.0)
2
+ project(MDescriptorCppTests LANGUAGES CXX)
3
+
4
+ include(CTest)
5
+ find_package(OpenMP)
6
+
7
+ add_executable(
8
+ mdescriptor_cpp_public_api
9
+ test_public_api.cpp
10
+ ../src/common/control.cpp
11
+ ../src/common/neighbor.cpp
12
+ )
13
+ target_compile_features(mdescriptor_cpp_public_api PRIVATE cxx_std_17)
14
+ target_include_directories(mdescriptor_cpp_public_api PRIVATE ../include)
15
+ if(OpenMP_CXX_FOUND)
16
+ target_link_libraries(mdescriptor_cpp_public_api PRIVATE OpenMP::OpenMP_CXX)
17
+ endif()
18
+
19
+ add_test(NAME cpp_public_api COMMAND mdescriptor_cpp_public_api)
@@ -0,0 +1,106 @@
1
+ #include "mdescriptor/neighbor.hpp"
2
+
3
+ #include <array>
4
+ #include <cstdint>
5
+ #include <iostream>
6
+ #include <memory>
7
+ #include <stdexcept>
8
+ #include <string>
9
+
10
+ namespace {
11
+
12
+ void require(bool condition, const std::string& message) {
13
+ if (!condition) {
14
+ throw std::runtime_error(message);
15
+ }
16
+ }
17
+
18
+ template <typename Error, typename Function>
19
+ void require_throws(Function&& function, const std::string& message) {
20
+ try {
21
+ function();
22
+ } catch (const Error&) {
23
+ return;
24
+ }
25
+ throw std::runtime_error(message);
26
+ }
27
+
28
+ mdescriptor::StructureBatchView isolated_pair() {
29
+ static const std::array<std::int32_t, 2> numbers{1, 8};
30
+ static const std::array<double, 6> positions{0.0, 0.0, 0.0, 1.0, 0.0, 0.0};
31
+ static const std::array<double, 9> cell{};
32
+ static const std::array<std::int32_t, 3> pbc{};
33
+ static const std::array<std::int64_t, 2> offsets{0, 2};
34
+ return {
35
+ numbers.data(), positions.data(), cell.data(), pbc.data(), offsets.data(), 1, 2,
36
+ };
37
+ }
38
+
39
+ void test_compute_control_contract() {
40
+ auto control = std::make_shared<mdescriptor::ComputeControl>();
41
+ control->reset(2);
42
+ require(control->total() == 2, "reset must publish the requested total");
43
+ require(control->completed() == 0, "reset must clear completed work");
44
+ require(!control->cancelled(), "reset must clear cancellation");
45
+ control->mark_completed();
46
+ require(control->completed() == 1, "mark_completed must advance progress");
47
+ control->cancel();
48
+ require(control->cancelled(), "cancel must be observable");
49
+ require_throws<std::invalid_argument>(
50
+ [&] { control->reset(-1); },
51
+ "negative work totals must be rejected");
52
+ }
53
+
54
+ void test_neighbor_graph_boundary_contract() {
55
+ const auto batch = isolated_pair();
56
+ const auto inclusive = mdescriptor::build_neighbor_graph(batch, 1.0, nullptr, 1, true);
57
+ require(inclusive.atoms() == 2, "graph must retain the batch atom count");
58
+ require(inclusive.offsets() == std::vector<std::int64_t>({0, 2, 4}),
59
+ "inclusive cutoff must retain self and boundary neighbor entries");
60
+ for (std::int64_t center = 0; center < 2; ++center) {
61
+ const auto neighbors = inclusive.for_center(center);
62
+ require(neighbors.size == 2, "each center must expose both atoms");
63
+ bool found_self = false;
64
+ bool found_boundary = false;
65
+ for (std::size_t index = 0; index < neighbors.size; ++index) {
66
+ found_self = found_self || neighbors.exact_self(index, center);
67
+ found_boundary = found_boundary || neighbors.distance2[index] == 1.0;
68
+ }
69
+ require(found_self, "neighbor views must identify exact self entries");
70
+ require(found_boundary, "inclusive cutoff must retain distance-equal neighbors");
71
+ }
72
+
73
+ const auto exclusive = mdescriptor::build_neighbor_graph(batch, 1.0, nullptr, 1, false);
74
+ require(exclusive.offsets() == std::vector<std::int64_t>({0, 1, 2}),
75
+ "exclusive cutoff must discard distance-equal neighbors");
76
+ }
77
+
78
+ void test_neighbor_graph_rejects_invalid_or_cancelled_work() {
79
+ auto mixed = isolated_pair();
80
+ const std::array<std::int32_t, 3> mixed_pbc{1, 0, 1};
81
+ mixed.pbc = mixed_pbc.data();
82
+ require_throws<std::invalid_argument>(
83
+ [&] { (void)mdescriptor::build_neighbor_graph(mixed, 1.0); },
84
+ "mixed periodicity must be rejected by the C++ boundary");
85
+
86
+ auto control = std::make_shared<mdescriptor::ComputeControl>();
87
+ control->reset(1);
88
+ control->cancel();
89
+ require_throws<mdescriptor::CancelledError>(
90
+ [&] { (void)mdescriptor::build_neighbor_graph(isolated_pair(), 1.0, control, 1); },
91
+ "pre-cancelled work must raise CancelledError");
92
+ }
93
+
94
+ } // namespace
95
+
96
+ int main() {
97
+ try {
98
+ test_compute_control_contract();
99
+ test_neighbor_graph_boundary_contract();
100
+ test_neighbor_graph_rejects_invalid_or_cancelled_work();
101
+ } catch (const std::exception& error) {
102
+ std::cerr << "C++ public API test failed: " << error.what() << '\n';
103
+ return 1;
104
+ }
105
+ return 0;
106
+ }
@@ -0,0 +1,49 @@
1
+ # Numerical baselines / 数值基线
2
+
3
+ The repository has a committed numerical golden for every descriptor.
4
+ An `external_static` entry means the values came from an independent
5
+ upstream/source oracle. The 21 provider-backed entries keep the older
6
+ project snapshot as a secondary contract fixture and add an
7
+ `external_manifest.json` sidecar as the primary numerical oracle.
8
+ The pinned provider tests remain a separate runtime smoke check.
9
+
10
+ 当前 28 个描述符全部有外部静态数值 golden:7 个沿用已提交的
11
+ source-derived NPZ,另外 21 个由锁定版本的独立 provider 生成
12
+ sidecar。21 个旧 project snapshot 仍保留,用于覆盖原有布局、
13
+ metadata 与非周期契约;它们不再被冒充为 upstream 数值来源。
14
+
15
+ | Descriptor | Committed golden | Independent oracle | Package/source | CI marker |
16
+ |---|---|---|---|---|
17
+ | `SOAP` | external static | DScribe | `dscribe` (2.1.2) | `dscribe` |
18
+ | `SOAPTurbo` | external static | soap_turbo-master | `soap_turbo` (pinned source archive) | — |
19
+ | `ACSF` | external static | DScribe | `dscribe` (2.1.2) | `dscribe` |
20
+ | `ACE` | external static | ACE1.jl | `ACE1.jl` (0.12.5) | — |
21
+ | `CoulombMatrix` | external static | DScribe | `dscribe` (2.1.2) | `dscribe` |
22
+ | `SineMatrix` | external static | DScribe | `dscribe` (2.1.2) | `dscribe` |
23
+ | `EwaldSumMatrix` | external static | DScribe | `dscribe` (2.1.2) | `dscribe` |
24
+ | `MBTR` | external static | DScribe | `dscribe` (2.1.2) | `dscribe` |
25
+ | `LMBTR` | external static | DScribe | `dscribe` (2.1.2) | `dscribe` |
26
+ | `ValleOganov` | external static | DScribe | `dscribe` (2.1.2) | `dscribe` |
27
+ | `AtomicComposition` | external static | Featomic | `featomic` (0.6.6) | `featomic` |
28
+ | `NeighborList` | external static | Featomic | `featomic` (0.6.6) | `featomic` |
29
+ | `SortedDistances` | external static | Featomic | `featomic` (0.6.6) | `featomic` |
30
+ | `SphericalExpansion` | external static | Featomic | `featomic` (0.6.6) | `featomic` |
31
+ | `SphericalExpansionByPair` | external static | Featomic | `featomic` (0.6.6) | `featomic` |
32
+ | `SoapRadialSpectrum` | external static | Featomic | `featomic` (0.6.6) | `featomic` |
33
+ | `SoapPowerSpectrum` | external static | Featomic | `featomic` (0.6.6) | `featomic` |
34
+ | `LodeSphericalExpansion` | external static | Featomic | `featomic` (0.6.6) | `featomic` |
35
+ | `EAD` | external static | PyXtal_FF | `pyxtal_ff` (0.2.3) | `pyxtalff` |
36
+ | `SO3` | external static | PyXtal_FF | `pyxtal_ff` (0.2.3) | `pyxtalff` |
37
+ | `SO4` | external static | PyXtal_FF | `pyxtal_ff` (0.2.3) | `pyxtalff` |
38
+ | `SNAP` | external static | PyXtal_FF | `pyxtal_ff` (0.2.3) | `pyxtalff` |
39
+ | `LBispectrum` | external static | LAMMPS/PyXtal_FF | `lammps + pyxtal_ff` (pinned source archive + 0.2.3) | — |
40
+ | `MTP` | external static | MLIP-4 | `MLIP-4` (pinned source archive) | — |
41
+ | `C00PSMLFF` | external static | licensed external MLFF | `local-only input` (user-supplied) | — |
42
+ | `NEP` | external static | nep-adapters | `nep-adapters` (1.0.2) | `nepadapters` |
43
+ | `DPA4` | external static | deepmd-kit | `deepmd-kit` (3.2.0) | `deepmd` |
44
+ | `DPA4C` | external static | deepmd-kit | `deepmd-kit` (3.2.0) | `deepmd` |
45
+
46
+ The NPZ comparisons check values and all result identity fields
47
+ (`samples`, labels, level, structure ids and row offsets). Contract,
48
+ periodicity, symmetry and lifecycle tests remain separate because a
49
+ numeric golden cannot prove those behaviours.
@@ -23,7 +23,7 @@ dependencies = [
23
23
  [project.optional-dependencies]
24
24
  ase = ["ase>=3.22"]
25
25
  sparse = ["scipy>=1.11"]
26
- test = ["pytest>=8", "ase>=3.22", "scipy>=1.11"]
26
+ test = ["pytest>=8", "pytest-cov>=7", "ase>=3.22", "scipy>=1.11"]
27
27
  reference-dscribe = ["pytest>=8", "ase==3.26.0", "scipy>=1.11", "dscribe==2.1.2"]
28
28
  reference-featomic = ["pytest>=8", "ase==3.26.0", "scipy>=1.11", "featomic==0.6.6"]
29
29
  reference-pyxtalff = [
@@ -46,7 +46,14 @@ reference-nepadapters = [
46
46
  "nep-adapters==1.0.2",
47
47
  ]
48
48
  all = ["ase>=3.22", "scipy>=1.11"]
49
- dev = ["pytest>=8", "ase>=3.22", "scipy>=1.11", "ruff>=0.8", "mypy>=1.13"]
49
+ dev = [
50
+ "pytest>=8",
51
+ "pytest-cov>=7",
52
+ "ase>=3.22",
53
+ "scipy>=1.11",
54
+ "ruff>=0.8",
55
+ "mypy>=1.13",
56
+ ]
50
57
 
51
58
  [tool.scikit-build]
52
59
  minimum-version = "1.0"
@@ -84,7 +91,18 @@ exclude = [
84
91
  build = "cp310-* cp311-* cp312-* cp313-* cp314-*"
85
92
  skip = "*-musllinux_* *-win32 *-*linux_i686"
86
93
  test-requires = ["pytest>=8", "ase>=3.22", "scipy>=1.11"]
87
- test-sources = ["tests", "scripts"]
94
+ # The repository-level provenance tests read the checked-in metadata below;
95
+ # include those files in cibuildwheel's isolated test tree so every wheel
96
+ # platform exercises the same contract suite as the source checkout.
97
+ test-sources = [
98
+ "tests",
99
+ "scripts",
100
+ "pyproject.toml",
101
+ "benchmarks/_legacy_oracles/sources.lock.json",
102
+ "benchmarks/_legacy_oracles/soapturbo",
103
+ "benchmarks/_legacy_oracles/lbispectrum",
104
+ "benchmarks/_legacy_oracles/mtp",
105
+ ]
88
106
  test-command = "python -m pytest --import-mode=importlib -m \"not reference\" tests && python scripts/verify_wheel.py"
89
107
 
90
108
  [tool.cibuildwheel.windows]
@@ -94,9 +112,11 @@ repair-wheel-command = "delvewheel repair --ignore-existing -w {dest_dir} -v {wh
94
112
 
95
113
  [tool.pytest.ini_options]
96
114
  testpaths = ["tests"]
115
+ pythonpath = ["."]
97
116
  addopts = "-m 'not reference'"
98
117
  markers = [
99
118
  "model: tests that exercise bundled model-backed descriptors and assets",
119
+ "timing: timing smoke tests that record runtimes without enforcing a speedup",
100
120
  "reference: tests that require a pinned external numerical reference implementation",
101
121
  "dscribe: external numerical comparisons against pinned DScribe",
102
122
  "featomic: external numerical comparisons against pinned Featomic",
@@ -105,6 +125,18 @@ markers = [
105
125
  "nepadapters: external numerical comparisons against pinned nep-adapters",
106
126
  ]
107
127
 
128
+ [tool.coverage.run]
129
+ branch = true
130
+ source = ["mdescriptor"]
131
+ omit = [
132
+ "*/mdescriptor/descriptors/model_backed/_vendor/*",
133
+ ]
134
+
135
+ [tool.coverage.report]
136
+ fail_under = 75
137
+ show_missing = true
138
+ skip_covered = true
139
+
108
140
  [tool.ruff]
109
141
  target-version = "py310"
110
142
  line-length = 100
@@ -0,0 +1,55 @@
1
+ """
2
+ Evaluate an ACE fixture directly through ACE1.jl.
3
+
4
+ The first argument is a generated Julia input file defining the uppercase
5
+ constants used below. The second argument receives a plain-text matrix, one
6
+ atom per row. Keeping the transport format in Julia's standard library avoids
7
+ adding a JSON or NumPy package to the archived ACE1.jl project.
8
+ """
9
+
10
+ using ACE1
11
+ using JuLIP
12
+
13
+ include(ARGS[1])
14
+
15
+ basis = ACE1.Utils.rpi_basis(
16
+ species=SPECIES,
17
+ N=N_ORDER,
18
+ r0=R0,
19
+ trans=ACE1.PolyTransform(TRANSFORM_P, TRANSFORM_R0),
20
+ wL=WL,
21
+ maxdeg=MAX_DEGREE,
22
+ D=DEGREES,
23
+ rcut=R_CUT,
24
+ rin=R_IN,
25
+ pcut=P_CUT,
26
+ pin=P_IN,
27
+ constants=CONSTANTS,
28
+ warn=false,
29
+ )
30
+
31
+ blocks = Matrix{Float64}[]
32
+ for structure in 1:(length(OFFSETS) - 1)
33
+ first = OFFSETS[structure]
34
+ last = OFFSETS[structure + 1] - 1
35
+ atoms = JuLIP.Atoms(
36
+ NUMBERS[first:last],
37
+ permutedims(POSITIONS[first:last, :]);
38
+ cell=CELLS[structure],
39
+ pbc=Tuple(PBCS[structure, :]),
40
+ )
41
+ push!(blocks, Matrix(permutedims(ACE1.Descriptors.descriptors(basis, atoms))))
42
+ end
43
+ values = isempty(blocks) ? zeros(Float64, 0, 0) : vcat(blocks...)
44
+
45
+ open(ARGS[2], "w") do output
46
+ println(output, size(values, 1), " ", size(values, 2))
47
+ for row in axes(values, 1)
48
+ println(output, join((repr(values[row, column]) for column in axes(values, 2)), " "))
49
+ end
50
+ end
51
+
52
+ println("ACE1=", Base.pkgversion(ACE1))
53
+ println("JuLIP=", Base.pkgversion(JuLIP))
54
+ println("Julia=", VERSION)
55
+