MDescriptor 0.2.2__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 (436) hide show
  1. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/PKG-INFO +118 -11
  2. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/README.md +89 -5
  3. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/include/mdescriptor/descriptor.hpp +2 -2
  4. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/src/common/control.cpp +5 -0
  5. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/src/common/nep.cpp +15 -0
  6. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/src/standalone/ace.cpp +1 -0
  7. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/src/standalone/c00ps_mlff.cpp +17 -17
  8. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/src/standalone/mtp.cpp +3 -0
  9. mdescriptor-0.2.4/cpp/tests/CMakeLists.txt +19 -0
  10. mdescriptor-0.2.4/cpp/tests/test_public_api.cpp +106 -0
  11. mdescriptor-0.2.4/docs/descriptor-inventory.md +110 -0
  12. mdescriptor-0.2.4/docs/numerical-baselines.md +49 -0
  13. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/pyproject.toml +63 -6
  14. mdescriptor-0.2.4/scripts/ace1_reference.jl +55 -0
  15. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/scripts/check_descriptor_inventory.py +37 -6
  16. mdescriptor-0.2.4/scripts/check_numerical_baselines.py +293 -0
  17. mdescriptor-0.2.4/scripts/deepmd_reference.py +156 -0
  18. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/scripts/descriptor_reference.py +6 -2
  19. mdescriptor-0.2.4/scripts/external_reference.py +111 -0
  20. mdescriptor-0.2.4/scripts/generate_ace1_reference.py +225 -0
  21. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/scripts/generate_descriptor_goldens.py +22 -32
  22. mdescriptor-0.2.4/scripts/generate_external_c00ps_reference.py +327 -0
  23. mdescriptor-0.2.4/scripts/generate_external_static_goldens.py +793 -0
  24. mdescriptor-0.2.4/scripts/numerical_baselines.py +255 -0
  25. mdescriptor-0.2.4/src/mdescriptor/__init__.py +89 -0
  26. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/_version.py +3 -3
  27. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/core/adapter.py +314 -100
  28. mdescriptor-0.2.4/src/mdescriptor/core/control.py +88 -0
  29. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/core/descriptor.py +38 -4
  30. mdescriptor-0.2.4/src/mdescriptor/core/errors.py +108 -0
  31. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/core/input.py +64 -8
  32. mdescriptor-0.2.4/src/mdescriptor/core/json_value.py +112 -0
  33. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/core/model_adapter.py +62 -29
  34. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/core/options.py +3 -27
  35. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/core/result.py +202 -32
  36. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/core/species.py +30 -10
  37. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/ace.py +104 -27
  38. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/c00ps_mlff.py +1 -1
  39. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/core.py +23 -4
  40. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/extra.py +9 -3
  41. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/mtp.py +7 -1
  42. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/soap_turbo.py +43 -4
  43. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/models/__init__.py +15 -15
  44. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/models/resource.py +2 -0
  45. mdescriptor-0.2.4/src/mdescriptor/registry/__init__.py +211 -0
  46. mdescriptor-0.2.4/src/mdescriptor/registry/builtins.py +653 -0
  47. mdescriptor-0.2.4/src/mdescriptor/registry/info.py +581 -0
  48. mdescriptor-0.2.4/src/mdescriptor/registry/model_defaults.py +41 -0
  49. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/registry/spec.py +5 -0
  50. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/_golden.py +24 -3
  51. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/contracts/test_capabilities.py +1 -0
  52. mdescriptor-0.2.4/tests/contracts/test_descriptor_info.py +384 -0
  53. mdescriptor-0.2.4/tests/contracts/test_input_schema.py +48 -0
  54. mdescriptor-0.2.4/tests/contracts/test_public_api.py +474 -0
  55. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/contracts/test_result_schema.py +41 -1
  56. mdescriptor-0.2.4/tests/data/mlip4_mtp6_carbon.json +1 -0
  57. mdescriptor-0.2.4/tests/external_reference/__init__.py +1 -0
  58. mdescriptor-0.2.4/tests/external_reference/test_deepmd.py +119 -0
  59. mdescriptor-0.2.4/tests/external_reference/test_dscribe.py +289 -0
  60. mdescriptor-0.2.4/tests/external_reference/test_featomic.py +370 -0
  61. mdescriptor-0.2.4/tests/external_reference/test_nep_adapters.py +45 -0
  62. mdescriptor-0.2.4/tests/external_reference/test_pyxtalff.py +153 -0
  63. mdescriptor-0.2.4/tests/golden/ace/expected_output.npz +0 -0
  64. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/ace/manifest.json +29 -3
  65. mdescriptor-0.2.4/tests/golden/acsf/external_expected_output.npz +0 -0
  66. mdescriptor-0.2.4/tests/golden/acsf/external_input.npz +0 -0
  67. mdescriptor-0.2.4/tests/golden/acsf/external_manifest.json +179 -0
  68. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/acsf/manifest.json +14 -0
  69. mdescriptor-0.2.4/tests/golden/atomiccomposition/external_expected_output.npz +0 -0
  70. mdescriptor-0.2.4/tests/golden/atomiccomposition/external_input.npz +0 -0
  71. mdescriptor-0.2.4/tests/golden/atomiccomposition/external_manifest.json +83 -0
  72. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/atomiccomposition/manifest.json +14 -0
  73. mdescriptor-0.2.4/tests/golden/c00psmlff/expected_output.npz +0 -0
  74. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/c00psmlff/manifest.json +37 -7
  75. mdescriptor-0.2.4/tests/golden/coulombmatrix/external_expected_output.npz +0 -0
  76. mdescriptor-0.2.4/tests/golden/coulombmatrix/external_input.npz +0 -0
  77. mdescriptor-0.2.4/tests/golden/coulombmatrix/external_manifest.json +78 -0
  78. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/coulombmatrix/manifest.json +14 -0
  79. mdescriptor-0.2.4/tests/golden/dpa4/expected_output.npz +0 -0
  80. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/dpa4/manifest.json +31 -4
  81. mdescriptor-0.2.4/tests/golden/dpa4c/expected_output.npz +0 -0
  82. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/dpa4c/manifest.json +31 -4
  83. mdescriptor-0.2.4/tests/golden/ead/external_expected_output.npz +0 -0
  84. mdescriptor-0.2.4/tests/golden/ead/external_input.npz +0 -0
  85. mdescriptor-0.2.4/tests/golden/ead/external_manifest.json +88 -0
  86. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/ead/manifest.json +14 -0
  87. mdescriptor-0.2.4/tests/golden/ewaldsummatrix/external_expected_output.npz +0 -0
  88. mdescriptor-0.2.4/tests/golden/ewaldsummatrix/external_input.npz +0 -0
  89. mdescriptor-0.2.4/tests/golden/ewaldsummatrix/external_manifest.json +83 -0
  90. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/ewaldsummatrix/manifest.json +16 -2
  91. mdescriptor-0.2.4/tests/golden/lbispectrum/expected_output.npz +0 -0
  92. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/lbispectrum/manifest.json +27 -6
  93. mdescriptor-0.2.4/tests/golden/lmbtr/external_expected_output.npz +0 -0
  94. mdescriptor-0.2.4/tests/golden/lmbtr/external_input.npz +0 -0
  95. mdescriptor-0.2.4/tests/golden/lmbtr/external_manifest.json +155 -0
  96. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/lmbtr/manifest.json +14 -0
  97. mdescriptor-0.2.4/tests/golden/lodesphericalexpansion/external_expected_output.npz +0 -0
  98. mdescriptor-0.2.4/tests/golden/lodesphericalexpansion/external_input.npz +0 -0
  99. mdescriptor-0.2.4/tests/golden/lodesphericalexpansion/external_manifest.json +195 -0
  100. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/lodesphericalexpansion/manifest.json +14 -0
  101. mdescriptor-0.2.4/tests/golden/mbtr/external_expected_output.npz +0 -0
  102. mdescriptor-0.2.4/tests/golden/mbtr/external_input.npz +0 -0
  103. mdescriptor-0.2.4/tests/golden/mbtr/external_manifest.json +152 -0
  104. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/mbtr/manifest.json +14 -0
  105. mdescriptor-0.2.4/tests/golden/mtp/expected_output.npz +0 -0
  106. mdescriptor-0.2.4/tests/golden/mtp/manifest.json +146 -0
  107. mdescriptor-0.2.4/tests/golden/neighborlist/external_expected_output.npz +0 -0
  108. mdescriptor-0.2.4/tests/golden/neighborlist/external_input.npz +0 -0
  109. mdescriptor-0.2.4/tests/golden/neighborlist/external_manifest.json +77 -0
  110. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/neighborlist/manifest.json +14 -0
  111. mdescriptor-0.2.4/tests/golden/nep/external_expected_output.npz +0 -0
  112. mdescriptor-0.2.4/tests/golden/nep/external_input.npz +0 -0
  113. mdescriptor-0.2.4/tests/golden/nep/external_manifest.json +228 -0
  114. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/nep/manifest.json +24 -0
  115. mdescriptor-0.2.4/tests/golden/sinematrix/external_expected_output.npz +0 -0
  116. mdescriptor-0.2.4/tests/golden/sinematrix/external_input.npz +0 -0
  117. mdescriptor-0.2.4/tests/golden/sinematrix/external_manifest.json +78 -0
  118. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/sinematrix/manifest.json +15 -1
  119. mdescriptor-0.2.4/tests/golden/snap/external_expected_output.npz +0 -0
  120. mdescriptor-0.2.4/tests/golden/snap/external_input.npz +0 -0
  121. mdescriptor-0.2.4/tests/golden/snap/external_manifest.json +91 -0
  122. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/snap/manifest.json +14 -0
  123. mdescriptor-0.2.4/tests/golden/so3/external_expected_output.npz +0 -0
  124. mdescriptor-0.2.4/tests/golden/so3/external_input.npz +0 -0
  125. mdescriptor-0.2.4/tests/golden/so3/external_manifest.json +84 -0
  126. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/so3/manifest.json +14 -0
  127. mdescriptor-0.2.4/tests/golden/so4/external_expected_output.npz +0 -0
  128. mdescriptor-0.2.4/tests/golden/so4/external_input.npz +0 -0
  129. mdescriptor-0.2.4/tests/golden/so4/external_manifest.json +87 -0
  130. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/so4/manifest.json +14 -0
  131. mdescriptor-0.2.4/tests/golden/soap/external_expected_output.npz +0 -0
  132. mdescriptor-0.2.4/tests/golden/soap/external_input.npz +0 -0
  133. mdescriptor-0.2.4/tests/golden/soap/external_manifest.json +164 -0
  134. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/soap/manifest.json +14 -0
  135. mdescriptor-0.2.4/tests/golden/soappowerspectrum/external_expected_output.npz +0 -0
  136. mdescriptor-0.2.4/tests/golden/soappowerspectrum/external_input.npz +0 -0
  137. mdescriptor-0.2.4/tests/golden/soappowerspectrum/external_manifest.json +246 -0
  138. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/soappowerspectrum/manifest.json +14 -0
  139. mdescriptor-0.2.4/tests/golden/soapradialspectrum/external_expected_output.npz +0 -0
  140. mdescriptor-0.2.4/tests/golden/soapradialspectrum/external_input.npz +0 -0
  141. mdescriptor-0.2.4/tests/golden/soapradialspectrum/external_manifest.json +96 -0
  142. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/soapradialspectrum/manifest.json +14 -0
  143. mdescriptor-0.2.4/tests/golden/soapturbo/expected_output.npz +0 -0
  144. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/soapturbo/manifest.json +18 -6
  145. mdescriptor-0.2.4/tests/golden/sorteddistances/external_expected_output.npz +0 -0
  146. mdescriptor-0.2.4/tests/golden/sorteddistances/external_input.npz +0 -0
  147. mdescriptor-0.2.4/tests/golden/sorteddistances/external_manifest.json +91 -0
  148. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/sorteddistances/manifest.json +14 -0
  149. mdescriptor-0.2.4/tests/golden/sphericalexpansion/external_expected_output.npz +0 -0
  150. mdescriptor-0.2.4/tests/golden/sphericalexpansion/external_input.npz +0 -0
  151. mdescriptor-0.2.4/tests/golden/sphericalexpansion/external_manifest.json +192 -0
  152. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/sphericalexpansion/manifest.json +14 -0
  153. mdescriptor-0.2.4/tests/golden/sphericalexpansionbypair/external_expected_output.npz +0 -0
  154. mdescriptor-0.2.4/tests/golden/sphericalexpansionbypair/external_input.npz +0 -0
  155. mdescriptor-0.2.4/tests/golden/sphericalexpansionbypair/external_manifest.json +111 -0
  156. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/sphericalexpansionbypair/manifest.json +14 -0
  157. mdescriptor-0.2.4/tests/golden/valleoganov/external_expected_output.npz +0 -0
  158. mdescriptor-0.2.4/tests/golden/valleoganov/external_input.npz +0 -0
  159. mdescriptor-0.2.4/tests/golden/valleoganov/external_manifest.json +141 -0
  160. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/valleoganov/manifest.json +14 -0
  161. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_ace.py +30 -1
  162. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_all_descriptors.py +0 -86
  163. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_c00ps_mlff.py +6 -6
  164. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_coulombmatrix_openmp.py +3 -1
  165. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_descriptor_symmetry.py +2 -0
  166. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_dpa4_golden.py +4 -0
  167. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_dpa4c_golden.py +4 -0
  168. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_ewaldsummatrix_openmp.py +3 -1
  169. mdescriptor-0.2.4/tests/test_external_static_goldens.py +27 -0
  170. mdescriptor-0.2.4/tests/test_golden_independence.py +161 -0
  171. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_lmbtr_openmp.py +2 -1
  172. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_nep_golden.py +4 -0
  173. mdescriptor-0.2.4/tests/test_soap_acsf_advanced.py +40 -0
  174. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_valleoganov_openmp.py +2 -1
  175. mdescriptor-0.2.2/docs/descriptor-cpp-plan.md +0 -75
  176. mdescriptor-0.2.2/docs/descriptor-inventory.md +0 -93
  177. mdescriptor-0.2.2/docs/ecosystem-comparison.md +0 -90
  178. mdescriptor-0.2.2/docs/file-inventory.md +0 -276
  179. mdescriptor-0.2.2/docs/plan.md +0 -60
  180. mdescriptor-0.2.2/docs/real-data-benchmark.md +0 -70
  181. mdescriptor-0.2.2/src/mdescriptor/__init__.py +0 -53
  182. mdescriptor-0.2.2/src/mdescriptor/core/control.py +0 -34
  183. mdescriptor-0.2.2/src/mdescriptor/core/errors.py +0 -38
  184. mdescriptor-0.2.2/src/mdescriptor/registry/__init__.py +0 -68
  185. mdescriptor-0.2.2/src/mdescriptor/registry/builtins.py +0 -50
  186. mdescriptor-0.2.2/tests/contracts/test_public_api.py +0 -208
  187. mdescriptor-0.2.2/tests/golden/ace/expected_output.npz +0 -0
  188. mdescriptor-0.2.2/tests/golden/c00psmlff/expected_output.npz +0 -0
  189. mdescriptor-0.2.2/tests/golden/dpa4/expected_output.npz +0 -0
  190. mdescriptor-0.2.2/tests/golden/dpa4c/expected_output.npz +0 -0
  191. mdescriptor-0.2.2/tests/golden/lbispectrum/expected_output.npz +0 -0
  192. mdescriptor-0.2.2/tests/golden/mtp/expected_output.npz +0 -0
  193. mdescriptor-0.2.2/tests/golden/mtp/manifest.json +0 -626
  194. mdescriptor-0.2.2/tests/golden/soapturbo/expected_output.npz +0 -0
  195. mdescriptor-0.2.2/tests/reference/test_dscribe_reference.py +0 -153
  196. mdescriptor-0.2.2/tests/test_golden_independence.py +0 -20
  197. mdescriptor-0.2.2/tests/test_soap_acsf_advanced.py +0 -114
  198. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/CMakeLists.txt +0 -0
  199. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/LICENSE +0 -0
  200. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/include/mdescriptor/ace.hpp +0 -0
  201. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/include/mdescriptor/detail/batch.hpp +0 -0
  202. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/include/mdescriptor/detail/blas.hpp +0 -0
  203. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/include/mdescriptor/detail/control.hpp +0 -0
  204. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/include/mdescriptor/detail/math3.hpp +0 -0
  205. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/include/mdescriptor/detail/species.hpp +0 -0
  206. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/include/mdescriptor/dpa4.hpp +0 -0
  207. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/include/mdescriptor/dpa4_wigner.hpp +0 -0
  208. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/include/mdescriptor/dpa4c.hpp +0 -0
  209. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/include/mdescriptor/extra.hpp +0 -0
  210. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/include/mdescriptor/local_descriptors.hpp +0 -0
  211. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/include/mdescriptor/mtp4.hpp +0 -0
  212. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/include/mdescriptor/mtp_cinf_coeffs.hpp +0 -0
  213. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/include/mdescriptor/neighbor.hpp +0 -0
  214. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/include/mdescriptor/nep.hpp +0 -0
  215. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/src/bindings/module.cpp +0 -0
  216. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/src/common/descriptor_common.hpp +0 -0
  217. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/src/common/extra_common.hpp +0 -0
  218. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/src/common/local_common.hpp +0 -0
  219. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/src/common/local_spherical_common.hpp +0 -0
  220. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/src/common/matrix_common.hpp +0 -0
  221. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/src/common/neighbor.cpp +0 -0
  222. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/src/model_backed/dpa4.cpp +0 -0
  223. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/src/model_backed/dpa4_wigner.cpp +0 -0
  224. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/src/model_backed/dpa4c.cpp +0 -0
  225. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/src/standalone/acsf.cpp +0 -0
  226. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/src/standalone/atomic_composition.cpp +0 -0
  227. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/src/standalone/coulomb_matrix.cpp +0 -0
  228. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/src/standalone/ead.cpp +0 -0
  229. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/src/standalone/ewald_sum_matrix.cpp +0 -0
  230. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/src/standalone/matrix_dispatch.cpp +0 -0
  231. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/src/standalone/mbtr.cpp +0 -0
  232. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/src/standalone/mtp4.cpp +0 -0
  233. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/src/standalone/neighbor_list.cpp +0 -0
  234. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/src/standalone/rotational_descriptors.cpp +0 -0
  235. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/src/standalone/sine_matrix.cpp +0 -0
  236. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/src/standalone/soap.cpp +0 -0
  237. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/src/standalone/soap_turbo.cpp +0 -0
  238. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/src/standalone/sorted_distances.cpp +0 -0
  239. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/src/standalone/spherical_expansion.cpp +0 -0
  240. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/cpp/src/standalone/spherical_expansion_by_pair.cpp +0 -0
  241. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/scripts/benchmark_dpa_native.py +0 -0
  242. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/scripts/benchmarking/__init__.py +0 -0
  243. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/scripts/benchmarking/benchmark_openmp_small.py +0 -0
  244. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/scripts/benchmarking/run_descriptor_benchmark.py +0 -0
  245. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/scripts/build_reference_wheel.py +0 -0
  246. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/scripts/promote_descriptor_golden.py +0 -0
  247. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/scripts/run_benchmark.py +0 -0
  248. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/scripts/verify_wheel.py +0 -0
  249. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/_native.py +0 -0
  250. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/_native.pyi +0 -0
  251. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/core/__init__.py +0 -0
  252. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/__init__.py +0 -0
  253. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/__init__.py +0 -0
  254. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/dpa4.py +0 -0
  255. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/dpa4c.py +0 -0
  256. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/local.py +0 -0
  257. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/nep.py +0 -0
  258. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/rotational.py +0 -0
  259. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/__init__.py +0 -0
  260. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/LICENSE-LGPL-3.0-or-later.txt +0 -0
  261. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/NOTICE.md +0 -0
  262. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/__init__.py +0 -0
  263. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/__init__.py +0 -0
  264. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/api.py +0 -0
  265. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/common.py +0 -0
  266. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/__init__.py +0 -0
  267. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/array_api.py +0 -0
  268. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/common.py +0 -0
  269. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/__init__.py +0 -0
  270. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/base_descriptor.py +0 -0
  271. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4.py +0 -0
  272. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/__init__.py +0 -0
  273. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/activation.py +0 -0
  274. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/attention.py +0 -0
  275. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/attn_res.py +0 -0
  276. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/block.py +0 -0
  277. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/cartesian.py +0 -0
  278. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/edge_cache.py +0 -0
  279. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/embedding.py +0 -0
  280. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/ffn.py +0 -0
  281. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/grid_net.py +0 -0
  282. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/indexing.py +0 -0
  283. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/mlp.py +0 -0
  284. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/norm.py +0 -0
  285. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/projection.py +0 -0
  286. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/radial.py +0 -0
  287. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/so2.py +0 -0
  288. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/so3.py +0 -0
  289. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/utils.py +0 -0
  290. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/wignerd.py +0 -0
  291. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c.py +0 -0
  292. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/__init__.py +0 -0
  293. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/bispectrum.py +0 -0
  294. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/charge_state.py +0 -0
  295. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/geometry.py +0 -0
  296. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/pair_film.py +0 -0
  297. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/readout.py +0 -0
  298. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/spin.py +0 -0
  299. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/make_base_descriptor.py +0 -0
  300. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/__init__.py +0 -0
  301. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/env_mat.py +0 -0
  302. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/exclude_mask.py +0 -0
  303. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/lebedev.py +0 -0
  304. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/lebedev_rules.npz +0 -0
  305. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/__init__.py +0 -0
  306. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/builder.py +0 -0
  307. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/csr.py +0 -0
  308. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/from_ijs.py +0 -0
  309. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/graph.py +0 -0
  310. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/pairs.py +0 -0
  311. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/segment.py +0 -0
  312. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/network.py +0 -0
  313. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/nlist.py +0 -0
  314. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/region.py +0 -0
  315. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/safe_gradient.py +0 -0
  316. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/seed.py +0 -0
  317. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/spherical_harmonics.py +0 -0
  318. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/type_embed.py +0 -0
  319. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/env.py +0 -0
  320. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/utils/__init__.py +0 -0
  321. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/utils/charge_state.py +0 -0
  322. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/utils/plugin.py +0 -0
  323. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/utils/version.py +0 -0
  324. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/weights.py +0 -0
  325. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/dpa.py +0 -0
  326. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/dpa4/__init__.py +0 -0
  327. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/dpa4/descriptor.py +0 -0
  328. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/dpa4c/__init__.py +0 -0
  329. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/dpa4c/descriptor.py +0 -0
  330. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/graph.py +0 -0
  331. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/nep/__init__.py +0 -0
  332. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/nep/descriptor.py +0 -0
  333. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/__init__.py +0 -0
  334. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/ace.py +0 -0
  335. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/acsf.py +0 -0
  336. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/c00ps_mlff.py +0 -0
  337. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/local/__init__.py +0 -0
  338. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/many_body/__init__.py +0 -0
  339. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/matrices/__init__.py +0 -0
  340. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/mtp.py +0 -0
  341. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/rotational/__init__.py +0 -0
  342. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/soap.py +0 -0
  343. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/soap_turbo.py +0 -0
  344. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/models/assets/DPA4-Air-OMat24-v20260704.pt +0 -0
  345. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/models/assets/DPA4C-Air-OMat24-v20260819.pt +0 -0
  346. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/models/assets/nep89_20250409.txt +0 -0
  347. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/models/resolver.py +0 -0
  348. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/models/session.py +0 -0
  349. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/src/mdescriptor/registry/registry.py +0 -0
  350. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/__init__.py +0 -0
  351. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/_public.py +0 -0
  352. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/contracts/test_model_resources.py +0 -0
  353. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/data/mlip4_test_mtp.json +0 -0
  354. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/ace/input.npz +0 -0
  355. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/acsf/expected_output.npz +0 -0
  356. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/acsf/input.npz +0 -0
  357. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/atomiccomposition/expected_output.npz +0 -0
  358. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/atomiccomposition/input.npz +0 -0
  359. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/c00psmlff/input.npz +0 -0
  360. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/coulombmatrix/expected_output.npz +0 -0
  361. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/coulombmatrix/input.npz +0 -0
  362. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/dpa4/input.npz +0 -0
  363. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/dpa4c/input.npz +0 -0
  364. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/ead/expected_output.npz +0 -0
  365. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/ead/input.npz +0 -0
  366. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/ewaldsummatrix/expected_output.npz +0 -0
  367. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/ewaldsummatrix/input.npz +0 -0
  368. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/lbispectrum/input.npz +0 -0
  369. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/lmbtr/expected_output.npz +0 -0
  370. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/lmbtr/input.npz +0 -0
  371. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/lodesphericalexpansion/expected_output.npz +0 -0
  372. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/lodesphericalexpansion/input.npz +0 -0
  373. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/mbtr/expected_output.npz +0 -0
  374. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/mbtr/input.npz +0 -0
  375. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/mtp/input.npz +0 -0
  376. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/neighborlist/expected_output.npz +0 -0
  377. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/neighborlist/input.npz +0 -0
  378. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/nep/expected_output.npz +0 -0
  379. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/nep/input.npz +0 -0
  380. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/sinematrix/expected_output.npz +0 -0
  381. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/sinematrix/input.npz +0 -0
  382. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/snap/expected_output.npz +0 -0
  383. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/snap/input.npz +0 -0
  384. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/so3/expected_output.npz +0 -0
  385. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/so3/input.npz +0 -0
  386. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/so4/expected_output.npz +0 -0
  387. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/so4/input.npz +0 -0
  388. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/soap/expected_output.npz +0 -0
  389. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/soap/input.npz +0 -0
  390. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/soappowerspectrum/expected_output.npz +0 -0
  391. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/soappowerspectrum/input.npz +0 -0
  392. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/soapradialspectrum/expected_output.npz +0 -0
  393. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/soapradialspectrum/input.npz +0 -0
  394. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/soapturbo/input.npz +0 -0
  395. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/sorteddistances/expected_output.npz +0 -0
  396. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/sorteddistances/input.npz +0 -0
  397. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/sphericalexpansion/expected_output.npz +0 -0
  398. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/sphericalexpansion/input.npz +0 -0
  399. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/sphericalexpansionbypair/expected_output.npz +0 -0
  400. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/sphericalexpansionbypair/input.npz +0 -0
  401. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/valleoganov/expected_output.npz +0 -0
  402. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/golden/valleoganov/input.npz +0 -0
  403. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_ace_golden.py +0 -0
  404. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_acsf_golden.py +0 -0
  405. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_atomiccomposition_golden.py +0 -0
  406. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_c00psmlff_golden.py +0 -0
  407. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_coulombmatrix_golden.py +0 -0
  408. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_dpa4.py +0 -0
  409. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_dpa4c.py +0 -0
  410. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_ead_golden.py +0 -0
  411. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_ewaldsummatrix_golden.py +0 -0
  412. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_lbispectrum_golden.py +0 -0
  413. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_lmbtr_golden.py +0 -0
  414. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_lodesphericalexpansion_golden.py +0 -0
  415. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_mbtr_golden.py +0 -0
  416. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_mtp.py +0 -0
  417. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_mtp_golden.py +0 -0
  418. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_neighbor_graph.py +0 -0
  419. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_neighborlist_golden.py +0 -0
  420. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_nep.py +0 -0
  421. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_nonperiodic.py +0 -0
  422. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_openmp_support.py +0 -0
  423. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_reference.py +0 -0
  424. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_sinematrix_golden.py +0 -0
  425. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_sinematrix_openmp.py +0 -0
  426. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_snap_golden.py +0 -0
  427. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_so3_golden.py +0 -0
  428. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_so4_golden.py +0 -0
  429. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_soap_golden.py +0 -0
  430. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_soappowerspectrum_golden.py +0 -0
  431. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_soapradialspectrum_golden.py +0 -0
  432. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_soapturbo_golden.py +0 -0
  433. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_sorteddistances_golden.py +0 -0
  434. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_sphericalexpansion_golden.py +0 -0
  435. {mdescriptor-0.2.2 → mdescriptor-0.2.4}/tests/test_sphericalexpansionbypair_golden.py +0 -0
  436. {mdescriptor-0.2.2 → 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.2
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,18 +687,41 @@ 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
- Provides-Extra: reference
693
- Requires-Dist: pytest>=8; extra == "reference"
694
- Requires-Dist: ase==3.26.0; extra == "reference"
695
- Requires-Dist: scipy>=1.11; extra == "reference"
696
- Requires-Dist: dscribe==2.1.2; extra == "reference"
693
+ Provides-Extra: reference-dscribe
694
+ Requires-Dist: pytest>=8; extra == "reference-dscribe"
695
+ Requires-Dist: ase==3.26.0; extra == "reference-dscribe"
696
+ Requires-Dist: scipy>=1.11; extra == "reference-dscribe"
697
+ Requires-Dist: dscribe==2.1.2; extra == "reference-dscribe"
698
+ Provides-Extra: reference-featomic
699
+ Requires-Dist: pytest>=8; extra == "reference-featomic"
700
+ Requires-Dist: ase==3.26.0; extra == "reference-featomic"
701
+ Requires-Dist: scipy>=1.11; extra == "reference-featomic"
702
+ Requires-Dist: featomic==0.6.6; extra == "reference-featomic"
703
+ Provides-Extra: reference-pyxtalff
704
+ Requires-Dist: pytest>=8; extra == "reference-pyxtalff"
705
+ Requires-Dist: ase==3.26.0; extra == "reference-pyxtalff"
706
+ Requires-Dist: scipy>=1.11; extra == "reference-pyxtalff"
707
+ Requires-Dist: numba>=0.50.1; extra == "reference-pyxtalff"
708
+ Requires-Dist: pyxtal_ff==0.2.3; extra == "reference-pyxtalff"
709
+ Provides-Extra: reference-deepmd
710
+ Requires-Dist: pytest>=8; extra == "reference-deepmd"
711
+ Requires-Dist: ase==3.26.0; extra == "reference-deepmd"
712
+ Requires-Dist: scipy>=1.11; extra == "reference-deepmd"
713
+ Requires-Dist: deepmd-kit[torch]==3.2.0; extra == "reference-deepmd"
714
+ Provides-Extra: reference-nepadapters
715
+ Requires-Dist: pytest>=8; extra == "reference-nepadapters"
716
+ Requires-Dist: ase==3.26.0; extra == "reference-nepadapters"
717
+ Requires-Dist: scipy>=1.11; extra == "reference-nepadapters"
718
+ Requires-Dist: nep-adapters==1.0.2; extra == "reference-nepadapters"
697
719
  Provides-Extra: all
698
720
  Requires-Dist: ase>=3.22; extra == "all"
699
721
  Requires-Dist: scipy>=1.11; extra == "all"
700
722
  Provides-Extra: dev
701
723
  Requires-Dist: pytest>=8; extra == "dev"
724
+ Requires-Dist: pytest-cov>=7; extra == "dev"
702
725
  Requires-Dist: ase>=3.22; extra == "dev"
703
726
  Requires-Dist: scipy>=1.11; extra == "dev"
704
727
  Requires-Dist: ruff>=0.8; extra == "dev"
@@ -726,8 +749,10 @@ src/mdescriptor/descriptors/
726
749
  model_backed/ graph seam plus NEP, DPA4, DPA4C
727
750
  src/mdescriptor/models/assets/ packaged, hash-verified model resources
728
751
  tests/golden/ descriptor-owned, benchmark-independent accuracy fixtures
752
+ docs/numerical-baselines.md static-golden and external-runtime oracle inventory
729
753
  scripts/benchmarking/ controlled local benchmark runners
730
- 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
731
756
  ```
732
757
 
733
758
  `standalone` descriptors never require a model file. `model_backed` descriptors
@@ -760,6 +785,23 @@ installing Torch; the supported default graphs run through the C++17/OpenMP
760
785
  backend and specialised configurations retain the NumPy fallback. No network
761
786
  model download is performed.
762
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
+
763
805
  性能说明:DPA4 native 路径现在使用固定大小分块的 SGEMM、可复用的计算工作区,
764
806
  并只为每条边计算一次 attention logit;DPA4C 的类型对 MLP 采用每个 calculator
765
807
  实例独立的惰性缓存。OpenBLAS 仅作为构建依赖,官方 wheel 会内置 prefixed 的
@@ -796,7 +838,8 @@ batch = StructureBatch(
796
838
  )
797
839
  ```
798
840
 
799
- `StructureBatch` validates contiguous arrays, finite positions/cells,
841
+ `StructureBatch` takes an owned, read-only snapshot of its contiguous arrays
842
+ and validates integer fields before narrowing, finite positions/cells,
800
843
  nonsingular cells, positive atomic numbers, monotonic offsets and fully
801
844
  periodic `pbc == (1, 1, 1)`. ASE conversion is available through
802
845
  `StructureBatch.from_ase(...)`.
@@ -841,7 +884,51 @@ Instances are synchronous and not promised to be thread-safe.
841
884
  `structure_ids`, row offsets, stable `labels`, JSON-safe `metadata`, per-row
842
885
  `samples`, and `feature_count`. The descriptor itself also retains the latest
843
886
  JSON-safe `metadata` and its `configuration` after `close()`. The standard shapes are `(N, F)`, `(S, F)`,
844
- and `(P, F)` for atom, structure and pair outputs respectively.
887
+ and `(P, F)` for atom, structure and pair outputs respectively. Result arrays
888
+ are owned snapshots and exposed read-only.
889
+
890
+ ## Supported descriptors / 支持的描述符
891
+
892
+ The built-in registry currently provides 28 descriptors. `None` means no model
893
+ file is needed; `Optional` means a model can be supplied (as with MTP); and
894
+ `Required` means the descriptor always resolves a local model resource. See
895
+ the [full descriptor inventory](docs/descriptor-inventory.md) for parameters,
896
+ capabilities and backend details.
897
+
898
+ 内置注册表目前提供 28 个描述符。`None` 表示不需要模型文件;`Optional` 表示
899
+ 可以提供模型(例如 MTP);`Required` 表示描述符始终解析本地模型资源。参数、
900
+ 能力和后端详情请参阅[完整描述符清单](docs/descriptor-inventory.md)。
901
+
902
+ | Descriptor / 描述符 | Category / 类型 | Output / 输出 | Model / 模型 |
903
+ |---|---|---|---|
904
+ | `SOAP` | Local / 局部 | Structure / 结构 | `None` |
905
+ | `SOAPTurbo` | Local / 局部 | Atom / 原子 | `None` |
906
+ | `ACSF` | Local / 局部 | Atom / 原子 | `None` |
907
+ | `ACE` | Local / 局部 | Atom / 原子 | `None` |
908
+ | `CoulombMatrix` | Matrix / 矩阵 | Structure / 结构 | `None` |
909
+ | `SineMatrix` | Matrix / 矩阵 | Structure / 结构 | `None` |
910
+ | `EwaldSumMatrix` | Matrix / 矩阵 | Structure / 结构 | `None` |
911
+ | `MBTR` | Many-body / 多体 | Structure / 结构 | `None` |
912
+ | `LMBTR` | Many-body / 多体 | Atom / 原子 | `None` |
913
+ | `ValleOganov` | Many-body / 多体 | Structure / 结构 | `None` |
914
+ | `AtomicComposition` | Local / 局部 | Structure / 结构 | `None` |
915
+ | `NeighborList` | Local / 局部 | Pair / 原子对 | `None` |
916
+ | `SortedDistances` | Local / 局部 | Atom / 原子 | `None` |
917
+ | `SphericalExpansion` | Local / 局部 | Atom / 原子 | `None` |
918
+ | `SphericalExpansionByPair` | Local / 局部 | Pair / 原子对 | `None` |
919
+ | `SoapRadialSpectrum` | Local / 局部 | Atom / 原子 | `None` |
920
+ | `SoapPowerSpectrum` | Local / 局部 | Atom / 原子 | `None` |
921
+ | `LodeSphericalExpansion` | Local / 局部 | Atom / 原子 | `None` |
922
+ | `EAD` | Rotational / 旋转 | Atom / 原子 | `None` |
923
+ | `SO3` | Rotational / 旋转 | Atom / 原子 | `None` |
924
+ | `SO4` | Rotational / 旋转 | Atom / 原子 | `None` |
925
+ | `SNAP` | Rotational / 旋转 | Atom / 原子 | `None` |
926
+ | `LBispectrum` | Rotational / 旋转 | Atom / 原子 | `None` |
927
+ | `MTP` | Local / 局部 | Atom / 原子 | `Optional` |
928
+ | `C00PSMLFF` | Local / 局部 | Atom / 原子 | `None` |
929
+ | `NEP` | Model-backed / 模型 | Atom / 原子 | `Required` |
930
+ | `DPA4` | Model-backed / 模型 | Atom / 原子 | `Required` |
931
+ | `DPA4C` | Model-backed / 模型 | Atom / 原子 | `Required` |
845
932
 
846
933
  ## Registry / 注册表
847
934
 
@@ -853,6 +940,8 @@ import mdescriptor
853
940
  from mdescriptor.descriptors import SOAP
854
941
 
855
942
  print(mdescriptor.list_descriptors())
943
+ metadata = mdescriptor.describe_descriptor("SOAP")
944
+ runtime = mdescriptor.get_runtime_info()
856
945
  soap = SOAP(species=[1, 8], r_cut=4.5, n_max=2, l_max=2)
857
946
  rebuilt = mdescriptor.create_descriptor(soap.configuration)
858
947
 
@@ -863,7 +952,10 @@ child.register(my_spec)
863
952
  The built-in list separates `AssetPolicy.NONE`, `OPTIONAL` (for example MTP
864
953
  potentials), and `REQUIRED` (NEP/DPA4/DPA4C). The root package exposes stable
865
954
  contracts, registry functions and errors only; algorithm implementations are
866
- not re-exported from the root.
955
+ not re-exported from the root. `describe_descriptor(name)` reads static,
956
+ JSON-safe GUI metadata from the registry without constructing a descriptor or
957
+ resolving a model. `get_runtime_info()` reports the package and contract
958
+ schema versions, including `result_schema_version`.
867
959
 
868
960
  ## Model resources / 模型资源
869
961
 
@@ -882,7 +974,11 @@ dpa4 = DPA4(
882
974
  result = dpa4.compute(batch)
883
975
  ```
884
976
 
885
- The DPA4/DPA4C checkpoint readers and NumPy reference path remain isolated
977
+ For GUI configuration JSON, a model parameter may be an explicit path string
978
+ or the tagged object returned by `ModelResource.to_dict()`; the latter is used
979
+ for named/checksummed resources.
980
+
981
+ The DPA4/DPA4C checkpoint readers and NumPy fallback path remain isolated
886
982
  vendor adapters. The default inference graphs are lowered into the private
887
983
  `mdescriptor._native` C++17/OpenMP extension.
888
984
 
@@ -891,8 +987,19 @@ vendor adapters. The default inference graphs are lowered into the private
891
987
  ```bash
892
988
  .venv/bin/python -m pip install -e . --no-build-isolation
893
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
894
995
  ```
895
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
+
896
1003
  The extension is private (`mdescriptor._native`). C++ shared math and batch
897
1004
  helpers live in named headers under `cpp/include/mdescriptor/detail/`.
898
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 的
@@ -89,7 +108,8 @@ batch = StructureBatch(
89
108
  )
90
109
  ```
91
110
 
92
- `StructureBatch` validates contiguous arrays, finite positions/cells,
111
+ `StructureBatch` takes an owned, read-only snapshot of its contiguous arrays
112
+ and validates integer fields before narrowing, finite positions/cells,
93
113
  nonsingular cells, positive atomic numbers, monotonic offsets and fully
94
114
  periodic `pbc == (1, 1, 1)`. ASE conversion is available through
95
115
  `StructureBatch.from_ase(...)`.
@@ -134,7 +154,51 @@ Instances are synchronous and not promised to be thread-safe.
134
154
  `structure_ids`, row offsets, stable `labels`, JSON-safe `metadata`, per-row
135
155
  `samples`, and `feature_count`. The descriptor itself also retains the latest
136
156
  JSON-safe `metadata` and its `configuration` after `close()`. The standard shapes are `(N, F)`, `(S, F)`,
137
- and `(P, F)` for atom, structure and pair outputs respectively.
157
+ and `(P, F)` for atom, structure and pair outputs respectively. Result arrays
158
+ are owned snapshots and exposed read-only.
159
+
160
+ ## Supported descriptors / 支持的描述符
161
+
162
+ The built-in registry currently provides 28 descriptors. `None` means no model
163
+ file is needed; `Optional` means a model can be supplied (as with MTP); and
164
+ `Required` means the descriptor always resolves a local model resource. See
165
+ the [full descriptor inventory](docs/descriptor-inventory.md) for parameters,
166
+ capabilities and backend details.
167
+
168
+ 内置注册表目前提供 28 个描述符。`None` 表示不需要模型文件;`Optional` 表示
169
+ 可以提供模型(例如 MTP);`Required` 表示描述符始终解析本地模型资源。参数、
170
+ 能力和后端详情请参阅[完整描述符清单](docs/descriptor-inventory.md)。
171
+
172
+ | Descriptor / 描述符 | Category / 类型 | Output / 输出 | Model / 模型 |
173
+ |---|---|---|---|
174
+ | `SOAP` | Local / 局部 | Structure / 结构 | `None` |
175
+ | `SOAPTurbo` | Local / 局部 | Atom / 原子 | `None` |
176
+ | `ACSF` | Local / 局部 | Atom / 原子 | `None` |
177
+ | `ACE` | Local / 局部 | Atom / 原子 | `None` |
178
+ | `CoulombMatrix` | Matrix / 矩阵 | Structure / 结构 | `None` |
179
+ | `SineMatrix` | Matrix / 矩阵 | Structure / 结构 | `None` |
180
+ | `EwaldSumMatrix` | Matrix / 矩阵 | Structure / 结构 | `None` |
181
+ | `MBTR` | Many-body / 多体 | Structure / 结构 | `None` |
182
+ | `LMBTR` | Many-body / 多体 | Atom / 原子 | `None` |
183
+ | `ValleOganov` | Many-body / 多体 | Structure / 结构 | `None` |
184
+ | `AtomicComposition` | Local / 局部 | Structure / 结构 | `None` |
185
+ | `NeighborList` | Local / 局部 | Pair / 原子对 | `None` |
186
+ | `SortedDistances` | Local / 局部 | Atom / 原子 | `None` |
187
+ | `SphericalExpansion` | Local / 局部 | Atom / 原子 | `None` |
188
+ | `SphericalExpansionByPair` | Local / 局部 | Pair / 原子对 | `None` |
189
+ | `SoapRadialSpectrum` | Local / 局部 | Atom / 原子 | `None` |
190
+ | `SoapPowerSpectrum` | Local / 局部 | Atom / 原子 | `None` |
191
+ | `LodeSphericalExpansion` | Local / 局部 | Atom / 原子 | `None` |
192
+ | `EAD` | Rotational / 旋转 | Atom / 原子 | `None` |
193
+ | `SO3` | Rotational / 旋转 | Atom / 原子 | `None` |
194
+ | `SO4` | Rotational / 旋转 | Atom / 原子 | `None` |
195
+ | `SNAP` | Rotational / 旋转 | Atom / 原子 | `None` |
196
+ | `LBispectrum` | Rotational / 旋转 | Atom / 原子 | `None` |
197
+ | `MTP` | Local / 局部 | Atom / 原子 | `Optional` |
198
+ | `C00PSMLFF` | Local / 局部 | Atom / 原子 | `None` |
199
+ | `NEP` | Model-backed / 模型 | Atom / 原子 | `Required` |
200
+ | `DPA4` | Model-backed / 模型 | Atom / 原子 | `Required` |
201
+ | `DPA4C` | Model-backed / 模型 | Atom / 原子 | `Required` |
138
202
 
139
203
  ## Registry / 注册表
140
204
 
@@ -146,6 +210,8 @@ import mdescriptor
146
210
  from mdescriptor.descriptors import SOAP
147
211
 
148
212
  print(mdescriptor.list_descriptors())
213
+ metadata = mdescriptor.describe_descriptor("SOAP")
214
+ runtime = mdescriptor.get_runtime_info()
149
215
  soap = SOAP(species=[1, 8], r_cut=4.5, n_max=2, l_max=2)
150
216
  rebuilt = mdescriptor.create_descriptor(soap.configuration)
151
217
 
@@ -156,7 +222,10 @@ child.register(my_spec)
156
222
  The built-in list separates `AssetPolicy.NONE`, `OPTIONAL` (for example MTP
157
223
  potentials), and `REQUIRED` (NEP/DPA4/DPA4C). The root package exposes stable
158
224
  contracts, registry functions and errors only; algorithm implementations are
159
- not re-exported from the root.
225
+ not re-exported from the root. `describe_descriptor(name)` reads static,
226
+ JSON-safe GUI metadata from the registry without constructing a descriptor or
227
+ resolving a model. `get_runtime_info()` reports the package and contract
228
+ schema versions, including `result_schema_version`.
160
229
 
161
230
  ## Model resources / 模型资源
162
231
 
@@ -175,7 +244,11 @@ dpa4 = DPA4(
175
244
  result = dpa4.compute(batch)
176
245
  ```
177
246
 
178
- The DPA4/DPA4C checkpoint readers and NumPy reference path remain isolated
247
+ For GUI configuration JSON, a model parameter may be an explicit path string
248
+ or the tagged object returned by `ModelResource.to_dict()`; the latter is used
249
+ for named/checksummed resources.
250
+
251
+ The DPA4/DPA4C checkpoint readers and NumPy fallback path remain isolated
179
252
  vendor adapters. The default inference graphs are lowered into the private
180
253
  `mdescriptor._native` C++17/OpenMP extension.
181
254
 
@@ -184,8 +257,19 @@ vendor adapters. The default inference graphs are lowered into the private
184
257
  ```bash
185
258
  .venv/bin/python -m pip install -e . --no-build-isolation
186
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
187
265
  ```
188
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
+
189
273
  The extension is private (`mdescriptor._native`). C++ shared math and batch
190
274
  helpers live in named headers under `cpp/include/mdescriptor/detail/`.
191
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;
@@ -1,8 +1,13 @@
1
1
  #include "mdescriptor/descriptor.hpp"
2
2
 
3
+ #include <stdexcept>
4
+
3
5
  namespace mdescriptor {
4
6
 
5
7
  void ComputeControl::reset(std::int64_t total) {
8
+ if (total < 0) {
9
+ throw std::invalid_argument("control total must be non-negative");
10
+ }
6
11
  cancelled_.store(false, std::memory_order_release);
7
12
  completed_.store(0, std::memory_order_release);
8
13
  total_.store(total, std::memory_order_release);
@@ -693,6 +693,9 @@ void compute_nep(
693
693
  int num_threads,
694
694
  double* output,
695
695
  const std::shared_ptr<ComputeControl>& control) {
696
+ if (control) {
697
+ control->reset(batch.structures);
698
+ }
696
699
  const std::size_t radial_basis = static_cast<std::size_t>(model.basis_size_radial + 1);
697
700
  const std::size_t angular_basis = static_cast<std::size_t>(model.basis_size_angular + 1);
698
701
  const std::size_t radial_n = static_cast<std::size_t>(model.n_max_radial + 1);
@@ -858,6 +861,9 @@ void compute_nep(
858
861
  for (std::int64_t structure = 0; structure < batch.structures; ++structure) {
859
862
  if (control && control->cancelled()) break;
860
863
  compute_structure(structure, radial, sums, angular, basis);
864
+ if (control && !control->cancelled()) {
865
+ control->mark_completed();
866
+ }
861
867
  }
862
868
  if (control && control->cancelled()) throw CancelledError();
863
869
  return;
@@ -883,6 +889,9 @@ void compute_nep(
883
889
  if (control && control->cancelled()) continue;
884
890
  try {
885
891
  compute_structure(structure, radial, sums, angular, basis);
892
+ if (control && !control->cancelled()) {
893
+ control->mark_completed();
894
+ }
886
895
  } catch (...) {
887
896
  record_error(std::current_exception());
888
897
  }
@@ -897,6 +906,9 @@ void compute_nep(
897
906
  if (control && control->cancelled()) break;
898
907
  try {
899
908
  compute_structure(structure, radial, sums, angular, basis);
909
+ if (control && !control->cancelled()) {
910
+ control->mark_completed();
911
+ }
900
912
  } catch (...) {
901
913
  record_error(std::current_exception());
902
914
  break;
@@ -935,6 +947,9 @@ void compute_nep(
935
947
  }
936
948
  #endif
937
949
  if (control && control->cancelled()) throw CancelledError();
950
+ if (control) {
951
+ control->mark_completed();
952
+ }
938
953
  }
939
954
 
940
955
  NepCalculator::NepCalculator(NepOptions options)
@@ -805,6 +805,7 @@ void AceCalculator::compute(
805
805
  const std::shared_ptr<ComputeControl>& control) const {
806
806
  if (closed()) throw std::runtime_error("ACE calculator is closed");
807
807
  std::lock_guard<std::mutex> lock(compute_mutex_);
808
+ if (control) control->reset(batch.structures);
808
809
  const auto graph = build_neighbor_graph(batch, options_.r_cut, control, options_.num_threads);
809
810
  std::map<std::int32_t, int> species_index;
810
811
  for (std::size_t i = 0; i < options_.species.size(); ++i) {
@@ -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.
@@ -752,6 +752,9 @@ void MtpCalculator::compute(
752
752
  throw std::runtime_error("MTP calculator is closed");
753
753
  }
754
754
  std::lock_guard<std::mutex> lock(compute_mutex_);
755
+ if (control) {
756
+ control->reset(batch.structures);
757
+ }
755
758
  if (official_model_) {
756
759
  if (official_model_->native_mlip4) {
757
760
  official_model_->native_model->compute(batch, options_.species, options_.num_threads, output, control);
@@ -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)