MDescriptor 0.2.4__tar.gz → 0.2.6__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 (419) hide show
  1. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/CMakeLists.txt +2 -0
  2. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/PKG-INFO +23 -5
  3. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/README.md +22 -4
  4. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/include/mdescriptor/detail/control.hpp +9 -0
  5. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/bindings/module.cpp +21 -28
  6. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/model_backed/dpa4.cpp +4 -3
  7. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/model_backed/dpa4c.cpp +27 -1
  8. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/ewald_sum_matrix.cpp +3 -0
  9. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/docs/descriptor-inventory.md +3 -3
  10. mdescriptor-0.2.6/docs/gui-adaptation-baseline.md +80 -0
  11. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/verify_wheel.py +6 -0
  12. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/__init__.py +35 -1
  13. mdescriptor-0.2.6/src/mdescriptor/_runtime.py +76 -0
  14. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/_version.py +3 -3
  15. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/core/__init__.py +2 -0
  16. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/core/adapter.py +133 -6
  17. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/core/errors.py +7 -0
  18. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/core/input.py +106 -3
  19. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/core/model_adapter.py +4 -1
  20. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/_kernels/dpa4.py +3 -28
  21. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/_kernels/dpa4c.py +3 -28
  22. mdescriptor-0.2.6/src/mdescriptor/descriptors/_kernels/dpa_common.py +51 -0
  23. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/_kernels/extra.py +2 -2
  24. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/_kernels/local.py +5 -2
  25. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/dpa.py +9 -1
  26. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/registry/__init__.py +51 -3
  27. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/registry/builtins.py +26 -6
  28. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/registry/info.py +13 -2
  29. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/registry/spec.py +18 -0
  30. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/contracts/test_capabilities.py +3 -1
  31. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/contracts/test_descriptor_info.py +29 -1
  32. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/contracts/test_input_schema.py +27 -0
  33. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/contracts/test_public_api.py +21 -1
  34. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/ewaldsummatrix/manifest.json +1 -1
  35. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/lodesphericalexpansion/manifest.json +1 -1
  36. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sinematrix/manifest.json +1 -1
  37. mdescriptor-0.2.6/tests/test_descriptor_regressions.py +98 -0
  38. mdescriptor-0.2.6/tests/test_dpa_control.py +278 -0
  39. mdescriptor-0.2.6/tests/test_import_threading.py +154 -0
  40. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_nonperiodic.py +26 -0
  41. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/LICENSE +0 -0
  42. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/include/mdescriptor/ace.hpp +0 -0
  43. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/include/mdescriptor/descriptor.hpp +0 -0
  44. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/include/mdescriptor/detail/batch.hpp +0 -0
  45. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/include/mdescriptor/detail/blas.hpp +0 -0
  46. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/include/mdescriptor/detail/math3.hpp +0 -0
  47. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/include/mdescriptor/detail/species.hpp +0 -0
  48. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/include/mdescriptor/dpa4.hpp +0 -0
  49. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/include/mdescriptor/dpa4_wigner.hpp +0 -0
  50. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/include/mdescriptor/dpa4c.hpp +0 -0
  51. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/include/mdescriptor/extra.hpp +0 -0
  52. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/include/mdescriptor/local_descriptors.hpp +0 -0
  53. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/include/mdescriptor/mtp4.hpp +0 -0
  54. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/include/mdescriptor/mtp_cinf_coeffs.hpp +0 -0
  55. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/include/mdescriptor/neighbor.hpp +0 -0
  56. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/include/mdescriptor/nep.hpp +0 -0
  57. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/common/control.cpp +0 -0
  58. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/common/descriptor_common.hpp +0 -0
  59. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/common/extra_common.hpp +0 -0
  60. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/common/local_common.hpp +0 -0
  61. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/common/local_spherical_common.hpp +0 -0
  62. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/common/matrix_common.hpp +0 -0
  63. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/common/neighbor.cpp +0 -0
  64. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/common/nep.cpp +0 -0
  65. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/model_backed/dpa4_wigner.cpp +0 -0
  66. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/ace.cpp +0 -0
  67. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/acsf.cpp +0 -0
  68. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/atomic_composition.cpp +0 -0
  69. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/c00ps_mlff.cpp +0 -0
  70. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/coulomb_matrix.cpp +0 -0
  71. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/ead.cpp +0 -0
  72. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/matrix_dispatch.cpp +0 -0
  73. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/mbtr.cpp +0 -0
  74. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/mtp.cpp +0 -0
  75. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/mtp4.cpp +0 -0
  76. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/neighbor_list.cpp +0 -0
  77. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/rotational_descriptors.cpp +0 -0
  78. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/sine_matrix.cpp +0 -0
  79. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/soap.cpp +0 -0
  80. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/soap_turbo.cpp +0 -0
  81. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/sorted_distances.cpp +0 -0
  82. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/spherical_expansion.cpp +0 -0
  83. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/spherical_expansion_by_pair.cpp +0 -0
  84. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/tests/CMakeLists.txt +0 -0
  85. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/tests/test_public_api.cpp +0 -0
  86. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/docs/numerical-baselines.md +0 -0
  87. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/pyproject.toml +0 -0
  88. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/ace1_reference.jl +0 -0
  89. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/benchmark_dpa_native.py +0 -0
  90. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/benchmarking/__init__.py +0 -0
  91. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/benchmarking/benchmark_openmp_small.py +0 -0
  92. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/benchmarking/run_descriptor_benchmark.py +0 -0
  93. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/build_reference_wheel.py +0 -0
  94. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/check_descriptor_inventory.py +0 -0
  95. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/check_numerical_baselines.py +0 -0
  96. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/deepmd_reference.py +0 -0
  97. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/descriptor_reference.py +0 -0
  98. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/external_reference.py +0 -0
  99. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/generate_ace1_reference.py +0 -0
  100. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/generate_descriptor_goldens.py +0 -0
  101. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/generate_external_c00ps_reference.py +0 -0
  102. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/generate_external_static_goldens.py +0 -0
  103. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/numerical_baselines.py +0 -0
  104. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/promote_descriptor_golden.py +0 -0
  105. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/run_benchmark.py +0 -0
  106. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/_native.py +0 -0
  107. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/_native.pyi +0 -0
  108. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/core/control.py +0 -0
  109. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/core/descriptor.py +0 -0
  110. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/core/json_value.py +0 -0
  111. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/core/options.py +0 -0
  112. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/core/result.py +0 -0
  113. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/core/species.py +0 -0
  114. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/__init__.py +0 -0
  115. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/_kernels/__init__.py +0 -0
  116. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/_kernels/ace.py +0 -0
  117. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/_kernels/c00ps_mlff.py +0 -0
  118. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/_kernels/core.py +0 -0
  119. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/_kernels/mtp.py +0 -0
  120. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/_kernels/nep.py +0 -0
  121. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/_kernels/rotational.py +0 -0
  122. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/_kernels/soap_turbo.py +0 -0
  123. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/__init__.py +0 -0
  124. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/LICENSE-LGPL-3.0-or-later.txt +0 -0
  125. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/NOTICE.md +0 -0
  126. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/__init__.py +0 -0
  127. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/__init__.py +0 -0
  128. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/api.py +0 -0
  129. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/common.py +0 -0
  130. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/__init__.py +0 -0
  131. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/array_api.py +0 -0
  132. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/common.py +0 -0
  133. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/__init__.py +0 -0
  134. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/base_descriptor.py +0 -0
  135. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4.py +0 -0
  136. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/__init__.py +0 -0
  137. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/activation.py +0 -0
  138. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/attention.py +0 -0
  139. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/attn_res.py +0 -0
  140. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/block.py +0 -0
  141. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/cartesian.py +0 -0
  142. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/edge_cache.py +0 -0
  143. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/embedding.py +0 -0
  144. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/ffn.py +0 -0
  145. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/grid_net.py +0 -0
  146. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/indexing.py +0 -0
  147. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/mlp.py +0 -0
  148. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/norm.py +0 -0
  149. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/projection.py +0 -0
  150. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/radial.py +0 -0
  151. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/so2.py +0 -0
  152. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/so3.py +0 -0
  153. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/utils.py +0 -0
  154. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/wignerd.py +0 -0
  155. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c.py +0 -0
  156. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/__init__.py +0 -0
  157. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/bispectrum.py +0 -0
  158. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/charge_state.py +0 -0
  159. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/geometry.py +0 -0
  160. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/pair_film.py +0 -0
  161. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/readout.py +0 -0
  162. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/spin.py +0 -0
  163. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/make_base_descriptor.py +0 -0
  164. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/__init__.py +0 -0
  165. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/env_mat.py +0 -0
  166. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/exclude_mask.py +0 -0
  167. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/lebedev.py +0 -0
  168. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/lebedev_rules.npz +0 -0
  169. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/__init__.py +0 -0
  170. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/builder.py +0 -0
  171. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/csr.py +0 -0
  172. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/from_ijs.py +0 -0
  173. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/graph.py +0 -0
  174. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/pairs.py +0 -0
  175. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/segment.py +0 -0
  176. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/network.py +0 -0
  177. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/nlist.py +0 -0
  178. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/region.py +0 -0
  179. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/safe_gradient.py +0 -0
  180. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/seed.py +0 -0
  181. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/spherical_harmonics.py +0 -0
  182. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/type_embed.py +0 -0
  183. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/env.py +0 -0
  184. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/utils/__init__.py +0 -0
  185. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/utils/charge_state.py +0 -0
  186. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/utils/plugin.py +0 -0
  187. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/utils/version.py +0 -0
  188. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/weights.py +0 -0
  189. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/dpa4/__init__.py +0 -0
  190. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/dpa4/descriptor.py +0 -0
  191. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/dpa4c/__init__.py +0 -0
  192. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/dpa4c/descriptor.py +0 -0
  193. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/graph.py +0 -0
  194. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/nep/__init__.py +0 -0
  195. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/nep/descriptor.py +0 -0
  196. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/standalone/__init__.py +0 -0
  197. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/standalone/ace.py +0 -0
  198. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/standalone/acsf.py +0 -0
  199. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/standalone/c00ps_mlff.py +0 -0
  200. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/standalone/local/__init__.py +0 -0
  201. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/standalone/many_body/__init__.py +0 -0
  202. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/standalone/matrices/__init__.py +0 -0
  203. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/standalone/mtp.py +0 -0
  204. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/standalone/rotational/__init__.py +0 -0
  205. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/standalone/soap.py +0 -0
  206. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/standalone/soap_turbo.py +0 -0
  207. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/models/__init__.py +0 -0
  208. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/models/assets/DPA4-Air-OMat24-v20260704.pt +0 -0
  209. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/models/assets/DPA4C-Air-OMat24-v20260819.pt +0 -0
  210. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/models/assets/nep89_20250409.txt +0 -0
  211. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/models/resolver.py +0 -0
  212. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/models/resource.py +0 -0
  213. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/models/session.py +0 -0
  214. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/registry/model_defaults.py +0 -0
  215. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/registry/registry.py +0 -0
  216. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/__init__.py +0 -0
  217. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/_golden.py +0 -0
  218. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/_public.py +0 -0
  219. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/contracts/test_model_resources.py +0 -0
  220. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/contracts/test_result_schema.py +0 -0
  221. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/data/mlip4_mtp6_carbon.json +0 -0
  222. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/data/mlip4_test_mtp.json +0 -0
  223. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/external_reference/__init__.py +0 -0
  224. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/external_reference/test_deepmd.py +0 -0
  225. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/external_reference/test_dscribe.py +0 -0
  226. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/external_reference/test_featomic.py +0 -0
  227. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/external_reference/test_nep_adapters.py +0 -0
  228. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/external_reference/test_pyxtalff.py +0 -0
  229. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/ace/expected_output.npz +0 -0
  230. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/ace/input.npz +0 -0
  231. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/ace/manifest.json +0 -0
  232. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/acsf/expected_output.npz +0 -0
  233. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/acsf/external_expected_output.npz +0 -0
  234. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/acsf/external_input.npz +0 -0
  235. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/acsf/external_manifest.json +0 -0
  236. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/acsf/input.npz +0 -0
  237. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/acsf/manifest.json +0 -0
  238. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/atomiccomposition/expected_output.npz +0 -0
  239. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/atomiccomposition/external_expected_output.npz +0 -0
  240. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/atomiccomposition/external_input.npz +0 -0
  241. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/atomiccomposition/external_manifest.json +0 -0
  242. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/atomiccomposition/input.npz +0 -0
  243. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/atomiccomposition/manifest.json +0 -0
  244. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/c00psmlff/expected_output.npz +0 -0
  245. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/c00psmlff/input.npz +0 -0
  246. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/c00psmlff/manifest.json +0 -0
  247. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/coulombmatrix/expected_output.npz +0 -0
  248. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/coulombmatrix/external_expected_output.npz +0 -0
  249. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/coulombmatrix/external_input.npz +0 -0
  250. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/coulombmatrix/external_manifest.json +0 -0
  251. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/coulombmatrix/input.npz +0 -0
  252. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/coulombmatrix/manifest.json +0 -0
  253. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/dpa4/expected_output.npz +0 -0
  254. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/dpa4/input.npz +0 -0
  255. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/dpa4/manifest.json +0 -0
  256. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/dpa4c/expected_output.npz +0 -0
  257. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/dpa4c/input.npz +0 -0
  258. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/dpa4c/manifest.json +0 -0
  259. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/ead/expected_output.npz +0 -0
  260. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/ead/external_expected_output.npz +0 -0
  261. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/ead/external_input.npz +0 -0
  262. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/ead/external_manifest.json +0 -0
  263. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/ead/input.npz +0 -0
  264. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/ead/manifest.json +0 -0
  265. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/ewaldsummatrix/expected_output.npz +0 -0
  266. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/ewaldsummatrix/external_expected_output.npz +0 -0
  267. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/ewaldsummatrix/external_input.npz +0 -0
  268. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/ewaldsummatrix/external_manifest.json +0 -0
  269. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/ewaldsummatrix/input.npz +0 -0
  270. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/lbispectrum/expected_output.npz +0 -0
  271. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/lbispectrum/input.npz +0 -0
  272. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/lbispectrum/manifest.json +0 -0
  273. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/lmbtr/expected_output.npz +0 -0
  274. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/lmbtr/external_expected_output.npz +0 -0
  275. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/lmbtr/external_input.npz +0 -0
  276. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/lmbtr/external_manifest.json +0 -0
  277. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/lmbtr/input.npz +0 -0
  278. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/lmbtr/manifest.json +0 -0
  279. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/lodesphericalexpansion/expected_output.npz +0 -0
  280. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/lodesphericalexpansion/external_expected_output.npz +0 -0
  281. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/lodesphericalexpansion/external_input.npz +0 -0
  282. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/lodesphericalexpansion/external_manifest.json +0 -0
  283. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/lodesphericalexpansion/input.npz +0 -0
  284. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/mbtr/expected_output.npz +0 -0
  285. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/mbtr/external_expected_output.npz +0 -0
  286. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/mbtr/external_input.npz +0 -0
  287. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/mbtr/external_manifest.json +0 -0
  288. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/mbtr/input.npz +0 -0
  289. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/mbtr/manifest.json +0 -0
  290. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/mtp/expected_output.npz +0 -0
  291. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/mtp/input.npz +0 -0
  292. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/mtp/manifest.json +0 -0
  293. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/neighborlist/expected_output.npz +0 -0
  294. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/neighborlist/external_expected_output.npz +0 -0
  295. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/neighborlist/external_input.npz +0 -0
  296. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/neighborlist/external_manifest.json +0 -0
  297. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/neighborlist/input.npz +0 -0
  298. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/neighborlist/manifest.json +0 -0
  299. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/nep/expected_output.npz +0 -0
  300. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/nep/external_expected_output.npz +0 -0
  301. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/nep/external_input.npz +0 -0
  302. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/nep/external_manifest.json +0 -0
  303. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/nep/input.npz +0 -0
  304. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/nep/manifest.json +0 -0
  305. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sinematrix/expected_output.npz +0 -0
  306. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sinematrix/external_expected_output.npz +0 -0
  307. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sinematrix/external_input.npz +0 -0
  308. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sinematrix/external_manifest.json +0 -0
  309. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sinematrix/input.npz +0 -0
  310. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/snap/expected_output.npz +0 -0
  311. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/snap/external_expected_output.npz +0 -0
  312. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/snap/external_input.npz +0 -0
  313. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/snap/external_manifest.json +0 -0
  314. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/snap/input.npz +0 -0
  315. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/snap/manifest.json +0 -0
  316. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/so3/expected_output.npz +0 -0
  317. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/so3/external_expected_output.npz +0 -0
  318. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/so3/external_input.npz +0 -0
  319. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/so3/external_manifest.json +0 -0
  320. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/so3/input.npz +0 -0
  321. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/so3/manifest.json +0 -0
  322. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/so4/expected_output.npz +0 -0
  323. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/so4/external_expected_output.npz +0 -0
  324. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/so4/external_input.npz +0 -0
  325. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/so4/external_manifest.json +0 -0
  326. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/so4/input.npz +0 -0
  327. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/so4/manifest.json +0 -0
  328. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soap/expected_output.npz +0 -0
  329. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soap/external_expected_output.npz +0 -0
  330. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soap/external_input.npz +0 -0
  331. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soap/external_manifest.json +0 -0
  332. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soap/input.npz +0 -0
  333. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soap/manifest.json +0 -0
  334. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soappowerspectrum/expected_output.npz +0 -0
  335. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soappowerspectrum/external_expected_output.npz +0 -0
  336. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soappowerspectrum/external_input.npz +0 -0
  337. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soappowerspectrum/external_manifest.json +0 -0
  338. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soappowerspectrum/input.npz +0 -0
  339. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soappowerspectrum/manifest.json +0 -0
  340. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soapradialspectrum/expected_output.npz +0 -0
  341. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soapradialspectrum/external_expected_output.npz +0 -0
  342. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soapradialspectrum/external_input.npz +0 -0
  343. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soapradialspectrum/external_manifest.json +0 -0
  344. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soapradialspectrum/input.npz +0 -0
  345. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soapradialspectrum/manifest.json +0 -0
  346. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soapturbo/expected_output.npz +0 -0
  347. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soapturbo/input.npz +0 -0
  348. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soapturbo/manifest.json +0 -0
  349. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sorteddistances/expected_output.npz +0 -0
  350. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sorteddistances/external_expected_output.npz +0 -0
  351. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sorteddistances/external_input.npz +0 -0
  352. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sorteddistances/external_manifest.json +0 -0
  353. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sorteddistances/input.npz +0 -0
  354. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sorteddistances/manifest.json +0 -0
  355. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sphericalexpansion/expected_output.npz +0 -0
  356. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sphericalexpansion/external_expected_output.npz +0 -0
  357. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sphericalexpansion/external_input.npz +0 -0
  358. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sphericalexpansion/external_manifest.json +0 -0
  359. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sphericalexpansion/input.npz +0 -0
  360. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sphericalexpansion/manifest.json +0 -0
  361. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sphericalexpansionbypair/expected_output.npz +0 -0
  362. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sphericalexpansionbypair/external_expected_output.npz +0 -0
  363. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sphericalexpansionbypair/external_input.npz +0 -0
  364. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sphericalexpansionbypair/external_manifest.json +0 -0
  365. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sphericalexpansionbypair/input.npz +0 -0
  366. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sphericalexpansionbypair/manifest.json +0 -0
  367. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/valleoganov/expected_output.npz +0 -0
  368. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/valleoganov/external_expected_output.npz +0 -0
  369. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/valleoganov/external_input.npz +0 -0
  370. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/valleoganov/external_manifest.json +0 -0
  371. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/valleoganov/input.npz +0 -0
  372. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/valleoganov/manifest.json +0 -0
  373. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_ace.py +0 -0
  374. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_ace_golden.py +0 -0
  375. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_acsf_golden.py +0 -0
  376. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_all_descriptors.py +0 -0
  377. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_atomiccomposition_golden.py +0 -0
  378. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_c00ps_mlff.py +0 -0
  379. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_c00psmlff_golden.py +0 -0
  380. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_coulombmatrix_golden.py +0 -0
  381. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_coulombmatrix_openmp.py +0 -0
  382. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_descriptor_symmetry.py +0 -0
  383. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_dpa4.py +0 -0
  384. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_dpa4_golden.py +0 -0
  385. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_dpa4c.py +0 -0
  386. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_dpa4c_golden.py +0 -0
  387. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_ead_golden.py +0 -0
  388. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_ewaldsummatrix_golden.py +0 -0
  389. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_ewaldsummatrix_openmp.py +0 -0
  390. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_external_static_goldens.py +0 -0
  391. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_golden_independence.py +0 -0
  392. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_lbispectrum_golden.py +0 -0
  393. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_lmbtr_golden.py +0 -0
  394. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_lmbtr_openmp.py +0 -0
  395. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_lodesphericalexpansion_golden.py +0 -0
  396. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_mbtr_golden.py +0 -0
  397. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_mtp.py +0 -0
  398. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_mtp_golden.py +0 -0
  399. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_neighbor_graph.py +0 -0
  400. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_neighborlist_golden.py +0 -0
  401. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_nep.py +0 -0
  402. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_nep_golden.py +0 -0
  403. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_openmp_support.py +0 -0
  404. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_reference.py +0 -0
  405. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_sinematrix_golden.py +0 -0
  406. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_sinematrix_openmp.py +0 -0
  407. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_snap_golden.py +0 -0
  408. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_so3_golden.py +0 -0
  409. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_so4_golden.py +0 -0
  410. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_soap_acsf_advanced.py +0 -0
  411. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_soap_golden.py +0 -0
  412. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_soappowerspectrum_golden.py +0 -0
  413. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_soapradialspectrum_golden.py +0 -0
  414. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_soapturbo_golden.py +0 -0
  415. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_sorteddistances_golden.py +0 -0
  416. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_sphericalexpansion_golden.py +0 -0
  417. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_sphericalexpansionbypair_golden.py +0 -0
  418. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_valleoganov_golden.py +0 -0
  419. {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_valleoganov_openmp.py +0 -0
@@ -186,6 +186,8 @@ install(FILES "${SCIPY_OPENBLAS_METADATA}"
186
186
  install(FILES "${SCIPY_OPENBLAS_LICENSE}"
187
187
  DESTINATION mdescriptor/licenses
188
188
  RENAME scipy-openblas32-LICENSE.txt)
189
+ install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/docs/gui-adaptation-baseline.md"
190
+ DESTINATION mdescriptor/docs)
189
191
 
190
192
  install(
191
193
  TARGETS _native
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: MDescriptor
3
- Version: 0.2.4
3
+ Version: 0.2.6
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
@@ -767,11 +767,12 @@ path). There are no network downloads or implicit model discovery.
767
767
 
768
768
  The base package requires Python 3.10+, NumPy and `array-api-compat`. ASE is
769
769
  optional and is only needed for `StructureBatch.from_ase` or direct ASE input.
770
+ GUI/native frame records can use `StructureBatch.from_frames` without ASE.
770
771
  Sparse output is provided as SciPy CSR by the optional `sparse` extra.
771
772
 
772
773
  基础包需要 Python 3.10+、NumPy 和 `array-api-compat`。ASE 只在使用
773
774
  `StructureBatch.from_ase` 或直接传入 ASE 对象时需要;稀疏输出由可选的
774
- `sparse` extra 提供。
775
+ `sparse` extra 提供。GUI/原生帧记录可使用 `StructureBatch.from_frames`,不依赖 ASE。
775
776
 
776
777
  ```bash
777
778
  python -m pip install .
@@ -785,6 +786,11 @@ installing Torch; the supported default graphs run through the C++17/OpenMP
785
786
  backend and specialised configurations retain the NumPy fallback. No network
786
787
  model download is performed.
787
788
 
789
+ All built-in descriptors currently advertise and execute on CPU only. CUDA/GPU
790
+ execution is not available in this release; `execution.device="cuda"` is
791
+ rejected rather than silently falling back. Adding GPU support requires a
792
+ device-specific kernel and a corresponding wheel/runtime build.
793
+
788
794
  可选的外部数值对照固定使用 `deepmd-kit==3.2.0`:
789
795
 
790
796
  ```bash
@@ -842,7 +848,9 @@ batch = StructureBatch(
842
848
  and validates integer fields before narrowing, finite positions/cells,
843
849
  nonsingular cells, positive atomic numbers, monotonic offsets and fully
844
850
  periodic `pbc == (1, 1, 1)`. ASE conversion is available through
845
- `StructureBatch.from_ase(...)`.
851
+ `StructureBatch.from_ase(...)`; GUI-style mappings or objects exposing
852
+ `numbers`, `positions`, `cell`, `pbc` and `id` can use
853
+ `StructureBatch.from_frames(...)`.
846
854
 
847
855
  ## Descriptor API / 描述符 API
848
856
 
@@ -940,8 +948,10 @@ import mdescriptor
940
948
  from mdescriptor.descriptors import SOAP
941
949
 
942
950
  print(mdescriptor.list_descriptors())
951
+ summaries = mdescriptor.list_descriptors(detailed=True)
943
952
  metadata = mdescriptor.describe_descriptor("SOAP")
944
953
  runtime = mdescriptor.get_runtime_info()
954
+ baseline = mdescriptor.gui_baseline()
945
955
  soap = SOAP(species=[1, 8], r_cut=4.5, n_max=2, l_max=2)
946
956
  rebuilt = mdescriptor.create_descriptor(soap.configuration)
947
957
 
@@ -954,8 +964,16 @@ potentials), and `REQUIRED` (NEP/DPA4/DPA4C). The root package exposes stable
954
964
  contracts, registry functions and errors only; algorithm implementations are
955
965
  not re-exported from the root. `describe_descriptor(name)` reads static,
956
966
  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`.
967
+ resolving a model. `list_descriptors(detailed=True)` returns the name, version,
968
+ display name, category and level for every descriptor in one call.
969
+ `gui_baseline()` returns the packaged GUI contract document, and
970
+ `get_runtime_info()` reports its `baseline_version` alongside the package and
971
+ schema versions.
972
+
973
+ On Windows, import `mdescriptor` during single-threaded startup, before an
974
+ embedding host starts background stdin/stdio readers. The package preloads the
975
+ packaged native binary at that point; a host that controls startup explicitly
976
+ may also call `mdescriptor.preload_native()`.
959
977
 
960
978
  ## Model resources / 模型资源
961
979
 
@@ -37,11 +37,12 @@ path). There are no network downloads or implicit model discovery.
37
37
 
38
38
  The base package requires Python 3.10+, NumPy and `array-api-compat`. ASE is
39
39
  optional and is only needed for `StructureBatch.from_ase` or direct ASE input.
40
+ GUI/native frame records can use `StructureBatch.from_frames` without ASE.
40
41
  Sparse output is provided as SciPy CSR by the optional `sparse` extra.
41
42
 
42
43
  基础包需要 Python 3.10+、NumPy 和 `array-api-compat`。ASE 只在使用
43
44
  `StructureBatch.from_ase` 或直接传入 ASE 对象时需要;稀疏输出由可选的
44
- `sparse` extra 提供。
45
+ `sparse` extra 提供。GUI/原生帧记录可使用 `StructureBatch.from_frames`,不依赖 ASE。
45
46
 
46
47
  ```bash
47
48
  python -m pip install .
@@ -55,6 +56,11 @@ installing Torch; the supported default graphs run through the C++17/OpenMP
55
56
  backend and specialised configurations retain the NumPy fallback. No network
56
57
  model download is performed.
57
58
 
59
+ All built-in descriptors currently advertise and execute on CPU only. CUDA/GPU
60
+ execution is not available in this release; `execution.device="cuda"` is
61
+ rejected rather than silently falling back. Adding GPU support requires a
62
+ device-specific kernel and a corresponding wheel/runtime build.
63
+
58
64
  可选的外部数值对照固定使用 `deepmd-kit==3.2.0`:
59
65
 
60
66
  ```bash
@@ -112,7 +118,9 @@ batch = StructureBatch(
112
118
  and validates integer fields before narrowing, finite positions/cells,
113
119
  nonsingular cells, positive atomic numbers, monotonic offsets and fully
114
120
  periodic `pbc == (1, 1, 1)`. ASE conversion is available through
115
- `StructureBatch.from_ase(...)`.
121
+ `StructureBatch.from_ase(...)`; GUI-style mappings or objects exposing
122
+ `numbers`, `positions`, `cell`, `pbc` and `id` can use
123
+ `StructureBatch.from_frames(...)`.
116
124
 
117
125
  ## Descriptor API / 描述符 API
118
126
 
@@ -210,8 +218,10 @@ import mdescriptor
210
218
  from mdescriptor.descriptors import SOAP
211
219
 
212
220
  print(mdescriptor.list_descriptors())
221
+ summaries = mdescriptor.list_descriptors(detailed=True)
213
222
  metadata = mdescriptor.describe_descriptor("SOAP")
214
223
  runtime = mdescriptor.get_runtime_info()
224
+ baseline = mdescriptor.gui_baseline()
215
225
  soap = SOAP(species=[1, 8], r_cut=4.5, n_max=2, l_max=2)
216
226
  rebuilt = mdescriptor.create_descriptor(soap.configuration)
217
227
 
@@ -224,8 +234,16 @@ potentials), and `REQUIRED` (NEP/DPA4/DPA4C). The root package exposes stable
224
234
  contracts, registry functions and errors only; algorithm implementations are
225
235
  not re-exported from the root. `describe_descriptor(name)` reads static,
226
236
  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`.
237
+ resolving a model. `list_descriptors(detailed=True)` returns the name, version,
238
+ display name, category and level for every descriptor in one call.
239
+ `gui_baseline()` returns the packaged GUI contract document, and
240
+ `get_runtime_info()` reports its `baseline_version` alongside the package and
241
+ schema versions.
242
+
243
+ On Windows, import `mdescriptor` during single-threaded startup, before an
244
+ embedding host starts background stdin/stdio readers. The package preloads the
245
+ packaged native binary at that point; a host that controls startup explicitly
246
+ may also call `mdescriptor.preload_native()`.
229
247
 
230
248
  ## Model resources / 模型资源
231
249
 
@@ -45,6 +45,15 @@ inline void mark_completed(const std::shared_ptr<ComputeControl>& control) {
45
45
  }
46
46
  }
