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.
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/CMakeLists.txt +2 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/PKG-INFO +23 -5
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/README.md +22 -4
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/include/mdescriptor/detail/control.hpp +9 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/bindings/module.cpp +21 -28
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/model_backed/dpa4.cpp +4 -3
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/model_backed/dpa4c.cpp +27 -1
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/ewald_sum_matrix.cpp +3 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/docs/descriptor-inventory.md +3 -3
- mdescriptor-0.2.6/docs/gui-adaptation-baseline.md +80 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/verify_wheel.py +6 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/__init__.py +35 -1
- mdescriptor-0.2.6/src/mdescriptor/_runtime.py +76 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/_version.py +3 -3
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/core/__init__.py +2 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/core/adapter.py +133 -6
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/core/errors.py +7 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/core/input.py +106 -3
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/core/model_adapter.py +4 -1
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/_kernels/dpa4.py +3 -28
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/_kernels/dpa4c.py +3 -28
- mdescriptor-0.2.6/src/mdescriptor/descriptors/_kernels/dpa_common.py +51 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/_kernels/extra.py +2 -2
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/_kernels/local.py +5 -2
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/dpa.py +9 -1
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/registry/__init__.py +51 -3
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/registry/builtins.py +26 -6
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/registry/info.py +13 -2
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/registry/spec.py +18 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/contracts/test_capabilities.py +3 -1
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/contracts/test_descriptor_info.py +29 -1
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/contracts/test_input_schema.py +27 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/contracts/test_public_api.py +21 -1
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/ewaldsummatrix/manifest.json +1 -1
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/lodesphericalexpansion/manifest.json +1 -1
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sinematrix/manifest.json +1 -1
- mdescriptor-0.2.6/tests/test_descriptor_regressions.py +98 -0
- mdescriptor-0.2.6/tests/test_dpa_control.py +278 -0
- mdescriptor-0.2.6/tests/test_import_threading.py +154 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_nonperiodic.py +26 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/LICENSE +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/include/mdescriptor/ace.hpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/include/mdescriptor/descriptor.hpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/include/mdescriptor/detail/batch.hpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/include/mdescriptor/detail/blas.hpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/include/mdescriptor/detail/math3.hpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/include/mdescriptor/detail/species.hpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/include/mdescriptor/dpa4.hpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/include/mdescriptor/dpa4_wigner.hpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/include/mdescriptor/dpa4c.hpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/include/mdescriptor/extra.hpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/include/mdescriptor/local_descriptors.hpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/include/mdescriptor/mtp4.hpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/include/mdescriptor/mtp_cinf_coeffs.hpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/include/mdescriptor/neighbor.hpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/include/mdescriptor/nep.hpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/common/control.cpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/common/descriptor_common.hpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/common/extra_common.hpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/common/local_common.hpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/common/local_spherical_common.hpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/common/matrix_common.hpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/common/neighbor.cpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/common/nep.cpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/model_backed/dpa4_wigner.cpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/ace.cpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/acsf.cpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/atomic_composition.cpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/c00ps_mlff.cpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/coulomb_matrix.cpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/ead.cpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/matrix_dispatch.cpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/mbtr.cpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/mtp.cpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/mtp4.cpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/neighbor_list.cpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/rotational_descriptors.cpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/sine_matrix.cpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/soap.cpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/soap_turbo.cpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/sorted_distances.cpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/spherical_expansion.cpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/src/standalone/spherical_expansion_by_pair.cpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/tests/CMakeLists.txt +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/cpp/tests/test_public_api.cpp +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/docs/numerical-baselines.md +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/pyproject.toml +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/ace1_reference.jl +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/benchmark_dpa_native.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/benchmarking/__init__.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/benchmarking/benchmark_openmp_small.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/benchmarking/run_descriptor_benchmark.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/build_reference_wheel.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/check_descriptor_inventory.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/check_numerical_baselines.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/deepmd_reference.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/descriptor_reference.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/external_reference.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/generate_ace1_reference.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/generate_descriptor_goldens.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/generate_external_c00ps_reference.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/generate_external_static_goldens.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/numerical_baselines.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/promote_descriptor_golden.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/scripts/run_benchmark.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/_native.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/_native.pyi +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/core/control.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/core/descriptor.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/core/json_value.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/core/options.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/core/result.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/core/species.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/__init__.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/_kernels/__init__.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/_kernels/ace.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/_kernels/c00ps_mlff.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/_kernels/core.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/_kernels/mtp.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/_kernels/nep.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/_kernels/rotational.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/_kernels/soap_turbo.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/__init__.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/LICENSE-LGPL-3.0-or-later.txt +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/NOTICE.md +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/__init__.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/__init__.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/api.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/common.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/__init__.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/array_api.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/common.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/__init__.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/base_descriptor.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/__init__.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/activation.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/attention.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/attn_res.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/block.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/cartesian.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/edge_cache.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/embedding.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/ffn.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/grid_net.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/indexing.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/mlp.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/norm.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/projection.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/radial.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/so2.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/so3.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/utils.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4_nn/wignerd.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/__init__.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/bispectrum.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/charge_state.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/geometry.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/pair_film.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/readout.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/dpa4c_nn/spin.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/descriptor/make_base_descriptor.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/__init__.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/env_mat.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/exclude_mask.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/lebedev.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/lebedev_rules.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/__init__.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/builder.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/csr.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/from_ijs.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/graph.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/pairs.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/neighbor_graph/segment.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/network.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/nlist.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/region.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/safe_gradient.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/seed.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/spherical_harmonics.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/dpmodel/utils/type_embed.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/env.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/utils/__init__.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/utils/charge_state.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/utils/plugin.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/utils/version.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/_vendor/dpa4desc/weights.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/dpa4/__init__.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/dpa4/descriptor.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/dpa4c/__init__.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/dpa4c/descriptor.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/graph.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/nep/__init__.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/model_backed/nep/descriptor.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/standalone/__init__.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/standalone/ace.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/standalone/acsf.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/standalone/c00ps_mlff.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/standalone/local/__init__.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/standalone/many_body/__init__.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/standalone/matrices/__init__.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/standalone/mtp.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/standalone/rotational/__init__.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/standalone/soap.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/descriptors/standalone/soap_turbo.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/models/__init__.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/models/assets/DPA4-Air-OMat24-v20260704.pt +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/models/assets/DPA4C-Air-OMat24-v20260819.pt +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/models/assets/nep89_20250409.txt +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/models/resolver.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/models/resource.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/models/session.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/registry/model_defaults.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/src/mdescriptor/registry/registry.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/__init__.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/_golden.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/_public.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/contracts/test_model_resources.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/contracts/test_result_schema.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/data/mlip4_mtp6_carbon.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/data/mlip4_test_mtp.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/external_reference/__init__.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/external_reference/test_deepmd.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/external_reference/test_dscribe.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/external_reference/test_featomic.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/external_reference/test_nep_adapters.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/external_reference/test_pyxtalff.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/ace/expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/ace/input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/ace/manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/acsf/expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/acsf/external_expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/acsf/external_input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/acsf/external_manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/acsf/input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/acsf/manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/atomiccomposition/expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/atomiccomposition/external_expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/atomiccomposition/external_input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/atomiccomposition/external_manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/atomiccomposition/input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/atomiccomposition/manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/c00psmlff/expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/c00psmlff/input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/c00psmlff/manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/coulombmatrix/expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/coulombmatrix/external_expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/coulombmatrix/external_input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/coulombmatrix/external_manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/coulombmatrix/input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/coulombmatrix/manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/dpa4/expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/dpa4/input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/dpa4/manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/dpa4c/expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/dpa4c/input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/dpa4c/manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/ead/expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/ead/external_expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/ead/external_input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/ead/external_manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/ead/input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/ead/manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/ewaldsummatrix/expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/ewaldsummatrix/external_expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/ewaldsummatrix/external_input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/ewaldsummatrix/external_manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/ewaldsummatrix/input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/lbispectrum/expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/lbispectrum/input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/lbispectrum/manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/lmbtr/expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/lmbtr/external_expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/lmbtr/external_input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/lmbtr/external_manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/lmbtr/input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/lmbtr/manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/lodesphericalexpansion/expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/lodesphericalexpansion/external_expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/lodesphericalexpansion/external_input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/lodesphericalexpansion/external_manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/lodesphericalexpansion/input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/mbtr/expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/mbtr/external_expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/mbtr/external_input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/mbtr/external_manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/mbtr/input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/mbtr/manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/mtp/expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/mtp/input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/mtp/manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/neighborlist/expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/neighborlist/external_expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/neighborlist/external_input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/neighborlist/external_manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/neighborlist/input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/neighborlist/manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/nep/expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/nep/external_expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/nep/external_input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/nep/external_manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/nep/input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/nep/manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sinematrix/expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sinematrix/external_expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sinematrix/external_input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sinematrix/external_manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sinematrix/input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/snap/expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/snap/external_expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/snap/external_input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/snap/external_manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/snap/input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/snap/manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/so3/expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/so3/external_expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/so3/external_input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/so3/external_manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/so3/input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/so3/manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/so4/expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/so4/external_expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/so4/external_input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/so4/external_manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/so4/input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/so4/manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soap/expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soap/external_expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soap/external_input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soap/external_manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soap/input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soap/manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soappowerspectrum/expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soappowerspectrum/external_expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soappowerspectrum/external_input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soappowerspectrum/external_manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soappowerspectrum/input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soappowerspectrum/manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soapradialspectrum/expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soapradialspectrum/external_expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soapradialspectrum/external_input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soapradialspectrum/external_manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soapradialspectrum/input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soapradialspectrum/manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soapturbo/expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soapturbo/input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/soapturbo/manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sorteddistances/expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sorteddistances/external_expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sorteddistances/external_input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sorteddistances/external_manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sorteddistances/input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sorteddistances/manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sphericalexpansion/expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sphericalexpansion/external_expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sphericalexpansion/external_input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sphericalexpansion/external_manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sphericalexpansion/input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sphericalexpansion/manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sphericalexpansionbypair/expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sphericalexpansionbypair/external_expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sphericalexpansionbypair/external_input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sphericalexpansionbypair/external_manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sphericalexpansionbypair/input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/sphericalexpansionbypair/manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/valleoganov/expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/valleoganov/external_expected_output.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/valleoganov/external_input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/valleoganov/external_manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/valleoganov/input.npz +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/golden/valleoganov/manifest.json +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_ace.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_ace_golden.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_acsf_golden.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_all_descriptors.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_atomiccomposition_golden.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_c00ps_mlff.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_c00psmlff_golden.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_coulombmatrix_golden.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_coulombmatrix_openmp.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_descriptor_symmetry.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_dpa4.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_dpa4_golden.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_dpa4c.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_dpa4c_golden.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_ead_golden.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_ewaldsummatrix_golden.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_ewaldsummatrix_openmp.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_external_static_goldens.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_golden_independence.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_lbispectrum_golden.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_lmbtr_golden.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_lmbtr_openmp.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_lodesphericalexpansion_golden.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_mbtr_golden.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_mtp.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_mtp_golden.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_neighbor_graph.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_neighborlist_golden.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_nep.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_nep_golden.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_openmp_support.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_reference.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_sinematrix_golden.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_sinematrix_openmp.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_snap_golden.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_so3_golden.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_so4_golden.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_soap_acsf_advanced.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_soap_golden.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_soappowerspectrum_golden.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_soapradialspectrum_golden.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_soapturbo_golden.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_sorteddistances_golden.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_sphericalexpansion_golden.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_sphericalexpansionbypair_golden.py +0 -0
- {mdescriptor-0.2.4 → mdescriptor-0.2.6}/tests/test_valleoganov_golden.py +0 -0
- {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.
|
|
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. `
|
|
958
|
-
|
|
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. `
|
|
228
|
-
|
|
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
|
-
|
|
457
|
-
|
|
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(
|
|
469
|
-
|
|
470
|
-
|
|
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", &
|
|
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", &
|
|
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
|
-
|
|
2755
|
-
|
|
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
|
-
|
|
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
|
-
`
|
|
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
|
-
|
|
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.
|
|
22
|
-
__version_tuple__ = version_tuple = (0, 2,
|
|
21
|
+
__version__ = version = '0.2.6'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 2, 6)
|
|
23
23
|
|
|
24
|
-
__commit_id__ = commit_id = '
|
|
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",
|