MDescriptor 0.2.3__tar.gz → 0.2.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/PKG-INFO +35 -3
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/README.md +32 -2
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/include/mdescriptor/descriptor.hpp +2 -2
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/c00ps_mlff.cpp +17 -17
- mdescriptor-0.2.4/cpp/tests/CMakeLists.txt +19 -0
- mdescriptor-0.2.4/cpp/tests/test_public_api.cpp +106 -0
- mdescriptor-0.2.4/docs/numerical-baselines.md +49 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/pyproject.toml +35 -3
- mdescriptor-0.2.4/scripts/ace1_reference.jl +55 -0
- mdescriptor-0.2.4/scripts/check_numerical_baselines.py +293 -0
- mdescriptor-0.2.4/scripts/deepmd_reference.py +156 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/scripts/descriptor_reference.py +6 -2
- mdescriptor-0.2.4/scripts/external_reference.py +111 -0
- mdescriptor-0.2.4/scripts/generate_ace1_reference.py +225 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/scripts/generate_descriptor_goldens.py +22 -32
- mdescriptor-0.2.4/scripts/generate_external_c00ps_reference.py +327 -0
- mdescriptor-0.2.4/scripts/generate_external_static_goldens.py +793 -0
- mdescriptor-0.2.4/scripts/numerical_baselines.py +255 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/_version.py +3 -3
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/_golden.py +24 -3
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/contracts/test_capabilities.py +1 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/contracts/test_descriptor_info.py +1 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/contracts/test_public_api.py +2 -0
- mdescriptor-0.2.4/tests/data/mlip4_mtp6_carbon.json +1 -0
- mdescriptor-0.2.4/tests/external_reference/test_deepmd.py +119 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/external_reference/test_featomic.py +17 -3
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/external_reference/test_nep_adapters.py +1 -1
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/external_reference/test_pyxtalff.py +12 -3
- mdescriptor-0.2.4/tests/golden/ace/expected_output.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/ace/manifest.json +29 -3
- mdescriptor-0.2.4/tests/golden/acsf/external_expected_output.npz +0 -0
- mdescriptor-0.2.4/tests/golden/acsf/external_input.npz +0 -0
- mdescriptor-0.2.4/tests/golden/acsf/external_manifest.json +179 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/acsf/manifest.json +14 -0
- mdescriptor-0.2.4/tests/golden/atomiccomposition/external_expected_output.npz +0 -0
- mdescriptor-0.2.4/tests/golden/atomiccomposition/external_input.npz +0 -0
- mdescriptor-0.2.4/tests/golden/atomiccomposition/external_manifest.json +83 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/atomiccomposition/manifest.json +14 -0
- mdescriptor-0.2.4/tests/golden/c00psmlff/expected_output.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/c00psmlff/manifest.json +37 -7
- mdescriptor-0.2.4/tests/golden/coulombmatrix/external_expected_output.npz +0 -0
- mdescriptor-0.2.4/tests/golden/coulombmatrix/external_input.npz +0 -0
- mdescriptor-0.2.4/tests/golden/coulombmatrix/external_manifest.json +78 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/coulombmatrix/manifest.json +14 -0
- mdescriptor-0.2.4/tests/golden/dpa4/expected_output.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/dpa4/manifest.json +21 -4
- mdescriptor-0.2.4/tests/golden/dpa4c/expected_output.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/dpa4c/manifest.json +21 -4
- mdescriptor-0.2.4/tests/golden/ead/external_expected_output.npz +0 -0
- mdescriptor-0.2.4/tests/golden/ead/external_input.npz +0 -0
- mdescriptor-0.2.4/tests/golden/ead/external_manifest.json +88 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/ead/manifest.json +14 -0
- mdescriptor-0.2.4/tests/golden/ewaldsummatrix/external_expected_output.npz +0 -0
- mdescriptor-0.2.4/tests/golden/ewaldsummatrix/external_input.npz +0 -0
- mdescriptor-0.2.4/tests/golden/ewaldsummatrix/external_manifest.json +83 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/ewaldsummatrix/manifest.json +14 -0
- mdescriptor-0.2.4/tests/golden/lbispectrum/expected_output.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/lbispectrum/manifest.json +27 -6
- mdescriptor-0.2.4/tests/golden/lmbtr/external_expected_output.npz +0 -0
- mdescriptor-0.2.4/tests/golden/lmbtr/external_input.npz +0 -0
- mdescriptor-0.2.4/tests/golden/lmbtr/external_manifest.json +155 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/lmbtr/manifest.json +14 -0
- mdescriptor-0.2.4/tests/golden/lodesphericalexpansion/external_expected_output.npz +0 -0
- mdescriptor-0.2.4/tests/golden/lodesphericalexpansion/external_input.npz +0 -0
- mdescriptor-0.2.4/tests/golden/lodesphericalexpansion/external_manifest.json +195 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/lodesphericalexpansion/manifest.json +14 -0
- mdescriptor-0.2.4/tests/golden/mbtr/external_expected_output.npz +0 -0
- mdescriptor-0.2.4/tests/golden/mbtr/external_input.npz +0 -0
- mdescriptor-0.2.4/tests/golden/mbtr/external_manifest.json +152 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/mbtr/manifest.json +14 -0
- mdescriptor-0.2.4/tests/golden/mtp/expected_output.npz +0 -0
- mdescriptor-0.2.4/tests/golden/mtp/manifest.json +146 -0
- mdescriptor-0.2.4/tests/golden/neighborlist/external_expected_output.npz +0 -0
- mdescriptor-0.2.4/tests/golden/neighborlist/external_input.npz +0 -0
- mdescriptor-0.2.4/tests/golden/neighborlist/external_manifest.json +77 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/neighborlist/manifest.json +14 -0
- mdescriptor-0.2.4/tests/golden/nep/external_expected_output.npz +0 -0
- mdescriptor-0.2.4/tests/golden/nep/external_input.npz +0 -0
- mdescriptor-0.2.4/tests/golden/nep/external_manifest.json +228 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/nep/manifest.json +14 -0
- mdescriptor-0.2.4/tests/golden/sinematrix/external_expected_output.npz +0 -0
- mdescriptor-0.2.4/tests/golden/sinematrix/external_input.npz +0 -0
- mdescriptor-0.2.4/tests/golden/sinematrix/external_manifest.json +78 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/sinematrix/manifest.json +14 -0
- mdescriptor-0.2.4/tests/golden/snap/external_expected_output.npz +0 -0
- mdescriptor-0.2.4/tests/golden/snap/external_input.npz +0 -0
- mdescriptor-0.2.4/tests/golden/snap/external_manifest.json +91 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/snap/manifest.json +14 -0
- mdescriptor-0.2.4/tests/golden/so3/external_expected_output.npz +0 -0
- mdescriptor-0.2.4/tests/golden/so3/external_input.npz +0 -0
- mdescriptor-0.2.4/tests/golden/so3/external_manifest.json +84 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/so3/manifest.json +14 -0
- mdescriptor-0.2.4/tests/golden/so4/external_expected_output.npz +0 -0
- mdescriptor-0.2.4/tests/golden/so4/external_input.npz +0 -0
- mdescriptor-0.2.4/tests/golden/so4/external_manifest.json +87 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/so4/manifest.json +14 -0
- mdescriptor-0.2.4/tests/golden/soap/external_expected_output.npz +0 -0
- mdescriptor-0.2.4/tests/golden/soap/external_input.npz +0 -0
- mdescriptor-0.2.4/tests/golden/soap/external_manifest.json +164 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/soap/manifest.json +14 -0
- mdescriptor-0.2.4/tests/golden/soappowerspectrum/external_expected_output.npz +0 -0
- mdescriptor-0.2.4/tests/golden/soappowerspectrum/external_input.npz +0 -0
- mdescriptor-0.2.4/tests/golden/soappowerspectrum/external_manifest.json +246 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/soappowerspectrum/manifest.json +14 -0
- mdescriptor-0.2.4/tests/golden/soapradialspectrum/external_expected_output.npz +0 -0
- mdescriptor-0.2.4/tests/golden/soapradialspectrum/external_input.npz +0 -0
- mdescriptor-0.2.4/tests/golden/soapradialspectrum/external_manifest.json +96 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/soapradialspectrum/manifest.json +14 -0
- mdescriptor-0.2.4/tests/golden/soapturbo/expected_output.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/soapturbo/manifest.json +18 -6
- mdescriptor-0.2.4/tests/golden/sorteddistances/external_expected_output.npz +0 -0
- mdescriptor-0.2.4/tests/golden/sorteddistances/external_input.npz +0 -0
- mdescriptor-0.2.4/tests/golden/sorteddistances/external_manifest.json +91 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/sorteddistances/manifest.json +14 -0
- mdescriptor-0.2.4/tests/golden/sphericalexpansion/external_expected_output.npz +0 -0
- mdescriptor-0.2.4/tests/golden/sphericalexpansion/external_input.npz +0 -0
- mdescriptor-0.2.4/tests/golden/sphericalexpansion/external_manifest.json +192 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/sphericalexpansion/manifest.json +14 -0
- mdescriptor-0.2.4/tests/golden/sphericalexpansionbypair/external_expected_output.npz +0 -0
- mdescriptor-0.2.4/tests/golden/sphericalexpansionbypair/external_input.npz +0 -0
- mdescriptor-0.2.4/tests/golden/sphericalexpansionbypair/external_manifest.json +111 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/sphericalexpansionbypair/manifest.json +14 -0
- mdescriptor-0.2.4/tests/golden/valleoganov/external_expected_output.npz +0 -0
- mdescriptor-0.2.4/tests/golden/valleoganov/external_input.npz +0 -0
- mdescriptor-0.2.4/tests/golden/valleoganov/external_manifest.json +141 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/valleoganov/manifest.json +14 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_c00ps_mlff.py +6 -6
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_coulombmatrix_openmp.py +3 -1
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_descriptor_symmetry.py +2 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_dpa4_golden.py +4 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_dpa4c_golden.py +4 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_ewaldsummatrix_openmp.py +3 -1
- mdescriptor-0.2.4/tests/test_external_static_goldens.py +27 -0
- mdescriptor-0.2.4/tests/test_golden_independence.py +161 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_lmbtr_openmp.py +2 -1
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_nep_golden.py +4 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_valleoganov_openmp.py +2 -1
- mdescriptor-0.2.3/tests/external_reference/test_deepmd.py +0 -113
- mdescriptor-0.2.3/tests/golden/ace/expected_output.npz +0 -0
- mdescriptor-0.2.3/tests/golden/c00psmlff/expected_output.npz +0 -0
- mdescriptor-0.2.3/tests/golden/dpa4/expected_output.npz +0 -0
- mdescriptor-0.2.3/tests/golden/dpa4c/expected_output.npz +0 -0
- mdescriptor-0.2.3/tests/golden/lbispectrum/expected_output.npz +0 -0
- mdescriptor-0.2.3/tests/golden/mtp/expected_output.npz +0 -0
- mdescriptor-0.2.3/tests/golden/mtp/manifest.json +0 -626
- mdescriptor-0.2.3/tests/golden/soapturbo/expected_output.npz +0 -0
- mdescriptor-0.2.3/tests/test_golden_independence.py +0 -20
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/CMakeLists.txt +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/LICENSE +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/include/mdescriptor/ace.hpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/include/mdescriptor/detail/batch.hpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/include/mdescriptor/detail/blas.hpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/include/mdescriptor/detail/control.hpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/include/mdescriptor/detail/math3.hpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/include/mdescriptor/detail/species.hpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/include/mdescriptor/dpa4.hpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/include/mdescriptor/dpa4_wigner.hpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/include/mdescriptor/dpa4c.hpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/include/mdescriptor/extra.hpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/include/mdescriptor/local_descriptors.hpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/include/mdescriptor/mtp4.hpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/include/mdescriptor/mtp_cinf_coeffs.hpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/include/mdescriptor/neighbor.hpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/include/mdescriptor/nep.hpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/bindings/module.cpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/common/control.cpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/common/descriptor_common.hpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/common/extra_common.hpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/common/local_common.hpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/common/local_spherical_common.hpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/common/matrix_common.hpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/common/neighbor.cpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/common/nep.cpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/model_backed/dpa4.cpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/model_backed/dpa4_wigner.cpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/model_backed/dpa4c.cpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/ace.cpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/acsf.cpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/atomic_composition.cpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/coulomb_matrix.cpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/ead.cpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/ewald_sum_matrix.cpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/matrix_dispatch.cpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/mbtr.cpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/mtp.cpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/mtp4.cpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/neighbor_list.cpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/rotational_descriptors.cpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/sine_matrix.cpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/soap.cpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/soap_turbo.cpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/sorted_distances.cpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/spherical_expansion.cpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/cpp/src/standalone/spherical_expansion_by_pair.cpp +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/docs/descriptor-inventory.md +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/scripts/benchmark_dpa_native.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/scripts/benchmarking/__init__.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/scripts/benchmarking/benchmark_openmp_small.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/scripts/benchmarking/run_descriptor_benchmark.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/scripts/build_reference_wheel.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/scripts/check_descriptor_inventory.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/scripts/promote_descriptor_golden.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/scripts/run_benchmark.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/scripts/verify_wheel.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/__init__.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/_native.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/_native.pyi +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/core/__init__.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/core/adapter.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/core/control.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/core/descriptor.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/core/errors.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/core/input.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/core/json_value.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/core/model_adapter.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/core/options.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/core/result.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/core/species.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/__init__.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/__init__.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/ace.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/c00ps_mlff.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/core.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/dpa4.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/dpa4c.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/extra.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/local.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/mtp.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/nep.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/rotational.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/_kernels/soap_turbo.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/__init__.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/LICENSE-LGPL-3.0-or-later.txt +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/NOTICE.md +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/__init__.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/__init__.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/api.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/common.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/__init__.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/array_api.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/common.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/__init__.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/base_descriptor.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/__init__.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/activation.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/attention.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/attn_res.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/block.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/cartesian.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/edge_cache.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/embedding.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/ffn.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/grid_net.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/indexing.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/mlp.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/norm.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/projection.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/radial.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/so2.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/so3.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/utils.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/wignerd.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/__init__.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/bispectrum.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/charge_state.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/geometry.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/pair_film.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/readout.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/spin.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/make_base_descriptor.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/__init__.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/env_mat.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/exclude_mask.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/lebedev.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/lebedev_rules.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/__init__.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/builder.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/csr.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/from_ijs.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/graph.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/pairs.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/segment.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/network.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/nlist.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/region.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/safe_gradient.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/seed.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/spherical_harmonics.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/type_embed.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/env.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/utils/__init__.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/utils/charge_state.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/utils/plugin.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/utils/version.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/weights.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/dpa.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/dpa4/__init__.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/dpa4/descriptor.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/dpa4c/__init__.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/dpa4c/descriptor.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/graph.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/nep/__init__.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/model_backed/nep/descriptor.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/__init__.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/ace.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/acsf.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/c00ps_mlff.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/local/__init__.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/many_body/__init__.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/matrices/__init__.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/mtp.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/rotational/__init__.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/soap.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/descriptors/standalone/soap_turbo.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/models/__init__.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/models/assets/DPA4-Air-OMat24-v20260704.pt +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/models/assets/DPA4C-Air-OMat24-v20260819.pt +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/models/assets/nep89_20250409.txt +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/models/resolver.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/models/resource.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/models/session.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/registry/__init__.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/registry/builtins.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/registry/info.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/registry/model_defaults.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/registry/registry.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/src/mdescriptor/registry/spec.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/__init__.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/_public.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/contracts/test_input_schema.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/contracts/test_model_resources.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/contracts/test_result_schema.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/data/mlip4_test_mtp.json +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/external_reference/__init__.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/external_reference/test_dscribe.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/ace/input.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/acsf/expected_output.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/acsf/input.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/atomiccomposition/expected_output.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/atomiccomposition/input.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/c00psmlff/input.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/coulombmatrix/expected_output.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/coulombmatrix/input.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/dpa4/input.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/dpa4c/input.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/ead/expected_output.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/ead/input.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/ewaldsummatrix/expected_output.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/ewaldsummatrix/input.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/lbispectrum/input.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/lmbtr/expected_output.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/lmbtr/input.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/lodesphericalexpansion/expected_output.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/lodesphericalexpansion/input.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/mbtr/expected_output.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/mbtr/input.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/mtp/input.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/neighborlist/expected_output.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/neighborlist/input.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/nep/expected_output.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/nep/input.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/sinematrix/expected_output.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/sinematrix/input.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/snap/expected_output.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/snap/input.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/so3/expected_output.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/so3/input.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/so4/expected_output.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/so4/input.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/soap/expected_output.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/soap/input.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/soappowerspectrum/expected_output.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/soappowerspectrum/input.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/soapradialspectrum/expected_output.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/soapradialspectrum/input.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/soapturbo/input.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/sorteddistances/expected_output.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/sorteddistances/input.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/sphericalexpansion/expected_output.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/sphericalexpansion/input.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/sphericalexpansionbypair/expected_output.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/sphericalexpansionbypair/input.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/valleoganov/expected_output.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/golden/valleoganov/input.npz +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_ace.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_ace_golden.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_acsf_golden.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_all_descriptors.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_atomiccomposition_golden.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_c00psmlff_golden.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_coulombmatrix_golden.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_dpa4.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_dpa4c.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_ead_golden.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_ewaldsummatrix_golden.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_lbispectrum_golden.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_lmbtr_golden.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_lodesphericalexpansion_golden.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_mbtr_golden.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_mtp.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_mtp_golden.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_neighbor_graph.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_neighborlist_golden.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_nep.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_nonperiodic.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_openmp_support.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_reference.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_sinematrix_golden.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_sinematrix_openmp.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_snap_golden.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_so3_golden.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_so4_golden.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_soap_acsf_advanced.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_soap_golden.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_soappowerspectrum_golden.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_soapradialspectrum_golden.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_soapturbo_golden.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_sorteddistances_golden.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_sphericalexpansion_golden.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_sphericalexpansionbypair_golden.py +0 -0
- {mdescriptor-0.2.3 → mdescriptor-0.2.4}/tests/test_valleoganov_golden.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: MDescriptor
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.4
|
|
4
4
|
Summary: Batch-oriented periodic atomic descriptors with C++17 kernels
|
|
5
5
|
License: GNU GENERAL PUBLIC LICENSE
|
|
6
6
|
Version 3, 29 June 2007
|
|
@@ -687,6 +687,7 @@ Provides-Extra: sparse
|
|
|
687
687
|
Requires-Dist: scipy>=1.11; extra == "sparse"
|
|
688
688
|
Provides-Extra: test
|
|
689
689
|
Requires-Dist: pytest>=8; extra == "test"
|
|
690
|
+
Requires-Dist: pytest-cov>=7; extra == "test"
|
|
690
691
|
Requires-Dist: ase>=3.22; extra == "test"
|
|
691
692
|
Requires-Dist: scipy>=1.11; extra == "test"
|
|
692
693
|
Provides-Extra: reference-dscribe
|
|
@@ -720,6 +721,7 @@ Requires-Dist: ase>=3.22; extra == "all"
|
|
|
720
721
|
Requires-Dist: scipy>=1.11; extra == "all"
|
|
721
722
|
Provides-Extra: dev
|
|
722
723
|
Requires-Dist: pytest>=8; extra == "dev"
|
|
724
|
+
Requires-Dist: pytest-cov>=7; extra == "dev"
|
|
723
725
|
Requires-Dist: ase>=3.22; extra == "dev"
|
|
724
726
|
Requires-Dist: scipy>=1.11; extra == "dev"
|
|
725
727
|
Requires-Dist: ruff>=0.8; extra == "dev"
|
|
@@ -747,8 +749,10 @@ src/mdescriptor/descriptors/
|
|
|
747
749
|
model_backed/ graph seam plus NEP, DPA4, DPA4C
|
|
748
750
|
src/mdescriptor/models/assets/ packaged, hash-verified model resources
|
|
749
751
|
tests/golden/ descriptor-owned, benchmark-independent accuracy fixtures
|
|
752
|
+
docs/numerical-baselines.md static-golden and external-runtime oracle inventory
|
|
750
753
|
scripts/benchmarking/ controlled local benchmark runners
|
|
751
|
-
benchmarks/ local
|
|
754
|
+
benchmarks/ local benchmark snapshots (ignored except for tracked oracles)
|
|
755
|
+
benchmarks/_legacy_oracles/ pinned independent upstream oracle adapters
|
|
752
756
|
```
|
|
753
757
|
|
|
754
758
|
`standalone` descriptors never require a model file. `model_backed` descriptors
|
|
@@ -781,6 +785,23 @@ installing Torch; the supported default graphs run through the C++17/OpenMP
|
|
|
781
785
|
backend and specialised configurations retain the NumPy fallback. No network
|
|
782
786
|
model download is performed.
|
|
783
787
|
|
|
788
|
+
可选的外部数值对照固定使用 `deepmd-kit==3.2.0`:
|
|
789
|
+
|
|
790
|
+
```bash
|
|
791
|
+
python -m pip install ".[reference-deepmd]"
|
|
792
|
+
python -m pytest -m deepmd tests/external_reference/test_deepmd.py
|
|
793
|
+
```
|
|
794
|
+
|
|
795
|
+
该对照同时覆盖周期和非周期输入;非周期帧按 DeepMD 的 `cells=None` 语义传入。
|
|
796
|
+
`tests/golden/dpa4*` 的 expected output(包括非周期行)也由该外部 evaluator 生成,
|
|
797
|
+
manifest 记录了 evaluator 脚本、模型 hash 和 `deepmd-kit` 版本;运行时仍只加载已
|
|
798
|
+
提交的 NPZ,不要求安装 DeepMD。
|
|
799
|
+
|
|
800
|
+
所有 28 个描述符都登记在[数值基线清单](docs/numerical-baselines.md),并都有外部
|
|
801
|
+
静态 golden:7 个沿用独立上游/source NPZ,另外 21 个在对应目录的
|
|
802
|
+
`external_manifest.json` 中保存固定版本 provider 生成的数值。默认测试只依赖提交的
|
|
803
|
+
fixture;外部 provider 缺失或版本漂移会使 reference job 失败,而不会静默跳过。
|
|
804
|
+
|
|
784
805
|
性能说明:DPA4 native 路径现在使用固定大小分块的 SGEMM、可复用的计算工作区,
|
|
785
806
|
并只为每条边计算一次 attention logit;DPA4C 的类型对 MLP 采用每个 calculator
|
|
786
807
|
实例独立的惰性缓存。OpenBLAS 仅作为构建依赖,官方 wheel 会内置 prefixed 的
|
|
@@ -957,7 +978,7 @@ For GUI configuration JSON, a model parameter may be an explicit path string
|
|
|
957
978
|
or the tagged object returned by `ModelResource.to_dict()`; the latter is used
|
|
958
979
|
for named/checksummed resources.
|
|
959
980
|
|
|
960
|
-
The DPA4/DPA4C checkpoint readers and NumPy
|
|
981
|
+
The DPA4/DPA4C checkpoint readers and NumPy fallback path remain isolated
|
|
961
982
|
vendor adapters. The default inference graphs are lowered into the private
|
|
962
983
|
`mdescriptor._native` C++17/OpenMP extension.
|
|
963
984
|
|
|
@@ -966,8 +987,19 @@ vendor adapters. The default inference graphs are lowered into the private
|
|
|
966
987
|
```bash
|
|
967
988
|
.venv/bin/python -m pip install -e . --no-build-isolation
|
|
968
989
|
.venv/bin/python -m pytest --import-mode=importlib tests -q
|
|
990
|
+
.venv/bin/python -m pytest --cov=mdescriptor --cov-report=term-missing tests
|
|
991
|
+
|
|
992
|
+
.venv/bin/cmake -S cpp/tests -B build/cpp-tests -DCMAKE_BUILD_TYPE=Release
|
|
993
|
+
.venv/bin/cmake --build build/cpp-tests --config Release
|
|
994
|
+
.venv/bin/ctest --test-dir build/cpp-tests -C Release --output-on-failure
|
|
969
995
|
```
|
|
970
996
|
|
|
997
|
+
Coverage excludes the isolated vendored DPA implementation and enforces 75%
|
|
998
|
+
branch coverage for project-owned Python code. Tests marked `timing` record
|
|
999
|
+
repeatable timing samples but intentionally do not impose a runner-dependent
|
|
1000
|
+
speedup threshold; controlled performance reports are produced by
|
|
1001
|
+
`scripts/run_benchmark.py`.
|
|
1002
|
+
|
|
971
1003
|
The extension is private (`mdescriptor._native`). C++ shared math and batch
|
|
972
1004
|
helpers live in named headers under `cpp/include/mdescriptor/detail/`.
|
|
973
1005
|
|
|
@@ -19,8 +19,10 @@ src/mdescriptor/descriptors/
|
|
|
19
19
|
model_backed/ graph seam plus NEP, DPA4, DPA4C
|
|
20
20
|
src/mdescriptor/models/assets/ packaged, hash-verified model resources
|
|
21
21
|
tests/golden/ descriptor-owned, benchmark-independent accuracy fixtures
|
|
22
|
+
docs/numerical-baselines.md static-golden and external-runtime oracle inventory
|
|
22
23
|
scripts/benchmarking/ controlled local benchmark runners
|
|
23
|
-
benchmarks/ local
|
|
24
|
+
benchmarks/ local benchmark snapshots (ignored except for tracked oracles)
|
|
25
|
+
benchmarks/_legacy_oracles/ pinned independent upstream oracle adapters
|
|
24
26
|
```
|
|
25
27
|
|
|
26
28
|
`standalone` descriptors never require a model file. `model_backed` descriptors
|
|
@@ -53,6 +55,23 @@ installing Torch; the supported default graphs run through the C++17/OpenMP
|
|
|
53
55
|
backend and specialised configurations retain the NumPy fallback. No network
|
|
54
56
|
model download is performed.
|
|
55
57
|
|
|
58
|
+
可选的外部数值对照固定使用 `deepmd-kit==3.2.0`:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
python -m pip install ".[reference-deepmd]"
|
|
62
|
+
python -m pytest -m deepmd tests/external_reference/test_deepmd.py
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
该对照同时覆盖周期和非周期输入;非周期帧按 DeepMD 的 `cells=None` 语义传入。
|
|
66
|
+
`tests/golden/dpa4*` 的 expected output(包括非周期行)也由该外部 evaluator 生成,
|
|
67
|
+
manifest 记录了 evaluator 脚本、模型 hash 和 `deepmd-kit` 版本;运行时仍只加载已
|
|
68
|
+
提交的 NPZ,不要求安装 DeepMD。
|
|
69
|
+
|
|
70
|
+
所有 28 个描述符都登记在[数值基线清单](docs/numerical-baselines.md),并都有外部
|
|
71
|
+
静态 golden:7 个沿用独立上游/source NPZ,另外 21 个在对应目录的
|
|
72
|
+
`external_manifest.json` 中保存固定版本 provider 生成的数值。默认测试只依赖提交的
|
|
73
|
+
fixture;外部 provider 缺失或版本漂移会使 reference job 失败,而不会静默跳过。
|
|
74
|
+
|
|
56
75
|
性能说明:DPA4 native 路径现在使用固定大小分块的 SGEMM、可复用的计算工作区,
|
|
57
76
|
并只为每条边计算一次 attention logit;DPA4C 的类型对 MLP 采用每个 calculator
|
|
58
77
|
实例独立的惰性缓存。OpenBLAS 仅作为构建依赖,官方 wheel 会内置 prefixed 的
|
|
@@ -229,7 +248,7 @@ For GUI configuration JSON, a model parameter may be an explicit path string
|
|
|
229
248
|
or the tagged object returned by `ModelResource.to_dict()`; the latter is used
|
|
230
249
|
for named/checksummed resources.
|
|
231
250
|
|
|
232
|
-
The DPA4/DPA4C checkpoint readers and NumPy
|
|
251
|
+
The DPA4/DPA4C checkpoint readers and NumPy fallback path remain isolated
|
|
233
252
|
vendor adapters. The default inference graphs are lowered into the private
|
|
234
253
|
`mdescriptor._native` C++17/OpenMP extension.
|
|
235
254
|
|
|
@@ -238,8 +257,19 @@ vendor adapters. The default inference graphs are lowered into the private
|
|
|
238
257
|
```bash
|
|
239
258
|
.venv/bin/python -m pip install -e . --no-build-isolation
|
|
240
259
|
.venv/bin/python -m pytest --import-mode=importlib tests -q
|
|
260
|
+
.venv/bin/python -m pytest --cov=mdescriptor --cov-report=term-missing tests
|
|
261
|
+
|
|
262
|
+
.venv/bin/cmake -S cpp/tests -B build/cpp-tests -DCMAKE_BUILD_TYPE=Release
|
|
263
|
+
.venv/bin/cmake --build build/cpp-tests --config Release
|
|
264
|
+
.venv/bin/ctest --test-dir build/cpp-tests -C Release --output-on-failure
|
|
241
265
|
```
|
|
242
266
|
|
|
267
|
+
Coverage excludes the isolated vendored DPA implementation and enforces 75%
|
|
268
|
+
branch coverage for project-owned Python code. Tests marked `timing` record
|
|
269
|
+
repeatable timing samples but intentionally do not impose a runner-dependent
|
|
270
|
+
speedup threshold; controlled performance reports are produced by
|
|
271
|
+
`scripts/run_benchmark.py`.
|
|
272
|
+
|
|
243
273
|
The extension is private (`mdescriptor._native`). C++ shared math and batch
|
|
244
274
|
helpers live in named headers under `cpp/include/mdescriptor/detail/`.
|
|
245
275
|
|
|
@@ -86,7 +86,7 @@ struct C00PSMlffOptions {
|
|
|
86
86
|
int n_radial = 8;
|
|
87
87
|
int l_max = 4;
|
|
88
88
|
int cutoff_function = 0; // 0: BP, 1: MO, 2: RJ, 3: WMC
|
|
89
|
-
// Gaussian width sigma_atom in the
|
|
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
|
-
//
|
|
100
|
+
// Reference MLFF LSIC semantics: subtract self terms only from PS
|
|
101
101
|
// channels whose neighbour species is the centre species.
|
|
102
102
|
bool exclude_self_interaction = true;
|
|
103
103
|
int num_threads = 0;
|
|
@@ -21,10 +21,10 @@ using detail::run_parallel_structures;
|
|
|
21
21
|
|
|
22
22
|
constexpr double kPi = 3.141592653589793238462643383279502884;
|
|
23
23
|
constexpr double kSqrtFourPi = 3.544907701811032054596334966682290365;
|
|
24
|
-
//
|
|
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
|
|
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
|
-
//
|
|
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>(
|
|
284
|
-
for (int point = 1; 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
|
-
//
|
|
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
|
-
//
|
|
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>(
|
|
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 <=
|
|
326
|
+
for (int point = 0; point <= kReferenceRadialGridPoints; ++point) {
|
|
327
327
|
const double sample = options.r_cut * static_cast<double>(point)
|
|
328
|
-
/ static_cast<double>(
|
|
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>(
|
|
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>(
|
|
360
|
-
const int left = std::min(
|
|
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(
|
|
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
|
|
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
|
|
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
|
-
//
|
|
654
|
+
// The reference WVAR distinguishes radial indices, not
|
|
655
655
|
// flattened species/radial channels. Therefore
|
|
656
656
|
// cross-species channels with equal radial index
|
|
657
657
|
// retain weight 1.0.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
cmake_minimum_required(VERSION 3.15...4.0)
|
|
2
|
+
project(MDescriptorCppTests LANGUAGES CXX)
|
|
3
|
+
|
|
4
|
+
include(CTest)
|
|
5
|
+
find_package(OpenMP)
|
|
6
|
+
|
|
7
|
+
add_executable(
|
|
8
|
+
mdescriptor_cpp_public_api
|
|
9
|
+
test_public_api.cpp
|
|
10
|
+
../src/common/control.cpp
|
|
11
|
+
../src/common/neighbor.cpp
|
|
12
|
+
)
|
|
13
|
+
target_compile_features(mdescriptor_cpp_public_api PRIVATE cxx_std_17)
|
|
14
|
+
target_include_directories(mdescriptor_cpp_public_api PRIVATE ../include)
|
|
15
|
+
if(OpenMP_CXX_FOUND)
|
|
16
|
+
target_link_libraries(mdescriptor_cpp_public_api PRIVATE OpenMP::OpenMP_CXX)
|
|
17
|
+
endif()
|
|
18
|
+
|
|
19
|
+
add_test(NAME cpp_public_api COMMAND mdescriptor_cpp_public_api)
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
#include "mdescriptor/neighbor.hpp"
|
|
2
|
+
|
|
3
|
+
#include <array>
|
|
4
|
+
#include <cstdint>
|
|
5
|
+
#include <iostream>
|
|
6
|
+
#include <memory>
|
|
7
|
+
#include <stdexcept>
|
|
8
|
+
#include <string>
|
|
9
|
+
|
|
10
|
+
namespace {
|
|
11
|
+
|
|
12
|
+
void require(bool condition, const std::string& message) {
|
|
13
|
+
if (!condition) {
|
|
14
|
+
throw std::runtime_error(message);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
template <typename Error, typename Function>
|
|
19
|
+
void require_throws(Function&& function, const std::string& message) {
|
|
20
|
+
try {
|
|
21
|
+
function();
|
|
22
|
+
} catch (const Error&) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
throw std::runtime_error(message);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
mdescriptor::StructureBatchView isolated_pair() {
|
|
29
|
+
static const std::array<std::int32_t, 2> numbers{1, 8};
|
|
30
|
+
static const std::array<double, 6> positions{0.0, 0.0, 0.0, 1.0, 0.0, 0.0};
|
|
31
|
+
static const std::array<double, 9> cell{};
|
|
32
|
+
static const std::array<std::int32_t, 3> pbc{};
|
|
33
|
+
static const std::array<std::int64_t, 2> offsets{0, 2};
|
|
34
|
+
return {
|
|
35
|
+
numbers.data(), positions.data(), cell.data(), pbc.data(), offsets.data(), 1, 2,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
void test_compute_control_contract() {
|
|
40
|
+
auto control = std::make_shared<mdescriptor::ComputeControl>();
|
|
41
|
+
control->reset(2);
|
|
42
|
+
require(control->total() == 2, "reset must publish the requested total");
|
|
43
|
+
require(control->completed() == 0, "reset must clear completed work");
|
|
44
|
+
require(!control->cancelled(), "reset must clear cancellation");
|
|
45
|
+
control->mark_completed();
|
|
46
|
+
require(control->completed() == 1, "mark_completed must advance progress");
|
|
47
|
+
control->cancel();
|
|
48
|
+
require(control->cancelled(), "cancel must be observable");
|
|
49
|
+
require_throws<std::invalid_argument>(
|
|
50
|
+
[&] { control->reset(-1); },
|
|
51
|
+
"negative work totals must be rejected");
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
void test_neighbor_graph_boundary_contract() {
|
|
55
|
+
const auto batch = isolated_pair();
|
|
56
|
+
const auto inclusive = mdescriptor::build_neighbor_graph(batch, 1.0, nullptr, 1, true);
|
|
57
|
+
require(inclusive.atoms() == 2, "graph must retain the batch atom count");
|
|
58
|
+
require(inclusive.offsets() == std::vector<std::int64_t>({0, 2, 4}),
|
|
59
|
+
"inclusive cutoff must retain self and boundary neighbor entries");
|
|
60
|
+
for (std::int64_t center = 0; center < 2; ++center) {
|
|
61
|
+
const auto neighbors = inclusive.for_center(center);
|
|
62
|
+
require(neighbors.size == 2, "each center must expose both atoms");
|
|
63
|
+
bool found_self = false;
|
|
64
|
+
bool found_boundary = false;
|
|
65
|
+
for (std::size_t index = 0; index < neighbors.size; ++index) {
|
|
66
|
+
found_self = found_self || neighbors.exact_self(index, center);
|
|
67
|
+
found_boundary = found_boundary || neighbors.distance2[index] == 1.0;
|
|
68
|
+
}
|
|
69
|
+
require(found_self, "neighbor views must identify exact self entries");
|
|
70
|
+
require(found_boundary, "inclusive cutoff must retain distance-equal neighbors");
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const auto exclusive = mdescriptor::build_neighbor_graph(batch, 1.0, nullptr, 1, false);
|
|
74
|
+
require(exclusive.offsets() == std::vector<std::int64_t>({0, 1, 2}),
|
|
75
|
+
"exclusive cutoff must discard distance-equal neighbors");
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
void test_neighbor_graph_rejects_invalid_or_cancelled_work() {
|
|
79
|
+
auto mixed = isolated_pair();
|
|
80
|
+
const std::array<std::int32_t, 3> mixed_pbc{1, 0, 1};
|
|
81
|
+
mixed.pbc = mixed_pbc.data();
|
|
82
|
+
require_throws<std::invalid_argument>(
|
|
83
|
+
[&] { (void)mdescriptor::build_neighbor_graph(mixed, 1.0); },
|
|
84
|
+
"mixed periodicity must be rejected by the C++ boundary");
|
|
85
|
+
|
|
86
|
+
auto control = std::make_shared<mdescriptor::ComputeControl>();
|
|
87
|
+
control->reset(1);
|
|
88
|
+
control->cancel();
|
|
89
|
+
require_throws<mdescriptor::CancelledError>(
|
|
90
|
+
[&] { (void)mdescriptor::build_neighbor_graph(isolated_pair(), 1.0, control, 1); },
|
|
91
|
+
"pre-cancelled work must raise CancelledError");
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
} // namespace
|
|
95
|
+
|
|
96
|
+
int main() {
|
|
97
|
+
try {
|
|
98
|
+
test_compute_control_contract();
|
|
99
|
+
test_neighbor_graph_boundary_contract();
|
|
100
|
+
test_neighbor_graph_rejects_invalid_or_cancelled_work();
|
|
101
|
+
} catch (const std::exception& error) {
|
|
102
|
+
std::cerr << "C++ public API test failed: " << error.what() << '\n';
|
|
103
|
+
return 1;
|
|
104
|
+
}
|
|
105
|
+
return 0;
|
|
106
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Numerical baselines / 数值基线
|
|
2
|
+
|
|
3
|
+
The repository has a committed numerical golden for every descriptor.
|
|
4
|
+
An `external_static` entry means the values came from an independent
|
|
5
|
+
upstream/source oracle. The 21 provider-backed entries keep the older
|
|
6
|
+
project snapshot as a secondary contract fixture and add an
|
|
7
|
+
`external_manifest.json` sidecar as the primary numerical oracle.
|
|
8
|
+
The pinned provider tests remain a separate runtime smoke check.
|
|
9
|
+
|
|
10
|
+
当前 28 个描述符全部有外部静态数值 golden:7 个沿用已提交的
|
|
11
|
+
source-derived NPZ,另外 21 个由锁定版本的独立 provider 生成
|
|
12
|
+
sidecar。21 个旧 project snapshot 仍保留,用于覆盖原有布局、
|
|
13
|
+
metadata 与非周期契约;它们不再被冒充为 upstream 数值来源。
|
|
14
|
+
|
|
15
|
+
| Descriptor | Committed golden | Independent oracle | Package/source | CI marker |
|
|
16
|
+
|---|---|---|---|---|
|
|
17
|
+
| `SOAP` | external static | DScribe | `dscribe` (2.1.2) | `dscribe` |
|
|
18
|
+
| `SOAPTurbo` | external static | soap_turbo-master | `soap_turbo` (pinned source archive) | — |
|
|
19
|
+
| `ACSF` | external static | DScribe | `dscribe` (2.1.2) | `dscribe` |
|
|
20
|
+
| `ACE` | external static | ACE1.jl | `ACE1.jl` (0.12.5) | — |
|
|
21
|
+
| `CoulombMatrix` | external static | DScribe | `dscribe` (2.1.2) | `dscribe` |
|
|
22
|
+
| `SineMatrix` | external static | DScribe | `dscribe` (2.1.2) | `dscribe` |
|
|
23
|
+
| `EwaldSumMatrix` | external static | DScribe | `dscribe` (2.1.2) | `dscribe` |
|
|
24
|
+
| `MBTR` | external static | DScribe | `dscribe` (2.1.2) | `dscribe` |
|
|
25
|
+
| `LMBTR` | external static | DScribe | `dscribe` (2.1.2) | `dscribe` |
|
|
26
|
+
| `ValleOganov` | external static | DScribe | `dscribe` (2.1.2) | `dscribe` |
|
|
27
|
+
| `AtomicComposition` | external static | Featomic | `featomic` (0.6.6) | `featomic` |
|
|
28
|
+
| `NeighborList` | external static | Featomic | `featomic` (0.6.6) | `featomic` |
|
|
29
|
+
| `SortedDistances` | external static | Featomic | `featomic` (0.6.6) | `featomic` |
|
|
30
|
+
| `SphericalExpansion` | external static | Featomic | `featomic` (0.6.6) | `featomic` |
|
|
31
|
+
| `SphericalExpansionByPair` | external static | Featomic | `featomic` (0.6.6) | `featomic` |
|
|
32
|
+
| `SoapRadialSpectrum` | external static | Featomic | `featomic` (0.6.6) | `featomic` |
|
|
33
|
+
| `SoapPowerSpectrum` | external static | Featomic | `featomic` (0.6.6) | `featomic` |
|
|
34
|
+
| `LodeSphericalExpansion` | external static | Featomic | `featomic` (0.6.6) | `featomic` |
|
|
35
|
+
| `EAD` | external static | PyXtal_FF | `pyxtal_ff` (0.2.3) | `pyxtalff` |
|
|
36
|
+
| `SO3` | external static | PyXtal_FF | `pyxtal_ff` (0.2.3) | `pyxtalff` |
|
|
37
|
+
| `SO4` | external static | PyXtal_FF | `pyxtal_ff` (0.2.3) | `pyxtalff` |
|
|
38
|
+
| `SNAP` | external static | PyXtal_FF | `pyxtal_ff` (0.2.3) | `pyxtalff` |
|
|
39
|
+
| `LBispectrum` | external static | LAMMPS/PyXtal_FF | `lammps + pyxtal_ff` (pinned source archive + 0.2.3) | — |
|
|
40
|
+
| `MTP` | external static | MLIP-4 | `MLIP-4` (pinned source archive) | — |
|
|
41
|
+
| `C00PSMLFF` | external static | licensed external MLFF | `local-only input` (user-supplied) | — |
|
|
42
|
+
| `NEP` | external static | nep-adapters | `nep-adapters` (1.0.2) | `nepadapters` |
|
|
43
|
+
| `DPA4` | external static | deepmd-kit | `deepmd-kit` (3.2.0) | `deepmd` |
|
|
44
|
+
| `DPA4C` | external static | deepmd-kit | `deepmd-kit` (3.2.0) | `deepmd` |
|
|
45
|
+
|
|
46
|
+
The NPZ comparisons check values and all result identity fields
|
|
47
|
+
(`samples`, labels, level, structure ids and row offsets). Contract,
|
|
48
|
+
periodicity, symmetry and lifecycle tests remain separate because a
|
|
49
|
+
numeric golden cannot prove those behaviours.
|
|
@@ -23,7 +23,7 @@ dependencies = [
|
|
|
23
23
|
[project.optional-dependencies]
|
|
24
24
|
ase = ["ase>=3.22"]
|
|
25
25
|
sparse = ["scipy>=1.11"]
|
|
26
|
-
test = ["pytest>=8", "ase>=3.22", "scipy>=1.11"]
|
|
26
|
+
test = ["pytest>=8", "pytest-cov>=7", "ase>=3.22", "scipy>=1.11"]
|
|
27
27
|
reference-dscribe = ["pytest>=8", "ase==3.26.0", "scipy>=1.11", "dscribe==2.1.2"]
|
|
28
28
|
reference-featomic = ["pytest>=8", "ase==3.26.0", "scipy>=1.11", "featomic==0.6.6"]
|
|
29
29
|
reference-pyxtalff = [
|
|
@@ -46,7 +46,14 @@ reference-nepadapters = [
|
|
|
46
46
|
"nep-adapters==1.0.2",
|
|
47
47
|
]
|
|
48
48
|
all = ["ase>=3.22", "scipy>=1.11"]
|
|
49
|
-
dev = [
|
|
49
|
+
dev = [
|
|
50
|
+
"pytest>=8",
|
|
51
|
+
"pytest-cov>=7",
|
|
52
|
+
"ase>=3.22",
|
|
53
|
+
"scipy>=1.11",
|
|
54
|
+
"ruff>=0.8",
|
|
55
|
+
"mypy>=1.13",
|
|
56
|
+
]
|
|
50
57
|
|
|
51
58
|
[tool.scikit-build]
|
|
52
59
|
minimum-version = "1.0"
|
|
@@ -84,7 +91,18 @@ exclude = [
|
|
|
84
91
|
build = "cp310-* cp311-* cp312-* cp313-* cp314-*"
|
|
85
92
|
skip = "*-musllinux_* *-win32 *-*linux_i686"
|
|
86
93
|
test-requires = ["pytest>=8", "ase>=3.22", "scipy>=1.11"]
|
|
87
|
-
|
|
94
|
+
# The repository-level provenance tests read the checked-in metadata below;
|
|
95
|
+
# include those files in cibuildwheel's isolated test tree so every wheel
|
|
96
|
+
# platform exercises the same contract suite as the source checkout.
|
|
97
|
+
test-sources = [
|
|
98
|
+
"tests",
|
|
99
|
+
"scripts",
|
|
100
|
+
"pyproject.toml",
|
|
101
|
+
"benchmarks/_legacy_oracles/sources.lock.json",
|
|
102
|
+
"benchmarks/_legacy_oracles/soapturbo",
|
|
103
|
+
"benchmarks/_legacy_oracles/lbispectrum",
|
|
104
|
+
"benchmarks/_legacy_oracles/mtp",
|
|
105
|
+
]
|
|
88
106
|
test-command = "python -m pytest --import-mode=importlib -m \"not reference\" tests && python scripts/verify_wheel.py"
|
|
89
107
|
|
|
90
108
|
[tool.cibuildwheel.windows]
|
|
@@ -94,9 +112,11 @@ repair-wheel-command = "delvewheel repair --ignore-existing -w {dest_dir} -v {wh
|
|
|
94
112
|
|
|
95
113
|
[tool.pytest.ini_options]
|
|
96
114
|
testpaths = ["tests"]
|
|
115
|
+
pythonpath = ["."]
|
|
97
116
|
addopts = "-m 'not reference'"
|
|
98
117
|
markers = [
|
|
99
118
|
"model: tests that exercise bundled model-backed descriptors and assets",
|
|
119
|
+
"timing: timing smoke tests that record runtimes without enforcing a speedup",
|
|
100
120
|
"reference: tests that require a pinned external numerical reference implementation",
|
|
101
121
|
"dscribe: external numerical comparisons against pinned DScribe",
|
|
102
122
|
"featomic: external numerical comparisons against pinned Featomic",
|
|
@@ -105,6 +125,18 @@ markers = [
|
|
|
105
125
|
"nepadapters: external numerical comparisons against pinned nep-adapters",
|
|
106
126
|
]
|
|
107
127
|
|
|
128
|
+
[tool.coverage.run]
|
|
129
|
+
branch = true
|
|
130
|
+
source = ["mdescriptor"]
|
|
131
|
+
omit = [
|
|
132
|
+
"*/mdescriptor/descriptors/model_backed/_vendor/*",
|
|
133
|
+
]
|
|
134
|
+
|
|
135
|
+
[tool.coverage.report]
|
|
136
|
+
fail_under = 75
|
|
137
|
+
show_missing = true
|
|
138
|
+
skip_covered = true
|
|
139
|
+
|
|
108
140
|
[tool.ruff]
|
|
109
141
|
target-version = "py310"
|
|
110
142
|
line-length = 100
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Evaluate an ACE fixture directly through ACE1.jl.
|
|
3
|
+
|
|
4
|
+
The first argument is a generated Julia input file defining the uppercase
|
|
5
|
+
constants used below. The second argument receives a plain-text matrix, one
|
|
6
|
+
atom per row. Keeping the transport format in Julia's standard library avoids
|
|
7
|
+
adding a JSON or NumPy package to the archived ACE1.jl project.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
using ACE1
|
|
11
|
+
using JuLIP
|
|
12
|
+
|
|
13
|
+
include(ARGS[1])
|
|
14
|
+
|
|
15
|
+
basis = ACE1.Utils.rpi_basis(
|
|
16
|
+
species=SPECIES,
|
|
17
|
+
N=N_ORDER,
|
|
18
|
+
r0=R0,
|
|
19
|
+
trans=ACE1.PolyTransform(TRANSFORM_P, TRANSFORM_R0),
|
|
20
|
+
wL=WL,
|
|
21
|
+
maxdeg=MAX_DEGREE,
|
|
22
|
+
D=DEGREES,
|
|
23
|
+
rcut=R_CUT,
|
|
24
|
+
rin=R_IN,
|
|
25
|
+
pcut=P_CUT,
|
|
26
|
+
pin=P_IN,
|
|
27
|
+
constants=CONSTANTS,
|
|
28
|
+
warn=false,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
blocks = Matrix{Float64}[]
|
|
32
|
+
for structure in 1:(length(OFFSETS) - 1)
|
|
33
|
+
first = OFFSETS[structure]
|
|
34
|
+
last = OFFSETS[structure + 1] - 1
|
|
35
|
+
atoms = JuLIP.Atoms(
|
|
36
|
+
NUMBERS[first:last],
|
|
37
|
+
permutedims(POSITIONS[first:last, :]);
|
|
38
|
+
cell=CELLS[structure],
|
|
39
|
+
pbc=Tuple(PBCS[structure, :]),
|
|
40
|
+
)
|
|
41
|
+
push!(blocks, Matrix(permutedims(ACE1.Descriptors.descriptors(basis, atoms))))
|
|
42
|
+
end
|
|
43
|
+
values = isempty(blocks) ? zeros(Float64, 0, 0) : vcat(blocks...)
|
|
44
|
+
|
|
45
|
+
open(ARGS[2], "w") do output
|
|
46
|
+
println(output, size(values, 1), " ", size(values, 2))
|
|
47
|
+
for row in axes(values, 1)
|
|
48
|
+
println(output, join((repr(values[row, column]) for column in axes(values, 2)), " "))
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
println("ACE1=", Base.pkgversion(ACE1))
|
|
53
|
+
println("JuLIP=", Base.pkgversion(JuLIP))
|
|
54
|
+
println("Julia=", VERSION)
|
|
55
|
+
|