47
47
 
48
+ inline void mark_completed_structures(
49
+ const std::shared_ptr<ComputeControl>& control,
50
+ std::int64_t structures) {
51
+ for (std::int64_t structure = 0; structure < structures; ++structure) {
52
+ check_cancelled(control);
53
+ mark_completed(control);
54
+ }
55
+ }
56
+
48
57
  } // namespace detail
49
58
 
50
59
  } // namespace mdescriptor
@@ -453,8 +453,22 @@ py::array compute_nep_array(
453
453
  return output;
454
454
  }
455
455
 
456
- py::array compute_dpa4c_array(
457
- const Dpa4cCalculator& calculator,
456
+ template <typename Calculator>
457
+ struct DpaBindingTraits;
458
+
459
+ template <>
460
+ struct DpaBindingTraits<Dpa4cCalculator> {
461
+ static constexpr const char* name = "DPA4C";
462
+ };
463
+
464
+ template <>
465
+ struct DpaBindingTraits<Dpa4Calculator> {
466
+ static constexpr const char* name = "DPA4";
467
+ };
468
+
469
+ template <typename Calculator>
470
+ py::array compute_dpa_array(
471
+ const Calculator& calculator,
458
472
  const I32Array& numbers,
459
473
  const F64Array& positions,
460
474
  const F64Array& cells,
@@ -465,30 +479,9 @@ py::array compute_dpa4c_array(
465
479
  ) {
466
480
  const auto batch = view_batch(numbers, positions, cells, pbc, offsets);
467
481
  if (type_indices.ndim() != 1 || type_indices.shape(0) != batch.atoms) {
468
- throw std::invalid_argument("DPA4C type_indices must have one entry per atom");
469
- }
470
- py::array_t<double> output({batch.atoms, calculator.feature_count()});
471
- auto ctrl = control_or_default(control);
472
- {
473
- py::gil_scoped_release release;
474
- calculator.compute(batch, type_indices.data(), output.mutable_data(), ctrl);
475
- }
476
- return output;
477
- }
478
-
479
- py::array compute_dpa4_array(
480
- const Dpa4Calculator& calculator,
481
- const I32Array& numbers,
482
- const F64Array& positions,
483
- const F64Array& cells,
484
- const I32Array& pbc,
485
- const I64Array& offsets,
486
- const I32Array& type_indices,
487
- const std::shared_ptr<ComputeControl>& control
488
- ) {
489
- const auto batch = view_batch(numbers, positions, cells, pbc, offsets);
490
- if (type_indices.ndim() != 1 || type_indices.shape(0) != batch.atoms) {
491
- throw std::invalid_argument("DPA4 type_indices must have one entry per atom");
482
+ throw std::invalid_argument(
483
+ std::string(DpaBindingTraits<Calculator>::name)
484
+ + " type_indices must have one entry per atom");
492
485
  }
493
486
  py::array_t<double> output({batch.atoms, calculator.feature_count()});
494
487
  auto ctrl = control_or_default(control);
@@ -1117,7 +1110,7 @@ PYBIND11_MODULE(_native, module) {
1117
1110
  .def_property_readonly("feature_count", &Dpa4cCalculator::feature_count)
1118
1111
  .def("close", &Dpa4cCalculator::close)
1119
1112
  .def("closed", &Dpa4cCalculator::closed)
1120
- .def("compute", &compute_dpa4c_array,
1113
+ .def("compute", &compute_dpa_array<Dpa4cCalculator>,
1121
1114
  py::arg("numbers"), py::arg("positions"), py::arg("cells"), py::arg("pbc"),
1122
1115
  py::arg("offsets"), py::arg("type_indices"), py::arg("control") = nullptr);
1123
1116
 
@@ -1130,7 +1123,7 @@ PYBIND11_MODULE(_native, module) {
1130
1123
  .def_property_readonly("feature_count", &Dpa4Calculator::feature_count)
1131
1124
  .def("close", &Dpa4Calculator::close)
1132
1125
  .def("closed", &Dpa4Calculator::closed)
1133
- .def("compute", &compute_dpa4_array,
1126
+ .def("compute", &compute_dpa_array<Dpa4Calculator>,
1134
1127
  py::arg("numbers"), py::arg("positions"), py::arg("cells"), py::arg("pbc"),
1135
1128
  py::arg("offsets"), py::arg("type_indices"), py::arg("control") = nullptr);
1136
1129
 
@@ -2606,6 +2606,7 @@ void Dpa4Calculator::compute(
2606
2606
  }
2607
2607
  }
2608
2608
  if (batch.atoms == 0) {
2609
+ detail::mark_completed_structures(control, batch.structures);
2609
2610
  return;
2610
2611
  }
2611
2612
 
@@ -2751,9 +2752,9 @@ void Dpa4Calculator::compute(
2751
2752
  output[static_cast<std::size_t>(node) * kChannels + static_cast<std::size_t>(channel)] =
2752
2753
  static_cast<double>(x[index] + output_update[index]);
2753
2754
  }
2754
- if (control) {
2755
- control->mark_completed();
2756
- }
2755
+ }
2756
+ if (control) {
2757
+ control->mark_completed();
2757
2758
  }
2758
2759
  detail::check_cancelled(control);
2759
2760
  }
@@ -501,6 +501,7 @@ void Dpa4cCalculator::compute(
501
501
  }
502
502
  }
503
503
  if (batch.atoms == 0) {
504
+ detail::mark_completed_structures(control, batch.structures);
504
505
  return;
505
506
  }
506
507
 
@@ -540,6 +541,26 @@ void Dpa4cCalculator::compute(
540
541
  ensure_pair_cache(used_pair_indices);
541
542
 
542
543
  const int angular_width = (options_.lmax + 1) * (options_.lmax + 1);
544
+ std::vector<std::int64_t> structure_for_atom;
545
+ std::unique_ptr<std::atomic<std::int64_t>[]> remaining_atoms;
546
+ if (control) {
547
+ structure_for_atom.resize(static_cast<std::size_t>(batch.atoms));
548
+ remaining_atoms = std::make_unique<std::atomic<std::int64_t>[]>(
549
+ static_cast<std::size_t>(batch.structures));
550
+ for (std::int64_t structure = 0; structure < batch.structures; ++structure) {
551
+ const std::int64_t begin = batch.offsets[structure];
552
+ const std::int64_t end = batch.offsets[structure + 1];
553
+ remaining_atoms[static_cast<std::size_t>(structure)].store(
554
+ end - begin, std::memory_order_relaxed);
555
+ for (std::int64_t atom = begin; atom < end; ++atom) {
556
+ structure_for_atom[static_cast<std::size_t>(atom)] = structure;
557
+ }
558
+ if (begin == end) {
559
+ detail::check_cancelled(control);
560
+ control->mark_completed();
561
+ }
562
+ }
563
+ }
543
564
  #ifdef _OPENMP
544
565
  #pragma omp parallel for schedule(static) num_threads(options_.num_threads > 0 ? options_.num_threads : omp_get_max_threads())
545
566
  #endif
@@ -915,7 +936,12 @@ void Dpa4cCalculator::compute(
915
936
  destination[feature] = value;
916
937
  }
917
938
  if (control) {
918
- control->mark_completed();
939
+ const std::int64_t structure = structure_for_atom[
940
+ static_cast<std::size_t>(center_atom)];
941
+ if (remaining_atoms[static_cast<std::size_t>(structure)].fetch_sub(
942
+ 1, std::memory_order_acq_rel) == 1) {
943
+ control->mark_completed();
944
+ }
919
945
  }
920
946
  }
921
947
  if (control && control->cancelled()) {
@@ -19,6 +19,9 @@ std::vector<double> ewald_matrix_values(
19
19
  const std::int64_t begin = batch.offsets[structure];
20
20
  const std::int64_t end = batch.offsets[structure + 1];
21
21
  const int count = static_cast<int>(end - begin);
22
+ if (count == 0) {
23
+ return {};
24
+ }
22
25
  #ifdef _OPENMP
23
26
  const int workers = num_threads > 0 ? num_threads : omp_get_max_threads();
24
27
  #else
@@ -34,13 +34,13 @@ controlled artifact: run `python scripts/check_descriptor_inventory.py
34
34
  | MTP | `standalone` | `local` | `OPTIONAL` | `cpp` | `atom` | cooperative_cancel, model, num_threads, sparse | species, model, min_dist, max_dist, r_cut, radial_basis_size, radial_funcs_count, max_rank, radial_basis_type | `—` |
35
35
  | C00PSMLFF | `standalone` | `local` | `NONE` | `cpp` | `atom` | cooperative_cancel, num_threads, sparse | species, r_cut, n_radial, l_max, cutoff_function, radial_sigma, include_radial, include_angular, normalize_radial, normalize_angular, super_vector, radial_weight, angular_weight, exclude_self_interaction | `—` |
36
36
  | NEP | `model_backed` | `model_backed` | `REQUIRED` | `cpp` | `atom` | cooperative_cancel, model, num_threads, sparse | model | `—` |
37
- | DPA4 | `model_backed` | `model_backed` | `REQUIRED` | `numpy` | `atom` | charge_spin, model, num_threads, sparse, spin | model | `—` |
38
- | DPA4C | `model_backed` | `model_backed` | `REQUIRED` | `numpy` | `atom` | charge_spin, model, num_threads, sparse, spin | model, calibrate | `—` |
37
+ | DPA4 | `model_backed` | `model_backed` | `REQUIRED` | `numpy` | `atom` | charge_spin, cooperative_cancel, model, num_threads, sparse, spin | model | `—` |
38
+ | DPA4C | `model_backed` | `model_backed` | `REQUIRED` | `numpy` | `atom` | charge_spin, cooperative_cancel, model, num_threads, sparse, spin | model, calibrate | `—` |
39
39
 
40
40
  ## Static descriptor metadata
41
41
 
42
42
  Each built-in entry carries `DescriptorInfo` schema version
43
- `1`. Query it without importing an algorithm
43
+ `2`. Query it without importing an algorithm
44
44
  implementation or resolving a model:
45
45
 
46
46
  ```python
@@ -0,0 +1,80 @@
1
+ # GUI adaptation baseline
2
+
3
+ This document is the versioned contract for a GUI that discovers and runs
4
+ MDescriptor descriptors. It describes the public seams; private kernel
5
+ classes, native symbols, and model internals are not GUI interfaces.
6
+
7
+ The package exposes this document through `mdescriptor.gui_baseline()` and
8
+ reports `baseline_version: "1"` from `mdescriptor.get_runtime_info()`.
9
+
10
+ ## Discovery and versions
11
+
12
+ `list_descriptors()` returns the registered descriptor names. For each name,
13
+ `describe_descriptor(name)` returns a JSON-safe object with these fields:
14
+
15
+ `schema_version`, `name`, `descriptor_version`, `display_name`, `description`,
16
+ `category`, `level`, `backend`, `execution_engine`, `capabilities`,
17
+ `parameters`, `execution`, `input`, `output`, and `asset`.
18
+
19
+ `schema_version` is the metadata-envelope version and is currently `2`.
20
+ `descriptor_version` identifies the individual descriptor contract and is
21
+ currently the string `"1"` for the built-ins. A GUI should check both before
22
+ persisting or reconstructing metadata-driven configurations.
23
+
24
+ `list_descriptors(detailed=True)` returns one JSON-safe summary record per
25
+ descriptor with `name`, `descriptor_version`, `display_name`, `category`, and
26
+ `level`. The default call remains the immutable tuple of names.
27
+
28
+ `backend` identifies the adapter/backend compatibility label. It is not a
29
+ promise about the currently selected native implementation. `execution_engine`
30
+ identifies the default numerical engine. For example, DPA4 and DPA4C expose
31
+ `backend: "numpy"` for their model/runtime adapter and
32
+ `execution_engine: "cpp"` when the native extension is available.
33
+
34
+ ## Parameters and execution
35
+
36
+ Parameter schemas use JSON-safe values. Supported schema types are `integer`,
37
+ `number`, `boolean`, `string`, `enum`, `species`, `model`, `array`, and
38
+ `object`; object schemas may contain nested `properties`, and array schemas
39
+ may contain `items`. The `parameters` object is the canonical constructor
40
+ surface; implementation-only options must not be synthesized by the GUI.
41
+
42
+ The current built-ins advertise CPU execution (`execution.devices == ["cpu"]`)
43
+ and may advertise `num_threads` and `cooperative_cancel` independently.
44
+ Cancellation is cooperative and is reported as the public `CancelledError`.
45
+ CUDA/GPU execution is not available in this release. A GUI must not offer a
46
+ CUDA device for built-in descriptors; selecting one produces a structured
47
+ `unsupported_device` configuration error. Future GPU support requires a
48
+ device-specific kernel and matching platform wheels.
49
+
50
+ ## Input policy
51
+
52
+ `StructureBatch` is the canonical flattened input. GUI frame records can be
53
+ passed to `StructureBatch.from_frames()` when they expose `numbers`,
54
+ `positions`, `cell`, `pbc`, and `id`; the helper generates the flattened
55
+ arrays and cumulative offsets. Each frame is either
56
+ `isolated` (all PBC flags false) or `fully_periodic` (all flags true); partial
57
+ periodicity is invalid. A descriptor that only supports fully periodic input
58
+ rejects isolated frames at the public adapter boundary with
59
+ `UnsupportedPeriodicityError` (a `DescriptorInputError` subclass), code
60
+ `unsupported_periodicity`, and path `["input", "periodicity"]`.
61
+ LodeSphericalExpansion is periodic-only.
62
+
63
+ The GUI should use the declared `input.periodicity`, `input.mixed_periodicity`,
64
+ spin fields, and the structured error payload instead of inferring support
65
+ from implementation names or exception text. Descriptors declaring both
66
+ `isolated` and `fully_periodic` accept those frame kinds in one batch;
67
+ periodic-only descriptors reject a batch containing an isolated frame.
68
+
69
+ On Windows, import `mdescriptor` during single-threaded startup, before the GUI
70
+ starts any background stdin/stdio reader. The package preloads the native
71
+ binary at that point; an embedding host may also call
72
+ `mdescriptor.preload_native()` explicitly during startup.
73
+
74
+ ## Results and lifecycle
75
+
76
+ Configurations and results carry their own schema versions. Descriptors are
77
+ closed explicitly after use; metadata snapshots remain available after close.
78
+ Unknown descriptor names, unsupported options, unavailable assets, and
79
+ unsupported input should be shown as structured errors rather than treated as
80
+ native implementation failures.
@@ -178,6 +178,12 @@ def main(argv: list[str] | None = None) -> int:
178
178
  target = package_file.parent.parent
179
179
  if not package_file.is_relative_to(target):
180
180
  raise SystemExit(f"wheel verification imported {package_file}, not {target}")
181
+ baseline = mdescriptor.gui_baseline()
182
+ if not baseline.startswith("# GUI adaptation baseline"):
183
+ raise SystemExit("GUI adaptation baseline resource is missing or invalid")
184
+ runtime = mdescriptor.get_runtime_info()
185
+ if runtime.get("baseline_version") != mdescriptor.GUI_BASELINE_VERSION:
186
+ raise SystemExit("GUI adaptation baseline version is missing or inconsistent")
181
187
  _verify_vendored_openblas(mdescriptor)
182
188
  names = mdescriptor.list_descriptors()
183
189
  if len(names) != 28 or len(set(names)) != 28:
@@ -1,8 +1,11 @@
1
1
  """Stable MDescriptor contracts and explicit registry functions."""
2
2
 
3
+ from importlib import resources
3
4
  from importlib.metadata import PackageNotFoundError
4
5
  from importlib.metadata import version as package_version
6
+ from pathlib import Path
5
7
 
8
+ from ._runtime import preload_native, preload_native_binary
6
9
  from .core import (
7
10
  CONFIGURATION_SCHEMA_VERSION,
8
11
  RESULT_SCHEMA_VERSION,
@@ -20,8 +23,12 @@ from .core import (
20
23
  OutputOptions,
21
24
  StructureBatch,
22
25
  StructureInput,
26
+ UnsupportedPeriodicityError,
23
27
  )
24
- from .registry import (
28
+
29
+ preload_native_binary()
30
+
31
+ from .registry import ( # noqa: E402 # preload native binary before registry metadata
25
32
  DESCRIPTOR_INFO_SCHEMA_VERSION,
26
33
  AssetPolicy,
27
34
  DescriptorConfiguration,
@@ -35,6 +42,28 @@ from .registry import (
35
42
  )
36
43
 
37
44
  API_VERSION = 1
45
+ GUI_BASELINE_VERSION = "1"
46
+
47
+
48
+ def gui_baseline() -> str:
49
+ """Return the packaged GUI adaptation contract document."""
50
+
51
+ resource = resources.files("mdescriptor").joinpath(
52
+ "docs", "gui-adaptation-baseline.md"
53
+ )
54
+ try:
55
+ return resource.read_text(encoding="utf-8")
56
+ except FileNotFoundError:
57
+ # Source checkouts are usable before the CMake install step. Wheels
58
+ # always take the resource branch because CMake installs the document
59
+ # under the package directory.
60
+ source_document = (
61
+ Path(__file__).resolve().parents[2] / "docs" / "gui-adaptation-baseline.md"
62
+ )
63
+ try:
64
+ return source_document.read_text(encoding="utf-8")
65
+ except FileNotFoundError as exc:
66
+ raise RuntimeError("GUI adaptation baseline is not installed") from exc
38
67
 
39
68
  try:
40
69
  from ._version import __version__
@@ -51,6 +80,7 @@ def get_runtime_info() -> dict[str, str | int]:
51
80
  return {
52
81
  "version": __version__,
53
82
  "api_version": API_VERSION,
83
+ "baseline_version": GUI_BASELINE_VERSION,
54
84
  "configuration_schema_version": CONFIGURATION_SCHEMA_VERSION,
55
85
  "descriptor_info_schema_version": DESCRIPTOR_INFO_SCHEMA_VERSION,
56
86
  "result_schema_version": RESULT_SCHEMA_VERSION,
@@ -58,6 +88,7 @@ def get_runtime_info() -> dict[str, str | int]:
58
88
 
59
89
  __all__ = [
60
90
  "API_VERSION",
91
+ "GUI_BASELINE_VERSION",
61
92
  "AssetPolicy",
62
93
  "CancelledError",
63
94
  "ClosedDescriptorError",
@@ -79,11 +110,14 @@ __all__ = [
79
110
  "RESULT_SCHEMA_VERSION",
80
111
  "StructureBatch",
81
112
  "StructureInput",
113
+ "UnsupportedPeriodicityError",
82
114
  "builtin_registry",
83
115
  "create_descriptor",
84
116
  "describe_descriptor",
85
117
  "get_descriptor",
86
118
  "get_runtime_info",
119
+ "gui_baseline",
87
120
  "list_descriptors",
121
+ "preload_native",
88
122
  "__version__",
89
123
  ]
@@ -0,0 +1,76 @@
1
+ """Small platform runtime setup kept independent of descriptor imports."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import ctypes
6
+ import importlib
7
+ import importlib.machinery
8
+ import importlib.util
9
+ import os
10
+ from pathlib import Path
11
+ from typing import Any
12
+
13
+ _DLL_DIRECTORIES: list[Any] = []
14
+ _NATIVE_HANDLES: list[Any] = []
15
+ _NATIVE_PRELOAD_ATTEMPTED = False
16
+
17
+
18
+ def native_extension_available() -> bool:
19
+ """Return whether the private native module resolves to an extension binary."""
20
+
21
+ # On Windows, an extension file can exist while one of its DLL
22
+ # dependencies is unavailable. ``preload_native_binary`` performs the
23
+ # loadability check before the registry is assembled, so do not fall back
24
+ # to the filename-only probe after that check has run.
25
+ if os.name == "nt" and _NATIVE_PRELOAD_ATTEMPTED:
26
+ return bool(_NATIVE_HANDLES)
27
+
28
+ try:
29
+ spec = importlib.util.find_spec("mdescriptor._native")
30
+ except (ImportError, ValueError):
31
+ return False
32
+ if spec is None or spec.origin is None:
33
+ return False
34
+ origin = str(spec.origin)
35
+ return any(origin.endswith(suffix) for suffix in importlib.machinery.EXTENSION_SUFFIXES)
36
+
37
+
38
+ def preload_native_binary() -> None:
39
+ """Load the packaged native binary before an embedded host starts threads.
40
+
41
+ Windows OpenBLAS builds can initialize a worker pool from DLL load code.
42
+ Loading the extension binary during normal package startup moves that work
43
+ before a GUI/stdio host starts its background pipe readers. The Python
44
+ extension module is not initialized here, so static registry metadata stays
45
+ independent of ``mdescriptor._native`` in ``sys.modules``.
46
+ """
47
+
48
+ global _NATIVE_PRELOAD_ATTEMPTED
49
+
50
+ if os.name != "nt":
51
+ return
52
+ _NATIVE_PRELOAD_ATTEMPTED = True
53
+ loader = getattr(ctypes, "WinDLL", None)
54
+ if loader is None:
55
+ return
56
+ package_directory = Path(__file__).resolve().parent
57
+ add_dll_directory = getattr(os, "add_dll_directory", None)
58
+ if add_dll_directory is not None:
59
+ _DLL_DIRECTORIES.append(add_dll_directory(str(package_directory)))
60
+ for path in sorted(package_directory.glob("_native*.pyd")):
61
+ try:
62
+ _NATIVE_HANDLES.append(loader(str(path)))
63
+ except OSError:
64
+ # Leave the normal import path to report a useful missing-runtime
65
+ # error. Source checkouts without a built extension also land here.
66
+ continue
67
+ break
68
+
69
+
70
+ def preload_native() -> None:
71
+ """Initialize the Python native module from a single-threaded startup hook."""
72
+
73
+ importlib.import_module("mdescriptor._native")
74
+
75
+
76
+ __all__ = ["preload_native"]
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.2.4'
22
- __version_tuple__ = version_tuple = (0, 2, 4)
21
+ __version__ = version = '0.2.6'
22
+ __version_tuple__ = version_tuple = (0, 2, 6)
23
23
 
24
- __commit_id__ = commit_id = 'gca05e625e'
24
+ __commit_id__ = commit_id = 'g1887016ed'
@@ -9,6 +9,7 @@ from .errors import (
9
9
  DescriptorInputError,
10
10
  MDescriptorError,
11
11
  ModelLoadError,
12
+ UnsupportedPeriodicityError,
12
13
  )
13
14
  from .input import StructureBatch, StructureInput, batch_from_ase, coerce_batch
14
15
  from .options import (
@@ -45,6 +46,7 @@ __all__ = [
45
46
  "OutputOptions",
46
47
  "StructureBatch",
47
48
  "StructureInput",
49
+ "UnsupportedPeriodicityError",
48
50
  "batch_from_ase",
49
51
  "coerce_batch",
50
52
  "normalize_species",