From a7d10e7997f8a5e850e005da2c7b40b54cd81c0c Mon Sep 17 00:00:00 2001 From: jenswehner Date: Fri, 4 Sep 2026 11:32:11 +0200 Subject: [PATCH 01/33] Remove legacy GauXC integration --- gauxc/UPSTREAM.md | 1 - gauxc/conftest.py | 19 - gauxc/docs/api/basis.rst | 440 ------------- gauxc/docs/api/cmake.rst | 183 ------ gauxc/docs/api/exceptions.rst | 55 -- gauxc/docs/api/index.rst | 19 - gauxc/docs/api/load_balancer.rst | 202 ------ gauxc/docs/api/macros.rst | 88 --- gauxc/docs/api/molecular_weights.rst | 288 --------- gauxc/docs/api/molecule.rst | 242 ------- gauxc/docs/api/molgrid.rst | 313 --------- gauxc/docs/api/runtime_environment.rst | 277 -------- gauxc/docs/api/xc_integrator.rst | 438 ------------- gauxc/docs/c-library.rst | 544 ---------------- gauxc/docs/conf.py | 29 - gauxc/docs/cpp-library.rst | 477 -------------- gauxc/docs/fortran-library.rst | 601 ------------------ gauxc/docs/gauxc.bib | 47 -- gauxc/docs/index.rst | 17 - gauxc/docs/installation.rst | 258 -------- gauxc/docs/scripts/export-h5.py | 14 - gauxc/docs/standalone.rst | 203 ------ gauxc/examples/c/gauxc_integration/.gitignore | 3 - .../c/gauxc_integration/CMakeLists.txt | 52 -- gauxc/examples/c/gauxc_integration/app/main.c | 412 ------------ .../cmake/skala-argtable3.cmake | 23 - .../cmake/skala-dep-versions.cmake | 5 - .../gauxc_integration/cmake/skala-gauxc.cmake | 45 -- .../gauxc_integration/cmake/skala-hdf5.cmake | 1 - .../examples/cpp/gauxc_integration/.gitignore | 3 - .../cpp/gauxc_integration/CMakeLists.txt | 39 -- .../cpp/gauxc_integration/app/main.cxx | 248 -------- .../gauxc_integration/cmake/skala-cli11.cmake | 25 - .../cmake/skala-dep-versions.cmake | 8 - .../cmake/skala-eigen3.cmake | 28 - .../gauxc_integration/cmake/skala-gauxc.cmake | 41 -- .../gauxc_integration/cmake/skala-hdf5.cmake | 9 - .../cmake/skala-sdftd3.cmake | 48 -- .../fortran/gauxc_integration/.gitignore | 3 - .../fortran/gauxc_integration/CMakeLists.txt | 52 -- .../fortran/gauxc_integration/app/main.F90 | 388 ----------- .../cmake/skala-dep-versions.cmake | 5 - .../gauxc_integration/cmake/skala-flap.cmake | 31 - .../gauxc_integration/cmake/skala-gauxc.cmake | 49 -- .../gauxc_integration/cmake/skala-hdf5.cmake | 1 - gauxc/src/skala_gauxc/__init__.py | 5 - gauxc/src/skala_gauxc/export.py | 163 ----- gauxc/tests/test_gauxc_export.py | 90 --- 48 files changed, 6532 deletions(-) delete mode 100644 gauxc/UPSTREAM.md delete mode 100644 gauxc/conftest.py delete mode 100644 gauxc/docs/api/basis.rst delete mode 100644 gauxc/docs/api/cmake.rst delete mode 100644 gauxc/docs/api/exceptions.rst delete mode 100644 gauxc/docs/api/index.rst delete mode 100644 gauxc/docs/api/load_balancer.rst delete mode 100644 gauxc/docs/api/macros.rst delete mode 100644 gauxc/docs/api/molecular_weights.rst delete mode 100644 gauxc/docs/api/molecule.rst delete mode 100644 gauxc/docs/api/molgrid.rst delete mode 100644 gauxc/docs/api/runtime_environment.rst delete mode 100644 gauxc/docs/api/xc_integrator.rst delete mode 100644 gauxc/docs/c-library.rst delete mode 100644 gauxc/docs/conf.py delete mode 100644 gauxc/docs/cpp-library.rst delete mode 100644 gauxc/docs/fortran-library.rst delete mode 100644 gauxc/docs/gauxc.bib delete mode 100644 gauxc/docs/index.rst delete mode 100644 gauxc/docs/installation.rst delete mode 100644 gauxc/docs/scripts/export-h5.py delete mode 100644 gauxc/docs/standalone.rst delete mode 100644 gauxc/examples/c/gauxc_integration/.gitignore delete mode 100644 gauxc/examples/c/gauxc_integration/CMakeLists.txt delete mode 100644 gauxc/examples/c/gauxc_integration/app/main.c delete mode 100644 gauxc/examples/c/gauxc_integration/cmake/skala-argtable3.cmake delete mode 100644 gauxc/examples/c/gauxc_integration/cmake/skala-dep-versions.cmake delete mode 100644 gauxc/examples/c/gauxc_integration/cmake/skala-gauxc.cmake delete mode 100644 gauxc/examples/c/gauxc_integration/cmake/skala-hdf5.cmake delete mode 100644 gauxc/examples/cpp/gauxc_integration/.gitignore delete mode 100644 gauxc/examples/cpp/gauxc_integration/CMakeLists.txt delete mode 100644 gauxc/examples/cpp/gauxc_integration/app/main.cxx delete mode 100644 gauxc/examples/cpp/gauxc_integration/cmake/skala-cli11.cmake delete mode 100644 gauxc/examples/cpp/gauxc_integration/cmake/skala-dep-versions.cmake delete mode 100644 gauxc/examples/cpp/gauxc_integration/cmake/skala-eigen3.cmake delete mode 100644 gauxc/examples/cpp/gauxc_integration/cmake/skala-gauxc.cmake delete mode 100644 gauxc/examples/cpp/gauxc_integration/cmake/skala-hdf5.cmake delete mode 100644 gauxc/examples/cpp/gauxc_integration/cmake/skala-sdftd3.cmake delete mode 100644 gauxc/examples/fortran/gauxc_integration/.gitignore delete mode 100644 gauxc/examples/fortran/gauxc_integration/CMakeLists.txt delete mode 100644 gauxc/examples/fortran/gauxc_integration/app/main.F90 delete mode 100644 gauxc/examples/fortran/gauxc_integration/cmake/skala-dep-versions.cmake delete mode 100644 gauxc/examples/fortran/gauxc_integration/cmake/skala-flap.cmake delete mode 100644 gauxc/examples/fortran/gauxc_integration/cmake/skala-gauxc.cmake delete mode 100644 gauxc/examples/fortran/gauxc_integration/cmake/skala-hdf5.cmake delete mode 100644 gauxc/src/skala_gauxc/__init__.py delete mode 100644 gauxc/src/skala_gauxc/export.py delete mode 100644 gauxc/tests/test_gauxc_export.py diff --git a/gauxc/UPSTREAM.md b/gauxc/UPSTREAM.md deleted file mode 100644 index 1ebcc865..00000000 --- a/gauxc/UPSTREAM.md +++ /dev/null @@ -1 +0,0 @@ -The development version of GauXC with added support for Skala was moved to the `skala` branch of the main GauXC repo at https://github.com/wavefunction91/GauXC/tree/skala. diff --git a/gauxc/conftest.py b/gauxc/conftest.py deleted file mode 100644 index 5ce23035..00000000 --- a/gauxc/conftest.py +++ /dev/null @@ -1,19 +0,0 @@ -# SPDX-License-Identifier: MIT - -"""Fixtures for the GauXC export utilities.""" - -from collections.abc import Iterator - -import pytest -from pyscf.scf import hf - - -@pytest.fixture(scope="session", autouse=True) -def mute_pyscf_temporary_checkpoints() -> Iterator[None]: - """Disable implicit PySCF checkpoint files for the test session.""" - previous = hf.MUTE_CHKFILE - hf.MUTE_CHKFILE = True - try: - yield - finally: - hf.MUTE_CHKFILE = previous diff --git a/gauxc/docs/api/basis.rst b/gauxc/docs/api/basis.rst deleted file mode 100644 index 9b643196..00000000 --- a/gauxc/docs/api/basis.rst +++ /dev/null @@ -1,440 +0,0 @@ -GauXC Basis Set API -=================== - -This section provides a reference for the GauXC basis set API, including C++ class definitions, C struct definitions, and Fortran derived type definitions for representing basis sets and shells in GauXC. - -C++ definitions ---------------- - -.. cpp:struct:: template \ - GauXC::BasisSet : public std::vector> - - A class to represent a collection of shells in a basis set. - - .. cpp:function:: inline BasisSet(std::vector> shells) - - Construct a BasisSet object from a vector of Shell objects. - - :param shells: A vector of Shell objects representing the shells in the basis set. - :returns: A BasisSet object initialized with the given shells. - - .. cpp:function:: inline int32_t nshells() const - - Get the number of shells in the basis set. - - :returns: The number of shells in the basis set. - - .. cpp:function:: inline int32_t nbf() const - - Get the total number of basis functions in the basis set, calculated as the sum of the sizes of all shells. - - :returns: The total number of basis functions in the basis set. - - -.. cpp:class:: template \ - GauXC::Shell - - A class to represent a shell in a basis set, containing its angular momentum and a vector of primitives. - - .. cpp:type:: prim_array = std::array - - A type to represent an array of primitive exponents or coefficients in a shell. - - .. cpp:type:: cart_array = std::array - - A type to represent an array of Cartesian coordinates for the center of a shell. - - .. cpp:member:: PrimSize nprim_ - - The number of primitives in the shell. - - .. cpp:member:: AngularMomentum l_ - - The angular momentum of the shell. - - .. cpp:member:: SphericalType pure_ - - Whether the shell is pure (spherical) or Cartesian. - - .. cpp:member:: prim_array alpha_ - - The exponents of the primitives in the shell. - - .. cpp:member:: prim_array coeff_ - - The coefficients of the primitives in the shell. - - .. cpp:member:: cart_array O_ - - The Cartesian coordinates of the center of the shell. - - .. cpp:member:: double cutoff_radius_ - - The cutoff radius of the shell, defined as the maximum distance from the center of the shell at which the primitives have non-negligible contributions. - - .. cpp:member:: double tolerance_ - - The tolerance for pruning primitives in the shell. Primitives with coefficients below this value will be pruned. The default value is 1e-10. - - .. cpp:function:: inline void set_shell_tolerance(double tol) - - Set the tolerance for pruning primitives in the shell. - The default value for the tolerance is 1e-10. - - :param tol: The tolerance for pruning primitives. Primitives with coefficients below this value will be pruned. - - .. cpp:function:: inline PrimSize nprim() const - - Get the number of primitives in the shell. - - :returns: The number of primitives in the shell. - - .. cpp:function:: inline AngularMomentum l() const - - Get the angular momentum of the shell. - - :returns: The angular momentum of the shell. - - .. cpp:function:: inline SphericalType pure() const - - Get whether the shell is pure (spherical) or Cartesian. - - :returns: ``1`` if the shell is pure (spherical), ``0`` if the shell is Cartesian. - - .. cpp:function:: inline const F* alpha_data() const - - Get a pointer to the exponents of the primitives in the shell. - - :returns: A pointer to the exponents of the primitives in the shell. - - .. cpp:function:: inline const F* coeff_data() const - - Get a pointer to the coefficients of the primitives in the shell. - - :returns: A pointer to the coefficients of the primitives in the shell. - - .. cpp:function:: inline const double* O_data() const - - Get a pointer to the Cartesian coordinates of the center of the shell. - - :returns: A pointer to the Cartesian coordinates of the center of the shell. - - .. cpp::function:: inline F* alpha_data() - - Get a mutable pointer to the exponents of the primitives in the shell. - - :returns: A mutable pointer to the exponents of the primitives in the shell. - - .. cpp::function:: inline F* coeff_data() - - Get a mutable pointer to the coefficients of the primitives in the shell. - - :returns: A mutable pointer to the coefficients of the primitives in the shell. - - .. cpp::function:: inline double* O_data() - - Get a mutable pointer to the Cartesian coordinates of the center of the shell. - - :returns: A mutable pointer to the Cartesian coordinates of the center of the shell. - - .. cpp:function:: inline double cutoff_radius() const - - Get the cutoff radius of the shell, defined as the maximum distance from the center of the shell at which the primitives have non-negligible contributions. - - :returns: The cutoff radius of the shell. - - .. cpp:function:: inline int32_t cart_size() const - - Get the number of Cartesian functions in the shell. - - :returns: The number of Cartesian functions in the shell. - - .. cpp:function:: inline int32_t pure_size() const - - Get the number of pure (spherical) functions in the shell. - - :returns: The number of pure (spherical) functions in the shell. - - .. cpp:function:: inline int32_t size() const - - Get the total number of functions in the shell, based on whether the shell is pure (spherical) or Cartesian. - - :returns: The total number of functions in the shell. - - .. cpp:function:: inline prim_array& alpha() const - - Get the exponents of the primitives in the shell as an array. - - :returns: An array containing the exponents of the primitives in the shell. - - .. cpp:function:: inline prim_array& coeff() const - - Get the coefficients of the primitives in the shell as an array. - - :returns: An array containing the coefficients of the primitives in the shell. - - .. cpp:function:: inline cart_array& O() const - - Get the Cartesian coordinates of the center of the shell as an array. - - :returns: An array containing the Cartesian coordinates of the center of the shell. - - .. cpp:function:: inline prim_array& alpha() - - Get the exponents of the primitives in the shell as a mutable array. - - :returns: A mutable array containing the exponents of the primitives in the shell. - - .. cpp:function:: inline prim_array& coeff() - - Get the coefficients of the primitives in the shell as a mutable array. - - :returns: A mutable array containing the coefficients of the primitives in the shell. - - .. cpp:function:: inline cart_array& O() - - Get the Cartesian coordinates of the center of the shell as a mutable array. - - :returns: A mutable array containing the Cartesian coordinates of the center of the shell. - - .. cpp:function:: inline void set_pure(bool pure) - - Set whether the shell is pure (spherical) or Cartesian. - - :param pure: ``1`` to set the shell as pure (spherical), ``0`` to set the shell as Cartesian. - - .. cpp:function:: inline bool operator==(const Shell& other) const - - Compare this shell with another shell for equality. - - :param other: Another shell to compare with. - :returns: True if this shell is equal to the other shell, false otherwise. - - -.. cpp:type:: PrimSize = int32_t - - A type to represent the number of primitives in a shell. - -.. cpp:type:: AngularMomentum = int32_t - - A type to represent the angular momentum of a shell. - -.. cpp:type:: SphericalType = int32_t - - A type to represent whether a shell is pure (spherical) or Cartesian. - ``1`` indicates a pure (spherical) shell, while ``0`` indicates a Cartesian shell. - -C bindings ----------- - -.. c:struct:: GauXCBasisSet - - An opaque struct to represent a basis set in the C API. - - .. c:function:: GauXCBasisSet gauxc_basisset_new(GauXCStatus* status) - - Create a new GauXCBasisSet object. - - :param status: A pointer to a GauXCStatus variable to store the status of the operation. - :returns: A new GauXCBasisSet object. - - .. c:function:: GauXCBasisSet gauxc_basisset_new_from_shells(GauXCStatus* status, const GauXCShell* shells, int32_t nshells, bool normalize) - - Create a new GauXCBasisSet object from an array of GauXCShell objects. - - :param status: A pointer to a GauXCStatus variable to store the status of the operation. - :param shells: A pointer to an array of GauXCShell objects representing the shells in the basis set. - :param nshells: The number of shells in the array. - :param normalize: Whether to normalize the primitives in the shells when creating the basis set. - :returns: A new GauXCBasisSet object initialized with the given shells. - - .. c:function:: void gauxc_basisset_delete(GauXCStatus* status, GauXCBasisSet* basis) - - Delete a GauXCBasisSet object and free its associated memory. - - :param status: A pointer to a GauXCStatus variable to store the status of the operation. - :param basis: A pointer to the GauXCBasisSet object to be deleted. - -.. c:struct:: GauXCShell - - Representation of a shell in a basis set for the C API, containing its angular momentum, number of primitives, and pointers to arrays of primitive exponents, coefficients, and Cartesian coordinates. - - .. c:member:: int32_t l - - The angular momentum of the shell. - - .. c:member:: bool pure - - Whether the shell is pure (spherical) or Cartesian. - - .. c:member:: int32_t nprim - - The number of primitives in the shell. - - .. c:member:: double alpha[32] - - An array of exponents of the primitives in the shell. - - .. c:member:: double coeff[32] - - An array of coefficients of the primitives in the shell. - - .. c:member:: double O[3] - - An array of Cartesian coordinates for the center of the shell. - - .. c:member:: double shell_tolerance - - The tolerance for pruning primitives in the shell. - Primitives with coefficients below this value will be pruned. - The default value is 1e-10. - -Fortran bindings ----------------- - -.. f:module:: gauxc_basisset - :synopsis: Fortran bindings for the GauXC basis set API. - -.. f:currentmodule:: gauxc_basisset - -.. f:type:: gauxc_basisset_type - - Opaque type representing a basis set in the GauXC Fortran API. - Available from :f:mod:`gauxc_basisset`. - - .. f:function:: gauxc_basisset_new(status) - - Create a new gauxc_basisset_type object. - - :param type(gauxc_status_type) status: A variable to store the status of the operation. - :returns type(gauxc_basisset_type): A new gauxc_basisset_type object. - - .. f:function:: gauxc_basisset_new_from_shells(status, shells, nshells, normalize) - - Create a new gauxc_basisset_type object from an array of gauxc_shell_type objects. - - :param type(gauxc_status_type) status: A variable to store the status of the operation. - :param type(gauxc_shell_type) shells(*): An array of :f:type:`gauxc_shell_type` objects representing the shells in the basis set. - :param integer(c_int32_t) nshells: The number of shells in the array. - :param logical(c_bool) normalize: Whether to normalize the primitives in the shells when creating the basis set. - :returns type(gauxc_basisset_type): A new gauxc_basisset_type object initialized with the given shells. - - .. f:function:: gauxc_basisset_delete(status, basis) - - Delete a gauxc_basisset_type object and free its associated memory. - Part of the :f:func:`gauxc_delete` interface. - - :param type(gauxc_status_type) status: A variable to store the status of the operation. - :param type(gauxc_basisset_type) basis: The gauxc_basisset_type object to be deleted. - -.. f:currentmodule:: gauxc_shell - -.. f:type:: gauxc_shell_type - - A derived type representing a shell in the GauXC Fortran API, containing its angular momentum, number of primitives, and arrays of primitive exponents, coefficients, and Cartesian coordinates. - - :f integer(c_int32_t) l: - The angular momentum of the shell. - - :f logical(c_bool) pure: - Whether the shell is pure (spherical) or Cartesian. - - :f integer(c_int32_t) nprim: - The number of primitives in the shell. - - :f real(c_double) alpha(32): - An array of exponents of the primitives in the shell. - - :f real(c_double) coeff(32): - An array of coefficients of the primitives in the shell. - - :f real(c_double) O(3): - An array of Cartesian coordinates for the center of the shell. - - :f real(c_double) shell_tolerance: - The tolerance for pruning primitives in the shell. - Primitives with coefficients below this value will be pruned. - The default value is 1e-10. - -Serialization to HDF5 ---------------------- - -If GauXC has been built with HDF5 support :c:macro:`GAUXC_HAS_HDF5`, the :cpp:class:`GauXC::BasisSet` class can be serialized to and deserialized from HDF5 files using the provided HDF5 interface. -This allows for easy storage and retrieval of basis set data in a standardized format. - -.. cpp:function:: void GauXC::write_hdf5_record(const BasisSet& basis, const std::string& filename, const std::string& group_name) - - Write a BasisSet object to an HDF5 file. - - :param basis: The BasisSet object to be written to the file. - :param filename: The name of the HDF5 file to write to. - :param group_name: The name of the group in the HDF5 file where the basis set data will be stored. - -.. cpp:function:: void GauXC::read_hdf5_record(BasisSet& basis, const std::string& filename, const std::string& group_name) - - Read a BasisSet object from an HDF5 file. - - :param basis: The BasisSet object to be populated with the data read from the file. - :param filename: The name of the HDF5 file to read from. - :param group_name: The name of the group in the HDF5 file where the basis set data is stored. - -The same functions are available in the GauXC C API. - -.. c:function:: void gauxc_basisset_write_hdf5_record(GauXCBasisSet basis, const char* filename, const char* group_name) - - Write a GauXCBasisSet object to an HDF5 file in C. - - :param basis: The GauXCBasisSet object to be written to the file. - :param filename: The name of the HDF5 file to write to. - :param group_name: The name of the group in the HDF5 file where the basis set data will be stored. - -.. c:function:: void gauxc_basisset_read_hdf5_record(GauXCBasisSet basis, const char* filename, const char* group_name) - - Read a GauXCBasisSet object from an HDF5 file in C. - - :param basis: The GauXCBasisSet object to be populated with the data read from the file. - :param filename: The name of the HDF5 file to read from. - :param group_name: The name of the group in the HDF5 file where the basis set data is stored. - -The same functions are also available in the GauXC Fortran API, available from the module :f:mod:`gauxc_external_hdf5`. - -.. f:module:: gauxc_external_hdf5 - :synopsis: HDF5 serialization functions for GauXC basis set objects. - -.. f:currentmodule:: gauxc_external_hdf5 - -.. f:subroutine:: gauxc_basisset_write_hdf5_record(basis, filename, group_name) - - Write a gauxc_basisset_type object to an HDF5 file in Fortran. - - :param type(gauxc_basisset_type) basis: The gauxc_basisset_type object to be written to the file. - :param character(len=*) filename: The name of the HDF5 file to write to. - :param character(len=*) group_name: The name of the group in the HDF5 file where the basis set data will be stored. - -.. f:subroutine:: gauxc_basisset_read_hdf5_record(basis, filename, group_name) - - Read a gauxc_basisset_type object from an HDF5 file in Fortran. - - :param type(gauxc_basisset_type) basis: The gauxc_basisset_type object to be populated with the data read from the file. - :param character(len=*) filename: The name of the HDF5 file to read from. - :param character(len=*) group_name: The name of the group in the HDF5 file where the basis set data is stored. - - -.. _gauxc-orbital-ordering: - -Orbital Ordering Convention ---------------------------- - -The orbital ordering convention for the shells in GauXC is following the common component architecture (CCA) convention for pure (spherical) shells and the row convention for cartesian ones. -The CCA ordering for pure (spherical) shells is defined as - -- ``s`` (:math:`\ell = 0`): :math:`Y_0^0` -- ``p`` (:math:`\ell = 1`): :math:`Y_1^{-1}`, :math:`Y_1^{0}`, :math:`Y_1^{+1}`, -- ``d`` (:math:`\ell = 2`): :math:`Y_2^{-2}`, :math:`Y_2^{-1}`, :math:`Y_2^{0}`, :math:`Y_2^{+1}`, :math:`Y_2^{+2}` - -The row ordering for cartesian shells is defined as - -- ``s`` (:math:`\ell = 0`): `1` -- ``p`` (:math:`\ell = 1`): ``x``, ``y``, ``z`` -- ``d`` (:math:`\ell = 2`): ``xx``, ``xy``, ``xz``, ``yy``, ``yz``, ``zz`` -- ``f`` (:math:`\ell = 3`): ``xxx``, ``xxy``, ``xxz``, ``xyy``, ``xyz``, ``xzz``, ``yyy``, ``yyz``, ``yzz``, ``zzz`` \ No newline at end of file diff --git a/gauxc/docs/api/cmake.rst b/gauxc/docs/api/cmake.rst deleted file mode 100644 index 41b4284a..00000000 --- a/gauxc/docs/api/cmake.rst +++ /dev/null @@ -1,183 +0,0 @@ -CMake Configuration Options -=========================== - -This section provides an overview of the available CMake configuration options for building GauXC with Skala support, as well as the required dependencies for each configuration. - - -.. _gauxc-cmake-deps: - -GauXC dependencies ------------------- - -The following dependencies are required for building GauXC with Skala support: - -- C/C++ compiler (with C++17 support) -- CMake (version 3.20 or higher) -- `exchcxx `__\ * (version 1 or higher) -- `libxc `__\ * (version 7 or higher) -- `integratorxx `__\ * (version 1 or higher) -- `gau2grid `__\ * (version 2.0.6 or higher) -- `libtorch `__ (CPU or CUDA version depending on your configuration) -- `nlohmann_json `__\ * (version 3.9.1 or higher) -- BLAS library (like OpenBLAS, MKL, etc.) - -When building with Fortran support via :cmake:variable:`GAUXC_ENABLE_FORTRAN` (default ``off``), a Fortran compiler is also required. - -When building with MPI support via :cmake:variable:`GAUXC_ENABLE_MPI` (default ``off``), the following dependencies are also required: - -- MPI implementation (like OpenMPI, MPICH, etc.) - -When building with CUDA support via :cmake:variable:`GAUXC_ENABLE_CUDA` (default ``off``), the following dependencies are also required: - -- CUDA toolkit -- `cuBLAS library `__ -- `Cutlass library `__\ * -- `CUB library `__\ * - -When building with HDF5 support via :cmake:variable:`GAUXC_ENABLE_HDF5` (default ``on``), the following dependencies are also required: - -- `HDF5 `__ -- `HighFive `__\ * (version 2.4.0 or higher) - -All libraries marked with a * can be automatically fetched by the GauXC build system and do not need to be installed manually. - - -.. _gauxc-cmake-options: - -Available configurations for CMake build ----------------------------------------- - -.. cmake:variable:: GAUXC_ENABLE_OPENMP - - Enable OpenMP support in GauXC (default: ON) - -.. cmake:variable:: GAUXC_ENABLE_MPI - - Enable MPI support in GauXC (default: OFF) - -.. cmake:variable:: GAUXC_ENABLE_ONEDFT - - Enable Skala support in GauXC (default: OFF) - -.. cmake:variable:: GAUXC_ENABLE_CUDA - - Enable CUDA support in GauXC (default: OFF) - Requires ExchCXX to be built with CUDA support as well (:cmake:variable:`EXCHCXX_ENABLE_CUDA` CMake option). - Cannot be enabled with HIP support at the same time. - -.. cmake:variable:: GAUXC_ENABLE_HIP - - Enable HIP support in GauXC (default: OFF) - Requires ExchCXX to be built with HIP support as well (:cmake:variable:`EXCHCXX_ENABLE_HIP` CMake option). - Cannot be enabled with CUDA support at the same time. - -.. cmake:variable:: GAUXC_ENABLE_C - - Enable C bindings for GauXC (default: OFF) - -.. cmake:variable:: GAUXC_ENABLE_FORTRAN - - Enable Fortran bindings for GauXC (default: OFF) - Requires Fortran compiler and :cmake:variable:`GAUXC_ENABLE_C` to be enabled as well. - -.. cmake:variable:: GAUXC_ENABLE_TESTS - - Enable building of GauXC tests (default: ON) - Requires catch2 library to be installed and available. - -.. cmake:variable:: GAUXC_ENABLE_HDF5 - - Enable HDF5 support in GauXC (default: ON) - Requires HDF5 library and HighFive library to be installed and available. - -.. cmake:variable:: GAUXC_ENABLE_MAGMA - - Enable MAGMA support in GauXC (default: OFF) - Requires MAGMA library to be installed and available. - Requires CUDA or HIP support to be enabled as well. - -.. cmake:variable:: GAUXC_ENABLE_NCCL - - Enable NCCL support in GauXC (default: OFF) - Requires NCCL library to be installed and available. - Requires CUDA support to be enabled as well. - -.. cmake:variable:: GAUXC_ENABLE_CUTLASS - - Enable CUTLASS support in GauXC (default: OFF) - Requires CUTLASS library to be installed and available. - Requires CUDA support to be enabled as well. - -.. cmake:variable:: GAUXC_ENABLE_GAU2GRID - - Enable Gau2Grid support in GauXC (default: ON) - Always enabled since Gau2Grid is a required dependency for GauXC. - -.. cmake:variable:: EXCHCXX_ENABLE_CUDA - - Enable CUDA support in ExchCXX (default: OFF) - Required for GauXC CUDA support. - Cannot be enabled with HIP support at the same time. - -.. cmake:variable:: EXCHCXX_ENABLE_HIP - - Enable HIP support in ExchCXX (default: OFF) - Required for GauXC HIP support. - Cannot be enabled with CUDA support at the same time. - - -.. _gauxc-cmake-integration: - -Integrating GauXC into your build system ----------------------------------------- - -Using an installed GauXC -~~~~~~~~~~~~~~~~~~~~~~~~ - -To integrate GauXC into your build system, you can use CMake's ``find_package`` command to locate the GauXC package and link against it in your ``CMakeLists.txt`` file. -Make sure that the ``CMAKE_PREFIX_PATH`` variable includes the path to your GauXC installation. -Running a command in a Pixi environment adds that environment to the search path; -the same prefix is exposed as ``${CONDA_PREFIX}``. - -.. code-block:: cmake - - find_package(gauxc CONFIG REQUIRED) - - if(NOT GAUXC_HAS_ONEDFT) - message(FATAL_ERROR "GauXC found but Skala/OneDFT was not enabled during the build") - endif() - - target_link_libraries(my_dft_driver PRIVATE gauxc::gauxc) - -The imported target propagates include directories, compile definitions, and linkage against BLAS, -Torch, and optional MPI/CUDA components. - -.. note:: - - Use the provided CMake variables like ``GAUXC_HAS_ONEDFT`` to check for specific features or configurations in GauXC before linking against it. - - -Embedding GauXC via FetchContent -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If you need to vendor GauXC directly from your build, use ``FetchContent`` while mirroring the options chosen above. -A possible approach for fetching GauXC with Skala support during the CMake configuration step is shown below. - -.. literalinclude:: ../../examples/cpp/gauxc_integration/cmake/skala-gauxc.cmake - :language: cmake - :caption: cmake/skala-gauxc.cmake - -It is recommended to define the GauXC source URL with its SHA256 hash in a separate CMake file (e.g., `skala-gauxc-versions.cmake`). - -.. literalinclude:: ../../examples/cpp/gauxc_integration/cmake/skala-dep-versions.cmake - :language: cmake - :caption: cmake/skala-dep-versions.cmake - :lines: 1-2 - -In the main ``CMakeLists.txt``, include the version definitions and the GauXC fetching logic. - -.. code-block:: cmake - - include(cmake/skala-gauxc.cmake) - - target_link_libraries(my_dft_driver PRIVATE gauxc::gauxc) diff --git a/gauxc/docs/api/exceptions.rst b/gauxc/docs/api/exceptions.rst deleted file mode 100644 index caf8d691..00000000 --- a/gauxc/docs/api/exceptions.rst +++ /dev/null @@ -1,55 +0,0 @@ -Error handling in GauXC -======================= - -This section provides a reference for error handling in GauXC, including C++ exceptions, C status handles, and Fortran status handles. - -C++ exceptions --------------- - -.. cpp:class:: GauXC::generic_gauxc_exception : public std::exception - - Base class for exceptions thrown by GauXC. This class inherits from std::exception and can be used to catch all exceptions thrown by GauXC. - - .. cpp:function:: const char* what() const noexcept override - - Get a human-readable error message describing the exception. - - :returns: A pointer to a null-terminated string containing the error message. - - -C status handle ---------------- - -.. c:struct:: GauXCStatus - - .. c:member:: int code - - The error code of the status. A value of 0 indicates success, while non-zero values indicate different types of errors. - - .. c:member:: char* message - - A human-readable error message providing more details about the error. - This is a null-terminated string that should be freed by the caller when no longer needed. - - -Fortran status handle ---------------------- - -.. f:module:: gauxc_status - :synopsis: Fortran bindings for GauXC status handling - -.. f:currentmodule:: gauxc_status - -.. f:type:: gauxc_status_type - - Representation of a status handle in the GauXC Fortran API, containing an error code and a message. - - :f integer(c_int) code: The error code of the status. A value of 0 indicates success, while non-zero values indicate different types of errors. - :f type(c_ptr) message: A pointer to a null-terminated string containing a human-readable error message providing more details about the error. This string should be freed by the caller when no longer needed. - - .. f:function:: gauxc_status_message(status) - - Get the error message from a GauXCStatus variable. - - :param type(gauxc_status_type) status: The GauXCStatus variable from which to retrieve the error message. - :returns character(len=*): Error message string. \ No newline at end of file diff --git a/gauxc/docs/api/index.rst b/gauxc/docs/api/index.rst deleted file mode 100644 index 0b253522..00000000 --- a/gauxc/docs/api/index.rst +++ /dev/null @@ -1,19 +0,0 @@ -Reference for GauXC API -======================= - -This section provides a comprehensive reference for the GauXC API which is used to integrate Skala into electronic structure packages. -The API includes C++ class definitions, C bindings, and Fortran bindings for various components of GauXC, and CMake configuration options. - -.. toctree:: - :maxdepth: 2 - - molecule - basis - molgrid - runtime_environment - load_balancer - molecular_weights - xc_integrator - macros - exceptions - cmake \ No newline at end of file diff --git a/gauxc/docs/api/load_balancer.rst b/gauxc/docs/api/load_balancer.rst deleted file mode 100644 index 2dd0a5b1..00000000 --- a/gauxc/docs/api/load_balancer.rst +++ /dev/null @@ -1,202 +0,0 @@ -Load balancer API -================= - -This section provides a reference for the load balancer in GauXC, including C++ class definitions, C bindings, and Fortran bindings for creating and managing load balancers used in GauXC computations. - - -C++ definitions ---------------- - -.. cpp:class:: GauXC::LoadBalancer - - A class representing a load balancer for distributing computational work across multiple processes in GauXC. - - -.. cpp:class:: GauXC::LoadBalancerFactory - - A factory class for creating LoadBalancer objects based on the specified load balancing strategy. - - .. cpp:function:: LoadBalancerFactory(ExecutionSpace ex, std::string kernel_name) - - Construct a LoadBalancerFactory object with the specified execution space and kernel name. - - Currently accepted values for Host execution space: - - :"DEFAULT": - Read as "REPLICATED-PETITE" - :"REPLICATED": - Read as "REPLICATED-PETITE" - :"REPLICATED-PETITE": - Replicate the load balancer function, only keep non negligible basis functions - :"REPLICATED-FILLIN": - Same as "REPLICATED-PETITE" except if two non-adjacent basis functions are kept, the gaps are filled in. - This gurantees contiguous memory access but leads to significantly more work. - Not advised for general usage. - - Currently accepted values for Device execution space: - - :"DEFAULT": - Read as "REPLICATED" - :"REPLICATED": - Same as Host::REPLICATED-PETITE - - :param ex: The execution space for which to create load balancers. - :param kernel_name: The name of the kernel for which to create load balancers. - - .. cpp:function:: LoadBalancer get_instance(const RuntimeEnvironment& rt, const Molecule& mol, const MolGrid& mg, const BasisSet& bs) - - Get a LoadBalancer instance for the specified runtime environment, molecule, molecular grid, and basis set. - - :param rt: The runtime environment for which to get the load balancer instance. - :param mol: The molecule for which to get the load balancer instance. - :param mg: The molecular grid for which to get the load balancer instance. - :param bs: The basis set for which to get the load balancer instance. - - .. cpp:function:: std::shared_ptr get_shared_instance(RuntimeEnvironment& rt, const Molecule& mol, const MolGrid& mg, const BasisSet& bs) - - Get a shared pointer to a LoadBalancer instance for the specified runtime environment, molecule, molecular grid, and basis set. - - :param rt: The runtime environment for which to get the load balancer instance. - :param mol: The molecule for which to get the load balancer instance. - :param mg: The molecular grid for which to get the load balancer instance. - :param bs: The basis set for which to get the load balancer instance. - - -.. cpp:enum-class:: GauXC::ExecutionSpace - - Enumeration of execution spaces for which load balancers can be created in GauXC. - - The following execution spaces are available: - - .. cpp:enumerator:: Host - - Load balancers for execution on the host CPU. - - .. cpp:enumerator:: Device - - Load balancers for execution on a device (e.g., GPU). - - -C bindings ----------- - -.. c:struct:: GauXCLoadBalancer - - Opaque struct representing a load balancer in the GauXC C API. - - .. c:function:: void gauxc_load_balancer_delete(GauXCStatus* status, GauXCLoadBalancer* lb) - - Delete a load balancer instance. - Part of the :f:func:`gauxc_delete` interface. - - :param status: Pointer to a GauXCStatus struct where the status of the operation will be stored. - :param lb: Pointer to the GauXCLoadBalancer instance to be deleted. - -.. c:struct:: GauXCLoadBalancerFactory - - Opaque struct representing a load balancer factory in the GauXC C API. - - .. c:function:: GauXCLoadBalancerFactory* gauxc_load_balancer_factory_new(GauXCStatus* status, enum GauXC_ExecutionSpace ex, const char* kernel_name) - - Create a new load balancer factory with the specified execution space and kernel name. - - :param status: Pointer to a GauXCStatus struct where the status of the operation will be stored. - :param ex: The execution space for which to create load balancers. - :param kernel_name: The name of the kernel for which to create load balancers. - - .. c:function:: GauXCLoadBalancer gauxc_load_balancer_factory_get_instance(GauXCStatus* status, GauXCLoadBalancerFactory lbf, const GauXCRuntimeEnvironment rt, const GauXCMolecule mol, const GauXCMolGrid mg, const GauXCBasisSet bs) - - Get a load balancer instance for the specified runtime environment, molecule, molecular grid, and basis set. - Part of the :f:func:`gauxc_get_instance` interface. - - :param status: Pointer to a GauXCStatus struct where the status of the operation will be stored. - :param lbf: GauXCLoadBalancerFactory struct from which to get the load balancer instance. - :param rt: Pointer to the runtime environment for which to get the load balancer instance. - :param mol: Pointer to the molecule for which to get the load balancer instance. - :param mg: Pointer to the molecular grid for which to get the load balancer instance. - :param bs: Pointer to the basis set for which to get the load balancer instance. - - .. c:function:: void gauxc_load_balancer_factory_delete(GauXCStatus* status, GauXCLoadBalancerFactory* lbf) - - Delete a load balancer factory instance. - Part of the :f:func:`gauxc_delete` interface. - - :param status: Pointer to a GauXCStatus struct where the status of the operation will be stored. - :param lbf: Pointer to the GauXCLoadBalancerFactory instance to be deleted. - - -.. c:enum:: GauXC_ExecutionSpace - - Enumeration of execution spaces for which load balancers can be created in the GauXC C API. - - The following execution spaces are available: - - .. c:enumerator:: GauXC_ExecutionSpace_Host - - Load balancers for execution on the host CPU. - - .. c:enumerator:: GauXC_ExecutionSpace_Device - - Load balancers for execution on a device (e.g., GPU). - - -Fortran bindings ----------------- - -.. f:module:: gauxc_load_balancer - :synopsis: Fortran bindings for GauXC LoadBalancer and LoadBalancerFactory - -.. f:currentmodule:: gauxc_load_balancer - -.. f:type:: gauxc_load_balancer_type - - Opaque type representing a load balancer in the GauXC Fortran API. - Available in the module :f:mod:`gauxc_load_balancer`. - - .. f:function:: gauxc_load_balancer_delete(status, lb) - - Delete a load balancer instance. - - :param type(gauxc_status_type) status: Pointer to a GauXCStatus variable to store the status of the operation. - :param type(gauxc_load_balancer_type) lb: The load balancer instance to be deleted. - -.. f:type:: gauxc_load_balancer_factory_type - - Opaque type representing a load balancer factory in the GauXC Fortran API. - Available in the module :f:mod:`gauxc_load_balancer`. - - .. f:function:: gauxc_load_balancer_factory_new(status, ex, kernel_name) - - Create a new load balancer factory with the specified execution space and kernel name. - - :param type(gauxc_status_type) status: Pointer to a GauXCStatus variable to store the status of the operation. - :param integer(c_int) ex: The execution space for which to create load balancers. - :param character(len=*) kernel_name: The name of the kernel for which to create load balancers. - - .. f:function:: gauxc_load_balancer_factory_get_instance(status, lbf, rt, mol, mg, bs) - - Get a load balancer instance for the specified runtime environment, molecule, molecular grid, and basis set. - - :param type(gauxc_status_type) status: Pointer to a GauXCStatus variable to store the status of the operation. - :param type(gauxc_load_balancer_factory_type) lbf: The load balancer factory from which to get the load balancer instance. - :param type(gauxc_runtime_environment_type) rt: The runtime environment for which to get the load balancer instance. - :param type(gauxc_molecule_type) mol: The molecule for which to get the load balancer instance. - :param type(gauxc_mol_grid_type) mg: The molecular grid for which to get the load balancer instance. - :param type(gauxc_basis_set_type) bs: The basis set for which to get the load balancer instance. - - .. f:subroutine:: gauxc_load_balancer_factory_delete(status, lbf) - - Delete a load balancer factory instance. - - :param type(gauxc_status_type) status: Pointer to a GauXCStatus variable to store the status of the operation. - :param type(gauxc_load_balancer_factory_type) lbf: The load balancer factory instance to be deleted. - -.. f:currentmodule:: gauxc_enums - -.. f:type:: gauxc_execution_space - - Parameter instance of a derived type with members corresponding to the execution spaces for which load balancers can be created in the GauXC Fortran API. - - :f integer(c_int) host: Load balancers for execution on the host CPU. - - :f integer(c_int) device: Load balancers for execution on a device (e.g., GPU). \ No newline at end of file diff --git a/gauxc/docs/api/macros.rst b/gauxc/docs/api/macros.rst deleted file mode 100644 index d547e9de..00000000 --- a/gauxc/docs/api/macros.rst +++ /dev/null @@ -1,88 +0,0 @@ -Macro definitions -================= - -GauXC provides a number of compile-time macros to indicate available features and configuration options. - -.. c:macro:: GAUXC_HAS_ONEDFT - - Defines whether Skala support is available in this build of GauXC. - Enabled with :cmake:variable:`GAUXC_ENABLE_ONEDFT` CMake option. - -.. c:macro:: GAUXC_HAS_C - - Defines whether C bindings are available in this build of GauXC. - Enabled with :cmake:variable:`GAUXC_ENABLE_C` CMake option. - -.. c:macro:: GAUXC_HAS_FORTRAN - - Defines whether Fortran bindings are available in this build of GauXC. - Enabled with :cmake:variable:`GAUXC_ENABLE_FORTRAN` CMake option. - -.. c:macro:: GAUXC_HAS_HOST - - Defines whether host support is available in this build of GauXC. - -.. c:macro:: GAUXC_HAS_DEVICE - - Defines whether any device support (CUDA or HIP) is available in this build of GauXC. - Enabled with :cmake:variable:`GAUXC_ENABLE_CUDA` or :cmake:variable:`GAUXC_ENABLE_HIP` CMake options. - -.. c:macro:: GAUXC_HAS_CUDA - - Defines whether CUDA support is available in this build of GauXC. - Enabled with :cmake:variable:`GAUXC_ENABLE_CUDA` CMake option. - -.. c:macro:: GAUXC_HAS_HIP - - Defines whether HIP support is available in this build of GauXC. - Enabled with :cmake:variable:`GAUXC_ENABLE_HIP` CMake option. - -.. c:macro:: GAUXC_HAS_MPI - - Defines whether MPI support is available in this build of GauXC. - Enabled with :cmake:variable:`GAUXC_ENABLE_MPI` CMake option. - -.. c:macro:: GAUXC_HAS_MAGMA - - Defines whether MAGMA support is available in this build of GauXC. - Enabled with :cmake:variable:`GAUXC_ENABLE_MAGMA` CMake option. - -.. c:macro:: GAUXC_HAS_NCCL - - Defines whether NCCL support is available in this build of GauXC. - Enabled with :cmake:variable:`GAUXC_ENABLE_NCCL` CMake option. - -.. c:macro:: GAUXC_HAS_CUTLASS - - Defines whether CUTLASS support is available in this build of GauXC. - Enabled with :cmake:variable:`GAUXC_ENABLE_CUTLASS` CMake option. - -.. c:macro:: GAUXC_HAS_GAU2GRID - - Defines whether Gau2Grid support is available in this build of GauXC. - Enabled with :cmake:variable:`GAUXC_ENABLE_GAU2GRID` CMake option. - -.. c:macro:: GAUXC_HAS_HDF5 - - Defines whether HDF5 support is available in this build of GauXC. - Enabled with :cmake:variable:`GAUXC_ENABLE_HDF5` CMake option. - -.. c:macro:: GAUXC_CPU_XC_MAX_AM - - Maximum angular momentum supported for CPU exchange-correlation calculations. - Default is 6 (i.e., up to i-type functions). - -.. c:macro:: GAUXC_CPU_SNLINK_MAX_AM - - Maximum angular momentum supported for CPU seminumerical exchange calculations. - Default is 6 (i.e., up to i-type functions). - -.. c:macro:: GAUXC_GPU_XC_MAX_AM - - Maximum angular momentum supported for GPU exchange-correlation calculations. - Default is 4 (i.e., up to g-type functions). - -.. c:macro:: GAUXC_GPU_SNLINK_MAX_AM - - Maximum angular momentum supported for GPU seminumerical exchange calculations. - Default is 2 (i.e., up to d-type functions). \ No newline at end of file diff --git a/gauxc/docs/api/molecular_weights.rst b/gauxc/docs/api/molecular_weights.rst deleted file mode 100644 index 1bfb29a2..00000000 --- a/gauxc/docs/api/molecular_weights.rst +++ /dev/null @@ -1,288 +0,0 @@ -Molecular grid weights API -========================== - -This section provides a reference for the GauXC API related to molecular grid weights, which can be applied to LoadBalancer tasks to modify their weights based on the molecular grid. The API includes C++ class definitions - -C++ definitions ---------------- - -.. cpp:class:: GauXC::MolecularWeights - - A class representing molecular grid weights in GauXC, which can be applied to a LoadBalancer's tasks. - - .. cpp:function:: void modify_weights(LoadBalancer& lb) - - Apply molecular weights to a LoadBalancer's tasks - - :param lb: LoadBalancer instance to which the molecular grid weights will be applied. - -.. cpp:class:: GauXC::MolecularWeightsFactory - - A factory class for creating MolecularWeights instances in GauXC. - - .. cpp:function:: MolecularWeightsFactory(ExecutionSpace ex, std::string local_work_kernel_name, MolecularWeightsSettings settings) - - Construct a MolecularWeightsFactory instance with the specified settings. - - :param ex: The execution space for which to create molecular grid weights. - :param local_work_kernel_name: Name of the local work kernel to be used. - :param settings: A MolecularWeightsSettings struct containing settings for computing molecular grid weights. - :returns: A MolecularWeightsFactory instance initialized with the specified settings. - - .. cpp:function:: MolecularWeights get_instance() - - Get a MolecularWeights instance created by the factory. - - :returns: A MolecularWeights instance created by the factory. - - .. cpp:function:: std::shared_ptr get_shared_instance() - - Get a shared pointer to a MolecularWeights instance created by the factory. - - :returns: A shared pointer to a MolecularWeights instance created by the factory. - -.. cpp:struct:: GauXC::MolecularWeightsSettings - - Struct representing settings for computing molecular grid weights in GauXC. - - .. cpp:member:: XCWeightAlg weight_alg = XCWeightAlg::Becke - - The algorithm to be used for computing molecular grid weights. Possible values are defined in the XCWeightAlg enum. - - .. cpp:member:: bool becke_size_adjustment - - Whether to apply Becke size adjustment to the molecular grid weights. - Default should be true. - -.. cpp:enum:: GauXC::XCWeightAlg - - The following options are available: - - .. cpp:enumerator:: NOTPARTITIONED - - No partitioning. - - .. cpp:enumerator:: Becke - - Becke's original algorithm for computing molecular grid weights. - - .. cpp:enumerator:: SSF - - Stratmann-Scuseria-Frisch algorithm for computing molecular grid weights. - - .. cpp:enumerator:: LKO - - Lauqua-Kuessman-Ochsenfeld algorithm for computing molecular grid weights. - - -C bindings ----------- - -.. c:struct:: GauXCMolecularWeights - - Opaque struct representing molecular grid weights in the GauXC C API. - - .. c:function:: void gauxc_molecular_weights_modify_weights(GauXCStatus* status, GauXCMolecularWeights mw, LoadBalancer lb) - - Apply molecular weights to a LoadBalancer's tasks - - :param status: Pointer to a GauXCStatus struct where the status of the operation will be stored. - :param mw: GauXCMolecularWeights struct from which to get the molecular grid weight. - :param lb: LoadBalancer struct to which the molecular grid weights will be applied. - - .. c:function:: void gauxc_molecular_weights_delete(GauXCStatus* status, GauXCMolecularWeights* mw) - - Delete a molecular grid weights instance. - - :param status: Pointer to a GauXCStatus struct where the status of the operation will be stored. - :param mw: Pointer to the GauXCMolecularWeights instance to be deleted. - -.. c:struct:: GauXCMolecularWeightsFactory - - Opaque struct representing a factory for creating molecular grid weights in the GauXC C API. - - .. c:function:: GauXCMolecularWeightsFactory gauxc_molecular_weights_factory_new(GauXCStatus* status, GauXCMolecularWeightsSettings settings) - - Create a new GauXCMolecularWeightsFactory instance with the specified settings. - - :param status: Pointer to a GauXCStatus struct where the status of the operation will be stored. - :param settings: GauXCMolecularWeightsSettings struct containing settings for computing molecular grid weights. - :returns: A new GauXCMolecularWeightsFactory instance initialized with the specified settings. - - .. c:function:: GauXCMolecularWeights gauxc_molecular_weights_factory_get_instance(GauXCStatus* status, GauXCMolecularWeightsFactory mwf, enum GauXC_ExecutionSpace ex, char* local_work_kernel_name, GauXCMolecularWeightsSettings settings) - - Get a GauXCMolecularWeights instance created by the factory. - - :param status: Pointer to a GauXCStatus struct where the status of the operation will be stored. - :param mwf: GauXCMolecularWeightsFactory struct from which to get the molecular grid weights instance. - :param local_work_kernel_name: Name of the local work kernel to be used. - :param settings: GauXCMolecularWeightsSettings struct containing settings for computing molecular grid weights. - :returns: A GauXCMolecularWeights instance created by the factory. - - .. c:function:: void gauxc_molecular_weights_factory_delete(GauXCStatus* status, GauXCMolecularWeightsFactory* mwf) - - Delete a GauXCMolecularWeightsFactory instance. - - :param status: Pointer to a GauXCStatus struct where the status of the operation will be stored. - :param mwf: Pointer to the GauXCMolecularWeightsFactory instance to be deleted. - -.. c:struct:: GauXCMolecularWeightsSettings - - Representation of settings for computing molecular grid weights in the GauXC C API. - - .. c:member:: enum GauXC_XCWeightAlg weight_alg - - The algorithm to be used for computing molecular grid weights. Possible values are defined in the GauXC_XCWeightAlg enum. - - .. c:member:: bool becke_size_adjustment - - Whether to apply Becke size adjustment to the molecular grid weights. - Default should be true. - -.. c:enum:: GauXC_XCWeightAlg - - Enumeration of algorithms for computing molecular grid weights in the GauXC C API. - - The following algorithms are available: - - .. c:enumerator:: GauXC_XCWeightAlg_NOTPARTITIONED - - No partitioning. - - .. c:enumerator:: GauXC_XCWeightAlg_Becke - - Becke's original algorithm for computing molecular grid weights. - - .. c:enumerator:: GauXC_XCWeightAlg_SSF - - Stratmann-Scuseria-Frisch algorithm for computing molecular grid weights. - - .. c:enumerator:: GauXC_XCWeightAlg_LKO - - Lauqua-Kuessman-Ochsenfeld algorithm for computing molecular grid weights. - - -Fortran bindings ----------------- - -.. f:module:: gauxc_molecular_weights - :synopsis: Fortran bindings for GauXC molecular grid weights - -.. f:currentmodule:: gauxc_molecular_weights - -.. f:type:: gauxc_molecular_weights_type - - Opaque type representing molecular grid weights in the GauXC Fortran API. - Available in the module :f:mod:`gauxc_molecular_weights`. - - .. f:function:: gauxc_molecular_weights_modify_weights(status, mw, lb) - - Apply molecular weights to a LoadBalancer's tasks - - :param type(gauxc_status_type) status: Pointer to a GauXCStatus variable to store the status of the operation. - :param type(gauxc_molecular_weights_type) mw: The molecular grid weights instance from which to get the molecular grid weight. - :param type(gauxc_load_balancer_type) lb: The LoadBalancer instance to which the molecular grid weights will be applied. - - .. f:function:: gauxc_molecular_weights_delete(status, mw) - - Delete a molecular grid weights instance. - Part of the :f:func:`gauxc_delete` interface. - - :param type(gauxc_status_type) status: Pointer to a GauXCStatus variable to store the status of the operation. - :param type(gauxc_molecular_weights_type) mw: The molecular grid weights instance to be deleted. - - -.. f:type:: gauxc_molecular_weights_factory_type - - Opaque type representing a factory for creating molecular grid weights in the GauXC Fortran API. - Available in the module :f:mod:`gauxc_molecular_weights`. - - .. f:function:: gauxc_molecular_weights_factory_new(status, ex, local_work_kernel_name, settings) - - Create a new GauXCMolecularWeightsFactory instance with the specified settings. - - :param type(gauxc_status_type) status: Pointer to a GauXCStatus variable to store the status of the operation. - :param integer(c_int) ex: The execution space for which to get the molecular grid weights instance. Possible values are defined in the gauxc_xc_weight_alg type. - :param character(len=*) local_work_kernel_name: Name of the local work kernel to be used. - :param type(gauxc_molecular_weights_settings_type) settings: The settings for computing molecular grid weights. - :returns type(gauxc_molecular_weights_factory_type): A new GauXCMolecularWeightsFactory instance initialized with the specified settings. - - .. f:function:: gauxc_molecular_weights_factory_get_instance(status, mwf) - - Get a GauXCMolecularWeights instance created by the factory. - Part of the :f:func:`gauxc_get_instance` interface. - - :param type(gauxc_status_type) status: Pointer to a GauXCStatus variable to store the status of the operation. - :param type(gauxc_molecular_weights_factory_type) mwf: The GauXCMolecularWeightsFactory instance from which to get the molecular grid weights instance. - :returns type(gauxc_molecular_weights_type): A GauXCMolecularWeights instance created by the factory. - - .. f:function:: gauxc_molecular_weights_factory_delete(status, mwf) - - Delete a GauXCMolecularWeightsFactory instance. - Part of the :f:func:`gauxc_delete` interface. - - :param type(gauxc_status_type) status: Pointer to a GauXCStatus variable to store the status of the operation. - :param type(gauxc_molecular_weights_factory_type) mwf: The GauXCMolecularWeightsFactory instance to be deleted. - - .. code-block:: fortran - :caption: Example - - use gauxc_enums, only : gauxc_executionspace - use gauxc_load_balancer, only : gauxc_load_balancer_type - use gauxc_molecular_weights, only : gauxc_molecular_weights_factory_type, gauxc_molecular_weights_factory_new, & - & gauxc_get_instance, gauxc_molecular_weights_type, gauxc_molecular_weights_modify_weight, gauxc_delete - - type(gauxc_load_balancer_type) :: lb - type(gauxc_status_type) :: status - type(gauxc_molecular_weights_factory_type) :: mwf - type(gauxc_molecular_weights_type) :: mw - - ! setup load balancer here - - main: block - call gauxc_molecular_weights_factory_new(status, gauxc_executionspace%host, & - & "Default", gauxc_molecular_weights_settings()) - if (status%code /= 0) exit main - mw = gauxc_get_instance(status, mwf) - if (status%code /= 0) exit main - call gauxc_molecular_weights_modify_weight(status, mw, lb) - if (status%code /= 0) exit main - end block main - if (status%code /= 0) then - ! handle error - end if - - call gauxc_delete(status, mw) - call gauxc_delete(status, mwf) - - -.. f:type:: gauxc_molecular_weights_settings - - Parameter instance of a derived type representing settings for computing molecular grid weights in the GauXC Fortran API. - Available in the module :f:mod:`gauxc_molecular_weights`. - - :f integer(c_int) weight_alg: The algorithm to be used for computing molecular grid weights. Possible values are defined in the gauxc_xc_weight_alg type. - :f logical(c_bool) becke_size_adjustment: Whether to apply Becke size adjustment to the molecular grid weights. Default should be true. - - .. code-block:: fortran - :caption: Example - - use gauxc_enums, only : gauxc_xcweightalg - use gauxc_molecular_weights, only : gauxc_molecular_weights_settings - type(gauxc_molecular_weights_settings) :: settings - settings%weight_alg = gauxc_xcweightalg%becke - settings%becke_size_adjustment = .true. - -.. f:currentmodule:: gauxc_enums - -.. f:type:: gauxc_xcweightalg - - Parameter instance of a derived type representing the algorithm to be used for computing molecular grid weights in the GauXC Fortran API. - Available in the module :f:mod:`gauxc_enums`. - - The following algorithms are available: - - :f integer(c_int) notpartitioned: No partitioning. - :f integer(c_int) becke: Becke's original algorithm for computing molecular grid weights. - :f integer(c_int) ssf: Stratmann-Scuseria-Frisch algorithm for computing molecular grid weights. - :f integer(c_int) lko: Lauqua-Kuessman-Ochsenfeld algorithm for computing molecular grid weights. \ No newline at end of file diff --git a/gauxc/docs/api/molecule.rst b/gauxc/docs/api/molecule.rst deleted file mode 100644 index 85018aae..00000000 --- a/gauxc/docs/api/molecule.rst +++ /dev/null @@ -1,242 +0,0 @@ -GauXC Molecule API -================== - -This section provides a reference for the GauXC API related to molecule objects, including C++ class definitions, C bindings, and Fortran bindings. - -C++ defintions --------------- - -.. cpp:class:: GauXC::Molecule : public std::Vector - - A class to represent a collection of atoms in a molecule. - - .. cpp:function:: inline Molecule(std::vector atoms) - - Construct a Molecule object from a vector of Atom objects. - - :param atoms: A vector of Atom objects representing the atoms in the molecule. - :returns: A Molecule object initialized with the given atoms. - - .. cpp:function:: inline size_t natoms() const - - Get the number of atoms in the molecule. - - :returns: The number of atoms in the molecule. - - .. cpp:function:: inline AtomicNumber maxZ() const - - Get the maximum atomic number among the atoms in the molecule. - - :returns: The maximum atomic number among the atoms in the molecule. - - .. cpp:function:: inline bool operator==(const Molecule& other) const - - Compare this molecule with another molecule for equality. - - :param other: Another molecule to compare with. - :returns: True if this molecule is equal to the other molecule, false otherwise. - -.. cpp:struct:: GauXC::Atom - - Representation of an atom in a molecule, containing its atomic number and Cartesian coordinates. - - .. cpp:member:: AtomicNumber Z - - The atomic number of the atom. - - .. cpp:member:: double x - - The x-coordinate of the atom in Cartesian coordinates. - - .. cpp:member:: double y - - The y-coordinate of the atom in Cartesian coordinates. - - .. cpp:member:: double z - - The z-coordinate of the atom in Cartesian coordinates. - - .. cpp:function:: inline Atom(AtomicNumber Z, double x, double y, double z) - - Construct an Atom object with the given atomic number and coordinates. - - :param Z: The atomic number of the atom. - :param x: The x-coordinate of the atom in Cartesian coordinates. - :param y: The y-coordinate of the atom in Cartesian coordinates. - :param z: The z-coordinate of the atom in Cartesian coordinates. - :returns: An Atom object initialized with the given atomic number and coordinates. - -.. cpp:type:: GauXC::AtomicNumber = int64_t - - A type to represent the atomic number of an atom. - -C bindings ----------- - -.. c:struct:: GauXCMolecule - - Opaque struct representing a molecule in the GauXC C API. - - .. c:function:: GauXCMolecule gauxc_molecule_new(GauXCStatus* status) - - Create a new GauXCMolecule object. - - :param status: Pointer to a GauXCStatus variable to store the status of the operation. - :returns: A new GauXCMolecule object. - - .. c:function:: GauXCMolecule gauxc_molecule_new_from_atoms(GauXCStatus* status, const GauXCAtom* atoms, size_t natoms) - - Create a new GauXCMolecule object from an array of GauXCAtom structs. - - :param status: Pointer to a GauXCStatus variable to store the status of the operation. - :param atoms: Pointer to an array of GauXCAtom structs representing the atoms in the molecule. - :param natoms: The number of atoms in the molecule. - :returns: A new GauXCMolecule object initialized with the given atoms. - - .. c:function:: void gauxc_molecule_delete(GauXCStatus* status, GauXCMolecule* molecule) - - Delete a GauXCMolecule object. - - :param status: Pointer to a GauXCStatus variable to store the status of the operation. - :param molecule: Pointer to the GauXCMolecule object to be deleted. - -.. c:struct:: GauXCAtom - - Representation of an atom in a molecule for the GauXC C API, containing its atomic number and Cartesian coordinates. - - .. c:member:: int64_t Z - - The atomic number of the atom. - - .. c:member:: double x - - The x-coordinate of the atom in Cartesian coordinates. - - .. c:member:: double y - - The y-coordinate of the atom in Cartesian coordinates. - - .. c:member:: double z - - The z-coordinate of the atom in Cartesian coordinates. - - -Fortran bindings ----------------- - -.. f:module:: gauxc_molecule - :synopsis: Fortran bindings for GauXC molecule objects. - -.. f:currentmodule:: gauxc_molecule - -.. f:type:: gauxc_molecule_type - - Opaque type representing a molecule in the GauXC Fortran API. - Available from the module :f:mod:`gauxc_molecule`. - - .. f:function:: gauxc_molecule_new(status) - - Create a new gauxc_molecule_type object. - - :param type(gauxc_status_type) status: A variable to store the status of the operation. - :returns type(gauxc_molecule_type): A new gauxc_molecule_type object. - - .. f:function:: gauxc_molecule_new_from_atoms(status, atoms, natoms) - - Create a new gauxc_molecule_type object from an array of gauxc_atom_type objects. - - :param type(gauxc_status_type) status: A variable to store the status of the operation. - :param type(gauxc_atom_type) atoms(*): An array of :f:type:`gauxc_atom_type` objects representing the atoms in the molecule. - :param integer(c_int64_t) natoms: The number of atoms in the molecule. - :returns type(gauxc_molecule_type): A new gauxc_molecule_type object initialized with the given atoms. - - .. f:function:: gauxc_molecule_delete(status, molecule) - - Delete a gauxc_molecule_type object. - Part of the :f:func:`gauxc_delete` interface. - - :param type(gauxc_status_type) status: A variable to store the status of the operation. - :param type(gauxc_molecule_type) molecule: The gauxc_molecule_type object to be deleted. - -.. f:currentmodule:: gauxc_atom - -.. f:type:: gauxc_atom_type - - A derived type representing an atom in the GauXC Fortran API, containing its atomic number and Cartesian coordinates. - - :f integer(c_int64_t) Z: - The atomic number of the atom. - - :f real(c_double) x: - The x-coordinate of the atom in Cartesian coordinates. - - :f real(c_double) y: - The y-coordinate of the atom in Cartesian coordinates. - - :f real(c_double) z: - The z-coordinate of the atom in Cartesian coordinates. - -Serialization to HDF5 ---------------------- - -If GauXC has been built with HDF5 support :c:macro:`GAUXC_HAS_HDF5`, the :cpp:class:`GauXC::Molecule` class can be serialized to and deserialized from HDF5 files using the provided HDF5 interface. -This allows for easy storage and retrieval of molecular data in a standardized format. - -.. cpp:function:: void GauXC::write_hdf5_record(const Molecule& molecule, const std::string& filename, const std::string& group_name) - - Write a Molecule object to an HDF5 file. - - :param molecule: The Molecule object to be written to the file. - :param filename: The name of the HDF5 file to write to. - :param group_name: The name of the group in the HDF5 file where the molecule data will be stored. - -.. cpp:function:: void GauXC::read_hdf5_record(Molecule& molecule, const std::string& filename, const std::string& group_name) - - Read a Molecule object from an HDF5 file. - - :param molecule: The Molecule object to be populated with the data read from the file. - :param filename: The name of the HDF5 file to read from. - :param group_name: The name of the group in the HDF5 file where the molecule data is stored. - -The same functions are available in the GauXC C API. - -.. c:function:: void gauxc_molecule_write_hdf5_record(GauXCMolecule molecule, const char* filename, const char* group_name) - - Write a GauXCMolecule object to an HDF5 file in C. - - :param molecule: The GauXCMolecule object to be written to the file. - :param filename: The name of the HDF5 file to write to. - :param group_name: The name of the group in the HDF5 file where the molecule data will be stored. - -.. c:function:: void gauxc_molecule_read_hdf5_record(GauXCMolecule molecule, const char* filename, const char* group_name) - - Read a GauXCMolecule object from an HDF5 file in C. - - :param molecule: The GauXCMolecule object to be populated with the data read from the file. - :param filename: The name of the HDF5 file to read from. - :param group_name: The name of the group in the HDF5 file where the molecule data is stored. - -The same functions are also available in the GauXC Fortran API, available from the module :f:mod:`gauxc_external_hdf5`. - -.. f:module:: gauxc_external_hdf5 - :synopsis: HDF5 serialization functions for GauXC molecule objects. - -.. f:currentmodule:: gauxc_external_hdf5 - -.. f:subroutine:: gauxc_molecule_write_hdf5_record(molecule, filename, group_name) - - Write a gauxc_molecule_type object to an HDF5 file in Fortran. - - :param type(gauxc_molecule_type) molecule: The gauxc_molecule_type object to be written to the file. - :param character(len=*) filename: The name of the HDF5 file to write to. - :param character(len=*) group_name: The name of the group in the HDF5 file where the molecule data will be stored. - -.. f:subroutine:: gauxc_molecule_read_hdf5_record(molecule, filename, group_name) - - Read a gauxc_molecule_type object from an HDF5 file in Fortran. - - :param type(gauxc_molecule_type) molecule: The gauxc_molecule_type object to be populated with the data read from the file. - :param character(len=*) filename: The name of the HDF5 file to read from. - :param character(len=*) group_name: The name of the group in the HDF5 file where the molecule data is stored. - -.. f:currentmodule:: \ No newline at end of file diff --git a/gauxc/docs/api/molgrid.rst b/gauxc/docs/api/molgrid.rst deleted file mode 100644 index 86c3ffb5..00000000 --- a/gauxc/docs/api/molgrid.rst +++ /dev/null @@ -1,313 +0,0 @@ -.. _gauxc_molecular_grid_settings: - -Molecular grid settings -======================= - -This section provides a reference for the settings related to molecular grids in GauXC, including C++ class definitions, C bindings, and Fortran bindings for creating and managing molecular grids used in numerical integration schemes. - -C++ definitions ---------------- - -This section provides C++ class definitions provided by the ``gauxc/molgrid.hpp`` header. - -.. cpp:class:: GauXC::MolGrid - - Molecular integration grid container. - - MolGrid aggregates atom-centered quadrature grids for each atomic number and exposes access to per-element grids and batch sizing information for numerical integration. - - .. cpp:function:: inline MolGrid GauXC::MolGridFactory::create_default_molgrid(const Molecule& mol, PruningScheme scheme, BatchSize bsz, RadialQuad radial_quad, AtomicGridSizeDefault grid_size) - - Create a default MolGrid for the given molecule using the specified pruning scheme, batch size, radial quadrature, and atomic grid size. - This constructor is available from the ``gauxc/molgrid/defaults.hpp`` header. - - :param mol: The molecule for which to create the MolGrid. - :param scheme: The pruning scheme to use for constructing the molecular grid weights from the atomic grids. - :param bsz: The batch size for processing grid points in parallel. - :param radial_quad: The radial quadrature scheme to use for the atomic grids. - :param grid_size: The default atomic grid size to use for the atomic grids. - :returns: A MolGrid object initialized with the specified parameters for the given molecule. - - .. cpp:function:: inline MolGrid GauXC::MolGridFactory::create_default_molgrid(const Molecule& mol, PruningScheme scheme, BatchSize bsz, RadialQuad radial_quad, RadialSize rad_size, AngularSize ang_size) - - Create a default MolGrid for the given molecule using the specified pruning scheme, batch size, radial quadrature, and explicit radial and angular sizes. - This constructor is available from the ``gauxc/molgrid/defaults.hpp`` header. - - :param mol: The molecule for which to create the MolGrid. - :param scheme: The pruning scheme to use for constructing the molecular grid weights from the atomic grids. - :param bsz: The batch size for processing grid points in parallel. - :param radial_quad: The radial quadrature scheme to use for the atomic grids. - :param rad_size: The radial size to use for the atomic grids. - :param ang_size: The angular size to use for the atomic grids. - :returns: A MolGrid object initialized with the specified parameters for the given molecule. - - -The enumerator values are available from the ``gauxc/enums.hpp`` header. - -.. cpp:enum-class:: GauXC::AtomicGridSizeDefault - - Enumeration of default atomic grid sizes for molecular integration. - - The following options are available: - - .. cpp:enumerator:: FineGrid - - A default atomic grid size with 75 angular points and 302 radial points. - - .. cpp:enumerator:: UltraFineGrid - - A default atomic grid size with 99 angular points and 590 radial points. - - .. cpp:enumerator:: SuperFineGrid - - A default atomic grid size with 250 angular points and 974 radial points. - - .. cpp:enumerator:: GM3 - - A default atomic grid size with 35 angular points and 110 radial points. - - .. cpp:enumerator:: GM5 - - A default atomic grid size with 50 angular points and 302 radial points. - - -.. cpp:enum-class:: GauXC::RadialQuad - - Enumeration of radial quadrature schemes for atomic grids. - - The following options are available: - - .. cpp:enumerator:: Becke - - The Becke radial quadrature scheme.\ :footcite:`becke1988` - - .. cpp:enumerator:: MuraKnowles - - The Mura-Knowles radial quadrature scheme.\ :footcite:`mura1996` - - .. cpp:enumerator:: TreutlerAhlrichs - - The Treutler-Ahlrichs radial quadrature scheme.\ :footcite:`treutler1995` - - .. cpp:enumerator:: MurrayHandyLaming - - The Murray-Handy-Laming radial quadrature scheme.\ :footcite:`murray1993` - - -.. cpp:enum-class:: GauXC::PruningScheme - - Enumeration of pruning schemes for constructing molecular grid weights from atomic grids. - - The following options are available: - - .. cpp:enumerator:: Unpruned - - No pruning is applied to the atomic grids when constructing the molecular grid. - - .. cpp:enumerator:: Robust - - Robust pruning scheme from Psi4. - - .. cpp:enumerator:: Treutler - - The Treutler pruning scheme. - - -.. cpp:type:: GauXCRadialSize = int64_t - - Type to represent the number of radial points in an atomic grid. - -.. cpp:type:: GauXCAngularSize = int64_t - - Type to represent the number of angular points in an atomic grid. - -.. cpp:type:: GauXC::BatchSize = int64_t - - Defines the batch size for processing grid points in parallel. - Default is 512 points per batch, however larger values up around 10000 are recommended for better performance. - - -C bindings ----------- - -The following C bindings are available in the ``gauxc/molgrid.h`` header for creating and managing molecular grids in the GauXC C API. - -.. c:struct:: GauXCMolGrid - - Opaque struct representing a molecular grid in the GauXC C API. - - .. c:function:: GauXCMolGrid gauxc_molgrid_new_default(GauXCStatus* status, const GauXCMolecule* molecule, enum GauXC_PruningScheme pruning_scheme, int64_t batch_size, enum GauXC_RadialQuad radial_quad, enum GauXC_AtomicGridSizeDefault grid_size) - - Create a new GauXCMolGrid object with default settings for the given molecule. - - :param status: Pointer to a GauXCStatus variable to store the status of the operation. - :param molecule: Pointer to a GauXCMolecule object representing the molecule for which to create the MolGrid. - :param pruning_scheme: The pruning scheme to use for constructing the molecular grid weights from the atomic grids. - :param batch_size: The batch size for processing grid points in parallel. - :param radial_quad: The radial quadrature scheme to use for the atomic grids. - :param grid_size: The default atomic grid size to use for the atomic grids. - :returns: A new GauXCMolGrid object initialized with the specified parameters for the given molecule. - - .. c:function:: void gauxc_molgrid_delete(GauXCStatus* status, GauXCMolGrid* molgrid) - - Delete a GauXCMolGrid object and free its resources. - - :param status: Pointer to a GauXCStatus variable to store the status of the operation. - :param molgrid: Pointer to the GauXCMolGrid object to delete. - - -.. c:enum:: GauXC_PruningScheme - - Enumeration of pruning schemes for constructing molecular grid weights from atomic grids in the GauXC C API. - - The following options are available: - - .. c:enumerator:: GauXC_PruningScheme_Unpruned - - No pruning is applied to the atomic grids when constructing the molecular grid. - - .. c:enumerator:: GauXC_PruningScheme_Robust - - Robust pruning scheme from Psi4. - - .. c:enumerator:: GauXC_PruningScheme_Treutler - - The Treutler pruning scheme. - - -.. c:enum:: GauXC_RadialQuad - - Enumeration of radial quadrature schemes for atomic grids in the GauXC C API. - - The following options are available: - - .. c:enumerator:: GauXC_RadialQuad_Becke - - The Becke radial quadrature scheme.\ :footcite:`becke1988` - - .. c:enumerator:: GauXC_RadialQuad_MuraKnowles - - The Mura-Knowles radial quadrature scheme.\ :footcite:`mura1996` - - .. c:enumerator:: GauXC_RadialQuad_TreutlerAhlrichs - - The Treutler-Ahlrichs radial quadrature scheme.\ :footcite:`treutler1995` - - .. c:enumerator:: GauXC_RadialQuad_MurrayHandyLaming - - The Murray-Handy-Laming radial quadrature scheme.\ :footcite:`murray1993` - - -.. c:enum:: GauXC_AtomicGridSizeDefault - - Enumeration of default atomic grid sizes for molecular integration in the GauXC C API. - - The following options are available: - - .. c:enumerator:: GauXC_AtomicGridSizeDefault_FineGrid - - A default atomic grid size with 75 angular points and 302 radial points. - - .. c:enumerator:: GauXC_AtomicGridSizeDefault_UltraFineGrid - - A default atomic grid size with 99 angular points and 590 radial points. - - .. c:enumerator:: GauXC_AtomicGridSizeDefault_SuperFineGrid - - A default atomic grid size with 250 angular points and 974 radial points. - - .. c:enumerator:: GauXC_AtomicGridSizeDefault_GM3 - - A default atomic grid size with 35 angular points and 110 radial points. - - .. c:enumerator:: GauXC_AtomicGridSizeDefault_GM5 - - A default atomic grid size with 50 angular points and 302 radial points. - - -Fortran bindings ----------------- - -.. f:module:: gauxc_molgrid - :synopsis: Fortran bindings for GauXC molecular grid objects. - -.. f:currentmodule:: gauxc_molgrid - -.. f:type:: gauxc_molgrid_type - - Opaque type representing a molecular grid in the GauXC Fortran API. - Available in the module :f:mod:`gauxc_molgrid`. - - .. f:function:: function gauxc_molgrid_new_default(status, molecule, pruning_scheme, batch_size, radial_quad, grid_size) - - :param type(gauxc_status_type) status: Output parameter to store the status of the operation. - :param type(gauxc_molecule_type) molecule: The molecule for which to create the MolGrid. - :param integer(c_int) pruning_scheme: The pruning scheme to use for constructing the molecular grid weights from the atomic grids. - :param integer(c_int64_t) batch_size: The batch size for processing grid points in parallel. - :param integer(c_int) radial_quad: The radial quadrature scheme to use for the atomic grids. - :param integer(c_int) grid_size: The default atomic grid size to use for the atomic grids. - :returns type(gauxc_molgrid_type): A new gauxc_molgrid_type object initialized with the specified parameters for the given molecule. - - .. f:function:: subroutine gauxc_molgrid_delete(status, molgrid) - - Delete a gauxc_molgrid_type object and free its resources. - Part of the :f:func:`gauxc_delete` interface. - - :param type(gauxc_status_type) status: Output parameter to store the status of the operation. - :param type(gauxc_molgrid_type) molgrid: The gauxc_molgrid_type object to delete. - -.. f:currentmodule:: gauxc_enums - -.. f:type:: gauxc_radialquad - - Parameter instance of a derived type with the respective enumerator values for each member variable. - - :f integer(c_int) becke: - The Becke radial quadrature scheme.\ :footcite:`becke1988` - - :f integer(c_int) muraknowles: - The Mura-Knowles radial quadrature scheme.\ :footcite:`mura1996` - - :f integer(c_int) treutlerahlrichs: - The Treutler-Ahlrichs radial quadrature scheme.\ :footcite:`treutler1995` - - :f integer(c_int) murrayhandylaming: - The Murray-Handy-Laming radial quadrature scheme.\ :footcite:`murray1993` - -.. f:type:: gauxc_pruningscheme - - Parameter instance of a derived type with the respective enumerator values for each member variable. - - :f integer(c_int) unpruned: - No pruning is applied to the atomic grids when constructing the molecular grid. - - :f integer(c_int) robust: - Robust pruning scheme from Psi4. - - :f integer(c_int) treutler: - The Treutler pruning scheme. - -.. f:type:: gauxc_atomicgridsizedefault - - Parameter instance of a derived type with the respective enumerator values for each member variable. - - :f integer(c_int) finegrid: - A default atomic grid size with 75 angular points and 302 radial points. - - :f integer(c_int) ultrafinegrid: - A default atomic grid size with 99 angular points and 590 radial points. - - :f integer(c_int) superfinegrid: - A default atomic grid size with 250 angular points and 974 radial points. - - :f integer(c_int) gm3: - A default atomic grid size with 35 angular points and 110 radial points. - - :f integer(c_int) gm5: - A default atomic grid size with 50 angular points and 302 radial points. - - -References ----------- - -.. footbibliography:: \ No newline at end of file diff --git a/gauxc/docs/api/runtime_environment.rst b/gauxc/docs/api/runtime_environment.rst deleted file mode 100644 index 8d37c698..00000000 --- a/gauxc/docs/api/runtime_environment.rst +++ /dev/null @@ -1,277 +0,0 @@ -Runtime environment -=================== - -This section provides a reference for the runtime environment in GauXC, including C++ class definitions, C bindings, and Fortran bindings for creating and managing runtime environments used in GauXC computations. -The runtime environment encapsulates information about the MPI communicator and device configuration for GauXC computations. - - -C++ definitions ---------------- - -.. cpp:class:: GauXC::RuntimeEnvironment - - A class representing the runtime environment for GauXC computations, including information about the MPI communicator and device configuration. - - .. cpp:function:: RuntimeEnvironment(MPI_Comm comm) - - Construct a RuntimeEnvironment object with the specified MPI communicator. - - .. important:: Signature changes if :c:macro:`GAUXC_HAS_MPI` is defined and :cmake:variable:`GAUXC_ENABLE_MPI` is enabled. - - :param comm: The MPI communicator to be used for GauXC computations. Only possible to pass if MPI support is enabled in GauXC. - - .. cpp:function:: int comm_rank() const - - Get the rank of the current process in the MPI communicator associated with this runtime environment. - - :returns: The rank of the current process in the MPI communicator. - - .. cpp:function:: int comm_size() const - - Get the size of the MPI communicator associated with this runtime environment. - - :returns: The size of the MPI communicator. - - .. cpp:function:: DeviceRuntimeEnvironment as_device_runtime() const - - Convert the current runtime environment to a device runtime environment. - - -.. cpp:class:: GauXC::DeviceRuntimeEnvironment : public RuntimeEnvironment - - A class representing a device runtime environment for GauXC computations, including information about the device configuration and memory usage. - - .. cpp:function:: DeviceRuntimeEnvironment(MPI_Comm comm, double fill_fraction) - - Construct a DeviceRuntimeEnvironment object with the specified MPI communicator and device memory fill fraction. - - .. important:: Signature changes if :c:macro:`GAUXC_HAS_MPI` is defined and :cmake:variable:`GAUXC_ENABLE_MPI` is enabled. - - :param comm: The MPI communicator to be used for GauXC computations. Only possible to pass if MPI support is enabled in GauXC. - :param fill_fraction: The fraction of the device memory to be used for GauXC computations (between 0 and 1). - - .. cpp:function:: DeviceRuntimeEnvironment(MPI_Comm comm, void* mem, size_t mem_size) - - Construct a DeviceRuntimeEnvironment object with the specified MPI communicator and user-provided memory. - - .. important:: Signature changes if :c:macro:`GAUXC_HAS_MPI` is defined and :cmake:variable:`GAUXC_ENABLE_MPI` is enabled. - - :param comm: The MPI communicator to be used for GauXC computations. Only possible to pass if MPI support is enabled in GauXC. - :param mem: Pointer to the user-provided memory to be used for GauXC computations. - :param mem_size: The size of the user-provided memory in bytes. - - .. cpp:function:: void* device_memory() const - - Get a pointer to the device memory associated with this runtime environment. - - :returns: A pointer to the device memory associated with this runtime environment. - - .. cpp:function:: size_t device_memory_size() const - - Get the size of the device memory associated with this runtime environment in bytes. - - :returns: The size of the device memory associated with this runtime environment in bytes. - - .. cpp:function:: bool owns_memory() const - - Check if this runtime environment owns the device memory. - - :returns: True if this runtime environment owns the device memory, false otherwise. - - .. cpp:function:: void release_buffer() - - Release the device memory buffer associated with this runtime environment, if it is owned by this runtime environment. - - .. cpp:function:: void set_buffer(void* mem, size_t mem_size) - - Set the device memory buffer for this runtime environment to the specified user-provided memory. - - :param mem: Pointer to the user-provided memory to be used for GauXC computations. - :param mem_size: The size of the user-provided memory in bytes. - - -C bindings ----------- - -.. c:struct:: GauXCRuntimeEnvironment - - Opaque struct representing the runtime environment in the GauXC C API. - - .. c:function:: GauXCRuntimeEnvironment gauxc_runtime_environment_new(GauXCStatus* status, MPI_Comm comm) - - Create a new GauXCRuntimeEnvironment object. - - .. important:: Signature changes if :c:macro:`GAUXC_HAS_MPI` is defined and :cmake:variable:`GAUXC_ENABLE_MPI` is enabled. - - :param status: Pointer to a GauXCStatus variable to store the status of the operation. - :param comm: The MPI communicator to be used for GauXC computations. Only possible to pass if MPI support is enabled in GauXC. - :returns: A new GauXCRuntimeEnvironment object. - - .. c:function:: GauXCRuntimeEnvironment gauxc_device_runtime_environment_new(GauXCStatus* status, MPI_Comm comm, double fill_fraction) - - Create a new GauXCRuntimeEnvironment object for a specific device. - - .. important:: Signature changes if :c:macro:`GAUXC_HAS_MPI` is defined and :cmake:variable:`GAUXC_ENABLE_MPI` is enabled. - - :param status: Pointer to a GauXCStatus variable to store the status of the operation. - :param comm: The MPI communicator to be used for GauXC computations. Only possible to pass if MPI support is enabled in GauXC. - :param fill_fraction: The fraction of the device memory to be used for GauXC computations (between 0 and 1). - :returns: A new GauXCRuntimeEnvironment object for the specified device. - - .. c:function:: GauXCRuntimeEnvironment gauxc_runtime_environment_new_mem(GauXCStatus* status, MPI_Comm comm, void* mem, size_t mem_size) - - Create a new GauXCRuntimeEnvironment object using user-provided memory. - - .. important:: Signature changes if :c:macro:`GAUXC_HAS_MPI` is defined and :cmake:variable:`GAUXC_ENABLE_MPI` is enabled. - - :param status: Pointer to a GauXCStatus variable to store the status of the operation. - :param comm: The MPI communicator to be used for GauXC computations. Only possible to pass if MPI support is enabled in GauXC. - :param mem: Pointer to the user-provided memory to be used for GauXC computations. - :param mem_size: The size of the user-provided memory in bytes. - :returns: A new GauXCRuntimeEnvironment object using the provided memory. - - .. c:function:: int gauxc_runtime_environment_comm_rank(GauXCStatus* status, GauXCRuntimeEnvironment env) - - Get the rank of the current process in the MPI communicator associated with the GauXCRuntimeEnvironment. - Returns 0 if MPI support is not enabled in GauXC. - - :param status: Pointer to a GauXCStatus variable to store the status of the operation. - :param env: The GauXCRuntimeEnvironment object for which to get the MPI rank. - :returns: The rank of the current process in the MPI communicator. - - .. c:function:: int gauxc_runtime_environment_comm_size(GauXCStatus* status, GauXCRuntimeEnvironment env) - - Get the size of the MPI communicator associated with the GauXCRuntimeEnvironment. - Returns 1 if MPI support is not enabled in GauXC. - - :param status: Pointer to a GauXCStatus variable to store the status of the operation. - :param env: The GauXCRuntimeEnvironment object for which to get the MPI size. - :returns: The size of the MPI communicator. - - .. c:function:: void gauxc_runtime_environment_delete(GauXCStatus* status, GauXCRuntimeEnvironment* env) - - Delete a GauXCRuntimeEnvironment object. - - :param status: Pointer to a GauXCStatus variable to store the status of the operation. - :param env: Pointer to the GauXCRuntimeEnvironment object to be deleted. - - -Fortran bindings ----------------- - -.. f:module:: gauxc_runtime_environment - :synopsis: Fortran bindings for GauXC runtime environment objects. - -.. f:currentmodule:: gauxc_runtime_environment - -.. f:type:: gauxc_runtime_environment_type - - Opaque type representing the runtime environment in the GauXC Fortran API. - Available in the module :f:mod:`gauxc_runtime_environment`. - - .. f:function:: gauxc_runtime_environment_new(status) - - Create a new GauXCRuntimeEnvironment object. - If MPI support is enabled in GauXC, this function creates a runtime environment with the default MPI communicator (``MPI_COMM_WORLD``). - Part of the :f:func:`gauxc_runtime_environment_new` interface. - - :param type(gauxc_status_type) status: Variable to store the status of the operation. - :returns type(gauxc_runtime_environment_type): A new GauXCRuntimeEnvironment object. - - .. f:function:: gauxc_runtime_environment_new_mpi(status, comm) - - Create a new GauXCRuntimeEnvironment object. - This function is only available if MPI support is enabled in GauXC and allows specifying the MPI communicator to be used for GauXC computations. - Part of the :f:func:`gauxc_runtime_environment_new` interface. - - :param type(gauxc_status_type) status: Variable to store the status of the operation. - :param integer comm: The MPI communicator to be used for GauXC computations. - :returns type(gauxc_runtime_environment_type): A new GauXCRuntimeEnvironment object. - - .. f:function:: gauxc_runtime_environment_new_mpi_f08(status, comm) - - Create a new GauXCRuntimeEnvironment object. - This function is only available if MPI support is enabled in GauXC and allows specifying the MPI communicator to be used for GauXC computations. - Part of the :f:func:`gauxc_runtime_environment_new` interface. - - :param type(gauxc_status_type) status: Variable to store the status of the operation. - :param type(MPI_Comm) comm: The MPI communicator to be used for GauXC computations. - :returns type(gauxc_runtime_environment_type): A new GauXCRuntimeEnvironment object. - - .. f:function:: gauxc_device_runtime_environment_new(status, fill_fraction) - - Create a new GauXCRuntimeEnvironment object for a specific device. - If MPI support is enabled in GauXC, this function creates a runtime environment with the default MPI communicator (``MPI_COMM_WORLD``). - This function is only available if device support (CUDA or HIP) is enabled in GauXC and allows specifying the fraction of the device memory to be used for GauXC computations. - Part of the :f:func:`gauxc_device_runtime_environment_new` interface. - - :param type(gauxc_status_type) status: Variable to store the status of the operation. - :param integer comm: The MPI communicator to be used for GauXC computations. - :param real(c_double) fill_fraction: The fraction of the device memory to be used for GauXC computations (between 0 and 1). - :returns type(gauxc_runtime_environment_type): A new GauXCRuntimeEnvironment object for the specified device. - - .. f:function:: gauxc_device_runtime_environment_new_mpi(status, comm, fill_fraction) - - Create a new GauXCRuntimeEnvironment object for a specific device. - This function is only available if device support (CUDA or HIP) is enabled in GauXC and allows specifying the MPI communicator and the fraction of the device memory to be used for GauXC computations. - Part of the :f:func:`gauxc_device_runtime_environment_new` interface. - - :param type(gauxc_status_type) status: Variable to store the status of the operation. - :param integer comm: The MPI communicator to be used for GauXC computations. - :param real(c_double) fill_fraction: The fraction of the device memory to be used for GauXC computations (between 0 and 1). - :returns type(gauxc_runtime_environment_type): A new GauXCRuntimeEnvironment object for the specified device. - - .. f:function:: gauxc_device_runtime_environment_new_mpi_f08(status, comm, fill_fraction) - - Create a new GauXCRuntimeEnvironment object for a specific device. - This function is only available if device support (CUDA or HIP) is enabled in GauXC and allows specifying the MPI communicator and the fraction of the device memory to be used for GauXC computations. - Part of the :f:func:`gauxc_device_runtime_environment_new` interface. - - :param type(gauxc_status_type) status: Variable to store the status of the operation. - :param type(MPI_Comm) comm: The MPI communicator to be used for GauXC computations. - :param real(c_double) fill_fraction: The fraction of the device memory to be used for GauXC computations (between 0 and 1). - :returns type(gauxc_runtime_environment_type): A new GauXCRuntimeEnvironment object for the specified device. - - .. f:function:: gauxc_device_runtime_environment_new_mem(status, mem, mem_size) - - Create a new GauXCRuntimeEnvironment object using user-provided memory. - If MPI support is enabled in GauXC, this function creates a runtime environment with the default MPI communicator (``MPI_COMM_WORLD``). - This function is only available if device support (CUDA or HIP) is enabled in GauXC and allows specifying the user-provided memory to be used for GauXC computations. - Part of the :f:func:`gauxc_device_runtime_environment_new` interface. - - :param type(gauxc_status_type) status: Variable to store the status of the operation. - :param type(c_ptr) mem: Pointer to the user-provided memory to be used for GauXC computations. - :param integer(c_size_t) mem_size: The size of the user-provided memory in bytes. - :returns type(gauxc_runtime_environment_type): A new GauXCRuntimeEnvironment object using the provided memory. - - .. f:function:: gauxc_device_runtime_environment_new_mem_mpi(status, comm, mem, mem_size) - - Create a new GauXCRuntimeEnvironment object using user-provided memory. - This function is only available if device support (CUDA or HIP) is enabled in GauXC and allows specifying the MPI communicator and the user-provided memory to be used for GauXC computations. - Part of the :f:func:`gauxc_device_runtime_environment_new` interface. - - :param type(gauxc_status_type) status: Variable to store the status of the operation. - :param integer comm: The MPI communicator to be used for GauXC computations. - :param type(c_ptr) mem: Pointer to the user-provided memory to be used for GauXC computations. - :param integer(c_size_t) mem_size: The size of the user-provided memory in bytes. - :returns type(gauxc_runtime_environment_type): A new GauXCRuntimeEnvironment object using the provided memory. - - .. f:function:: gauxc_device_runtime_environment_new_mem_mpi_f08(status, comm, mem, mem_size) - - Create a new GauXCRuntimeEnvironment object using user-provided memory. - This function is only available if device support (CUDA or HIP) is enabled in GauXC and allows specifying the MPI communicator and the user-provided memory to be used for GauXC computations. - Part of the :f:func:`gauxc_device_runtime_environment_new` interface. - - :param type(gauxc_status_type) status: Variable to store the status of the operation. - :param type(MPI_Comm) comm: The MPI communicator to be used for GauXC computations. - :param type(c_ptr) mem: Pointer to the user-provided memory to be used for GauXC computations. - :param integer(c_size_t) mem_size: The size of the user-provided memory in bytes. - :returns type(gauxc_runtime_environment_type): A new GauXCRuntimeEnvironment object using the provided memory. - - .. f:function:: gauxc_runtime_environment_delete(status, env) - - Delete a GauXCRuntimeEnvironment object. - Part of the :f:func:`gauxc_delete` interface. - - :param type(gauxc_status_type) status: Variable to store the status of the operation. - :param type(gauxc_runtime_environment_type) env: The GauXCRuntimeEnvironment object to be deleted. \ No newline at end of file diff --git a/gauxc/docs/api/xc_integrator.rst b/gauxc/docs/api/xc_integrator.rst deleted file mode 100644 index 9e9509c7..00000000 --- a/gauxc/docs/api/xc_integrator.rst +++ /dev/null @@ -1,438 +0,0 @@ -Exchange-correlation integrator -=============================== - -C++ definitions ---------------- - -.. cpp:class:: template GauXC::XCIntegrator - - .. cpp:type:: matrix_type = MatrixType - - The type of matrix data expected by the integrator kernels. - - .. cpp:type:: value_type = matrix_type::value_type - - The scalar value type corresponding to the matrix type. - - .. cpp:function:: value_type integrate_den(const MatrixType& density_matrix) const - - Compute the total density to get the number of electrons. - - :param density_matrix: The input density matrix data. - :returns: The computed total density. - - .. cpp:function:: value_type eval_exc(const MatrixType& density_matrix) const - - Compute the exchange-correlation energy for a given density matrix. - - :param density_matrix: The input density matrix data. - :returns: The computed exchange-correlation energy. - - .. cpp:function:: value_type eval_exc(const MatrixType& density_matrix_s, const MatrixType& density_matrix_z) const - - Compute the exchange-correlation energy for a given density matrix. - - :param density_matrix_s: The input density matrix data for the spin-up component. - :param density_matrix_z: The input density matrix data for the spin-down component. - :returns: The computed exchange-correlation energy. - - .. cpp:function:: value_type eval_exc(const MatrixType& density_matrix_s, const MatrixType& density_matrix_z, const MatrixType& density_matrix_y, const MatrixType& density_matrix_x) const - - Compute the exchange-correlation energy for a given density matrix. - - :param density_matrix_s: The input density matrix data for the spin-up component. - :param density_matrix_z: The input density matrix data for the spin-down component. - :param density_matrix_y: The input density matrix data for the spin-y component. - :param density_matrix_x: The input density matrix data for the spin-x component. - :returns: The computed exchange-correlation energy. - - .. cpp:function:: std::tuple eval_exc_vxc(const MatrixType& density_matrix) - - Compute the exchange-correlation energy and potential for a given density matrix. - - :param density_matrix: The input density matrix data. - :returns: The computed exchange-correlation energy and the computed exchange-correlation potential matrix. - - .. cpp:function:: std::tuple eval_exc_vxc(const MatrixType& density_matrix_s, const MatrixType& density_matrix_z) - - Compute the exchange-correlation energy and potential for a given density matrix. - - :param density_matrix_s: The input density matrix data for the spin-up component. - :param density_matrix_z: The input density matrix data for the spin-down component. - :returns: The computed exchange-correlation energy and the computed exchange-correlation potential matrices for the total and spin-polarization components. - - .. cpp:function:: std::tuple eval_exc_vxc_onedft(const MatrixType& density_matrix_s, const MatrixType& density_matrix_z, const OneDFTSettings settings) - - Compute the exchange-correlation energy and potential for a given density matrix. - - .. important:: - - This function is available if :c:macro:`GAUXC_HAS_ONEDFT` is defined or the CMake option :cmake:variable:`GAUXC_ENABLE_ONEDFT` is enabled. - It requires a compatible checkpoint for the Skala implementation of the functional, which can be specified with the ``settings`` parameter. - - :param density_matrix_s: The input density matrix data for the spin-up component. - :param density_matrix_z: The input density matrix data for the spin-down component. - :param settings: The OneDFTSettings struct containing parameters for the Skala evaluation. - :returns: The computed exchange-correlation energy and the computed exchange-correlation potential matrices for the total and spin-polarization components. - - .. cpp:function:: std::tuple eval_exc_vxc(const MatrixType& density_matrix_s, const MatrixType& density_matrix_z, const MatrixType& density_matrix_y, const MatrixType& density_matrix_x) - - Compute the exchange-correlation energy and potential for a given density matrix. - - :param density_matrix_s: The input density matrix data for the spin-up component. - :param density_matrix_z: The input density matrix data for the spin-down component. - :param density_matrix_y: The input density matrix data for the spin-y component. - :param density_matrix_x: The input density matrix data for the spin-x component. - :returns: The computed exchange-correlation energy and the computed exchange-correlation potential matrices for the total and spin-polarization components. - -.. cpp:class:: GauXC::XCIntegratorFactory - - A factory class for creating instances of the XCIntegrator class based on specified parameters. - - .. cpp:function:: XCIntegratorFactory(ExecutionSpace ex, std::string integrator_input_type, std::string integrator_kernel_name, std::string local_work_kernel_name, std::string reduction_kernel_name) - - Create a new XCIntegratorFactory instance with the specified execution space and kernel names. - - :param ex: The execution space for which to create integrators. - :param integrator_input_type: The type of input data expected by the integrator kernels. - :param integrator_kernel_name: The name of the kernel to use for the main integration step. - :param local_work_kernel_name: The name of the kernel to use for computing local work sizes. - :param reduction_kernel_name: The name of the kernel to use for reduction operations. - - .. cpp:function:: XCIntegrator get_instance(const ExchCXX::Functional& func, const LoadBalancer& lb) - - Get an instance of the XCIntegrator class for the specified functional and load balancer. - - :param func: The exchange-correlation functional for which to get the integrator instance. - :param lb: The load balancer to use for the integrator instance. - :returns: An instance of the XCIntegrator class initialized with the specified parameters. - - .. cpp:function:: std::shared_ptr get_shared_instance(const ExchCXX::Functional& func, const LoadBalancer& lb) - - Get a shared pointer to an instance of the XCIntegrator class for the specified functional and load balancer. - - :param func: The exchange-correlation functional for which to get the integrator instance. - :param lb: The load balancer to use for the integrator instance. - :returns: A shared pointer to an instance of the XCIntegrator class initialized with the specified parameters. - -.. cpp:struct:: GauXC::OneDFTSettings - - A struct containing settings for the Skala implementation of the exchange-correlation functional. - - .. cpp:member:: std::string model - - The model checkpoint to use for evaluating the exchange-correlation energy and potential with the Skala implementation. - -.. cpp:class:: ExchCXX::Functional - - A class representing an exchange-correlation functional in the ExchCXX library, which can be used with GauXC integrators. - - -C bindings ----------- - -.. c:struct:: GauXCIntegrator - - Opaque type representing an exchange-correlation integrator instance. - - .. c:function:: GauXCIntegrator gauxc_integrator_new(GauXCStatus* status, const GauXCFunctional functional, const GauXCLoadBalancer lb, enum GauXC_ExecutionSpace ex, const char* integrator_input_type, const char* integrator_kernel_name, const char* local_work_kernel_name, const char* reduction_kernel_name) - - Create a new exchange-correlation integrator instance with the specified functional, load balancer, execution space, and kernel names. - - :param status: Pointer to a GauXCStatus struct where the status of the operation will be stored. - :param functional: The exchange-correlation functional for which to create the integrator. - :param lb: The load balancer to use for the integrator. - :param ex: The execution space for which to create the integrator. - :param integrator_input_type: The type of input data expected by the integrator kernels. - :param integrator_kernel_name: The name of the kernel to use for the main integration step. - :param local_work_kernel_name: The name of the kernel to use for computing local work sizes. - :param reduction_kernel_name: The name of the kernel to use for reduction operations. - :returns: A new GauXCIntegrator instance initialized with the specified parameters. - - .. c:function:: void gauxc_integrator_integrate_den(GauXCStatus* status, GauXCIntegrator integrator, const int64_t m, const int64_t n, const double* density_matrix, const int64_t ldp, double* den) - - Compute the total density to get the number of electrons - - :param status: Pointer to a GauXCStatus struct where the status of the operation will be stored. - :param integrator: The GauXCIntegrator instance to use for the integration. - :param m: The number of rows in the density matrix. - :param n: The number of columns in the density matrix. - :param density_matrix: Pointer to the input density matrix data. - :param ldp: The leading dimension of the density matrix. - :param den: Pointer to the output variable where the computed total density will be stored. - - .. c:function:: void gauxc_integrator_eval_exc_rks(GauXCStatus* status, GauXCIntegrator integrator, const int64_t m, const int64_t n, const double* density_matrix, const int64_t ldp, double* exc) - - Compute the exchange-correlation energy for a given density matrix. - - :param status: Pointer to a GauXCStatus struct where the status of the operation will be stored. - :param integrator: The GauXCIntegrator instance to use for the integration. - :param m: The number of rows in the density matrix. - :param n: The number of columns in the density matrix. - :param density_matrix: Pointer to the input density matrix data. - :param ldp: The leading dimension of the density matrix. - :param exc: Pointer to the output variable where the computed exchange-correlation energy will be stored. - - .. c:function:: void gauxc_integrator_eval_exc_uks(GauXCStatus* status, GauXCIntegrator integrator, const int64_t m, const int64_t n, const double* density_matrix_s, const int64_t ldp_s, const double* density_matrix_z, const int64_t ldp_z, double* exc) - - Compute the exchange-correlation energy for a given density matrix. - - :param status: Pointer to a GauXCStatus struct where the status of the operation will be stored. - :param integrator: The GauXCIntegrator instance to use for the integration. - :param m: The number of rows in the density matrix. - :param n: The number of columns in the density matrix. - :param density_matrix_s: Pointer to the input density matrix data. - :param ldp_s: The leading dimension of the density matrix. - :param density_matrix_z: Pointer to the input density matrix data. - :param ldp_z: The leading dimension of the density matrix. - :param exc: Pointer to the output variable where the computed exchange-correlation energy will be stored. - - .. c:function:: void gauxc_integrator_eval_exc_gks(GauXCStatus* status, GauXCIntegrator integrator, const int64_t m, const int64_t n, const double* density_matrix_s, const int64_t ldp_s, const double* density_matrix_z, const int64_t ldp_z, const double* density_matrix_y, const int64_t ldp_y, const double* density_matrix_x, const int64_t ldp_x, double* exc) - - Compute the exchange-correlation energy for a given density matrix. - - :param status: Pointer to a GauXCStatus struct where the status of the operation will be stored. - :param integrator: The GauXCIntegrator instance to use for the integration. - :param m: The number of rows in the density matrix. - :param n: The number of columns in the density matrix. - :param density_matrix_s: Pointer to the input density matrix data. - :param ldp_s: The leading dimension of the density matrix. - :param density_matrix_z: Pointer to the input density matrix data. - :param ldp_z: The leading dimension of the density matrix. - :param density_matrix_y: Pointer to the input density matrix data. - :param ldp_y: The leading dimension of the density matrix. - :param density_matrix_x: Pointer to the input density matrix data. - :param ldp_x: The leading dimension of the density matrix. - :param exc: Pointer to the output variable where the computed exchange-correlation energy will be stored. - - .. c:function:: void gauxc_integrator_eval_exc_vxc_rks(GauXCStatus* status, GauXCIntegrator integrator, const int64_t m, const int64_t n, const double* density_matrix, const int64_t ldp, double* exc, double* vxc_matrix, const int64_t ldp_vxc) - - Compute the exchange-correlation energy and potential for a given density matrix. - - :param status: Pointer to a GauXCStatus struct where the status of the operation will be stored. - :param integrator: The GauXCIntegrator instance to use for the integration. - :param m: The number of rows in the density matrix. - :param n: The number of columns in the density matrix. - :param density_matrix: Pointer to the input density matrix data. - :param ldp: The leading dimension of the density matrix. - :param exc: Pointer to the output variable where the computed exchange-correlation energy will be stored. - :param vxc_matrix: Pointer to the output array where the computed exchange-correlation potential matrix will be stored. - :param ldp_vxc: The leading dimension of the vxc_matrix array. - - .. c:function:: void gauxc_integrator_eval_exc_vxc_uks(GauXCStatus* status, GauXCIntegrator integrator, const int64_t m, const int64_t n, const double* density_matrix_s, const int64_t ldp_s, const double* density_matrix_z, const int64_t ldp_z, double* exc, double* vxc_matrix_s, const int64_t ldp_vxc_s, double* vxc_matrix_z, const int64_t ldp_vxc_z) - - Compute the exchange-correlation energy and potential for a given density matrix. - - :param status: Pointer to a GauXCStatus struct where the status of the operation will be stored. - :param integrator: The GauXCIntegrator instance to use for the integration. - :param m: The number of rows in the density matrix. - :param n: The number of columns in the density matrix. - :param density_matrix_s: Pointer to the input density matrix data. - :param ldp_s: The leading dimension of the density matrix. - :param density_matrix_z: Pointer to the input density matrix data. - :param ldp_z: The leading dimension of the density matrix. - :param exc: Pointer to the output variable where the computed exchange-correlation energy will be stored. - :param vxc_matrix_s: Pointer to the output array where the computed exchange-correlation potential matrix for the spin-up component will be stored. - :param ldp_vxc_s: The leading dimension of the vxc_matrix_s array. - :param vxc_matrix_z: Pointer to the output array where the computed exchange-correlation potential matrix for the spin-down component will be stored. - :param ldp_vxc_z: The leading dimension of the vxc_matrix_z array. - - - .. c:function:: void gauxc_integrator_eval_exc_vxc_onedft_uks(GauXCStatus* status, GauXCIntegrator integrator, const int64_t m, const int64_t n, const double* density_matrix_s, const int64_t ldp_s, const double* density_matrix_z, const int64_t ldp_z, const char* model, double* exc, double* vxc_matrix_s, const int64_t ldp_vxc_s, double* vxc_matrix_z, const int64_t ldp_vxc_z) - - Compute the exchange-correlation energy and potential for a given density matrix. - - .. important:: - - This function is available if :c:macro:`GAUXC_HAS_ONEDFT` is defined or the CMake option :cmake:variable:`GAUXC_ENABLE_ONEDFT` is enabled. - It requires a compatible checkpoint for the Skala implementation of the functional, which can be specified with the ``model`` parameter. - - :param status: Pointer to a GauXCStatus struct where the status of the operation will be stored. - :param integrator: The GauXCIntegrator instance to use for the integration. - :param m: The number of rows in the density matrix. - :param n: The number of columns in the density matrix. - :param density_matrix_s: Pointer to the input density matrix data. - :param ldp_s: The leading dimension of the density matrix. - :param density_matrix_z: Pointer to the input density matrix data. - :param ldp_z: The leading dimension of the density matrix. - :param model: The model checkpoint to use for evaluating the exchange-correlation energy and potential. - :param exc: Pointer to the output variable where the computed exchange-correlation energy will be stored. - :param vxc_matrix_s: Pointer to the output array where the computed exchange-correlation potential matrix for the spin-up component will be stored. - :param ldp_vxc_s: The leading dimension of the vxc_matrix_s array. - :param vxc_matrix_z: Pointer to the output array where the computed exchange-correlation potential matrix for the spin-down component will be stored. - :param ldp_vxc_z: The leading dimension of the vxc_matrix_z array. - - .. c:function:: void gauxc_integrator_eval_exc_vxc_gks(GauXCStatus* status, GauXCIntegrator integrator, const int64_t m, const int64_t n, const double* density_matrix_s, const int64_t ldp_s, const double* density_matrix_z, const int64_t ldp_z, const double* density_matrix_y, const int64_t ldp_y, const double* density_matrix_x, const int64_t ldp_x, double* exc, double* vxc_matrix_s, const int64_t ldp_vxc_s, double* vxc_matrix_z, const int64_t ldp_vxc_z, double* vxc_matrix_y, const int64_t ldp_vxc_y, double* vxc_matrix_x, const int64_t ldp_vxc_x) - - Compute the exchange-correlation energy and potential for a given density matrix. - - :param status: Pointer to a GauXCStatus struct where the status of the operation will be stored. - :param integrator: The GauXCIntegrator instance to use for the integration. - :param m: The number of rows in the density matrix. - :param n: The number of columns in the density matrix. - :param density_matrix_s: Pointer to the input density matrix data. - :param ldp_s: The leading dimension of the density matrix. - :param density_matrix_z: Pointer to the input density matrix data. - :param ldp_z: The leading dimension of the density matrix. - :param density_matrix_y: Pointer to the input density matrix data. - :param ldp_y: The leading dimension of the density matrix. - :param density_matrix_x: Pointer to the input density matrix data. - :param ldp_x: The leading dimension of the density matrix. - :param exc: Pointer to the output variable where the computed exchange-correlation energy will be stored. - :param vxc_matrix_s: Pointer to the output array where the computed exchange-correlation potential matrix for the spin-up component will be stored. - :param ldp_vxc_s: The leading dimension of the vxc_matrix_s array. - :param vxc_matrix_z: Pointer to the output array where the computed exchange-correlation potential matrix for the spin-down component will be stored. - :param ldp_vxc_z: The leading dimension of the vxc_matrix_z array. - :param vxc_matrix_y: Pointer to the output array where the computed exchange-correlation potential matrix for the spin-y component will be stored. - :param ldp_vxc_y: The leading dimension of the vxc_matrix_y array. - :param vxc_matrix_x: Pointer to the output array where the computed exchange-correlation potential matrix for the spin-x component will be stored. - :param ldp_vxc_x: The leading dimension of the vxc_matrix_x array. - - .. c:function:: void gauxc_integrator_delete(GauXCStatus* status, GauXCIntegrator* integrator) - - Delete an exchange-correlation integrator instance. - - :param status: Pointer to a GauXCStatus struct where the status of the operation will be stored. - :param integrator: Pointer to the GauXCIntegrator instance to be deleted. - -.. c:struct:: GauXCFunctional - - Opaque type representing an exchange-correlation functional in the GauXC C API, which can be used with GauXC integrators. - - -Fortran bindings ----------------- - -.. f:module:: gauxc_integrator - :synopsis: Fortran bindings for GauXC exchange-correlation integrator objects. - -.. f:currentmodule:: gauxc_integrator - -.. f:type:: gauxc_integrator_type - - Opaque type representing an exchange-correlation integrator instance in the GauXC Fortran API. - Available in the module :f:mod:`gauxc_integrator`. - - .. f:function:: gauxc_integrator_new(status, functional, lb, ex[, integrator_input_type, integrator_kernel_name, local_work_kernel_name, reduction_kernel_name]) - - Create a new exchange-correlation integrator instance with the specified functional, load balancer, execution space, and kernel names. - - :param type(gauxc_status_type) status: A variable to store the status of the operation. - :param type(gauxc_functional_type) functional: The exchange-correlation functional for which to create the integrator. - :param type(gauxc_load_balancer_type) lb: The load balancer to use for the integrator. - :param integer(c_int) ex: The execution space for which to create the integrator. - :optional character(len=*) integrator_input_type: The type of input data expected by the integrator kernels. Default: "Replicated" - :optional character(len=*) integrator_kernel_name: The name of the kernel to use for the main integration step. Default: "Default" - :optional character(len=*) local_work_kernel_name: The name of the kernel to use for computing local work sizes. Default: "Default" - :optional character(len=*) reduction_kernel_name: The name of the kernel to use for reduction operations. Default: "Default" - :returns type(gauxc_integrator_type): A new gauxc_integrator_type object initialized with the specified parameters. - - .. f:subroutine:: gauxc_integrator_integrate_den(status, integrator, density_matrix, den) - - Compute the total density to get the number of electrons. - - :param type(gauxc_status_type) status: A variable to store the status of the operation. - :param type(gauxc_integrator_type) integrator: The GauXCIntegrator instance to use for the integration. - :param real(c_double) density_matrix [dimension(:,:)]: The input density matrix data. - :param real(c_double) den: Output variable where the computed total density will be stored. - - .. f:subroutine:: gauxc_integrator_eval_exc_rks(status, integrator, density_matrix, exc) - - Compute the exchange-correlation energy for a given density matrix. - Part of the :f:func:`gauxc_eval_exc` interface. - - :param type(gauxc_status_type) status: A variable to store the status of the operation. - :param type(gauxc_integrator_type) integrator: The GauXCIntegrator instance to use for the integration. - :param real(c_double) density_matrix [dimension(:,:)]: The input density matrix data. - :param real(c_double) exc: Output variable where the computed exchange-correlation energy will be stored. - - .. f:subroutine:: gauxc_integrator_eval_exc_uks(status, integrator, density_matrix_s, density_matrix_z, exc) - - Compute the exchange-correlation energy for a given density matrix. - Part of the :f:func:`gauxc_eval_exc` interface. - - :param type(gauxc_status_type) status: A variable to store the status of the operation. - :param type(gauxc_integrator_type) integrator: The GauXCIntegrator instance to use for the integration. - :param real(c_double) density_matrix_s [dimension(:,:)]: The input density matrix data for the spin-up component. - :param real(c_double) density_matrix_z [dimension(:,:)]: The input density matrix data for the spin-down component. - :param real(c_double) exc: Output variable where the computed exchange-correlation energy will be stored. - - .. f:subroutine:: gauxc_integrator_eval_exc_gks(status, integrator, density_matrix_s, density_matrix_z, density_matrix_y, density_matrix_x, exc) - - Compute the exchange-correlation energy for a given density matrix. - Part of the :f:func:`gauxc_eval_exc` interface. - - :param type(gauxc_status_type) status: A variable to store the status of the operation. - :param type(gauxc_integrator_type) integrator: The GauXCIntegrator instance to use for the integration. - :param real(c_double) density_matrix_s [dimension(:,:)]: The input density matrix data for the spin-up component. - :param real(c_double) density_matrix_z [dimension(:,:)]: The input density matrix data for the spin-down component. - :param real(c_double) density_matrix_y [dimension(:,:)]: The input density matrix data for the spin-y component. - :param real(c_double) density_matrix_x [dimension(:,:)]: The input density matrix data for the spin-x component. - :param real(c_double) exc: Output variable where the computed exchange-correlation energy will be stored. - - .. f:subroutine:: gauxc_integrator_eval_exc_vxc_rks(status, integrator, density_matrix, exc, vxc_matrix, ldp_vxc) - - Compute the exchange-correlation energy and potential for a given density matrix. - Part of the :f:func:`gauxc_eval_exc_vxc` interface. - - :param type(gauxc_status_type) status: A variable to store the status of the operation. - :param type(gauxc_integrator_type) integrator: The GauXCIntegrator instance to use for the integration. - :param real(c_double) density_matrix [dimension(:,:)]: The input density matrix data. - :param real(c_double) exc: Output variable where the computed exchange-correlation energy will be stored. - :param real(c_double) vxc_matrix [dimension(:,:)]: Output array where the computed exchange-correlation potential matrix will be stored. - :param integer(c_int64_t) ldp_vxc: The leading dimension of the vxc_matrix array. - - .. f:subroutine:: gauxc_integrator_eval_exc_vxc_uks(status, integrator, density_matrix_s, density_matrix_z, exc, vxc_matrix_s, vxc_matrix_z) - - Compute the exchange-correlation energy and potential for a given density matrix. - Part of the :f:func:`gauxc_eval_exc_vxc` interface. - - :param type(gauxc_status_type) status: A variable to store the status of the operation. - :param type(gauxc_integrator_type) integrator: The GauXCIntegrator instance to use for the integration. - :param real(c_double) density_matrix_s [dimension(:,:)]: The input density matrix data for the spin-up component. - :param real(c_double) density_matrix_z [dimension(:,:)]: The input density matrix data for the spin-down component. - :param real(c_double) exc: Output variable where the computed exchange-correlation energy will be stored. - :param real(c_double) vxc_matrix_s [dimension(:,:)]: Output array where the computed exchange-correlation potential matrix for the spin-up component will be stored. - :param real(c_double) vxc_matrix_z [dimension(:,:)]: Output array where the computed exchange-correlation potential matrix for the spin-down component will be stored. - - .. f:subroutine:: gauxc_integrator_eval_exc_vxc_onedft_uks(status, integrator, density_matrix_s, density_matrix_z, model, exc, vxc_matrix_s, vxc_matrix_z) - - Compute the exchange-correlation energy and potential for a given density matrix. - Part of the :f:func:`gauxc_eval_exc_vxc` interface. - - .. important:: - - This function is available if :c:macro:`GAUXC_HAS_ONEDFT` is defined or the CMake option :cmake:variable:`GAUXC_ENABLE_ONEDFT` is enabled. - It requires a compatible checkpoint for the Skala implementation of the functional, which can be specified with the ``model`` parameter. - - :param type(gauxc_status_type) status: A variable to store the status of the operation. - :param type(gauxc_integrator_type) integrator: The GauXCIntegrator instance to use for the integration. - :param real(c_double) density_matrix_s [dimension(:,:)]: The input density matrix data for the spin-up component. - :param real(c_double) density_matrix_z [dimension(:,:)]: The input density matrix data for the spin-down component. - :param character(len=*) model: The model checkpoint to use for evaluating the exchange-correlation energy and potential. - :param real(c_double) exc: Output variable where the computed exchange-correlation energy will be stored. - :param real(c_double) vxc_matrix_s [dimension(:,:)]: Output array where the computed exchange-correlation potential matrix for the spin-up component will be stored. - :param real(c_double) vxc_matrix_z [dimension(:,:)]: Output array where the computed exchange-correlation potential matrix for the spin-down component will be stored. - - .. f:subroutine:: gauxc_integrator_eval_exc_vxc_gks(status, integrator, density_matrix_s, density_matrix_z, density_matrix_y, density_matrix_x, exc, vxc_matrix_s, vxc_matrix_z, vxc_matrix_y, vxc_matrix_x) - - Compute the exchange-correlation energy and potential for a given density matrix. - Part of the :f:func:`gauxc_eval_exc_vxc` interface. - - :param type(gauxc_status_type) status: A variable to store the status of the operation. - :param type(gauxc_integrator_type) integrator: The GauXCIntegrator instance to use for the integration. - :param real(c_double) density_matrix_s [dimension(:,:)]: The input density matrix data for the spin-up component. - :param real(c_double) density_matrix_z [dimension(:,:)]: The input density matrix data for the spin-down component. - :param real(c_double) density_matrix_y [dimension(:,:)]: The input density matrix data for the spin-y component. - :param real(c_double) density_matrix_x [dimension(:,:)]: The input density matrix data for the spin-x component. - :param real(c_double) exc: Output variable where the computed exchange-correlation energy will be stored. - :param real(c_double) vxc_matrix_s [dimension(:,:)]: Output array where the computed exchange-correlation potential matrix for the spin-up component will be stored. - :param real(c_double) vxc_matrix_z [dimension(:,:)]: Output array where the computed exchange-correlation potential matrix for the spin-down component will be stored. - :param real(c_double) vxc_matrix_y [dimension(:,:)]: Output array where the computed exchange-correlation potential matrix for the spin-y component will be stored. - :param real(c_double) vxc_matrix_x [dimension(:,:)]: Output array where the computed exchange-correlation potential matrix for the spin-x component will be stored. - -.. f:currentmodule:: gauxc_xc_functional - -.. f:type:: gauxc_functional_type - - Opaque type representing an exchange-correlation functional in the GauXC Fortran API, which can be used with GauXC integrators. \ No newline at end of file diff --git a/gauxc/docs/c-library.rst b/gauxc/docs/c-library.rst deleted file mode 100644 index 906260cb..00000000 --- a/gauxc/docs/c-library.rst +++ /dev/null @@ -1,544 +0,0 @@ -GauXC in C -========== - -This guide shows how to use the GauXC library in C applications. -We will cover - -* setting up a CMake project to include GauXC as dependency -* initializing the GauXC runtime environment -* reading molecule, basis set, and density matrix from an HDF5 input file -* setting up the integration grid, load balancer, and exchange-correlation integrator -* performing the exchange-correlation evaluation and outputting the result - -Setting up CMake ----------------- - -GauXC can be most conveniently used via CMake, therefore we will setup a minimal CMake project for a command line driver to use GauXC. -Next to GauXC we will use other dependencies as needed. - -The directory structure for the project will be - -.. code-block:: text - - ├── CMakeLists.txt - ├── app - │ └── main.c - └── cmake - ├── skala-argtable3.cmake - ├── skala-dep-versions.cmake - ├── skala-gauxc.cmake - └── skala-hdf5.cmake - -First we create the main ``CMakeLists.txt`` to define our project, include our dependencies, and declare our executable. - -.. literalinclude:: ../examples/c/gauxc_integration/CMakeLists.txt - :language: cmake - :caption: CMakeLists.txt - -For handling the dependencies, we create a separate file in the ``cmake/`` subdirectory to include the path and checksums for all our dependencies. - -.. literalinclude:: ../examples/c/gauxc_integration/cmake/skala-dep-versions.cmake - :language: cmake - :caption: cmake/skala-dep-versions.cmake - -For each dependency we will create a separate CMake include file for finding and making it available. -First, we define how we will include GauXC our main dependency. -For this we can rely in most cases to discover the GauXC config file, however we also provide a fallback to download and build GauXC in case it is not available in the environment. -The options we defined in the main CMake file will be passed through to GauXC to ensure the library provides the requested features. -Furthermore, after having GauXC available, we double check whether our requirements for GauXC are satisfied, this is especially necessary for the Skala implementation, which requires the ``GAUXC_HAS_ONEDFT`` feature flag. - -.. literalinclude:: ../examples/c/gauxc_integration/cmake/skala-gauxc.cmake - :language: cmake - :caption: cmake/skala-gauxc.cmake - -For our command line driver, we will be using `Argtable3 `__ to create the command line interface. - -.. literalinclude:: ../examples/c/gauxc_integration/cmake/skala-argtable3.cmake - :language: cmake - :caption: cmake/skala-argtable3.cmake - -Finally, we will use the HDF5 C library for reading our input data from an HDF5 file. - -.. literalinclude:: ../examples/c/gauxc_integration/cmake/skala-hdf5.cmake - :language: cmake - :caption: cmake/skala-hdf5.cmake - -With this we have the full CMake setup we need for creating our command line driver. - - -Setting up headers ------------------- - -For our main driver program we include the relevant headers from GauXC, next to the ones needed for the HDF5 I/O and command line interface. - -.. literalinclude:: ../examples/c/gauxc_integration/app/main.c - :language: c - :lines: 1-25 - :caption: app/main.c (header includes) - -For each of the GauXC components we will be using, we include the respective header file from GauXC. - -`gauxc/status.h` - For handling GauXC status codes and errors. - -`gauxc/molecule.h` - For handling molecular data structures, like atomic numbers and coordinates. - -`gauxc/basisset.h` - For handling basis set data, like basis function definitions. - -`gauxc/molgrid.h` - For setting up and managing the integration grid. - -`gauxc/runtime_environment.h` - For interacting with MPI and device runtime environments. - -`gauxc/load_balancer.h` - For setting up and managing the load balancer for distributing grid points. - -`gauxc/molecular_weights.h` - For computing molecular weights needed for grid generation. - -`gauxc/functional.h` - For handling exchange-correlation functionals. - -`gauxc/xc_integrator.h` - For setting up and managing the exchange-correlation integrator. - -We start our main driver with initializing the MPI environment, if GauXC was built with MPI support. - -.. literalinclude:: ../examples/c/gauxc_integration/app/main.c - :language: c - :lines: 185-190 - :caption: app/main.c (MPI initialize) - -For the finalization of the MPI environment we also add a guarded call to the MPI finalize function at the end of our main program. - -.. literalinclude:: ../examples/c/gauxc_integration/app/main.c - :language: c - :lines: 408-410,412 - :caption: app/main.c (MPI finalize) - -GauXC provides a macro ``GAUXC_HAS_MPI`` to inform users whether GauXC was built with MPI support. -We can use this macro to conditionally compile the MPI initialization and finalization code only when GauXC was built with MPI support. - - -Creating the Command Line Driver --------------------------------- - -We will provide our input data mainly via an HDF5 input file. -This file will contain the molecular structure, basis set, and density matrix. -Additionally, we have parameters for defining the integration grid and also the parallelization strategy. -Our main parameters for the input will therefore be - -``input_file`` - an HDF5 input file to provide the molecule, basis and density matrix - -``model`` - the model checkpoint we want to evaluate - -``grid_spec`` - the grid size specification which defines the number of angular and radial integration points - -``rad_quad_spec`` - the radial quadrature scheme which defines the spacing of radial integration points - -``prune_spec`` - the pruning scheme for combining the atomic grids to a molecular one - -For the command line driver we will use Argtable3 to handle the command line arguments concisely. -We define the command line arguments for the input HDF5 file, model type, and other parameters using Argtable3. - -.. literalinclude:: ../examples/c/gauxc_integration/app/main.c - :language: c - :lines: 191-216 - :caption: app/main.c (command line arguments) - -.. note:: - - The settings for the molecular grid (``grid_spec``, ``rad_quad_spec``, ``prune_spec``) are defined in more detail in :ref:`gauxc_molecular_grid_settings` reference. - -With this we can parse the command line and handle potential errors. - -.. literalinclude:: ../examples/c/gauxc_integration/app/main.c - :language: c - :lines: 218-238 - :caption: app/main.c (parse command line arguments) - -Finally, we can extract the values of the command line arguments and store them in variables for later use. -For this purpose we will define two helper functions, one for copying the values from the Argtable3 structs and a normalization function to ensure all inputs are lowercase. - -.. literalinclude:: ../examples/c/gauxc_integration/app/main.c - :language: c - :lines: 167-183 - :caption: app/main.c (helper functions for command line arguments) - -With this we can extract the command line argument values. - -.. literalinclude:: ../examples/c/gauxc_integration/app/main.c - :language: c - :lines: 240-248 - :caption: app/main.c (extract command line argument values) - -At this point we can already free the Argtable3 structures as we do not need them anymore. - -.. literalinclude:: ../examples/c/gauxc_integration/app/main.c - :language: c - :lines: 250-251 - :caption: app/main.c (free Argtable3 structures) - -Also, we want to ensure our input string variables will get freed at the end of our program. -We add the respective ``free()`` calls at the end of our main program, before the MPI finalization. - -.. literalinclude:: ../examples/c/gauxc_integration/app/main.c - :language: c - :lines: 388-394 - :caption: app/main.c (free input strings) - -Before adding any further implementation, we will create a first build of the project. -To configure the CMake build run - -.. code-block:: shell - - cmake -B build -G Ninja -S . - cmake --build build - -After we build our project successfully, we can run our driver directly from the build directory with - -.. code-block:: shell - - ./build/Skala --help - -As output you should see the help page generated by our command-line interface - -.. code-block:: text - - Usage: ./_build/Skala --model= [--grid-spec=] [--radial-quad=] [--prune-scheme=] [--lb-exec-space=] [--int-exec-space=] [--batch-size=] [--basis-tol=] [--help] - - Options: - Input file containing molecular geometry and density matrix - --model= OneDFT model to use, can be a path to a checkpoint - --grid-spec= Atomic grid size specification (default: Fine) - Possible values are: Fine, UltraFine, SuperFine, GM3, GM5 - --radial-quad= Radial quadrature scheme (default: MuraKnowles) - Possible values are: Becke, MuraKnowles, TreutlerAhlrichs, MurrayHandyLaming - --prune-scheme= Pruning scheme (default: Robust) - Possible values are: Unpruned, Robust, Treutler - --lb-exec-space= Load balancer execution space - Possible values are: Host, Device - --int-exec-space= Integrator execution space - Possible values are: Host, Device - --batch-size= Batch size for grid point processing (default: 512) - --basis-tol= Basis function evaluation tolerance (default: 1e-10) - --help Print this help and exit - -With this we are able to change our configuration conveniently from the command line. - -.. tip:: - - If you encounter any issues when running the driver, like segmentation faults, rerun your binary with a debugger, like gdb. - - .. code-block:: shell - - gdb --args ./build/Skala --help - - This way you can inspect the stack trace and find the source of the error more easily. - - -As first step for any interaction with GauXC, we need to initialize the GauXC status object and runtime environment. - -.. literalinclude:: ../examples/c/gauxc_integration/app/main.c - :language: c - :lines: 253-267 - :caption: app/main.c (GauXC status and runtime environment) - -.. tip:: - - We also define an array of pointers to GauXC objects we create during our program. - This will help us to free all allocated memory at the end of our program. - -The ``world_size`` and ``world_rank`` variables describe our MPI environment and contain dummy values if we do not use MPI. - -At this point we want to show the configuration we are using before proceeding further. -We can use the ``world_rank`` variable to ensure that only the root process outputs the configuration in case of MPI parallel execution. - -.. literalinclude:: ../examples/c/gauxc_integration/app/main.c - :language: c - :lines: 269-277 - :caption: app/main.c (configuration summary) - -At the end of our program we add a label for handling errors and process the status code and message accordingly. - -.. literalinclude:: ../examples/c/gauxc_integration/app/main.c - :language: c - :caption: app/main.c (handle status code) - :lines: 381-387 - -Finally, we also add calls to free the runtime environment at the end of our main program. - -.. literalinclude:: ../examples/c/gauxc_integration/app/main.c - :language: c - :caption: app/main.c (free runtime) - :lines: 400-406 - -We can use the error code from the status to adjust our own program return code. - -.. literalinclude:: ../examples/c/gauxc_integration/app/main.c - :language: c - :caption: app/main.c (return exit code) - :lines: 408-412 - -Molecule data -------------- - -For reading the molecule we will use GauXC's built-in functionality to read from an HDF5 dataset. - -.. note:: - - GauXC stores the information about the atomic numbers and their coordinates as an array of structs, defined in C++ as - - .. code-block:: c++ - - struct GauXC::Atom { - int64_t Z; ///< Atomic number - double x; ///< X coordinate (bohr) - double y; ///< Y coordinate (bohr) - double z; ///< Z coordinate (bohr) - }; - class GauXC::Molecule : public std::vector { - ... - }; - - The HDF5 wrapper directly maps this struct representation to an HDF5 dataset. - -We use :c:func:`gauxc_molecule_read_hdf5_record` function which implements the reading of the molecule data. - -.. literalinclude:: ../examples/c/gauxc_integration/app/main.c - :language: c - :caption: app/main.c (read molecule) - :lines: 279-285 - -By registering the molecule object in our GauXC objects array, we ensure that it will be freed at the end of our main program. - - -Basis set data --------------- - -For the basis set we will use the same approach as for the molecule and use GauXC's built-in HDF5 reading functionality. - -.. note:: - - Similar to the molecule the basis set object is built as an array of shell objects. - The shell object contains the information about the primitives, contraction coefficients, angular momentum, and center of the shell. - - .. code-block:: c++ - - template - class alignas(256) GauXC::Shell { - std::array alpha; ///< exponents of primitives - std::array coeff; ///< contraction coefficients - std::array O; ///< origin of the shell - int32_t nprim; ///< number of primitives - int32_t l; ///< angular moment of the shell - int32_t pure; ///< pure=1: spherical Gaussianss; pure=0: cartesian Gaussianss - }; - - template - struct GauXC::BasisSet : public std::vector> { - ... - }; - - Again, this allows to directly map the object's representation to an HDF5 dataset. - -With GauXC's :c:func:`gauxc_basisset_read_hdf5_record` function we can read the basis set data conveniently from the HDF5 file. - -.. literalinclude:: ../examples/c/gauxc_integration/app/main.c - :language: c - :caption: app/main.c (read basisset) - :lines: 287-293 - -Integration grid ----------------- - -To setup the integration grid, which is the part of the input to GauXC for computing the exchange-correlation functional, we create a molecular grid. -We have three main input parameters here, the grid size which defines the density of angular and radial points, the radial quadrature scheme which defines the spacing of the radial points, and the pruning scheme which defines how atomic grids are combined to a molecular grid. -In GauXC these are defined as enumerators and we add a number of helper functions for turning the input strings from the command-line to the respective enumerator values. - -.. literalinclude:: ../examples/c/gauxc_integration/app/main.c - :language: c - :caption: app/main.c (enumerator conversion functions) - :lines: 39-85 - -For the main program we can now create the molecular grid based on our input parameters. -We also have to define the batch size for the grid, the default is 512 points per batch, however larger values up around 10000 are recommended for better performance. - -.. literalinclude:: ../examples/c/gauxc_integration/app/main.c - :language: c - :caption: app/main.c (grid setup) - :lines: 295-310 - -Exchange-correlation integrator -------------------------------- - -To distribute the work of evaluating the exchange-correlation functional on the grid points, we create a load balancer. -The load balancer will take care of distributing the grid points to the available resources, either host or device, based on the execuation space we provide. -Again we have a helper function to convert the input string to the respective enumerator value. - -.. literalinclude:: ../examples/c/gauxc_integration/app/main.c - :language: c - :caption: app/main.c (execuation space enumerator) - :lines: 27-37 - -Note that the load balancer will provide access to the molecule, basis and grid data for all further usage in GauXC. -We can now create the load balancer based on our input parameters. - -.. literalinclude:: ../examples/c/gauxc_integration/app/main.c - :language: c - :caption: app/main.c (load balancer setup) - :lines: 312-337 - -Finally, we can create the main GauXC integrator, for this we setup the exchange-correlation integrator factory for producing an instance of the integrator. -To configure the integrator we create an additional settings object which holds the model checkpoint we want to evaluate. - -.. literalinclude:: ../examples/c/gauxc_integration/app/main.c - :language: c - :caption: app/main.c (integrator setup) - :lines: 339-346 - -Density matrix --------------- - -The final input we need to provide to GauXC is the density matrix. -Unlike the molecule and basis set, we read the density matrix using our own HDF5 helper function ``read_matrix_from_hdf5_record``. -This function opens the HDF5 file, reads a 2D dataset into a newly allocated array, and performs error handling for each HDF5 operation. - -.. literalinclude:: ../examples/c/gauxc_integration/app/main.c - :language: c - :caption: app/main.c (HDF5 matrix reader) - :lines: 87-152 - -With this helper we can read the density matrices from the input file. - -.. literalinclude:: ../examples/c/gauxc_integration/app/main.c - :language: c - :caption: app/main.c (read density matrix) - :lines: 348-355 - -We free the density matrices at the end of our program. - -.. literalinclude:: ../examples/c/gauxc_integration/app/main.c - :language: c - :caption: app/main.c (free density matrices) - :lines: 396-397 - -Exchange-correlation evaluation -------------------------------- - -With all inputs provided we can now perform the exchange-correlation evaluation. - -.. literalinclude:: ../examples/c/gauxc_integration/app/main.c - :language: c - :caption: app/main.c (exchange-correlation evaluation) - :lines: 361-367 - -After the evaluation we can output the computed exchange-correlation energy. -To print the Frobenius norm of the potential matrices, we define a small helper function: - -.. literalinclude:: ../examples/c/gauxc_integration/app/main.c - :language: c - :caption: app/main.c (matrix norm helper) - :lines: 154-165 - -With this we can output the results: - -.. literalinclude:: ../examples/c/gauxc_integration/app/main.c - :language: c - :caption: app/main.c (exchange-correlation output) - :lines: 373-379 - -We free the allocated exchange-correlation potential matrices at the end of our program. - -.. literalinclude:: ../examples/c/gauxc_integration/app/main.c - :language: c - :caption: app/main.c (free exchange-correlation potentials) - :lines: 398-399 - -Now we can rebuild our project with - -.. code-block:: shell - - cmake --build build - -After we build our project successfully, we run the driver again from the build directory - -.. code-block:: shell - - ./build/Skala He_def2-svp.h5 --model PBE - -.. note:: - - The ``He_def2-svp.h5`` input file can be created with the ``skala`` package. - - .. literalinclude:: scripts/export-h5.py - :language: python - -As output we can see the results for the PBE functional - -.. code-block:: text - - Configuration - -> Input file : He_def2-svp.h5 - -> Model : PBE - -> Grid : fine - -> Radial quadrature : muraknowles - -> Pruning scheme : robust - - Results - -> EXC : -1.0540318683 - -> |VXC(a+b)|_F : 1.4559829661 - -> |VXC(a-b)|_F : 0.0000000000 - -Download checkpoint from HuggingFace ------------------------------------- - -To evaluate Skala we first need to download the model checkpoint from HuggingFace. -For this we can use the ``hf`` command line tool from the ``huggingface_hub`` Python package. -After downloading the model checkpoint we can run our driver again with the new model - -.. code-block:: shell - - hf download microsoft/skala-1.1 skala-1.1-rev1.fun --local-dir . - ./build/Skala He_def2-svp.h5 --model ./skala-1.1-rev1.fun - -In the output we can see the results for the Skala functional - -.. code-block:: text - - Configuration - -> Input file : He_def2-svp.h5 - -> Model : ./skala-1.1-rev1.fun - -> Grid : fine - -> Radial quadrature : muraknowles - -> Pruning scheme : robust - - Results - -> EXC : -1.0646206500 - -> |VXC(a+b)|_F : 1.4893029702 - -> |VXC(a-b)|_F : 0.0000000000 - -Full source code ----------------- - -.. dropdown:: Full source code of the main driver - - .. literalinclude:: ../examples/c/gauxc_integration/app/main.c - :language: c - :caption: app/main.c - -Summary -------- - -Within this guide the usage of GauXC in C applications was demonstrated. -A minimal CMake project was created to setup the build environment and include GauXC. -We created a command line driver which reads the molecule, basis set, and density matrix from an HDF5 input file and sets up the integration grid, load balancer, and exchange-correlation integrator. -Finally, we evaluated the exchange-correlation energy and potential and output the result. \ No newline at end of file diff --git a/gauxc/docs/conf.py b/gauxc/docs/conf.py deleted file mode 100644 index dcfcf1d5..00000000 --- a/gauxc/docs/conf.py +++ /dev/null @@ -1,29 +0,0 @@ -import skala - -project = "Skala GauXC integration" -version = skala.__version__ -author = "Microsoft Research, AI for Science" - -extensions = [ - "sphinx_book_theme", - "sphinx_design", - "sphinxcontrib.bibtex", - "sphinxcontrib.moderncmakedomain", - "sphinxfortran.fortran_domain", -] - -bibtex_bibfiles = ["gauxc.bib"] - -html_theme = "sphinx_book_theme" -html_title = project -html_theme_options = { - "repository_url": "https://github.com/microsoft/skala", - "repository_branch": "main", - "path_to_docs": "gauxc/docs", - "use_repository_button": True, -} -master_doc = "index" - -exclude_patterns = ["_build"] - -linkcheck_ignore = [r"^https://doi\.org/"] diff --git a/gauxc/docs/cpp-library.rst b/gauxc/docs/cpp-library.rst deleted file mode 100644 index 6edcdbe1..00000000 --- a/gauxc/docs/cpp-library.rst +++ /dev/null @@ -1,477 +0,0 @@ -.. _gauxc-cpp-library: - -GauXC in C++ -============ - -In this guide we will cover how to use the GauXC library in C++. -We will cover - -* setting up a CMake project including GauXC as dependency -* initializing the GauXC runtime environment -* reading molecule, basis set, and density matrix from an HDF5 input file -* setting up the integration grid, load balancer, and exchange-correlation integrator -* performing the exchange-correlation evaluation and outputting the results - -.. tip:: - - For building GauXC and installing it into a locked Pixi environment, see - :ref:`gauxc_install`. - -Setting up CMake ----------------- - -GauXC can be most conveniently used via CMake, therefore we will setup a minimal CMake project for a command line driver to use GauXC. -Next to GauXC we will use other dependencies as needed. - -The directory structure for the project will be - -.. code-block:: text - - ├── CMakeLists.txt - ├── app - │ └── main.cxx - └── cmake - ├── skala-cli11.cmake - ├── skala-dep-versions.cmake - ├── skala-eigen3.cmake - └── skala-gauxc.cmake - -First we create the main ``CMakeLists.txt`` to define our project, include our dependencies, and declare our executable. - -.. literalinclude:: ../examples/cpp/gauxc_integration/CMakeLists.txt - :language: cmake - :caption: CMakeLists.txt - -For handling the dependencies, we create a separate file in the ``cmake/`` subdirectory to include the path and checksums for all our dependencies. - -.. literalinclude:: ../examples/cpp/gauxc_integration/cmake/skala-dep-versions.cmake - :language: cmake - :caption: cmake/skala-dep-versions.cmake - -For each dependency we will create a separate CMake include file for finding and making it available. -First, we define how we will include GauXC our main dependency. -For this we can rely in most cases to discover the GauXC config file, however we also provide a fallback to download and build GauXC in case it is not available in the environment. -The options we defined in the main CMake file will be passed through to GauXC to ensure the library provides the requested features. -Furthermore, after having GauXC available, we double check whether our requirements for GauXC are satisfied, this is especially necessary for the Skala implementation, which requires the ``GAUXC_HAS_ONEDFT`` feature flag. - -.. literalinclude:: ../examples/cpp/gauxc_integration/cmake/skala-gauxc.cmake - :language: cmake - :caption: cmake/skala-gauxc.cmake - -While GauXC provides the implementation to evaluate the exchange-correlation functional, it is independent to the library used for storing matrices. -For our example here we will be using `Eigen3 `__. -Similar to GauXC we will attempt to find Eigen3 via its config file and fallback to downloading it. -Since Eigen3 is a header-only library, we just need to reexport the include directory of the project. - -.. literalinclude:: ../examples/cpp/gauxc_integration/cmake/skala-eigen3.cmake - :language: cmake - :caption: cmake/skala-eigen3.cmake - -For our command line driver, we will be using `CLI11 `__ to create the command line interface. -Similar to Eigen3, CLI11 is a header-only library and we will use the same approach for including its headers if the dependency can not be found in the environment. - -.. literalinclude:: ../examples/cpp/gauxc_integration/cmake/skala-cli11.cmake - :language: cmake - :caption: cmake/skala-cli11.cmake - -With this we have the full CMake setup we need for creating our command line driver. - -Initializing GauXC ------------------- - -For the main program we start with including the relevant headers for GauXC. -In our case those come from GauXC for the main functionality of the library, HighFive for access to HDF5 files, Eigen3 for matrix types, and CLI11 for creating the command line interface. - -.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx - :language: c++ - :caption: app/main.cxx (headers) - :lines: 1-20 - -We start defining our main program with a set of default variables. -In this tutorial we will be using - -``input_file`` - an HDF5 input file to provide the molecule, basis and density matrix - -``model`` - the model checkpoint we want to evaluate - -``grid_spec`` - the grid size specification which defines the number of angular and radial integration points - -``rad_quad_spec`` - the radial quadrature scheme which defines the spacing of radial integration points - -``prune_spec`` - the pruning scheme for combining the atomic grids to a molecular one - -Furthermore, we have the variables which define where GauXC is executing (host or device) and ``batch_size`` and ``basis_tol`` for the numerical settings of the evaluation. - -.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx - :language: c++ - :caption: app/main.cxx (initialization) - :lines: 118-133 - -.. note:: - - The settings for the molecular grid (``grid_spec``, ``rad_quad_spec``, ``prune_spec``) are defined in more detail in :ref:`gauxc_molecular_grid_settings` reference. - -Command line interface ----------------------- - -Next we will create a command line interface based on the CLI11 library. -Each of the default options we specified will be included there. - -.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx - :language: c++ - :caption: app/main.cxx (command-line) - :lines: 134-152 - -Before adding any further implementation, we can add the finalization to our main and create a first build of the project. - -.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx - :language: c++ - :caption: app/main.cxx (finalization) - :lines: 244-248 - -To configure the CMake build run - -.. code-block:: shell - - cmake -B build -G Ninja -S . - cmake --build build - -After we build our project successfully, we can run our driver directly from the build directory with - -.. code-block:: shell - - ./build/Skala --help - -As output you should see the help page generated by our command-line interface - -.. code-block:: text - - Skala GauXC driver - - - ./build/Skala [OPTIONS] input - - - POSITIONALS: - input TEXT:FILE REQUIRED Input file in HDF5 format - - OPTIONS: - -h, --help Print this help message and exit - --model TEXT Model checkpoint to evaluate - --grid-size TEXT [fine] - Grid specification (fine|ultrafine|superfine|gm3|gm5) - --radial-quad TEXT [muraknowles] - Radial quadrature specification - (becke|muraknowles|treutlerahlrichs|murrayhandylaming) - --prune-scheme TEXT [robust] - Pruning scheme (unpruned|robust|treutler) - --lb-exec-space TEXT [host] - Load balancing execution space - --int-exec-space TEXT [host] - Integration execution space - --batch-size INT [512] - --basis-tol FLOAT [1e-10] - -Now that we are able to change our program variables conveniently from the command-line, we will initialize the GauXC runtime. -For this we are defining a new function to handle different cases, like having access to a device (GPU) or running MPI parallel. -GauXC provides preprocessor guards like ``GAUXC_HAS_DEVICE`` and ``GAUXC_HAS_MPI`` or convenience macros like ``GAUXC_MPI_CODE`` for defining conditional code paths. -When creating the runtime environment, we will provide it with the MPI world communicator if available and if we have a device preallocate memory on the device. - -.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx - :language: c++ - :caption: app/main.cxx (get_runtime) - :lines: 22-41 - -We return the runtime environment in the main program. - -.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx - :language: c++ - :caption: app/main.cxx (runtime setup) - :lines: 153-156 - -The ``world_size`` and ``world_rank`` variables describe our MPI environment and contain dummy values if we do not use MPI. - -Before we continue with setting up GauXC, we include an output of our program variables. -Here we can use ``world_rank`` provided by the runtime environment to ensure only the root rank outputs the information. - -.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx - :language: c++ - :caption: app/main.cxx (inputs) - :lines: 158-167 - -Molecule data -------------- - -For reading the molecule we will use GauXC's built-in functionality to read from an HDF5 dataset. - -.. note:: - - The ``GauXC::Molecule`` stores the information about the atomic numbers and their coordinates as an array of structs. - - .. code-block:: c++ - - struct GauXC::Atom { - int64_t Z; ///< Atomic number - double x; ///< X coordinate (bohr) - double y; ///< Y coordinate (bohr) - double z; ///< Z coordinate (bohr) - }; - class GauXC::Molecule : public std::vector { - ... - }; - - This allows to directly map the object's representation to an HDF5 dataset. - -We use :cpp:func:`void GauXC::read_hdf5_record(Molecule&,string,string)` function which implements the reading of the molecule data. - -.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx - :language: c++ - :caption: app/main.cxx (read_molecule) - :lines: 43-50 - -In the main program we will just use our small wrapper function to obtain the molecule. - -.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx - :language: c++ - :caption: app/main.cxx (molecule) - :lines: 169-170 - -Basis set data --------------- - -For the basis set we will use the same approach as for the molecule and use GauXC's built-in HDF5 reading functionality. - -.. note:: - - Similar to the molecule the ``GauXC::BasisSet`` object is built as an array of ``GauXC::Shell`` objects. - The ``GauXC::Shell`` object contains the information about the primitives, contraction coefficients, angular momentum, and center of the shell. - - .. code-block:: c++ - - template - class alignas(256) GauXC::Shell { - std::array alpha; ///< exponents of primitives - std::array coeff; ///< contraction coefficients - std::array O; ///< origin of the shell - int32_t nprim; ///< number of primitives - int32_t l; ///< angular moment of the shell - int32_t pure; ///< pure=1: spherical Gaussianss; pure=0: cartesian Gaussianss - }; - - template - struct GauXC::BasisSet : public std::vector> { - ... - }; - - Again, this allows to directly map the object's representation to an HDF5 dataset. - -With GauXC's :cpp:func:`void GauXC::read_hdf5_record(BasisSet&,string,string)` function we can read the basis set data conveniently from the HDF5 file. -Additionally, we are setting the basis set tolerance on the loaded basis set data, which will be taken from our input variables, by default we use a tolerance of 1e-10. -The basis set tolerance will be used for screening small contributions during the evaluation of the density on the grid points. - -.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx - :language: c++ - :caption: app/main.cxx (read_basis) - :lines: 52-62 - -In the main program we can use our wrapper function to load the basis set. - -.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx - :language: c++ - :caption: app/main.cxx (basis) - :lines: 172-173 - -Integration grid ----------------- - -To setup the integration grid, which is the part of the input to GauXC for computing the exchange-correlation functional, we create a molecular grid. -We have three main input parameters here, the grid size which defines the density of angular and radial points, the radial quadrature scheme which defines the spacing of the radial points, and the pruning scheme which defines how atomic grids are combined to a molecular grid. -In GauXC these are defined as enumerators and we add a number of helper functions for turning the input strings from the command-line to the respective enumerator values. - -.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx - :language: c++ - :caption: app/main.cxx (grid setting) - :lines: 64-98 - -For the main program we can now create the molecular grid based on our input parameters. -We also have to define the batch size for the grid, the default is 512 points per batch, however larger values up around 10000 are recommended for better performance. - -.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx - :language: c++ - :caption: app/main.cxx (grid) - :lines: 175-181 - -Exchange-correlation integrator -------------------------------- - -To distribute the work of evaluating the exchange-correlation functional on the grid points, we create a load balancer. -The load balancer will take care of distributing the grid points to the available resources, either host or device, based on the execuation space we provide. -Note that the load balancer will provide access to the molecule, basis and grid data for all further usage in GauXC. - -.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx - :language: c++ - :caption: app/main.cxx (load balancer) - :lines: 183-205 - -Finally, we can create the main GauXC integrator, for this we setup the exchange-correlation integrator factory for producing an instance of the integrator. -To configure the integrator we create an additional settings object which holds the model checkpoint we want to evaluate. - -.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx - :language: c++ - :caption: app/main.cxx (integrator) - :lines: 207-214 - -Density matrix --------------- - -The final input we need to provide to GauXC is the density matrix. -Similar to the molecule and basis set we will read it from our HDF5 input file using the HighFive library directly. - -.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx - :language: c++ - :caption: app/main.cxx (load_density_matrix) - :lines: 100-116 - -For the model checkpoint we always use two spin channels and therefore have the scalar density matrix (alpha + beta spin channel) and the polarization density matrix (alpha - beta spin channel). - -.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx - :language: c++ - :caption: app/main.cxx (density matrix) - :lines: 216-218 - -Exchange-correlation evaluation -------------------------------- - -With all inputs provided we can now perform the exchange-correlation evaluation. - -.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx - :language: c++ - :caption: app/main.cxx (exchange-correlation) - :lines: 225-228 - -.. tip:: - - For timing the execution we can add an optional timer around the evaluation and synchronize the MPI processes before and after the evaluation to get accurate timings. - - .. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx - :language: c++ - :caption: app/main.cxx (timer) - :lines: 220-234 - -After the evaluation we can output the computed exchange-correlation energy and potential. - -.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx - :language: c++ - :caption: app/main.cxx (output) - :lines: 236-243 - -Now we can rebuild our project with - -.. code-block:: shell - - cmake --build build - -After we build our project successfully, we run the driver again from the build directory - -.. code-block:: shell - - ./build/Skala He_def2-svp.h5 --model PBE - -.. note:: - - The ``He_def2-svp.h5`` input file can be created with the ``skala`` package. - - .. literalinclude:: scripts/export-h5.py - :language: python - -As output we can see the results for the PBE functional - -.. code-block:: text - - Configuration - -> Input file : He_def2-svp.h5 - -> Model : PBE - -> Grid : fine - -> Radial quadrature : muraknowles - -> Pruning scheme : robust - - EXC = -1.054031868349e+00 Eh - |VXC(a+b)|_F = 1.455982966065e+00 - |VXC(a-b)|_F = 0.000000000000e+00 - Runtime XC = 4.382018760000e-01 s - -Download checkpoint from HuggingFace ------------------------------------- - -To evaluate Skala we first need to download the model checkpoint from HuggingFace. -For this we can use the ``hf`` command line tool from the ``huggingface_hub`` Python package. -After downloading the model checkpoint we can run our driver again with the new model - -.. code-block:: shell - - hf download microsoft/skala-1.1 skala-1.1-rev1.fun --local-dir . - ./build/Skala He_def2-svp.h5 --model ./skala-1.1-rev1.fun - -In the output we can see the results for the Skala functional - -.. code-block:: text - - Configuration - -> Input file : He_def2-svp.h5 - -> Model : ./skala-1.1-rev1.fun - -> Grid : fine - -> Radial quadrature : muraknowles - -> Pruning scheme : robust - - EXC = -1.064620650033e+00 Eh - |VXC(a+b)|_F = 1.489302970205e+00 - |VXC(a-b)|_F = 0.000000000000e+00 - Runtime XC = 1.792662281000e+00 s - -Full source code ----------------- - -.. dropdown:: Full source code of the main driver - - .. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx - :language: c++ - :caption: app/main.cxx - -Summary -------- - -In this guide we covered how to use the GauXC library in C++. -We created a minimal CMake project to setup the build environment and included GauXC. -We created a command line driver which reads the molecule, basis set, and density matrix from an HDF5 input file and sets up the integration grid, load balancer, and exchange-correlation integrator. -Finally, we performed the exchange-correlation evaluation and output the results. - -Troubleshooting ---------------- - -The link interface of target "gauxc::gauxc" contains "gau2grid::gg" but the target was not found - Explicitly find the gau2grid package together with GauXC by adding the following lines at the end of the GauXC CMake include file - - .. code-block:: cmake - :caption: cmake/skala-gauxc.cmake (append) - - if(GAUXC_HAS_GAU2GRID AND NOT TARGET gau2grid::gg) - find_package(gau2grid CONFIG REQUIRED) - endif() - -OpenMP not found with Apple Clang - On macOS OpenMP support is not provided by default with Apple Clang. - Either disable OpenMP using the CMake option ``-DSkala_GauXC_ENABLE_OPENMP=OFF`` - or provide an OpenMP-capable Clang toolchain. - -libtorch not found - Use one of the ``gauxc-*`` Pixi environments and run CMake through - ``pixi run -e `` so LibTorch is in ``CMAKE_PREFIX_PATH``. - - .. code-block:: shell - - pixi run -e gauxc-openmp cmake --build ../build_example diff --git a/gauxc/docs/fortran-library.rst b/gauxc/docs/fortran-library.rst deleted file mode 100644 index 6ff47ac9..00000000 --- a/gauxc/docs/fortran-library.rst +++ /dev/null @@ -1,601 +0,0 @@ -GauXC in Fortran -================ - -This guide demonstrates how to use the GauXC library from Fortran to evaluate exchange-correlation functionals, including the Skala neural network functional. -By the end of this tutorial, you will: - -* Set up a CMake project with GauXC as a dependency -* Initialize the GauXC runtime environment -* Read molecule, basis set, and density matrix from an HDF5 input file -* Configure the integration grid, load balancer, and XC integrator -* Evaluate the exchange-correlation energy and potential - -.. _gauxc_fortran_api: - -Before you start ----------------- - -This example assumes that you already have access to a GauXC source tree with Skala support, either because you followed :ref:`gauxc_install` first or because you let this example download GauXC automatically through CMake. -The example CMake files are written to accept either workflow. - -Before configuring the project, make sure you have the following available: - -- a Fortran compiler together with C and C++ compilers -- CMake and Ninja -- HDF5 development libraries -- an installed GauXC with both the C and Fortran APIs enabled, or network access so the example can build GauXC with those APIs enabled for you - -If you want to reproduce the sample ``He_def2-svp.h5`` input file from this guide, you also need the Python ``skala`` package installed. - -Install the locked ``gauxc-openmp-fortran`` Pixi environment for an OpenMP -build. For MPI, use ``gauxc-mpi-fortran`` so OpenMPI and the matching MPI HDF5 -variant are selected together: - -.. code-block:: bash - - pixi install --locked -e gauxc-openmp-fortran - -Setting up CMake ----------------- - -GauXC integrates most conveniently via CMake. -We will set up a minimal CMake project for a command-line driver that uses GauXC. -In addition to GauXC, we will include other dependencies as needed. - -The directory structure for the project will be - -.. code-block:: text - - ├── CMakeLists.txt - ├── app - │ └── main.F90 - └── cmake - ├── skala-flap.cmake - ├── skala-dep-versions.cmake - ├── skala-gauxc.cmake - └── skala-hdf5.cmake - -First, we create the main ``CMakeLists.txt`` to define our project, include dependencies, and declare the executable. - -.. literalinclude:: ../examples/fortran/gauxc_integration/CMakeLists.txt - :language: cmake - :caption: CMakeLists.txt - -To manage dependencies cleanly, we create a separate file in the ``cmake/`` subdirectory that stores URLs and checksums for all external packages. - -.. literalinclude:: ../examples/fortran/gauxc_integration/cmake/skala-dep-versions.cmake - :language: cmake - :caption: cmake/skala-dep-versions.cmake - -Each dependency gets its own CMake include file. -First, we define how to include GauXC, our main dependency. -CMake will first attempt to discover an installed GauXC via its config file; if that fails, it will download and build GauXC from source. -The options defined in the main CMake file are passed through to GauXC to ensure the library provides the requested features. -After GauXC is available, we verify that our requirements are satisfied. -For the Fortran driver this includes the Skala implementation as well as the C and Fortran APIs, which are checked via :c:macro:`GAUXC_HAS_ONEDFT`, :c:macro:`GAUXC_HAS_C`, and :c:macro:`GAUXC_HAS_FORTRAN`. - -.. literalinclude:: ../examples/fortran/gauxc_integration/cmake/skala-gauxc.cmake - :language: cmake - :caption: cmake/skala-gauxc.cmake - -For the command-line interface, we use the `FLAP library `__ (Fortran command Line Arguments Parser). - -.. literalinclude:: ../examples/fortran/gauxc_integration/cmake/skala-flap.cmake - :language: cmake - :caption: cmake/skala-flap.cmake - -Finally, we will use the HDF5 Fortran interface for reading our input data from an HDF5 file. - -.. literalinclude:: ../examples/fortran/gauxc_integration/cmake/skala-hdf5.cmake - :language: cmake - :caption: cmake/skala-hdf5.cmake - -The Fortran example links against the HDF5 Fortran interface and the high-level HDF5 libraries. -If HDF5 is missing or only a partial HDF5 installation is visible to CMake, configuration or link-time failures are expected. - -This completes the CMake setup required for our command-line driver. - -Module imports --------------- - -The main driver program imports the relevant GauXC modules. -We also use GauXC's HDF5 I/O module and the FLAP module for command-line parsing. - -.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 - :language: fortran - :caption: app/main.F90 - :lines: 1-28 - -Each GauXC component has a corresponding Fortran module: - -`gauxc_status` - Handles GauXC status codes and error messages. - -`gauxc_molecule` - Manages molecular data structures (atomic numbers and Cartesian coordinates). - -`gauxc_basisset` - Manages basis set data (shell definitions, exponents, contraction coefficients). - -`gauxc_molgrid` - Sets up and manages the numerical integration grid. - -`gauxc_runtime_environment` - Interfaces with MPI and device (GPU) runtime environments. - -`gauxc_load_balancer` - Distributes grid points across available compute resources. - -`gauxc_molecular_weights` - Computes Becke-style partitioning weights for the molecular grid. - -`gauxc_xc_functional` - Handles exchange-correlation functional definitions. - -`gauxc_integrator` - Performs the numerical integration of the exchange-correlation energy and potential. - -Next, we declare variables for the GauXC-specific types: - -.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 - :language: fortran - :caption: app/main.F90 - :lines: 32-43 - -We also declare variables for input parameters and intermediate values: - -.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 - :language: fortran - :caption: app/main.F90 - :lines: 45-53 - -When compiled with MPI support, we initialize MPI at program startup. -The ``gauxc/gauxc_config.f`` header provides the :c:macro:`GAUXC_HAS_MPI` preprocessor macro for guarding MPI-specific calls. - -.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 - :language: fortran - :caption: app/main.F90 - :lines: 55-57 - -Similarly, at the end of the program we finalize MPI: - -.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 - :language: fortran - :caption: app/main.F90 - :lines: 262-264 - -Command line interface ----------------------- - -This guide uses an HDF5 input file to provide molecular data. -(GauXC also supports constructing these objects programmatically, which is more convenient when embedding GauXC in a library.) -We also expose parameters for configuring the integration grid and parallelization strategy. -The main command-line arguments are: - -``input_file`` - Path to an HDF5 file containing the molecule, basis set, and density matrix. - -``model`` - The model checkpoint to evaluate (e.g., ``PBE`` for a traditional functional or a path to a Skala checkpoint). - -``grid_spec`` - The grid size specification, which controls the number of angular and radial integration points. - -``rad_quad_spec`` - The radial quadrature scheme, which determines the spacing of radial integration points. - -``prune_spec`` - The pruning scheme, which controls how atomic grids are combined into a molecular grid. - -We use the ``command_line_interface`` type from the FLAP library to define the CLI. -First, we initialize variables with their default values. -These assignments appear immediately above the named ``input`` block in ``main.F90``: - -.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 - :language: fortran - :caption: app/main.F90 - :lines: 59-64 - -Next, we initialize the CLI and define the available arguments. -A named ``input`` block provides convenient error handling. -Add the following inside that block, right after ``input: block`` and before the call to ``cli%parse``: - -.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 - :language: fortran - :caption: app/main.F90 - :lines: 66-92,132-140 - -.. note:: - - The molecular grid settings (``grid_spec``, ``rad_quad_spec``, ``prune_spec``) are documented in detail in the :ref:`gauxc_molecular_grid_settings` reference. - -After defining the CLI, we parse it within the ``input`` block and retrieve the values: - -This is still part of the same ``input`` block. -The block ends after the argument values are read, at ``end block input``. - -.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 - :language: fortran - :caption: app/main.F90 - :lines: 94-131 - -Before adding further implementation, let's build and test the project. -Configure and compile with: - -.. code-block:: shell - - cmake -B build -G Ninja -S . - cmake --build build - -Once built, run the driver with ``--help`` to verify it works: - -.. code-block:: shell - - ./build/Skala --help - -You should see the help page generated by FLAP: - -.. code-block:: text - - usage: ./build/Skala value --model value [--grid value] [--radial-quadrature value] [--pruning-scheme value] [--lb-exec-space value] [--int-exec-space value] [--batch-size value] [--help] [--markdown] [--version] - - Driver for using Skala - - - Required switches: - value - 1-th argument - Input HDF5 file containing molecule, basis set and density matrix - --model value - Model to use for the calculation - - Optional switches: - --grid value, value in: `fine,ultrafine,superfine,gm3,gm5` - default value fine - Molecular grid specification - --radial-quadrature value, value in: `becke,muraknowles,treutlerahlrichs,murrayhandylaming` - default value muraknowles - Radial quadrature to use - --pruning-scheme value, value in: `unpruned,robust,treutler` - default value robust - Pruning scheme to use - --lb-exec-space value, value in: `host,device` - default value host - Execution space for load balancer - --int-exec-space value, value in: `host,device` - default value host - Execution space for integrator - --batch-size value - default value 512 - Batch size for grid point processing - --help, -h - Print this help message - --markdown, -md - Save this help message in a Markdown file - --version, -v - Print version - -The CLI is now fully functional and allows flexible configuration from the command line. - -Initializing GauXC ------------------- - -We begin by initializing the GauXC runtime environment. -All GauXC-related calls are placed inside the named ``main`` block for streamlined error handling. -This block starts after the command-line parsing section and contains the remainder of the GauXC workflow: - -.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 - :language: fortran - :caption: app/main.F90 - :lines: 146-157 - -At the end of the block, we check the status and clean up the runtime environment: - -.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 - :language: fortran - :caption: app/main.F90 - :lines: 245-250 - -The runtime environment provides the MPI world rank and size (for both MPI and non-MPI builds). -Still inside the ``main`` block, we print the configuration obtained from the command line: - -.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 - :language: fortran - :caption: app/main.F90 - :lines: 159-168 - -From here on, we use ``world_rank`` to ensure only rank 0 produces output. - - -Molecule data -------------- - -We use GauXC's built-in HDF5 reader to load the molecule data. -Add this immediately after the runtime configuration printout in the ``main`` block. - -.. note:: - - GauXC stores the information about the atomic numbers and their coordinates as an array of structs, defined in C++ as - - .. code-block:: c++ - - struct GauXC::Atom { - int64_t Z; ///< Atomic number - double x; ///< X coordinate (bohr) - double y; ///< Y coordinate (bohr) - double z; ///< Z coordinate (bohr) - }; - class GauXC::Molecule : public std::vector { - ... - }; - - The HDF5 wrapper maps this struct representation directly to the HDF5 dataset. - -The :f:func:`gauxc_read_hdf5_record` interface (see :f:func:`gauxc_molecule_read_hdf5_record`) loads the molecule data: - -.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 - :language: fortran - :caption: app/main.F90 (read molecule) - :lines: 170-175 - -For proper memory management, we free the molecule object at program end: - -.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 - :language: fortran - :caption: app/main.F90 (free molecule) - :lines: 252 - - -Basis set data --------------- - -We load the basis set using the same HDF5 approach as for the molecule. -Place this directly after the molecule-loading code in the ``main`` block. - -.. note:: - - The basis set is represented as an array of shell objects, each containing primitive exponents, - contraction coefficients, angular momentum, and shell center: - - .. code-block:: c++ - - template - class alignas(256) GauXC::Shell { - std::array alpha; ///< exponents of primitives - std::array coeff; ///< contraction coefficients - std::array O; ///< origin of the shell - int32_t nprim; ///< number of primitives - int32_t l; ///< angular moment of the shell - int32_t pure; ///< pure=1: spherical Gaussians; pure=0: cartesian Gaussians - }; - - template - struct GauXC::BasisSet : public std::vector> { - ... - }; - - Again, this allows the object's representation to map directly to an HDF5 dataset. - -We read the basis set using :f:func:`gauxc_read_hdf5_record` (see :f:func:`gauxc_basisset_read_hdf5_record`): - -.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 - :language: fortran - :caption: app/main.F90 (read basisset) - :lines: 177-182 - -We free the basis set at program end: - -.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 - :language: fortran - :caption: app/main.F90 (free basisset) - :lines: 253 - -Integration grid ----------------- - -The integration grid defines the spatial points for evaluating the exchange-correlation functional. -Three parameters control grid construction: - -- **Grid size**: Density of angular and radial points (e.g., ``fine``, ``ultrafine``) -- **Radial quadrature**: Spacing scheme for radial points (e.g., ``muraknowles``) -- **Pruning scheme**: How atomic grids combine into the molecular grid (e.g., ``robust``) - -GauXC uses enumerators for these settings. We define helper functions to convert CLI strings: - -.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 - :language: fortran - :caption: app/main.F90 (enumerator conversion functions) - :lines: 266,279-322 - -We create the molecular grid from our input parameters. -The batch size controls how many grid points are processed together; larger values (up to ~10000) -improve performance, though the default is 512: - -These lines follow the molecule and basis-set setup in the ``main`` block. - -.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 - :language: fortran - :caption: app/main.F90 (grid setup) - :lines: 184-189 - -We free the grid at program end: - -.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 - :language: fortran - :caption: app/main.F90 (free grid) - :lines: 254 - -Exchange-correlation integrator -------------------------------- - -The load balancer distributes XC functional evaluation across available resources (host or device). -A helper function converts the execution-space CLI string to an enumerator: - -.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 - :language: fortran - :caption: app/main.F90 (execution space enumerator) - :lines: 266-277 - -The load balancer manages access to the molecule, basis, and grid data for all subsequent GauXC operations. -We create it from our input parameters: - -Add this in the ``main`` block right after the grid has been constructed. - -.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 - :language: fortran - :caption: app/main.F90 (load balancer setup) - :lines: 191-207 - -Finally, we create the XC integrator. -The functional and load balancer are passed directly to the integrator constructor: - -.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 - :language: fortran - :force: - :caption: app/main.F90 (integrator setup) - :lines: 209-212 - -We free the integrator and associated objects at program end: - -.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 - :language: fortran - :caption: app/main.F90 (free integrator) - :lines: 255-260 - -Density matrix --------------- - -The density matrix is the final input for GauXC. -Unlike the molecule and basis set, we read the density matrix using our own HDF5 helper subroutine ``read_matrix_from_hdf5_record``. -This subroutine opens the HDF5 file, reads a 2D dataset into an allocatable array, and performs error handling for each HDF5 operation. - -The helper subroutine lives in the ``contains`` section at the end of the file, while the call site shown below remains in the ``main`` block after the integrator has been created. - -.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 - :language: fortran - :caption: app/main.F90 (HDF5 matrix reader) - :lines: 324-380 - -With this helper we can read the density matrices from the input file: - -.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 - :language: fortran - :caption: app/main.F90 (read density matrix) - :lines: 214-218 - -Exchange-correlation evaluation -------------------------------- - -With all inputs ready, we perform the XC evaluation: - -.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 - :language: fortran - :caption: app/main.F90 (exchange-correlation evaluation) - :lines: 225-229 - -.. tip:: - - To measure evaluation time, define a helper function: - - .. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 - :language: fortran - :caption: app/main.F90 (time helper function) - :lines: 382-387 - - Use it to wrap the evaluation and print elapsed time: - - .. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 - :language: fortran - :caption: app/main.F90 (timed exchange-correlation evaluation) - :lines: 220-243 - -We output the computed XC energy: - -.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 - :language: fortran - :caption: app/main.F90 (exchange-correlation output) - :lines: 237-243 - -Rebuild the project: - -.. code-block:: shell - - cmake --build build - -Run the driver from the build directory: - -.. code-block:: shell - - ./build/Skala He_def2-svp.h5 --model PBE - -.. note:: - - Create the ``He_def2-svp.h5`` input file using the ``skala`` package: - - .. literalinclude:: scripts/export-h5.py - :language: python - -The output shows results for the PBE functional: - -.. code-block:: text - - Configuration - -> Input file : He_def2-svp.h5 - -> Model : PBE - -> Grid : fine - -> Radial quadrature : muraknowles - -> Pruning scheme : robust - - Results - Exc = -1.0540318683E+00 Eh - |VXC(a+b)|_F = 1.4559829661E+00 - |VXC(a-b)|_F = 0.0000000000E+00 - Runtime XC = 2.5566819200E-01 - -Download checkpoint from HuggingFace ------------------------------------- - -To evaluate Skala, download the model checkpoint from HuggingFace using the ``hf`` CLI -from the ``huggingface_hub`` package: - -.. code-block:: shell - - hf download microsoft/skala-1.1 skala-1.1-rev1.fun --local-dir . - ./build/Skala He_def2-svp.h5 --model ./skala-1.1-rev1.fun - -The output shows results for the Skala functional: - -.. code-block:: text - - Configuration - -> Input file : He_def2-svp.h5 - -> Model : ./skala-1.1-rev1.fun - -> Grid : fine - -> Radial quadrature : muraknowles - -> Pruning scheme : robust - - Results - Exc = -1.0646206500E+00 Eh - |VXC(a+b)|_F = 1.4893029702E+00 - |VXC(a-b)|_F = 0.0000000000E+00 - Runtime XC = 1.5986489670E+00 - -Full source code ----------------- - -.. dropdown:: Full source code of the main driver - - .. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 - :language: fortran - :force: - :caption: app/main.F90 - -Summary -------- - -This guide demonstrated GauXC usage in Fortran applications. We: - -1. Created a minimal CMake project with GauXC as a dependency -2. Built a CLI driver that reads molecule, basis set, and density matrix from HDF5 -3. Configured the integration grid, load balancer, and XC integrator -4. Evaluated the exchange-correlation energy and potential diff --git a/gauxc/docs/gauxc.bib b/gauxc/docs/gauxc.bib deleted file mode 100644 index 1139e1bb..00000000 --- a/gauxc/docs/gauxc.bib +++ /dev/null @@ -1,47 +0,0 @@ -@article{becke1988, - title={A multicenter numerical integration scheme for polyatomic molecules}, - author={Becke, Axel D}, - journal={The Journal of chemical physics}, - volume={88}, - number={4}, - pages={2547--2553}, - year={1988}, - doi={10.1063/1.454033}, - publisher={American Institute of Physics} -} - -@article{mura1996, - title={Improved radial grids for quadrature in molecular density-functional calculations}, - author={Mura, Michael E and Knowles, Peter J}, - journal={The Journal of Chemical Physics}, - volume={104}, - number={24}, - pages={9848--9858}, - year={1996}, - doi={10.1063/1.471749}, - publisher={AIP Publishing} -} - -@article{murray1993, - title={Quadrature schemes for integrals of density functional theory}, - author={Murray, Christopher W and Handy, Nicholas C and Laming, Gregory J}, - journal={Molecular Physics}, - volume={78}, - number={4}, - pages={997--1014}, - year={1993}, - doi={10.1080/00268979300100651}, - publisher={Taylor \& Francis} -} - -@article{treutler1995, - title={Efficient molecular numerical integration schemes}, - author={Treutler, Oliver and Ahlrichs, Reinhart}, - journal={The Journal of Chemical Physics}, - volume={102}, - number={1}, - pages={346--354}, - year={1995}, - doi={10.1063/1.469408}, - publisher={American Institute of Physics} -} diff --git a/gauxc/docs/index.rst b/gauxc/docs/index.rst deleted file mode 100644 index 3e782a24..00000000 --- a/gauxc/docs/index.rst +++ /dev/null @@ -1,17 +0,0 @@ -Integrating Skala in Electronic Structure Packages via GauXC -============================================================ - -The `GauXC `__ library provides an implementation for evaluating exchange-correlation functionals from an input density matrix. -We provide Skala as an extension to the GauXC library, allowing users to easily integrate Skala into electronic structure packages that already interface with GauXC. -The following sections provide instructions on how to install GauXC with Skala support and how to use Skala in your own electronic structure package via GauXC. - - -.. toctree:: - :maxdepth: 1 - - installation - standalone - cpp-library - c-library - fortran-library - api/index \ No newline at end of file diff --git a/gauxc/docs/installation.rst b/gauxc/docs/installation.rst deleted file mode 100644 index 59a5fe61..00000000 --- a/gauxc/docs/installation.rst +++ /dev/null @@ -1,258 +0,0 @@ -.. _gauxc_install: - -Installing GauXC -================ - -In this section, we will install GauXC with Skala support using the locked Pixi -environments in the Skala repository. -As part of this tutorial we will be - -* installing dependencies for building GauXC -* configuring GauXC with different options -* testing the Skala implementation in GauXC -* installing the GauXC library -* reusing GauXC from the CMake build system - - -Prerequisites -------------- - -Install `Pixi 0.75 `__ and clone Skala. The repository provides -five native environments: - -.. list-table:: - :header-rows: 1 - - * - Environment - - Backend - - Bindings - * - ``gauxc-openmp`` - - OpenMP - - C/C++ - * - ``gauxc-openmp-fortran`` - - OpenMP - - C/C++/Fortran - * - ``gauxc-mpi`` - - OpenMPI with MPI HDF5 - - C/C++ - * - ``gauxc-mpi-fortran`` - - OpenMPI with MPI HDF5 - - C/C++/Fortran - * - ``gauxc-cuda12`` - - CUDA 12 with GPU LibTorch - - C/C++ - -.. note:: - - A full list of dependencies can be found at :ref:`gauxc-cmake-deps` in the CMake configuration documentation. - -Install the environment for the backend you need, for example: - -.. code-block:: bash - - git clone https://github.com/microsoft/skala - cd skala - pixi install --locked -e gauxc-openmp - -Verify that the toolchain is visible: - -.. code-block:: bash - - pixi run -e gauxc-openmp cmake --version - pixi run -e gauxc-openmp python -c "import torch; print(torch.__version__)" - - -Obtain GauXC with Skala ------------------------ - -Download the pre-packaged source bundle from the Skala release page: - -.. code-block:: none - - curl -L https://github.com/microsoft/skala/releases/download/v1.1.1/gauxc-skala-r2.tar.gz | tar xzv - -.. tip:: - - To verify the downloaded tarball you can obtain a checksum - - .. code-block:: none - - curl -L https://github.com/microsoft/skala/releases/download/v1.1.1/gauxc-skala-r2.tar.gz > gauxc-skala-r2.tar.gz - curl -L https://github.com/microsoft/skala/releases/download/v1.1.1/gauxc-skala-r2.tar.gz.sha256 | sha256sum -c - tar xzvf gauxc-skala-r2.tar.gz - -The archive expands into a ``gauxc`` directory that already contains the Skala -patches. Place it beside the Skala checkout because the CMake commands below -assume this layout: - -.. code-block:: text - - work/ - ├── skala/ - ├── gauxc/ - ├── build_gauxc/ - └── build_example/ - -.. note:: - - You can also obtain the latest version of GauXC with Skala support by downloading the `skala branch of GauXC `__. - - .. code-block:: none - - curl -L https://github.com/wavefunction91/GauXC/archive/refs/heads/skala.tar.gz | tar xzv - - -Configure and build -------------------- - -From the Skala repository root, pick the environment and CMake options that -match your backend. The following commands build the C++ API; enable -:cmake:variable:`GAUXC_ENABLE_C` or :cmake:variable:`GAUXC_ENABLE_FORTRAN` when -building the C or Fortran examples. - -.. tab-set:: - :sync-group: config - - .. tab-item:: OpenMP - - .. code-block:: bash - - pixi run -e gauxc-openmp bash -c \ - 'cmake -B ../build_gauxc -S ../gauxc -G Ninja \ - -DGAUXC_ENABLE_OPENMP=ON \ - -DGAUXC_ENABLE_MPI=OFF \ - -DGAUXC_ENABLE_CUDA=OFF \ - -DGAUXC_ENABLE_ONEDFT=ON \ - -DGAUXC_ENABLE_C=OFF \ - -DGAUXC_ENABLE_FORTRAN=OFF \ - -DGAUXC_ENABLE_TESTS=OFF \ - -DBUILD_SHARED_LIBS=ON \ - -DCMAKE_INSTALL_PREFIX="$CONDA_PREFIX"' - pixi run -e gauxc-openmp cmake --build ../build_gauxc - pixi run -e gauxc-openmp cmake --install ../build_gauxc - - .. tab-item:: MPI - - .. code-block:: bash - - pixi run -e gauxc-mpi bash -c \ - 'cmake -B ../build_gauxc -S ../gauxc -G Ninja \ - -DGAUXC_ENABLE_OPENMP=OFF \ - -DGAUXC_ENABLE_MPI=ON \ - -DGAUXC_ENABLE_CUDA=OFF \ - -DGAUXC_ENABLE_ONEDFT=ON \ - -DGAUXC_ENABLE_C=OFF \ - -DGAUXC_ENABLE_FORTRAN=OFF \ - -DGAUXC_ENABLE_TESTS=OFF \ - -DBUILD_SHARED_LIBS=ON \ - -DCMAKE_INSTALL_PREFIX="$CONDA_PREFIX"' - pixi run -e gauxc-mpi cmake --build ../build_gauxc - pixi run -e gauxc-mpi cmake --install ../build_gauxc - - .. tab-item:: CUDA - - .. code-block:: bash - - pixi run -e gauxc-cuda12 bash -c \ - 'cmake -B ../build_gauxc -S ../gauxc -G Ninja \ - -DGAUXC_ENABLE_OPENMP=ON \ - -DGAUXC_ENABLE_MPI=OFF \ - -DGAUXC_ENABLE_CUDA=ON \ - -DCMAKE_CUDA_ARCHITECTURES="${CMAKE_CUDA_ARCHITECTURES:-60}" \ - -DGAUXC_ENABLE_ONEDFT=ON \ - -DGAUXC_ENABLE_C=OFF \ - -DGAUXC_ENABLE_FORTRAN=OFF \ - -DGAUXC_ENABLE_TESTS=OFF \ - -DBUILD_SHARED_LIBS=ON \ - -DCMAKE_INSTALL_PREFIX="$CONDA_PREFIX"' - pixi run -e gauxc-cuda12 cmake --build ../build_gauxc - pixi run -e gauxc-cuda12 cmake --install ../build_gauxc - - This defaults to compute capability 6.0, GauXC's minimum for FP64 - atomics. Set ``CMAKE_CUDA_ARCHITECTURES`` before the configure command for - the deployment GPU, for example ``CMAKE_CUDA_ARCHITECTURES=80``. - -.. note:: - - To enable the C or Fortran bindings, set :cmake:variable:`GAUXC_ENABLE_C` or :cmake:variable:`GAUXC_ENABLE_FORTRAN` in your CMake configuration step. - For a full list of available CMake options, see :ref:`gauxc-cmake-options` in the CMake configuration documentation. - -.. tip:: - - Pixi exposes the selected environment as ``${CONDA_PREFIX}`` for compatibility - with conda build tools. If CMake cannot find LibTorch, pass - ``-DTorch_DIR=${CONDA_PREFIX}/share/cmake/Torch``. - - -Install the library -------------------- - -The CMake install command installs into the selected Pixi environment so -downstream projects can discover its CMake config files. - -.. code-block:: bash - - pixi run -e gauxc-openmp cmake --install ../build_gauxc - -This installs headers, libraries, and CMake config. - -.. note:: - - For using GauXC in your own CMake project, check out :ref:`gauxc-cmake-integration` in the CMake configuration documentation. - Alternatively, you can follow the instructions in the :ref:`gauxc-cpp-library` tutorial for a full standalone example. - - -Quick verification ------------------- - -The installed GauXC library does not provide a ``Skala`` executable by itself; it is -built by the standalone C++ example project described in :ref:`gauxc-cpp-library`, which -now discovers the GauXC installation from the previous step. Configure and build the -example to obtain the ``Skala`` command line driver: - -.. code-block:: bash - - pixi run -e gauxc-openmp cmake -B ../build_example -S ../skala/examples/cpp/gauxc_integration -G Ninja - pixi run -e gauxc-openmp cmake --build ../build_example - -Then run the bundled regression test to confirm that Skala-enabled functionals -are working correctly. The Skala implementation can run different traditional functionals, like PBE and TPSS, -which can be compared against other libraries. - -.. code-block:: bash - - pixi run -e gauxc-openmp ../build_example/Skala \ - ../gauxc/tests/ref_data/onedft_he_def2qzvp_tpss_uks.hdf5 --model TPSS - -Expected output includes the total TPSS energy computed using a checkpoint compatible for the Skala implementation -for the reference density matrix. - -.. tip:: - - If the executable cannot locate libtorch or other shared libraries, double-check - that ``LD_LIBRARY_PATH`` includes ``${CONDA_PREFIX}/lib`` - (activating the environment usually handles this). - - -Troubleshooting ---------------- - -Torch not found - ensure ``Torch_DIR`` points to the libtorch CMake package inside the active environment, - or export ``Torch_DIR`` before running CMake. - -CUDA mismatch - use ``gauxc-cuda12`` as a unit. Its lock selects matching CUDA 12 compiler, - ExchCXX, and PyTorch builds. - -Linker errors for BLAS/MPI - run CMake through ``pixi run -e `` and verify that it picked the - toolchain from ``${CONDA_PREFIX}`` via ``CMAKE_PREFIX_PATH``. - -Standalone driver cannot find densities - run it from ``gauxc/tests/ref_data`` since paths in density files are specified relative to the - current directory. - -.. note:: - - Need help? Open an issue on the `Skala repository `__. diff --git a/gauxc/docs/scripts/export-h5.py b/gauxc/docs/scripts/export-h5.py deleted file mode 100644 index be29ca51..00000000 --- a/gauxc/docs/scripts/export-h5.py +++ /dev/null @@ -1,14 +0,0 @@ -from skala.pyscf import SkalaRKS -from skala_gauxc import write_gauxc_h5_from_pyscf - -from pyscf import gto - -mol = gto.M(atom="He 0 0 0", basis="def2-svp", unit="Bohr", spin=0) -ks = SkalaRKS(mol, xc="pbe") -ks.kernel() - -dm = ks.make_rdm1() -exc = ks.scf_summary["exc"] -_, _, vxc = ks._numint.nr_rks(ks.mol, ks.grids, ks.xc, dm) - -write_gauxc_h5_from_pyscf("He_def2-svp.h5", mol, dm=dm, exc=exc, vxc=vxc) diff --git a/gauxc/docs/standalone.rst b/gauxc/docs/standalone.rst deleted file mode 100644 index 862b2f3a..00000000 --- a/gauxc/docs/standalone.rst +++ /dev/null @@ -1,203 +0,0 @@ -GauXC standalone usage -====================== - -The GauXC package comes with a standalone driver for testing the evaluation of the exchange-correlation energy with different functionals. -In this tutorial we will use the standalone driver to evaluate Skala based on density matrices computed with different packages. - -.. tip:: - - For building GauXC and running the standalone driver checkout :ref:`gauxc_install`. - -Create GauXC compatible input ------------------------------ - -We will use the ``skala`` package to write a GauXC compatible input for our calculation. -For this we will run a PySCF calculation and write the molecule, basis set and density matrix in the format expected by GauXC. -In this example we will use a single one atom system in a small basis set. -Before running the export script, install the Python ``skala`` package together with its dependencies. - -.. note:: - - We will write the input data as HDF5 file since GauXC can read its objects directly from HDF5 datasets. - The format in the HDF5 file does correspond to the internal structure of GauXC objects and therefore allows us to conveniently inspect the data. - -.. literalinclude:: scripts/export-h5.py - :language: python - -Additionally to the inputs (molecule, basis set, and density matrix) we provide the exchange-correlation energy and potential to allow the standalone driver to compare against our reference calculation. - -Running the GauXC standalone driver ------------------------------------ - -The GauXC standalone driver takes a single input file, where we need to specify the path of our HDF5 file with the input data. -In the input file we specify the ``ONEDFT_MODEL`` as PBE since we used it for our input calculation as well. -Furthermore, we have parameters like ``grid``, ``pruning_scheme``, etc. which define the integration grid settings in GauXC, here we go with a fine grid, Mura-Knowles radial integration scheme and the robust pruning scheme of Psi4. - -.. code-block:: ini - :caption: gauxc_input.inp - - [GAUXC] - ref_file = He_def2-svp.h5 - ONEDFT_MODEL = PBE - grid = Fine - pruning_scheme = Robust - RAD_QUAD = MuraKnowles - batch_size = 512 - basis_tol = 2.22e-16 - LB_EXEC_SPACE = Device - INT_EXEC_SPACE = Device - REDUCTION_KERNEL = Default - MEMORY_SIZE = 0.1 - -.. tip:: - - Make sure the HDF5 file ``He_def2-svp.h5`` is in the same directory as the one where we start the standalone driver. - -To run the standalone driver with this input we run it from the build directory with our input file: - -.. code-block:: text - - ./build/tests/standalone_driver gauxc_input.inp - -For a successful run we will see the following output - -.. code-block:: text - - DRIVER SETTINGS: - REF_FILE = He_def2-svp.h5 - GRID = FINE - RAD_QUAD = MURAKNOWLES - PRUNING_SCHEME = ROBUST - BATCH_SIZE = 512 - BASIS_TOL = 2.22e-16 - FUNCTIONAL = PBE0 - LB_EXEC_SPACE = DEVICE - INT_EXEC_SPACE = DEVICE - INTEGRATOR_KERNEL = DEFAULT - LWD_KERNEL = DEFAULT - REDUCTION_KERNEL = DEFAULT - DEN (?) = false - VXC (?) = true - EXX (?) = false - EXC_GRAD (?) = false - DD_PSI (?) = false - DD_PSI_POTENTIAL (?) = false - ONEDFT_MODEL = PBE - FXC_CONTRACTION (?) = false - MEMORY_SIZE = 0.1 - - EXC: -1.054031868349e+00 - EXC = -1.054031868349e+00 - - Load Balancer Timings - LoadBalancer.CreateTasks: 1.50510e+01 ms - MolecularWeights Timings - MolecularWeights: 2.98569e+01 ms - Integrator Timings - XCIntegrator.Allreduce: 4.11500e-03 ms - XCIntegrator.LocalWork: 2.35691e+01 ms - XCIntegrator.LocalWork2: 9.11679e+00 ms - XC Int Duration = 3.35111170000000e-01 s - EXC (ref) = -1.05403142675144e+00 - EXC (calc) = -1.05403186834886e+00 - EXC Diff = -4.18960391377858e-07 - | VXC (ref) |_F = 1.45598265614311e+00 - | VXC (calc) |_F = 1.45598296606474e+00 - RMS VXC Diff = 7.43706533247358e-08 - | VXCz (ref) |_F = 0.00000000000000e+00 - | VXCz (calc) |_F = 0.00000000000000e+00 - RMS VXCz Diff = 0.00000000000000e+00 - -We find a reasonable difference between PySCF and GauXC computed exchange-correlation energy and potential. - -.. tip:: - - We can converge this value further by choosing finer grid settings both in PySCF and GauXC. - -Inspecting the GauXC input data -------------------------------- - -Now that we verified that GauXC can evaluate based on our PySCF produced input data, we will have a closer look of what we sent to GauXC. -For this we will inspect our HDF5 input data more closely. - -.. code-block:: ipython - - In [1]: import h5py - ...: import numpy as np - - In [2]: with h5py.File("He_def2-svp.h5") as h5: - ...: molecule = np.asarray(h5["MOLECULE"]) - ...: basis = np.asarray(h5["BASIS"]) - ...: dm_scalar = np.asarray(h5["DENSITY_SCALAR"]) - ...: dm_z = np.asarray(h5["DENSITY_Z"]) - ...: - -First, we inspect the molecule format which follows an array of structs format, combining the atomic number together with the cartesian coordinates in Bohr. -For our Helium example we expect a single entry centered at the origin: - -.. code-block:: ipython - - In [3]: molecule.shape - Out[3]: (1,) - - In [4]: molecule.dtype - Out[4]: dtype({'names': ['Atomic Number', 'X Coordinate', 'Y Coordinate', 'Z Coordinate'], 'formats': [' -#include -#include -#include -#include - -// For GauXC core functionality -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// For HDF5 I/O -#include -#include - -// For command line interface -#include - -enum GauXC_ExecutionSpace -read_execution_space(GauXCStatus* status, const char* exec_space_str) -{ - status->code = 0; - if(strcmp(exec_space_str, "host") == 0) - return GauXC_ExecutionSpace_Host; - if(strcmp(exec_space_str, "device") == 0) - return GauXC_ExecutionSpace_Device; - status->message = "Invalid execution space specification"; - status->code = 1; -} - -enum GauXC_RadialQuad -read_radial_quad(GauXCStatus* status, const char* rad_quad_spec) -{ - status->code = 0; - if(strcmp(rad_quad_spec, "becke") == 0) - return GauXC_RadialQuad_Becke; - if(strcmp(rad_quad_spec, "muraknowles") == 0) - return GauXC_RadialQuad_MuraKnowles; - if(strcmp(rad_quad_spec, "treutlerahlrichs") == 0) - return GauXC_RadialQuad_TreutlerAhlrichs; - if(strcmp(rad_quad_spec, "murrayhandylaming") == 0) - return GauXC_RadialQuad_MurrayHandyLaming; - status->message = "Invalid radial quadrature specification"; - status->code = 1; -} - -enum GauXC_AtomicGridSizeDefault -read_atomic_grid_size(GauXCStatus* status, const char* spec) -{ - status->code = 0; - if(strcmp(spec, "fine") == 0) - return GauXC_AtomicGridSizeDefault_FineGrid; - if(strcmp(spec, "ultrafine") == 0) - return GauXC_AtomicGridSizeDefault_UltraFineGrid; - if(strcmp(spec, "superfine") == 0) - return GauXC_AtomicGridSizeDefault_SuperFineGrid; - if(strcmp(spec, "gm3") == 0) - return GauXC_AtomicGridSizeDefault_GM3; - if(strcmp(spec, "gm5") == 0) - return GauXC_AtomicGridSizeDefault_GM5; - status->message = "Invalid atomic grid size specification"; - status->code = 1; -} - -enum GauXC_PruningScheme -read_pruning_scheme(GauXCStatus* status, const char* spec) -{ - status->code = 0; - if(strcmp(spec, "unpruned") == 0) - return GauXC_PruningScheme_Unpruned; - if(strcmp(spec, "robust") == 0) - return GauXC_PruningScheme_Robust; - if(strcmp(spec, "treutler") == 0) - return GauXC_PruningScheme_Treutler; - status->message = "Invalid pruning scheme specification"; - status->code = 1; -} - -void -read_matrix_from_hdf5_record(GauXCStatus* status, double** mat, int64_t* n, const char* file, const char* dataset) -{ - status->code = 0; - *mat = NULL; - bool file_opened = false, dataset_opened = false, dataspace_opened = false; - hid_t hdf5_file = H5Fopen(file, H5F_ACC_RDONLY, H5P_DEFAULT); - if (hdf5_file < 0) { - status->message = "Failed to open HDF5 file"; status->code = 1; - goto err; - } - file_opened = true; - - hid_t hdf5_dataset = H5Dopen2(hdf5_file, dataset, H5P_DEFAULT); - if (hdf5_dataset < 0) { - status->message = "Failed to open HDF5 dataset"; - status->code = 1; - goto err; - } - dataset_opened = true; - - hid_t hdf5_dataspace = H5Dget_space(hdf5_dataset); - if (hdf5_dataspace < 0) { - status->message = "Failed to get HDF5 dataspace"; - status->code = 1; - goto err; - } - dataspace_opened = true; - - int ndims = H5Sget_simple_extent_ndims(hdf5_dataspace); - if (ndims != 2) { - status->message = "Expected 2D dataset in HDF5 file"; - status->code = 1; - goto err; - } - - hsize_t dims[2]; - H5Sget_simple_extent_dims(hdf5_dataspace, dims, NULL); - *n = dims[0]; - if (dims[1] != dims[0]) { - status->message = "Expected square matrix dataset in HDF5 file"; - status->code = 1; - goto err; - } - - *mat = (double*)malloc(dims[0] * dims[1] * sizeof(double)); - if (*mat == NULL) { - status->message = "Failed to allocate memory for matrix"; - status->code = 1; - goto err; - } - - herr_t err = H5Dread(hdf5_dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, *mat); - if (err < 0) { - status->message = "Failed to read matrix data from HDF5 dataset"; - status->code = 1; - free(*mat); - *mat = NULL; - goto err; - } - -err: - if (dataspace_opened) H5Sclose(hdf5_dataspace); - if (dataset_opened) H5Dclose(hdf5_dataset); - if (file_opened) H5Fclose(hdf5_file); -} - -inline static double -matrix_norm(const int64_t m, const int64_t n, const double* mat, const int64_t ld) -{ - double norm = 0.0; - for (int64_t i = 0; i < m; ++i) { - for (int64_t j = 0; j < n; ++j) { - double val = mat[i * ld + j]; - norm += val * val; - } - } - return sqrt(norm); -} - -inline static char * arg_strcpy(struct arg_str * arg, char * default_str) -{ - if(arg->count == 0 && default_str != NULL) { - return strcpy(malloc(strlen(default_str) + 1), default_str); - } - if(arg->count > 0) { - const char* sval = arg->sval[arg->count - 1]; - return strcpy(malloc(strlen(sval) + 1), sval); - } - return NULL; -} - -inline static char * lowercase(char * str) -{ - for(char * p = str; *p; ++p) *p = tolower(*p); - return str; -} - -int -main(int argc, char** argv) -{ -#ifdef GAUXC_HAS_MPI - MPI_Init(NULL, NULL); -#endif - struct arg_lit *help; - struct arg_file *input_file_; - struct arg_int *batch_size_; - struct arg_dbl *basis_tol_; - struct arg_str *model_, *grid_spec_, *rad_quad_spec_, *prune_spec_; - struct arg_str *lb_exec_space_, *int_exec_space_; - struct arg_end *end; - - void* argtable[] = { - input_file_ = arg_filen(NULL, NULL, "", 1, 1, "Input file containing molecular geometry and density matrix"), - model_ = arg_strn(NULL, "model", "", 1, 1, "OneDFT model to use, can be a path to a checkpoint"), - grid_spec_ = arg_strn(NULL, "grid-spec", "", 0, 1, "Atomic grid size specification (default: Fine)"), - arg_rem(NULL, "Possible values are: Fine, UltraFine, SuperFine, GM3, GM5"), - rad_quad_spec_ = arg_strn(NULL, "radial-quad", "", 0, 1, "Radial quadrature scheme (default: MuraKnowles)"), - arg_rem(NULL, "Possible values are: Becke, MuraKnowles, TreutlerAhlrichs, MurrayHandyLaming"), - prune_spec_ = arg_strn(NULL, "prune-scheme", "", 0, 1, "Pruning scheme (default: Robust)"), - arg_rem(NULL, "Possible values are: Unpruned, Robust, Treutler"), - lb_exec_space_ = arg_strn(NULL, "lb-exec-space", "", 0, 1, "Load balancer execution space"), - arg_rem(NULL, "Possible values are: Host, Device"), - int_exec_space_= arg_strn(NULL, "int-exec-space", "", 0, 1, "Integrator execution space"), - arg_rem(NULL, "Possible values are: Host, Device"), - batch_size_ = arg_intn(NULL, "batch-size", "", 0, 1, "Batch size for grid point processing (default: 512)"), - basis_tol_ = arg_dbln(NULL, "basis-tol", "", 0, 1, "Basis function evaluation tolerance (default: 1e-10)"), - help = arg_litn(NULL, "help", 0, 1, "Print this help and exit"), - end = arg_end(20) - }; - - int nerrors = arg_parse(argc, argv, argtable); - if(help->count > 0) { - printf("Usage: %s", argv[0]); - arg_print_syntax(stdout, argtable, "\n\n"); - printf("Options:\n"); - arg_print_glossary(stdout, argtable, " %-25s %s\n"); -#ifdef GAUXC_HAS_MPI - MPI_Finalize(); -#endif - return EXIT_SUCCESS; - } - - if (nerrors > 0 || input_file_->count == 0 || model_->count == 0) { - printf("Usage: %s", argv[0]); - arg_print_syntax(stdout, argtable, "\n"); - arg_print_errors(stderr, end, argv[0]); -#ifdef GAUXC_HAS_MPI - MPI_Abort(MPI_COMM_WORLD, 1); -#endif - return EXIT_FAILURE; - } - - char* input_file = strcpy(malloc(strlen(input_file_->filename[0]) + 1), input_file_->filename[0]); - char* model = arg_strcpy(model_, NULL); - char* grid_spec = lowercase(arg_strcpy(grid_spec_, "Fine")); - char* rad_quad_spec = lowercase(arg_strcpy(rad_quad_spec_, "MuraKnowles")); - char* prune_spec = lowercase(arg_strcpy(prune_spec_, "Robust")); - char* lb_exec_space_str = lowercase(arg_strcpy(lb_exec_space_, "Host")); - char* int_exec_space_str = lowercase(arg_strcpy(int_exec_space_, "Host")); - int batch_size = batch_size_->count > 0 ? batch_size_->ival[0] : 512; - double basis_tol = basis_tol_->count > 0 ? basis_tol_->dval[0] : 1e-10; - - // Clean up argtable memory - arg_freetable(argtable, sizeof(argtable) / sizeof(argtable[0])); - - // Memory management for GauXC - void* objs[16]; - size_t nobj = 0; - - // Add handler for events like exceptions - GauXCStatus status = {0, NULL}; - - // Create runtime - GauXCRuntimeEnvironment rt = gauxc_runtime_environment_new(&status GAUXC_MPI_CODE(, MPI_COMM_WORLD)); - objs[nobj++] = &rt; - if (status.code) goto err; - int world_rank = gauxc_runtime_environment_comm_rank(&status, rt); - if (status.code) goto err; - int world_size = gauxc_runtime_environment_comm_size(&status, rt); - if (status.code) goto err; - - if(!world_rank && !status.code) { - printf("Configuration\n"); - printf("-> Input file : %s\n", input_file); - printf("-> Model : %s\n", model); - printf("-> Grid : %s\n", grid_spec); - printf("-> Radial quadrature : %s\n", rad_quad_spec); - printf("-> Pruning scheme : %s\n", prune_spec); - printf("\n"); - } - - // Get molecule (atomic numbers and cartesian coordinates) - GauXCMolecule mol = gauxc_molecule_new(&status); - objs[nobj++] = &mol; - if (status.code) goto err; - // Load molecule from HDF5 dataset - gauxc_molecule_read_hdf5_record(&status, mol, input_file, "/MOLECULE"); - if (status.code) goto err; - - // Get basis set - GauXCBasisSet basis = gauxc_basisset_new(&status); - objs[nobj++] = &basis; - if (status.code) goto err; - // Load basis set from HDF5 dataset - gauxc_basisset_read_hdf5_record(&status, basis, input_file, "/BASIS"); - if (status.code) goto err; - - // Define molecular grid from grid size, radial quadrature and pruning scheme - enum GauXC_AtomicGridSizeDefault grid_type = read_atomic_grid_size(&status, grid_spec); - if (status.code) goto err; - enum GauXC_RadialQuad radial_quad = read_radial_quad(&status, rad_quad_spec); - if (status.code) goto err; - enum GauXC_PruningScheme pruning_scheme = read_pruning_scheme(&status, prune_spec); - if (status.code) goto err; - GauXCMolGrid grid = gauxc_molgrid_new_default( - &status, - mol, - pruning_scheme, - batch_size, - radial_quad, - grid_type); - objs[nobj++] = &grid; - if (status.code) goto err; - - // Choose whether we run on host or device - enum GauXC_ExecutionSpace lb_exec_space, int_exec_space; - lb_exec_space = read_execution_space(&status, lb_exec_space_str); - if (status.code) goto err; - int_exec_space = read_execution_space(&status, int_exec_space_str); - if (status.code) goto err; - - // Setup load balancer based on molecule, grid and basis set - GauXCLoadBalancerFactory lb_factory = gauxc_load_balancer_factory_new(&status, lb_exec_space, "Replicated"); - objs[nobj++] = &lb_factory; - if (status.code) goto err; - GauXCLoadBalancer lb = gauxc_load_balancer_factory_get_instance(&status, lb_factory, rt, mol, grid, basis); - objs[nobj++] = &lb; - if (status.code) goto err; - - // Apply partitioning weights to the molecule grid - GauXCMolecularWeightsSettings settings = {GauXC_XCWeightAlg_SSF, false}; - GauXCMolecularWeightsFactory mw_factory = gauxc_molecular_weights_factory_new(&status, int_exec_space, - "Default", settings); - objs[nobj++] = &mw_factory; - if (status.code) goto err; - GauXCMolecularWeights mw = gauxc_molecular_weights_factory_get_instance(&status, mw_factory); - if (status.code) goto err; - gauxc_molecular_weights_modify_weights(&status, mw, lb); - objs[nobj++] = &mw; - if (status.code) goto err; - - // Setup exchange-correlation integrator - GauXCFunctional func = gauxc_functional_from_string(&status, "PBE", true); - objs[nobj++] = &func; - if (status.code) goto err; - GauXCIntegrator integrator = gauxc_integrator_new(&status, func, lb, int_exec_space, - "Replicated", "Default", "Default", "Default"); - objs[nobj++] = &integrator; - if (status.code) goto err; - - // Load density matrix from input - int64_t nbf; - double* P_s = NULL; - double* P_z = NULL; - read_matrix_from_hdf5_record(&status, &P_s, &nbf, input_file, "/DENSITY_SCALAR"); - if (status.code) goto err; - read_matrix_from_hdf5_record(&status, &P_z, &nbf, input_file, "/DENSITY_Z"); - if (status.code) goto err; - -#ifdef GAUXC_HAS_MPI - MPI_Barrier(MPI_COMM_WORLD); -#endif - - // Integrate exchange correlation energy - double EXC; - double* VXC_s = (double*)malloc(nbf * nbf * sizeof(double)); - double* VXC_z = (double*)malloc(nbf * nbf * sizeof(double)); - gauxc_integrator_eval_exc_vxc_onedft_uks(&status, integrator, - nbf, nbf, P_s, nbf, P_z, nbf, model, &EXC, VXC_s, nbf, VXC_z, nbf); - if (status.code) goto err; - -#ifdef GAUXC_HAS_MPI - MPI_Barrier(MPI_COMM_WORLD); -#endif - - if(!world_rank && !status.code) { - printf("Results\n"); - printf("-> EXC : %.10f\n", EXC); - printf("-> |VXC(a+b)|_F : %.10f\n", matrix_norm(nbf, nbf, VXC_s, nbf)); - printf("-> |VXC(a-b)|_F : %.10f\n", matrix_norm(nbf, nbf, VXC_z, nbf)); - printf("\n"); - } - -err: - int error_code = status.code; - if (error_code) { - fprintf(stderr, "Error (code %d)", error_code); - if (status.message) fprintf(stderr, ": %s", status.message); - fprintf(stderr, "\n"); - } - // Clean up memory - free(input_file); - free(model); - free(grid_spec); - free(rad_quad_spec); - free(prune_spec); - free(lb_exec_space_str); - free(int_exec_space_str); - free(P_s); - free(P_z); - free(VXC_s); - free(VXC_z); - gauxc_objects_delete(&status, objs, nobj); - if (status.code) { - fprintf(stderr, "Error during cleanup (code %d)", status.code); - if (status.message) fprintf(stderr, ": %s", status.message); - fprintf(stderr, "\n"); - error_code = status.code; - } - -#ifdef GAUXC_HAS_MPI - MPI_Finalize(); -#endif - return error_code ? EXIT_FAILURE : EXIT_SUCCESS; -} diff --git a/gauxc/examples/c/gauxc_integration/cmake/skala-argtable3.cmake b/gauxc/examples/c/gauxc_integration/cmake/skala-argtable3.cmake deleted file mode 100644 index 679544b0..00000000 --- a/gauxc/examples/c/gauxc_integration/cmake/skala-argtable3.cmake +++ /dev/null @@ -1,23 +0,0 @@ -if(NOT DEFINED Skala_Argtable3_URL) - include(skala-dep-versions) -endif() -find_package(Argtable3 QUIET CONFIG) -if(NOT Argtable3_FOUND) - include(FetchContent) - - message(STATUS "Could not find Argtable3... Building Argtable3 from source") - message(STATUS "Argtable3 URL: ${Skala_Argtable3_URL}") - - FetchContent_Declare( - argtable3 - URL ${Skala_Argtable3_URL} - URL_HASH SHA256=${Skala_Argtable3_SHA256} - DOWNLOAD_EXTRACT_TIMESTAMP ON - ) - - # The example only needs the library target. Disabling upstream tests/examples - # avoids extra tooling requirements in CI (e.g., dos2unix). - set(ARGTABLE3_ENABLE_TESTS OFF CACHE BOOL "" FORCE) - set(ARGTABLE3_ENABLE_EXAMPLES OFF CACHE BOOL "" FORCE) - FetchContent_MakeAvailable(argtable3) -endif() diff --git a/gauxc/examples/c/gauxc_integration/cmake/skala-dep-versions.cmake b/gauxc/examples/c/gauxc_integration/cmake/skala-dep-versions.cmake deleted file mode 100644 index 29b29ccd..00000000 --- a/gauxc/examples/c/gauxc_integration/cmake/skala-dep-versions.cmake +++ /dev/null @@ -1,5 +0,0 @@ -set(Skala_GauXC_URL "https://github.com/microsoft/skala/releases/download/v1.1.1/gauxc-skala-r2.tar.gz") -set(Skala_GauXC_SHA256 "6659d00522b443f2557a960a9ba0217449d2ee25df809634d6becca23eb0f1ff") - -set(Skala_Argtable3_URL "https://github.com/argtable/argtable3/releases/download/v3.3.1/argtable-v3.3.1.tar.gz") -set(Skala_Argtable3_SHA256 "c08bca4b88ddb9234726b75455b3b1670d7c864d8daf198eaa7a3b4d41addf2c") diff --git a/gauxc/examples/c/gauxc_integration/cmake/skala-gauxc.cmake b/gauxc/examples/c/gauxc_integration/cmake/skala-gauxc.cmake deleted file mode 100644 index f2d319ff..00000000 --- a/gauxc/examples/c/gauxc_integration/cmake/skala-gauxc.cmake +++ /dev/null @@ -1,45 +0,0 @@ -if(NOT DEFINED Skala_GauXC_URL) - include(skala-dep-versions) -endif() -find_package(gauxc QUIET CONFIG) -if(NOT gauxc_FOUND) - include(FetchContent) - - message(STATUS "Could not find GauXC... Building GauXC from source") - message(STATUS "GAUXC URL: ${Skala_GauXC_URL}") - - set(GAUXC_ENABLE_ONEDFT ON CACHE BOOL "" FORCE) - set(GAUXC_ENABLE_C ON CACHE BOOL "" FORCE) - set(GAUXC_ENABLE_TESTS OFF CACHE BOOL "" FORCE) - set(GAUXC_ENABLE_HDF5 ON CACHE BOOL "" FORCE) - set(GAUXC_ENABLE_OPENMP ${Skala_GauXC_ENABLE_OPENMP} CACHE BOOL "" FORCE) - set(GAUXC_ENABLE_MPI ${Skala_GauXC_ENABLE_MPI} CACHE BOOL "" FORCE) - set(GAUXC_ENABLE_CUDA ${Skala_GauXC_ENABLE_CUDA} CACHE BOOL "" FORCE) - - FetchContent_Declare( - gauxc - URL ${Skala_GauXC_URL} - # URL_HASH SHA256=${Skala_GauXC_SHA256} - DOWNLOAD_EXTRACT_TIMESTAMP ON - ) - FetchContent_MakeAvailable(gauxc) - -endif() -if(NOT GAUXC_HAS_ONEDFT) - message(FATAL_ERROR "GauXC found but without Skala support enabled") -endif() -if(NOT GAUXC_HAS_C) - message(FATAL_ERROR "GauXC found but without C API support enabled") -endif() -if(NOT GAUXC_HAS_HDF5) - message(FATAL_ERROR "GauXC found but without HDF5 support enabled") -endif() -if(Skala_GauXC_ENABLE_OPENMP AND NOT GAUXC_HAS_OPENMP) - message(FATAL_ERROR "GauXC found without OpenMP support but Skala_GauXC_ENABLE_OPENMP is ON") -endif() -if(Skala_GauXC_ENABLE_MPI AND NOT GAUXC_HAS_MPI) - message(FATAL_ERROR "GauXC found without MPI support but Skala_GauXC_ENABLE_MPI is ON") -endif() -if(Skala_GauXC_ENABLE_CUDA AND NOT GAUXC_HAS_CUDA) - message(FATAL_ERROR "GauXC found without CUDA support but Skala_GauXC_ENABLE_CUDA is ON") -endif() diff --git a/gauxc/examples/c/gauxc_integration/cmake/skala-hdf5.cmake b/gauxc/examples/c/gauxc_integration/cmake/skala-hdf5.cmake deleted file mode 100644 index 7ace282a..00000000 --- a/gauxc/examples/c/gauxc_integration/cmake/skala-hdf5.cmake +++ /dev/null @@ -1 +0,0 @@ -find_package(HDF5 REQUIRED COMPONENTS C HL) \ No newline at end of file diff --git a/gauxc/examples/cpp/gauxc_integration/.gitignore b/gauxc/examples/cpp/gauxc_integration/.gitignore deleted file mode 100644 index 07b9832e..00000000 --- a/gauxc/examples/cpp/gauxc_integration/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -*build/ -*.tar.gz -*.fun diff --git a/gauxc/examples/cpp/gauxc_integration/CMakeLists.txt b/gauxc/examples/cpp/gauxc_integration/CMakeLists.txt deleted file mode 100644 index ac0172d2..00000000 --- a/gauxc/examples/cpp/gauxc_integration/CMakeLists.txt +++ /dev/null @@ -1,39 +0,0 @@ -cmake_minimum_required(VERSION 3.20 FATAL_ERROR) - -project("Skala" LANGUAGES CXX) - -include(GNUInstallDirs) -include(FetchContent) -set(FETCHCONTENT_UPDATES_DISCONNECTED ON CACHE BOOL "Disable FC Updates") - -list(PREPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) - -option(Skala_GauXC_ENABLE_OPENMP "Enable OpenMP support in GauXC" ON) -option(Skala_GauXC_ENABLE_MPI "Enable MPI support in GauXC" OFF) -option(Skala_GauXC_ENABLE_CUDA "Enable CUDA support in GauXC" OFF) - -include(skala-dep-versions) -include(skala-hdf5) -include(skala-gauxc) -include(skala-cli11) -include(skala-eigen3) - -add_executable( - "${PROJECT_NAME}" - "app/main.cxx" -) -target_link_libraries( - "${PROJECT_NAME}" - PRIVATE - gauxc::gauxc - CLI11::CLI11 - Eigen3::Eigen -) -install( - TARGETS - "${PROJECT_NAME}" - DESTINATION - "${CMAKE_INSTALL_BINDIR}" -) - -list(REMOVE_AT CMAKE_MODULE_PATH 0) \ No newline at end of file diff --git a/gauxc/examples/cpp/gauxc_integration/app/main.cxx b/gauxc/examples/cpp/gauxc_integration/app/main.cxx deleted file mode 100644 index 62057a0b..00000000 --- a/gauxc/examples/cpp/gauxc_integration/app/main.cxx +++ /dev/null @@ -1,248 +0,0 @@ -// For GauXC core functionality -#include -#include -#include -#include -#include -#include - -// For loading data from HDF5 files -#include -#include - -// For providing matrix implementation -#define EIGEN_DONT_VECTORIZE -#define EIGEN_NO_CUDA -#include -using matrix = Eigen::MatrixXd; - -// For command line interface -#include - -GauXC::RuntimeEnvironment -get_runtime() -{ -#ifdef GAUXC_HAS_DEVICE - auto rt = GauXC::DeviceRuntimeEnvironment( GAUXC_MPI_CODE(MPI_COMM_WORLD,) 0.9 ); - // Calculate GauXC Device buffer size - size_t available_mem, total_mem; - cudaMemGetInfo(&available_mem, &total_mem); - int device_id; - cudaGetDevice(&device_id); - size_t sz = 0.9 * available_mem; - void* p; - cudaMallocAsync(&p, sz, 0); - cudaStreamSynchronize(0); - rt.set_buffer(p, sz); -#else - auto rt = GauXC::RuntimeEnvironment(GAUXC_MPI_CODE(MPI_COMM_WORLD)); -#endif - return rt; -} - -// Load molecule from HDF5 dataset -GauXC::Molecule -read_molecule(std::string ref_file) -{ - GauXC::Molecule mol; - GauXC::read_hdf5_record(mol, ref_file, "/MOLECULE"); - return mol; -} - -// Load basis from HDF5 dataset -GauXC::BasisSet -read_basis(std::string ref_file, double basis_tol) -{ - GauXC::BasisSet basis; - GauXC::read_hdf5_record(basis, ref_file, "/BASIS"); - for(auto& shell : basis){ - shell.set_shell_tolerance(basis_tol); - } - return basis; -} - -GauXC::AtomicGridSizeDefault -read_atomic_grid_size(std::string spec) -{ - std::map mg_map = { - {"fine", GauXC::AtomicGridSizeDefault::FineGrid}, - {"ultrafine", GauXC::AtomicGridSizeDefault::UltraFineGrid}, - {"superfine", GauXC::AtomicGridSizeDefault::SuperFineGrid}, - {"gm3", GauXC::AtomicGridSizeDefault::GM3}, - {"gm5", GauXC::AtomicGridSizeDefault::GM5} - }; - return mg_map.at(spec); -} - -GauXC::PruningScheme -read_pruning_scheme(std::string spec) -{ - std::map prune_map = { - {"unpruned", GauXC::PruningScheme::Unpruned}, - {"robust", GauXC::PruningScheme::Robust}, - {"treutler", GauXC::PruningScheme::Treutler} - }; - return prune_map.at(spec); -} - -GauXC::RadialQuad -read_radial_quad(std::string spec) -{ - std::map rad_quad_map = { - {"becke", GauXC::RadialQuad::Becke}, - {"muraknowles", GauXC::RadialQuad::MuraKnowles}, - {"treutlerahlrichs", GauXC::RadialQuad::TreutlerAhlrichs}, - {"murrayhandylaming", GauXC::RadialQuad::MurrayHandyLaming}, - }; - return rad_quad_map.at(spec); -} - -std::pair -read_density_matrix(std::string ref_file) -{ - HighFive::File h5file(ref_file, HighFive::File::ReadOnly); - - auto dset = h5file.getDataSet("/DENSITY_SCALAR"); - auto dims = dset.getDimensions(); - auto P_s = matrix(dims[0], dims[1]); - auto P_z = matrix(dims[0], dims[1]); - - dset.read(P_s.data()); - - dset = h5file.getDataSet("/DENSITY_Z"); - dset.read(P_z.data()); - - return std::make_pair(P_s, P_z); -} - -int -main(int argc, char** argv) -{ -#ifdef GAUXC_HAS_MPI - MPI_Init(NULL, NULL); -#endif - { - std::string input_file; - std::string model; - std::string grid_spec = "fine"; - std::string rad_quad_spec = "muraknowles"; - std::string prune_spec = "robust"; - std::string lb_exec_space_str = "host"; - std::string int_exec_space_str = "host"; - int batch_size = 512; - double basis_tol = 1e-10; - { - auto string_to_lower = CLI::Validator( - [](auto& str){ - std::transform(str.begin(), str.end(), str.begin(), ::tolower); - return ""; - }, std::string(""), std::string("argument is case-insensitive")); - CLI::App app{"Skala GauXC driver"}; - app.option_defaults()->always_capture_default(); - app.add_option("input", input_file, "Input file in HDF5 format")->required()->check(CLI::ExistingFile); - app.add_option("--model", model, "Model checkpoint to evaluate")->required(); - app.add_option("--grid-size", grid_spec, "Grid specification (fine|ultrafine|superfine|gm3|gm5)")->transform(string_to_lower); - app.add_option("--radial-quad", rad_quad_spec, "Radial quadrature specification (becke|muraknowles|treutlerahlrichs|murrayhandylaming)")->transform(string_to_lower); - app.add_option("--prune-scheme", prune_spec, "Pruning scheme (unpruned|robust|treutler)")->transform(string_to_lower); - app.add_option("--lb-exec-space", lb_exec_space_str, "Load balancing execution space")->transform(string_to_lower); - app.add_option("--int-exec-space", int_exec_space_str, "Integration execution space")->transform(string_to_lower); - app.add_option("--batch-size", batch_size, ""); - app.add_option("--basis-tol", basis_tol, ""); - CLI11_PARSE(app, argc, argv); - } - // Create runtime - auto rt = get_runtime(); - auto world_rank = rt.comm_rank(); - auto world_size = rt.comm_size(); - - if (!world_rank) { - std::cout << std::boolalpha; - std::cout << "Configuration" << std::endl - << "-> Input file : " << input_file << std::endl - << "-> Model : " << model << std::endl - << "-> Grid : " << grid_spec << std::endl - << "-> Radial quadrature : " << rad_quad_spec << std::endl - << "-> Pruning scheme : " << prune_spec << std::endl - << std::endl; - } - - // Get molecule (atomic numbers and cartesian coordinates) - auto mol = read_molecule(input_file); - - // Get basis set - auto basis = read_basis(input_file, basis_tol); - - // Define molecular grid from grid size, radial quadrature and pruning scheme - auto grid = GauXC::MolGridFactory::create_default_molgrid( - mol, - read_pruning_scheme(prune_spec), - GauXC::BatchSize(batch_size), - read_radial_quad(rad_quad_spec), - read_atomic_grid_size(grid_spec)); - - // Choose whether we run on host or device - #ifdef GAUXC_HAS_DEVICE - std::map exec_space_map = { - { "host", GauXC::ExecutionSpace::Host }, - { "device", GauXC::ExecutionSpace::Device } - }; - - auto lb_exec_space = exec_space_map.at(lb_exec_space_str); - auto int_exec_space = exec_space_map.at(int_exec_space_str); - #else - auto lb_exec_space = GauXC::ExecutionSpace::Host; - auto int_exec_space = GauXC::ExecutionSpace::Host; - #endif - - // Setup load balancer based on molecule, grid and basis set - GauXC::LoadBalancerFactory lb_factory(lb_exec_space, "Replicated"); - auto lb = lb_factory.get_shared_instance(rt, mol, grid, basis); - - // Apply partitioning weights to the molecule grid - GauXC::MolecularWeightsFactory mw_factory(int_exec_space, "Default", - GauXC::MolecularWeightsSettings{} ); - auto mw = mw_factory.get_instance(); - mw.modify_weights(*lb); - - // Setup exchange-correlation integrator - GauXC::functional_type func; - GauXC::XCIntegratorFactory integrator_factory(int_exec_space, "Replicated", "Default", "Default", "Default"); - auto integrator = integrator_factory.get_instance(func, lb); - - // Configure model checkpoint - GauXC::OneDFTSettings onedft_settings; - onedft_settings.model = model; - - // Load density matrix from input - matrix P_s, P_z; - std::tie(P_s, P_z) = read_density_matrix(input_file); - -#ifdef GAUXC_HAS_MPI - MPI_Barrier(MPI_COMM_WORLD); -#endif - auto xc_int_start = std::chrono::high_resolution_clock::now(); - - // Integrate exchange correlation energy - double EXC; - matrix VXC_s, VXC_z; - std::tie(EXC, VXC_s, VXC_z) = integrator.eval_exc_vxc_onedft(P_s, P_z, onedft_settings); - -#ifdef GAUXC_HAS_MPI - MPI_Barrier(MPI_COMM_WORLD); -#endif - auto xc_int_end = std::chrono::high_resolution_clock::now(); - double xc_int_dur = std::chrono::duration(xc_int_end - xc_int_start).count(); - - std::cout << std::scientific << std::setprecision(12); - if(!world_rank) { - std::cout << "EXC = " << EXC << " Eh" << std::endl - << "|VXC(a+b)|_F = " << VXC_s.norm() << std::endl - << "|VXC(a-b)|_F = " << VXC_z.norm() << std::endl - << "Runtime XC = " << xc_int_dur << " s" << std::endl - << std::endl; - } - } -#ifdef GAUXC_HAS_MPI - MPI_Finalize(); -#endif -} diff --git a/gauxc/examples/cpp/gauxc_integration/cmake/skala-cli11.cmake b/gauxc/examples/cpp/gauxc_integration/cmake/skala-cli11.cmake deleted file mode 100644 index 5b85f810..00000000 --- a/gauxc/examples/cpp/gauxc_integration/cmake/skala-cli11.cmake +++ /dev/null @@ -1,25 +0,0 @@ -if(NOT DEFINED Skala_CLI11_URL) - include(skala-dep-versions) -endif() -find_package(CLI11 QUIET CONFIG) -if(NOT CLI11_FOUND) - message(STATUS "Could not find CLI11... Building CLI11 from source") - message(STATUS "CLI11 URL: ${Skala_CLI11_URL}") - - FetchContent_Declare( - cli11 - URL ${Skala_CLI11_URL} - URL_HASH SHA256=${Skala_CLI11_SHA256} - DOWNLOAD_EXTRACT_TIMESTAMP ON - ) - - FetchContent_GetProperties(cli11) - if(NOT cli11_POPULATED) - FetchContent_Populate(cli11) - endif() - - add_library( CLI11::CLI11 INTERFACE IMPORTED ) - set_target_properties( CLI11::CLI11 PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES ${cli11_SOURCE_DIR}/include - ) -endif() \ No newline at end of file diff --git a/gauxc/examples/cpp/gauxc_integration/cmake/skala-dep-versions.cmake b/gauxc/examples/cpp/gauxc_integration/cmake/skala-dep-versions.cmake deleted file mode 100644 index a640db5c..00000000 --- a/gauxc/examples/cpp/gauxc_integration/cmake/skala-dep-versions.cmake +++ /dev/null @@ -1,8 +0,0 @@ -set(Skala_GauXC_URL "https://github.com/microsoft/skala/releases/download/v1.1.1/gauxc-skala-r2.tar.gz") -set(Skala_GauXC_SHA256 "6659d00522b443f2557a960a9ba0217449d2ee25df809634d6becca23eb0f1ff") - -set(Skala_CLI11_URL "https://github.com/CLIUtils/CLI11/archive/refs/tags/v2.6.1.tar.gz") -set(Skala_CLI11_SHA256 "377691f3fac2b340f12a2f79f523c780564578ba3d6eaf5238e9f35895d5ba95") - -set(Skala_Eigen3_URL "https://gitlab.com/libeigen/eigen/-/archive/3.4.0/eigen-3.4.0.tar.gz") -set(Skala_Eigen3_SHA256 "8586084f71f9bde545ee7fa6d00288b264a2b7ac3607b974e54d13e7162c1c72") diff --git a/gauxc/examples/cpp/gauxc_integration/cmake/skala-eigen3.cmake b/gauxc/examples/cpp/gauxc_integration/cmake/skala-eigen3.cmake deleted file mode 100644 index 31e6c108..00000000 --- a/gauxc/examples/cpp/gauxc_integration/cmake/skala-eigen3.cmake +++ /dev/null @@ -1,28 +0,0 @@ -if(NOT DEFINED Skala_Eigen3_URL) - include(skala-dep-versions) -endif() -find_package(Eigen3 CONFIG HINTS ${EIGEN3_ROOT_DIR}) -if(NOT Eigen3_FOUND) - message(STATUS "Could Not Find Eigen3... Building Eigen3 from source") - message(STATUS "EIGEN3 REPO = ${Skala_Eigen3_URL}") - - FetchContent_Declare( - eigen3 - URL ${Skala_Eigen3_URL} - URL_HASH SHA256=${Skala_Eigen3_SHA256} - DOWNLOAD_EXTRACT_TIMESTAMP ON - ) - - FetchContent_GetProperties(eigen3) - if(NOT eigen3_POPULATED) - FetchContent_Populate(eigen3) - endif() - - add_library(Eigen3::Eigen INTERFACE IMPORTED) - set_target_properties( - Eigen3::Eigen - PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES ${eigen3_SOURCE_DIR} - ) -endif() - diff --git a/gauxc/examples/cpp/gauxc_integration/cmake/skala-gauxc.cmake b/gauxc/examples/cpp/gauxc_integration/cmake/skala-gauxc.cmake deleted file mode 100644 index aea1ea55..00000000 --- a/gauxc/examples/cpp/gauxc_integration/cmake/skala-gauxc.cmake +++ /dev/null @@ -1,41 +0,0 @@ -if(NOT DEFINED Skala_GauXC_URL) - include(skala-dep-versions) -endif() -find_package(gauxc QUIET CONFIG) -if(NOT gauxc_FOUND) - include(FetchContent) - - message(STATUS "Could not find GauXC... Building GauXC from source") - message(STATUS "GAUXC URL: ${Skala_GauXC_URL}") - - set(GAUXC_ENABLE_ONEDFT ON CACHE BOOL "" FORCE) - set(GAUXC_ENABLE_TESTS OFF CACHE BOOL "" FORCE) - set(GAUXC_ENABLE_HDF5 ON CACHE BOOL "" FORCE) - set(GAUXC_ENABLE_OPENMP ${Skala_GauXC_ENABLE_OPENMP} CACHE BOOL "" FORCE) - set(GAUXC_ENABLE_MPI ${Skala_GauXC_ENABLE_MPI} CACHE BOOL "" FORCE) - set(GAUXC_ENABLE_CUDA ${Skala_GauXC_ENABLE_CUDA} CACHE BOOL "" FORCE) - - FetchContent_Declare( - gauxc - URL ${Skala_GauXC_URL} - URL_HASH SHA256=${Skala_GauXC_SHA256} - DOWNLOAD_EXTRACT_TIMESTAMP ON - ) - FetchContent_MakeAvailable(gauxc) - -endif() -if(NOT GAUXC_HAS_ONEDFT) - message(FATAL_ERROR "GauXC found but without Skala support enabled") -endif() -if(NOT GAUXC_HAS_HDF5) - message(FATAL_ERROR "GauXC found but without HDF5 support enabled") -endif() -if(Skala_GauXC_ENABLE_OPENMP AND NOT GAUXC_HAS_OPENMP) - message(FATAL_ERROR "GauXC found without OpenMP support but Skala_GauXC_ENABLE_OPENMP is ON") -endif() -if(Skala_GauXC_ENABLE_MPI AND NOT GAUXC_HAS_MPI) - message(FATAL_ERROR "GauXC found without MPI support but Skala_GauXC_ENABLE_MPI is ON") -endif() -if(Skala_GauXC_ENABLE_CUDA AND NOT GAUXC_HAS_CUDA) - message(FATAL_ERROR "GauXC found without CUDA support but Skala_GauXC_ENABLE_CUDA is ON") -endif() \ No newline at end of file diff --git a/gauxc/examples/cpp/gauxc_integration/cmake/skala-hdf5.cmake b/gauxc/examples/cpp/gauxc_integration/cmake/skala-hdf5.cmake deleted file mode 100644 index c31f203c..00000000 --- a/gauxc/examples/cpp/gauxc_integration/cmake/skala-hdf5.cmake +++ /dev/null @@ -1,9 +0,0 @@ -find_package(HDF5 REQUIRED COMPONENTS C HL) - -# Some released GauXC/HighFive exports refer to a plain "hdf5-shared" link -# item. Map it to the resolved imported HDF5 target so link lines remain -# portable across package layouts. -if(TARGET HDF5::HDF5 AND NOT TARGET hdf5-shared) - add_library(hdf5-shared INTERFACE IMPORTED) - target_link_libraries(hdf5-shared INTERFACE HDF5::HDF5) -endif() diff --git a/gauxc/examples/cpp/gauxc_integration/cmake/skala-sdftd3.cmake b/gauxc/examples/cpp/gauxc_integration/cmake/skala-sdftd3.cmake deleted file mode 100644 index 675b0b80..00000000 --- a/gauxc/examples/cpp/gauxc_integration/cmake/skala-sdftd3.cmake +++ /dev/null @@ -1,48 +0,0 @@ -if(NOT DEFINED Skala_SDFTD3_URL) - include(skala-dep-versions) -endif() -find_package(PkgConfig QUIET) -if(PkgConfig_FOUND) - pkg_check_modules(SDFTD3 QUIET "s-dftd3") -else() - set(SDFTD3_FOUND OFF) -endif() -if(SDFTD3_FOUND) - message(STATUS "Found s-dftd3 via pkg-config") - - add_library("s-dftd3::s-dftd3" INTERFACE IMPORTED) - target_link_libraries( - "s-dftd3::s-dftd3" - INTERFACE - "${SDFTD3_LINK_LIBRARIES}" - ) - target_include_directories( - "s-dftd3::s-dftd3" - INTERFACE - "${SDFTD3_INCLUDE_DIRS}" - ) -else() - include(FetchContent) - - message(STATUS "Could not find s-dftd3... Building s-dftd3 from source") - message(STATUS "S-DFTD3 URL: ${Skala_SDFTD3_URL}") - - set("s-dftd3-dependency-method" "subproject" CACHE STRING "Method to acquire s-dftd3 dependencies" FORCE) - - FetchContent_Declare( - sdftd3 - URL ${Skala_SDFTD3_URL} - URL_HASH SHA256=${Skala_SDFTD3_SHA256} - DOWNLOAD_EXTRACT_TIMESTAMP ON - ) - FetchContent_MakeAvailable(sdftd3) - - if(NOT TARGET "s-dftd3::s-dftd3") - add_library("s-dftd3::s-dftd3" INTERFACE IMPORTED) - target_link_libraries( - "s-dftd3::s-dftd3" - INTERFACE - s-dftd3 - ) - endif() -endif() \ No newline at end of file diff --git a/gauxc/examples/fortran/gauxc_integration/.gitignore b/gauxc/examples/fortran/gauxc_integration/.gitignore deleted file mode 100644 index 07b9832e..00000000 --- a/gauxc/examples/fortran/gauxc_integration/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -*build/ -*.tar.gz -*.fun diff --git a/gauxc/examples/fortran/gauxc_integration/CMakeLists.txt b/gauxc/examples/fortran/gauxc_integration/CMakeLists.txt deleted file mode 100644 index 47f4ea43..00000000 --- a/gauxc/examples/fortran/gauxc_integration/CMakeLists.txt +++ /dev/null @@ -1,52 +0,0 @@ -cmake_minimum_required(VERSION 3.20 FATAL_ERROR) - -# Enable C/C++ first so conda's compiler wrappers lead CMake to the matching -# gfortran instead of the system f95, whose module format may be incompatible. -project("Skala" LANGUAGES C CXX Fortran) - -include(GNUInstallDirs) -include(FetchContent) -set(FETCHCONTENT_UPDATES_DISCONNECTED ON CACHE BOOL "Disable FC Updates") - -list(PREPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) - -option(Skala_GauXC_ENABLE_OPENMP "Enable OpenMP support in GauXC" ON) -option(Skala_GauXC_ENABLE_MPI "Enable MPI support in GauXC" OFF) -option(Skala_GauXC_ENABLE_CUDA "Enable CUDA support in GauXC" OFF) - -include(skala-dep-versions) -include(skala-hdf5) -include(skala-gauxc) -include(skala-flap) - -add_executable( - "${PROJECT_NAME}" - "app/main.F90" -) -# GauXC links to C++ libraries such as LibTorch, so use the C++ driver while -# CMake adds the Fortran runtime required by this target's Fortran source. -set_property(TARGET "${PROJECT_NAME}" PROPERTY LINKER_LANGUAGE CXX) -target_link_libraries( - "${PROJECT_NAME}" - PRIVATE - gauxc::gauxc - FLAP::FLAP - HDF5::HDF5 -) -if(GAUXC_HAS_MPI) - find_package(MPI REQUIRED) - target_link_libraries( - "${PROJECT_NAME}" - PRIVATE - MPI::MPI_Fortran - ) -endif() - -install( - TARGETS - "${PROJECT_NAME}" - DESTINATION - "${CMAKE_INSTALL_BINDIR}" -) - -list(REMOVE_AT CMAKE_MODULE_PATH 0) diff --git a/gauxc/examples/fortran/gauxc_integration/app/main.F90 b/gauxc/examples/fortran/gauxc_integration/app/main.F90 deleted file mode 100644 index 9b1703eb..00000000 --- a/gauxc/examples/fortran/gauxc_integration/app/main.F90 +++ /dev/null @@ -1,388 +0,0 @@ -#include "gauxc/gauxc_config.f" - -program skala - use iso_c_binding, only : c_int, c_int64_t, c_double, c_bool - use flap, only : command_line_interface - use gauxc_status, only : gauxc_status_type, gauxc_status_message - use gauxc_enums, only : gauxc_executionspace, gauxc_radialquad, & - & gauxc_atomicgridsizedefault, gauxc_pruningscheme - use gauxc_runtime_environment, only : gauxc_runtime_environment_type, & - & gauxc_runtime_environment_comm_rank, gauxc_runtime_environment_comm_size, & - & gauxc_runtime_environment_new, gauxc_delete - use gauxc_molecule, only : gauxc_molecule_type, gauxc_molecule_new, gauxc_delete - use gauxc_basisset, only : gauxc_basisset_type, gauxc_basisset_new, gauxc_delete - use gauxc_molgrid, only : gauxc_molgrid_type, gauxc_molgrid_new_default, & - & gauxc_delete - use gauxc_load_balancer, only : gauxc_load_balancer_type, gauxc_load_balancer_factory_type, & - & gauxc_load_balancer_factory_new, gauxc_get_instance, gauxc_delete - use gauxc_molecular_weights, only : gauxc_molecular_weights_type, & - & gauxc_molecular_weights_factory_type, gauxc_molecular_weights_factory_new, & - & gauxc_molecular_weights_modify_weights, gauxc_get_instance, gauxc_delete, & - & gauxc_molecular_weights_settings - use gauxc_xc_functional, only : gauxc_functional_type, gauxc_functional_from_string, gauxc_delete - use gauxc_integrator, only : gauxc_integrator_type, gauxc_integrator_new, & - & gauxc_eval_exc_vxc, gauxc_delete - use gauxc_external_hdf5_read, only : gauxc_read_hdf5_record -#ifdef GAUXC_HAS_MPI - use mpi -#endif - - implicit none(type, external) - - type(gauxc_status_type) :: status - type(gauxc_runtime_environment_type) :: rt - type(gauxc_molecule_type) :: mol - type(gauxc_basisset_type) :: basis - type(gauxc_molgrid_type) :: grid - type(gauxc_load_balancer_factory_type) :: lbf - type(gauxc_load_balancer_type) :: lb - type(gauxc_molecular_weights_factory_type) :: mwf - type(gauxc_molecular_weights_type) :: mw - type(gauxc_functional_type) :: func - type(gauxc_integrator_type) :: integrator - real(c_double), allocatable :: p_s(:,:), p_z(:,:), vxc_s(:,:), vxc_z(:,:) - - character(len=:), allocatable :: input_file, model, grid_spec, rad_quad_spec, prune_spec, & - & lb_exec_space_str, int_exec_space_str - integer(c_int) :: grid_type, radial_quad, pruning_scheme - integer(c_int) :: lb_exec_space, int_exec_space - integer(c_int) :: world_rank, world_size - integer(c_int64_t) :: batch_size - real(c_double) :: exc, t_exc, t_start, t_end - type(command_line_interface) :: cli - integer :: error - -#ifdef GAUXC_HAS_MPI - call MPI_Init(error) -#endif - - grid_spec = "fine" - rad_quad_spec = "muraknowles" - prune_spec = "robust" - lb_exec_space_str = "host" - int_exec_space_str = "host" - batch_size = 512_c_int64_t - - input: block - character(len=512) :: dummy - call cli%init(description="Driver for using Skala") - call cli%add(position=1, required=.true., act="store", error=error, positional=.true., & - & help="Input HDF5 file containing molecule, basis set and density matrix") - if (error /= 0) exit input - call cli%add(switch="--model", required=.true., act="store", error=error, & - & help="Model to use for the calculation") - if (error /= 0) exit input - call cli%add(switch="--grid", act="store", error=error, def=grid_spec, required=.false., & - & help="Molecular grid specification", choices="fine,ultrafine,superfine,gm3,gm5") - if (error /= 0) exit input - call cli%add(switch="--radial-quadrature", act="store", error=error, def=rad_quad_spec, & - & help="Radial quadrature to use", choices="becke,muraknowles,treutlerahlrichs,murrayhandylaming") - if (error /= 0) exit input - call cli%add(switch="--pruning-scheme", act="store", error=error, def=prune_spec, & - & help="Pruning scheme to use", choices="unpruned,robust,treutler") - if (error /= 0) exit input - call cli%add(switch="--lb-exec-space", act="store", error=error, def=lb_exec_space_str, & - & help="Execution space for load balancer", choices="host,device") - if (error /= 0) exit input - call cli%add(switch="--int-exec-space", act="store", error=error, def=int_exec_space_str, & - & help="Execution space for integrator", choices="host,device") - if (error /= 0) exit input - call cli%add(switch="--batch-size", act="store", error=error, def="512", & - & help="Batch size for grid point processing") - if (error /= 0) exit input - - call cli%parse(error=error) - if (error /= 0) exit input - - call cli%get(position=1, val=dummy, error=error) - input_file = trim(dummy) - if (error /= 0) exit input - call cli%get(switch="--model", val=dummy, error=error) - model = trim(dummy) - if (error /= 0) exit input - if (cli%is_passed(switch="--grid")) then - call cli%get(switch="--grid", val=dummy, error=error) - if (error /= 0) exit input - grid_spec = trim(dummy) - end if - if (cli%is_passed(switch="--radial-quadrature")) then - call cli%get(switch="--radial-quadrature", val=dummy, error=error) - if (error /= 0) exit input - rad_quad_spec = trim(dummy) - end if - if (cli%is_passed(switch="--pruning-scheme")) then - call cli%get(switch="--pruning-scheme", val=dummy, error=error) - if (error /= 0) exit input - prune_spec = trim(dummy) - end if - if (cli%is_passed(switch="--lb-exec-space")) then - call cli%get(switch="--lb-exec-space", val=dummy, error=error) - if (error /= 0) exit input - lb_exec_space_str = trim(dummy) - end if - if (cli%is_passed(switch="--int-exec-space")) then - call cli%get(switch="--int-exec-space", val=dummy, error=error) - if (error /= 0) exit input - int_exec_space_str = trim(dummy) - end if - if (cli%is_passed(switch="--batch-size")) then - call cli%get(switch="--batch-size", val=batch_size, error=error) - if (error /= 0) exit input - end if - end block input - if (error /= 0) then - print '(a)', cli%error_message -#ifdef GAUXC_HAS_MPI - call MPI_Abort(MPI_COMM_WORLD, 1, error) -#else - stop 1 -#endif - end if - -#ifdef GAUXC_HAS_MPI - call MPI_Barrier(MPI_COMM_WORLD, error) -#endif - - main: block - ! Create runtime -#ifdef GAUXC_HAS_MPI - rt = gauxc_runtime_environment_new(status, MPI_COMM_WORLD) -#else - rt = gauxc_runtime_environment_new(status) -#endif - if (status%code /= 0) exit main - world_rank = gauxc_runtime_environment_comm_rank(status, rt) - if (status%code /= 0) exit main - world_size = gauxc_runtime_environment_comm_size(status, rt) - if (status%code /= 0) exit main - - if (world_rank == 0) then - print '(a)', & - & "Configuration", & - & "-> Input file : "//input_file, & - & "-> Model : "//model, & - & "-> Grid : "//grid_spec, & - & "-> Radial quadrature : "//rad_quad_spec, & - & "-> Pruning scheme : "//prune_spec, & - & "" - end if - - ! Get molecule (atomic numbers and cartesian coordinates) - mol = gauxc_molecule_new(status) - if (status%code /= 0) exit main - ! Load molecule from HDF5 dataset - call gauxc_read_hdf5_record(status, mol, input_file, "/MOLECULE") - if (status%code /= 0) exit main - - ! Get basis set - basis = gauxc_basisset_new(status) - if (status%code /= 0) exit main - ! Load basis set from HDF5 dataset - call gauxc_read_hdf5_record(status, basis, input_file, "/BASIS") - if (status%code /= 0) exit main - - ! Define molecular grid from grid size, radial quadrature and pruning scheme - grid_type = read_atomic_grid_size(grid_spec) - radial_quad = read_radial_quad(rad_quad_spec) - pruning_scheme = read_pruning_scheme(prune_spec) - grid = gauxc_molgrid_new_default(status, mol, pruning_scheme, batch_size, radial_quad, grid_type) - if (status%code /= 0) exit main - - ! Choose whether we run on host or device - lb_exec_space = read_execution_space(lb_exec_space_str) - int_exec_space = read_execution_space(int_exec_space_str) - - ! Setup load balancer based on molecule, grid and basis set - lbf = gauxc_load_balancer_factory_new(status, lb_exec_space, "Replicated") - if (status%code /= 0) exit main - lb = gauxc_get_instance(status, lbf, rt, mol, grid, basis) - if (status%code /= 0) exit main - - ! Apply partitioning weights to the molecule grid - mwf = gauxc_molecular_weights_factory_new(status, int_exec_space) - if (status%code /= 0) exit main - mw = gauxc_get_instance(status, mwf) - if (status%code /= 0) exit main - call gauxc_molecular_weights_modify_weights(status, mw, lb) - if (status%code /= 0) exit main - - ! Setup exchange-correlation integrator - func = gauxc_functional_from_string(status, "PBE", .true._c_bool) - integrator = gauxc_integrator_new(status, func, lb, int_exec_space) - if (status%code /= 0) exit main - - ! Load density matrix from input - call read_matrix_from_hdf5_record(status, p_s, input_file, "/DENSITY_SCALAR") - if (status%code /= 0) exit main - call read_matrix_from_hdf5_record(status, p_z, input_file, "/DENSITY_Z") - if (status%code /= 0) exit main - -#ifdef GAUXC_HAS_MPI - call MPI_Barrier(MPI_COMM_WORLD, error) -#endif - t_start = timing() - - ! Integrate exchange-correlation energy - allocate(vxc_s(size(p_s,1), size(p_s,2))) - allocate(vxc_z(size(p_z,1), size(p_z,2))) - call gauxc_eval_exc_vxc(status, integrator, p_s, p_z, model, exc, vxc_s, vxc_z) - if (status%code /= 0) exit main - -#ifdef GAUXC_HAS_MPI - call MPI_Barrier(MPI_COMM_WORLD, error) -#endif - t_end = timing() - t_exc = t_end - t_start - - if (world_rank == 0) then - print '(a)', "Results" - print '(a,1x,es17.10,:1x,a)', "Exc =", exc, "Eh" - print '(a,1x,es17.10,:1x,a)', "|VXC(a+b)|_F =", sqrt(sum(vxc_s**2)) - print '(a,1x,es17.10,:1x,a)', "|VXC(a-b)|_F =", sqrt(sum(vxc_z**2)) - print '(a,1x,es17.10,:1x,a)', "Runtime XC =", t_exc - end if - - end block main - if (world_rank == 0 .and. status%code /= 0) then - print '(a,1x,i0)', "GauXC returned with status code", status%code - print '(a)', gauxc_status_message(status) - end if - - call gauxc_delete(status, rt) - call gauxc_delete(status, mol) - call gauxc_delete(status, basis) - call gauxc_delete(status, grid) - call gauxc_delete(status, lbf) - call gauxc_delete(status, lb) - call gauxc_delete(status, mwf) - call gauxc_delete(status, mw) - call gauxc_delete(status, func) - call gauxc_delete(status, integrator) - -#ifdef GAUXC_HAS_MPI - call MPI_Finalize(error) -#endif - -contains - - pure function read_execution_space(spec) result(val) - character(len=*), intent(in) :: spec - integer(c_int) :: val - select case(spec) - case("host") - val = gauxc_executionspace%host - case("device") - val = gauxc_executionspace%device - end select - end function read_execution_space - - pure function read_atomic_grid_size(spec) result(val) - character(len=*), intent(in) :: spec - integer(c_int) :: val - select case(spec) - case("fine") - val = gauxc_atomicgridsizedefault%finegrid - case("ultrafine") - val = gauxc_atomicgridsizedefault%ultrafinegrid - case("superfine") - val = gauxc_atomicgridsizedefault%superfinegrid - case("gm3") - val = gauxc_atomicgridsizedefault%gm3 - case("gm5") - val = gauxc_atomicgridsizedefault%gm5 - end select - end function read_atomic_grid_size - - pure function read_radial_quad(spec) result(val) - character(len=*), intent(in) :: spec - integer(c_int) :: val - select case(spec) - case("becke") - val = gauxc_radialquad%becke - case("muraknowles") - val = gauxc_radialquad%mura_knowles - case("treutlerahlrichs") - val = gauxc_radialquad%treutler_ahlrichs - case("murrayhandylaming") - val = gauxc_radialquad%murray_handy_laming - end select - end function read_radial_quad - - pure function read_pruning_scheme(spec) result(val) - character(len=*), intent(in) :: spec - integer(c_int) :: val - select case(spec) - case("unpruned") - val = gauxc_pruningscheme%unpruned - case("robust") - val = gauxc_pruningscheme%robust - case("treutler") - val = gauxc_pruningscheme%treutler - end select - end function read_pruning_scheme - - subroutine read_matrix_from_hdf5_record(status, mat, file, dataset) - use hdf5, only : hid_t, hsize_t, H5F_ACC_RDONLY_F, H5T_NATIVE_DOUBLE, & - & h5open_f, h5close_f, h5fopen_f, h5dopen_f, h5dget_space_f, & - & h5sget_simple_extent_dims_f, h5dread_f, h5fclose_f, h5dclose_f, h5sclose_f - type(gauxc_status_type), intent(out) :: status - real(c_double), allocatable :: mat(:,:) - character(len=*), intent(in) :: file, dataset - - logical :: file_opened, dataset_opened, dataspace_obtained - integer(hid_t) :: file_id, dataset_id, dataspace_id - integer :: hdf5_status - integer(hsize_t), dimension(2) :: dims, maxdims - - file_opened = .false. - dataset_opened = .false. - dataspace_obtained = .false. - status%code = 0 - - h5: block - ! Initialize HDF5 Fortran interface - call h5open_f(hdf5_status) - if (hdf5_status < 0) exit h5 - - ! Open the HDF5 file and dataset - call h5fopen_f(trim(file), H5F_ACC_RDONLY_F, file_id, hdf5_status) - if (hdf5_status < 0) exit h5 - file_opened = .true. - - call h5dopen_f(file_id, trim(dataset), dataset_id, hdf5_status) - if (hdf5_status < 0) exit h5 - dataset_opened = .true. - - call h5dget_space_f(dataset_id, dataspace_id, hdf5_status) - if (hdf5_status < 0) exit h5 - dataspace_obtained = .true. - - ! Get the dimensions of the dataset - call h5sget_simple_extent_dims_f(dataspace_id, dims, maxdims, hdf5_status) - if (hdf5_status < 0) exit h5 - - ! Allocate the matrix and read the data - allocate(mat(dims(1), dims(2))) - call h5dread_f(dataset_id, H5T_NATIVE_DOUBLE, mat, dims, hdf5_status) - if (hdf5_status < 0) exit h5 - end block h5 - - if (hdf5_status < 0) then - status%code = 1 - if (allocated(mat)) deallocate(mat) - end if - - ! Close HDF5 resources (reverse order) - if (dataspace_obtained) call h5sclose_f(dataspace_id, hdf5_status) - if (dataset_opened) call h5dclose_f(dataset_id, hdf5_status) - if (file_opened) call h5fclose_f(file_id, hdf5_status) - call h5close_f(hdf5_status) - end subroutine read_matrix_from_hdf5_record - - function timing() result(time) - real(c_double) :: time - integer(c_int64_t) :: time_count, time_rate, time_max - call system_clock(time_count, time_rate, time_max) - time = real(time_count, c_double) / real(time_rate, c_double) - end function timing -end program skala \ No newline at end of file diff --git a/gauxc/examples/fortran/gauxc_integration/cmake/skala-dep-versions.cmake b/gauxc/examples/fortran/gauxc_integration/cmake/skala-dep-versions.cmake deleted file mode 100644 index dadc12cc..00000000 --- a/gauxc/examples/fortran/gauxc_integration/cmake/skala-dep-versions.cmake +++ /dev/null @@ -1,5 +0,0 @@ -set(Skala_GauXC_URL "https://github.com/microsoft/skala/releases/download/v1.1.1/gauxc-skala-r2.tar.gz") -set(Skala_GauXC_SHA256 "6659d00522b443f2557a960a9ba0217449d2ee25df809634d6becca23eb0f1ff") - -set(Skala_FLAP_URL "https://github.com/szaghi/FLAP/releases/download/v1.2.5/FLAP.tar.gz") -set(Skala_FLAP_SHA256 "f2a388898a1ee49a8559822280647eb112d884484cb6169710011daab6dbb501") diff --git a/gauxc/examples/fortran/gauxc_integration/cmake/skala-flap.cmake b/gauxc/examples/fortran/gauxc_integration/cmake/skala-flap.cmake deleted file mode 100644 index b6b93a65..00000000 --- a/gauxc/examples/fortran/gauxc_integration/cmake/skala-flap.cmake +++ /dev/null @@ -1,31 +0,0 @@ -if(NOT DEFINED Skala_FLAP_URL) - include(skala-dep-versions) -endif() -find_package(FLAP QUIET CONFIG) -if(NOT FLAP_FOUND) - include(FetchContent) - - message(STATUS "Could not find FLAP... Building FLAP from source") - message(STATUS "FLAP URL: ${Skala_FLAP_URL}") - - FetchContent_Declare( - flap - URL ${Skala_FLAP_URL} - URL_HASH SHA256=${Skala_FLAP_SHA256} - DOWNLOAD_EXTRACT_TIMESTAMP ON - ) - FetchContent_MakeAvailable(flap) - - # FLAP exports these generated module paths before its build creates them. - file(MAKE_DIRECTORY - "${flap_BINARY_DIR}/modules" - "${flap_BINARY_DIR}/src/third_party/FACE/modules" - "${flap_BINARY_DIR}/src/third_party/PENF/modules" - "${flap_BINARY_DIR}/src/third_party/fortran_tester/modules" - ) -endif() - -if(NOT TARGET FLAP::FLAP) - add_library(FLAP::FLAP INTERFACE IMPORTED) - target_link_libraries(FLAP::FLAP INTERFACE FLAP) -endif() diff --git a/gauxc/examples/fortran/gauxc_integration/cmake/skala-gauxc.cmake b/gauxc/examples/fortran/gauxc_integration/cmake/skala-gauxc.cmake deleted file mode 100644 index a540240a..00000000 --- a/gauxc/examples/fortran/gauxc_integration/cmake/skala-gauxc.cmake +++ /dev/null @@ -1,49 +0,0 @@ -if(NOT DEFINED Skala_GauXC_URL) - include(skala-dep-versions) -endif() -find_package(gauxc QUIET CONFIG) -if(NOT gauxc_FOUND) - include(FetchContent) - - message(STATUS "Could not find GauXC... Building GauXC from source") - message(STATUS "GAUXC URL: ${Skala_GauXC_URL}") - - set(GAUXC_ENABLE_ONEDFT ON CACHE BOOL "" FORCE) - set(GAUXC_ENABLE_C ON CACHE BOOL "" FORCE) - set(GAUXC_ENABLE_FORTRAN ON CACHE BOOL "" FORCE) - set(GAUXC_ENABLE_TESTS OFF CACHE BOOL "" FORCE) - set(GAUXC_ENABLE_HDF5 ON CACHE BOOL "" FORCE) - set(GAUXC_ENABLE_OPENMP ${Skala_GauXC_ENABLE_OPENMP} CACHE BOOL "" FORCE) - set(GAUXC_ENABLE_MPI ${Skala_GauXC_ENABLE_MPI} CACHE BOOL "" FORCE) - set(GAUXC_ENABLE_CUDA ${Skala_GauXC_ENABLE_CUDA} CACHE BOOL "" FORCE) - - FetchContent_Declare( - gauxc - URL ${Skala_GauXC_URL} - # URL_HASH SHA256=${Skala_GauXC_SHA256} - DOWNLOAD_EXTRACT_TIMESTAMP ON - ) - FetchContent_MakeAvailable(gauxc) - -endif() -if(NOT GAUXC_HAS_ONEDFT) - message(FATAL_ERROR "GauXC found but without Skala support enabled") -endif() -if(NOT GAUXC_HAS_C) - message(FATAL_ERROR "GauXC found but without C API support enabled") -endif() -if(NOT GAUXC_HAS_FORTRAN) - message(FATAL_ERROR "GauXC found but without Fortran API support enabled") -endif() -if(NOT GAUXC_HAS_HDF5) - message(FATAL_ERROR "GauXC found but without HDF5 support enabled") -endif() -if(Skala_GauXC_ENABLE_OPENMP AND NOT GAUXC_HAS_OPENMP) - message(FATAL_ERROR "GauXC found without OpenMP support but Skala_GauXC_ENABLE_OPENMP is ON") -endif() -if(Skala_GauXC_ENABLE_MPI AND NOT GAUXC_HAS_MPI) - message(FATAL_ERROR "GauXC found without MPI support but Skala_GauXC_ENABLE_MPI is ON") -endif() -if(Skala_GauXC_ENABLE_CUDA AND NOT GAUXC_HAS_CUDA) - message(FATAL_ERROR "GauXC found without CUDA support but Skala_GauXC_ENABLE_CUDA is ON") -endif() diff --git a/gauxc/examples/fortran/gauxc_integration/cmake/skala-hdf5.cmake b/gauxc/examples/fortran/gauxc_integration/cmake/skala-hdf5.cmake deleted file mode 100644 index d78ee052..00000000 --- a/gauxc/examples/fortran/gauxc_integration/cmake/skala-hdf5.cmake +++ /dev/null @@ -1 +0,0 @@ -find_package(HDF5 REQUIRED COMPONENTS Fortran HL) \ No newline at end of file diff --git a/gauxc/src/skala_gauxc/__init__.py b/gauxc/src/skala_gauxc/__init__.py deleted file mode 100644 index 7a475364..00000000 --- a/gauxc/src/skala_gauxc/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -"""Utilities for integrating Skala with GauXC.""" - -from skala_gauxc.export import pyscf_to_gauxc_h5, write_gauxc_h5_from_pyscf - -__all__ = ["pyscf_to_gauxc_h5", "write_gauxc_h5_from_pyscf"] diff --git a/gauxc/src/skala_gauxc/export.py b/gauxc/src/skala_gauxc/export.py deleted file mode 100644 index 5ecdfef1..00000000 --- a/gauxc/src/skala_gauxc/export.py +++ /dev/null @@ -1,163 +0,0 @@ -from typing import Any - -import h5py -import numpy as np - -from pyscf import gto - -MOLECULE_DTYPE = { - "names": ["Atomic Number", "X Coordinate", "Y Coordinate", "Z Coordinate"], - "formats": [" None: - data = pyscf_to_gauxc_h5(mol, dm, exc, vxc) - with h5py.File(filename, "w") as fd: - for key, value in data.items(): - fd.create_dataset(key, data=value) - - -def pyscf_to_gauxc_h5( - mol: gto.Mole, - dm: np.ndarray, - exc: float | None = None, - vxc: np.ndarray | None = None, -) -> dict[str, np.ndarray]: - molecule = np.array( - [ - (number, *coords) - for number, coords in zip( - mol.atom_charges(), mol.atom_coords(unit="Bohr"), strict=True - ) - ], - dtype=MOLECULE_DTYPE, # type: ignore[call-overload] # numpy structured dtype - ) - basis = np.array( - [ - format_basis( - func[0], - mol.cart, - [pair[0] for pair in func[1:]], - [pair[prim] for pair in func[1:]], - coord, - ) - for atom, coord in mol._atom - for func in mol._basis[atom] - for prim in range(1, len(func[1])) - ], - dtype=BASIS_DTYPE, # type: ignore[call-overload] # numpy structured dtype - ) - dm_scalar = dm if dm.ndim == 2 else dm[0] + dm[1] - dm_z = np.zeros_like(dm) if dm.ndim == 2 else dm[0] - dm[1] - - data = { - "MOLECULE": molecule, - "BASIS": basis, - "DENSITY_SCALAR": dm_scalar, - "DENSITY_Z": dm_z, - } - - if exc is not None: - data["EXC"] = exc - if vxc is not None: - vxc_scalar = vxc if vxc.ndim == 2 else vxc[0] + vxc[1] - vxc_z = np.zeros_like(vxc) if vxc.ndim == 2 else vxc[0] - vxc[1] - data["VXC_SCALAR"] = vxc_scalar - data["VXC_Z"] = vxc_z - - return data - - -def norm( - coeff: list[float] | np.ndarray, alpha: list[float] | np.ndarray, l: int -) -> list[float]: - """ - Normalize contraction coefficients for a given angular momentum and exponents - using libint normalization conventions. - """ - alpha = np.asarray(alpha) - two_alpha = 2 * alpha - two_alpha_to_am32 = two_alpha ** (l + 1) * np.sqrt(two_alpha) - normalization_factor: np.ndarray[Any, np.dtype[np.float64]] = np.sqrt( - 2**l * two_alpha_to_am32 / (SQRT_PI_CUBED * K_MINUS_1[2 * l]) - ) - gamma = alpha[:, np.newaxis] + alpha[np.newaxis, :] - aa = K_MINUS_1[2 * l] * SQRT_PI_CUBED / (2**l * gamma ** (l + 1) * np.sqrt(gamma)) - coeff_array = np.asarray(coeff) * normalization_factor - normalization_factor = 1.0 / np.sqrt( - np.einsum("i,j,ij->", coeff_array, coeff_array, aa) - ) - raw_result: list[float] = (coeff_array * normalization_factor).tolist() - return raw_result - - -def format_basis( - l: int, - cart: bool, - alpha: list[float], - coeff: list[float], - coord: list[float], - padv: float = 0.0, - padl: int = 16, -) -> tuple[int, int, int, list[float], list[float], list[float]]: - return ( - len(alpha), - l, - 0 if cart or l == 1 else 1, - alpha + [padv] * (padl - len(alpha)), - norm(coeff, alpha, l) + [padv] * (padl - len(coeff)), - coord, - ) diff --git a/gauxc/tests/test_gauxc_export.py b/gauxc/tests/test_gauxc_export.py deleted file mode 100644 index ba2a6162..00000000 --- a/gauxc/tests/test_gauxc_export.py +++ /dev/null @@ -1,90 +0,0 @@ -from tempfile import NamedTemporaryFile -from typing import cast - -import h5py -import numpy as np -import pytest -from skala_gauxc import write_gauxc_h5_from_pyscf - -from pyscf import dft, gto - - -@pytest.fixture(params=["He", "Li"]) -def mol_name(request: pytest.FixtureRequest) -> str: - return cast(str, request.param) - - -@pytest.fixture -def basis() -> str: - return "def2-svp" - - -@pytest.fixture(params=["cart", "sph"]) -def cartesian(request: pytest.FixtureRequest) -> bool: - return cast(str, request.param) == "cart" - - -@pytest.fixture -def mol(mol_name: str, basis: str, cartesian: bool) -> gto.Mole: - match mol_name: - case "He": - return gto.M( - atom="He 0 0 0", basis=basis, cart=cartesian, unit="Bohr", spin=0 - ) - case "Li": - return gto.M( - atom="Li 0 0 0", basis=basis, cart=cartesian, unit="Bohr", spin=1 - ) - case _: - raise ValueError(f"Unknown molecule name: {mol_name}") - - -@pytest.fixture -def ks(mol: gto.Mole) -> dft.rks.RKS: - ks = dft.KS(mol, xc="pbe") - ks.kernel() - return ks - - -@pytest.fixture -def dm(ks: dft.rks.RKS) -> np.ndarray: - result = ks.make_rdm1() - assert isinstance(result, np.ndarray) - return result - - -@pytest.fixture -def exc(ks: dft.rks.RKS) -> float: - result = ks.scf_summary["exc"] - assert isinstance(result, float) - return result - - -@pytest.fixture -def vxc(ks: dft.rks.RKS, dm: np.ndarray) -> np.ndarray: - if dm.ndim == 2: - _, _, vxc = ks._numint.nr_rks(ks.mol, ks.grids, ks.xc, dm) - else: - _, _, vxc = ks._numint.nr_uks(ks.mol, ks.grids, ks.xc, dm) - assert isinstance(vxc, np.ndarray) - return vxc - - -def test_write_pyscf( - mol: gto.Mole, dm: np.ndarray, exc: float, vxc: np.ndarray -) -> None: - with NamedTemporaryFile(suffix=".h5") as tmp: - write_gauxc_h5_from_pyscf(tmp.name, mol, dm, exc, vxc) - - with h5py.File(tmp.name, "r") as h5: - assert "MOLECULE" in h5, "Molecule is missing in h5 export" - assert "BASIS" in h5, "Basis is missing in h5 export" - assert "DENSITY_SCALAR" in h5, "Density (a+b) is missing in h5 export" - assert "DENSITY_Z" in h5, "Density (a-b) is missing in h5 export" - assert "EXC" in h5, "Exchange-correlation energy is missing in h5 export" - assert "VXC_SCALAR" in h5, ( - "Exchange-correlation potential (a+b) is missing in h5 export" - ) - assert "VXC_Z" in h5, ( - "Exchange-correlation potential (a-b) is missing in h5 export" - ) From 99d7efd1dc22ec28dc6fc1abea298283899a7c87 Mon Sep 17 00:00:00 2001 From: jenswehner Date: Fri, 4 Sep 2026 11:35:57 +0200 Subject: [PATCH 02/33] Bootstrap SkalaXC dependencies --- .gitmodules | 3 + SkalaXC/.gitignore | 3 + SkalaXC/cmake/skalaxc-gauxc.cmake | 358 ++++++++++++++++++ SkalaXC/cmake/skalaxc-models.cmake | 78 ++++ SkalaXC/cmake/skalaxc-skala.cmake | 157 ++++++++ SkalaXC/external/GauXC | 1 + SkalaXC/include/skalaxc/skalaxc_config.hpp.in | 23 ++ SkalaXC/pixi.toml | 11 + 8 files changed, 634 insertions(+) create mode 100644 .gitmodules create mode 100644 SkalaXC/.gitignore create mode 100644 SkalaXC/cmake/skalaxc-gauxc.cmake create mode 100644 SkalaXC/cmake/skalaxc-models.cmake create mode 100644 SkalaXC/cmake/skalaxc-skala.cmake create mode 160000 SkalaXC/external/GauXC create mode 100644 SkalaXC/include/skalaxc/skalaxc_config.hpp.in create mode 100644 SkalaXC/pixi.toml diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..3c26e180 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "SkalaXC/external/GauXC"] + path = SkalaXC/external/GauXC + url = https://github.com/wavefunction91/GauXC.git diff --git a/SkalaXC/.gitignore b/SkalaXC/.gitignore new file mode 100644 index 00000000..c7efd82c --- /dev/null +++ b/SkalaXC/.gitignore @@ -0,0 +1,3 @@ +build/ +build-*/ +install-*/ diff --git a/SkalaXC/cmake/skalaxc-gauxc.cmake b/SkalaXC/cmake/skalaxc-gauxc.cmake new file mode 100644 index 00000000..27ba23d5 --- /dev/null +++ b/SkalaXC/cmake/skalaxc-gauxc.cmake @@ -0,0 +1,358 @@ +# skalaxc-gauxc.cmake +# +# Brings in an UNMODIFIED GauXC master source tree as a build-tree dependency so +# SkalaXC can reuse GauXC's internal components (LocalWorkDriver, LoadBalancer, +# MolecularWeights, collocation, HDF5 I/O, ...). +# +# GauXC is vendored as a git submodule at SkalaXC/external/GauXC, pinned to the +# exact commit the ML port was validated against. Initialize it with: +# git submodule update --init SkalaXC/external/GauXC +# +# GauXC's `gauxc` target publishes ${GauXC}/src on its PUBLIC BUILD_INTERFACE +# include path, so a source-tree (add_subdirectory) build is what grants SkalaXC +# access to GauXC's private headers. An installed GauXC would NOT expose them -- +# that is intentional: SkalaXC only reuses internals, it never ships them. +# +# GauXC is never modified. All SkalaXC-specific code lives under skala/SkalaXC. + +# Path to the GauXC master source tree. Defaults to the bundled submodule; can +# be overridden to point at an existing checkout. +set(SKALAXC_GAUXC_SOURCE_DIR "${PROJECT_SOURCE_DIR}/external/GauXC" + CACHE PATH "Path to an unmodified GauXC master source tree") + +# Resolved path to GauXC test fixtures used by SkalaXC integration tests. +# This may differ from SKALAXC_GAUXC_SOURCE_DIR when GauXC is acquired through +# FetchContent fallback. +set(SKALAXC_GAUXC_REF_DATA_DIR "${SKALAXC_GAUXC_SOURCE_DIR}/tests/ref_data" + CACHE PATH "Path to GauXC reference fixture directory") + +# Commit the submodule is pinned to; also used to pin the FetchContent fallback +# so both acquisition paths yield an identical, reproducible GauXC. +set(SKALAXC_GAUXC_GIT_TAG "554bef7495b2a93f16a2fdedabf4e1cdcb3a1faf" + CACHE STRING "GauXC commit to use when fetching (fallback only)") + +# GauXC build options. Master has no ONEDFT/skala option -- SkalaXC provides the +# ML functional itself. Match GauXC's HDF5 support to the public SkalaXC option +# because the SkalaXC molecule and basis readers reuse GauXC's implementation. +set(GAUXC_ENABLE_TESTS OFF CACHE BOOL "" FORCE) +set(GAUXC_ENABLE_C OFF CACHE BOOL "" FORCE) +set(GAUXC_ENABLE_HDF5 ${SKALAXC_ENABLE_HDF5} CACHE BOOL "" FORCE) +set(GAUXC_ENABLE_OPENMP ${SKALAXC_ENABLE_OPENMP} CACHE BOOL "" FORCE) +set(GAUXC_ENABLE_MPI ${SKALAXC_ENABLE_MPI} CACHE BOOL "" FORCE) +set(GAUXC_ENABLE_CUDA ${SKALAXC_ENABLE_CUDA} CACHE BOOL "" FORCE) +set(GAUXC_ENABLE_MAGMA OFF CACHE BOOL "" FORCE) + +# GauXC currently declares HighFive with an older revision that can be slow or +# unreliable to fetch on some networks. Bootstrap a shallow clone here and +# force GauXC's FetchContent to reuse this local source tree, without modifying +# the vendored GauXC source files. +include(FetchContent) +if(SKALAXC_ENABLE_HDF5 AND + NOT DEFINED FETCHCONTENT_SOURCE_DIR_HIGHFIVE) + # Force these cache entries so existing build trees recover from stale values + # left by previous configure attempts. + set(HIGHFIVE_USE_BOOST OFF CACHE BOOL "" FORCE) + set(HIGHFIVE_UNIT_TESTS OFF CACHE STRING "" FORCE) + set(HIGHFIVE_EXAMPLES OFF CACHE BOOL "" FORCE) + set(HIGHFIVE_BUILD_DOCS OFF CACHE BOOL "" FORCE) + + FetchContent_Declare( + skalaxc_highfive_bootstrap + GIT_REPOSITORY https://github.com/highfive-devs/HighFive.git + GIT_TAG v2.9.0 + GIT_SHALLOW TRUE + GIT_PROGRESS TRUE + # Populate only; GauXC adds HighFive from this source tree below. + SOURCE_SUBDIR _skalaxc_source_only + ) + FetchContent_MakeAvailable(skalaxc_highfive_bootstrap) + set(FETCHCONTENT_SOURCE_DIR_HIGHFIVE + "${skalaxc_highfive_bootstrap_SOURCE_DIR}" + CACHE PATH + "Local HighFive source directory used by GauXC FetchContent" + FORCE) +endif() + +# GauXC transitively uses deprecated CMake APIs and fetches an older HighFive +# release whose minimum CMake version triggers a deprecation warning on CMake +# 4.x. Suppress developer and deprecation warnings only while configuring this +# external dependency tree. +if(DEFINED CACHE{CMAKE_WARN_DEPRECATED}) + set(_skalaxc_cmake_warn_deprecated_defined TRUE) + get_property(_skalaxc_cmake_warn_deprecated + CACHE CMAKE_WARN_DEPRECATED PROPERTY VALUE) +else() + set(_skalaxc_cmake_warn_deprecated_defined FALSE) +endif() +set(CMAKE_WARN_DEPRECATED OFF CACHE BOOL + "Suppress deprecation warnings while configuring GauXC dependencies" FORCE) + +if(DEFINED CACHE{CMAKE_SUPPRESS_DEVELOPER_WARNINGS}) + set(_skalaxc_cmake_suppress_developer_warnings_defined TRUE) + get_property(_skalaxc_cmake_suppress_developer_warnings + CACHE CMAKE_SUPPRESS_DEVELOPER_WARNINGS PROPERTY VALUE) +else() + set(_skalaxc_cmake_suppress_developer_warnings_defined FALSE) +endif() +set(CMAKE_SUPPRESS_DEVELOPER_WARNINGS ON CACHE BOOL + "Suppress developer warnings while configuring GauXC dependencies" FORCE) + +# LibXC resets its policy baseline to CMake 3.1, where CMP0063 is unset. +# Apply modern visibility handling only while configuring this dependency tree. +if(DEFINED CMAKE_POLICY_DEFAULT_CMP0063) + set(_skalaxc_policy_default_cmp0063_defined TRUE) + set(_skalaxc_policy_default_cmp0063 "${CMAKE_POLICY_DEFAULT_CMP0063}") +else() + set(_skalaxc_policy_default_cmp0063_defined FALSE) +endif() +set(CMAKE_POLICY_DEFAULT_CMP0063 NEW) + +# CMake 4 no longer accepts HighFive 2.9's CMake 3.1 policy baseline. +if(DEFINED CMAKE_POLICY_VERSION_MINIMUM) + set(_skalaxc_policy_version_minimum_defined TRUE) + set(_skalaxc_policy_version_minimum "${CMAKE_POLICY_VERSION_MINIMUM}") +else() + set(_skalaxc_policy_version_minimum_defined FALSE) +endif() +if(NOT DEFINED CMAKE_POLICY_VERSION_MINIMUM OR + CMAKE_POLICY_VERSION_MINIMUM VERSION_LESS 3.5) + set(CMAKE_POLICY_VERSION_MINIMUM 3.5) +endif() + +if(EXISTS "${SKALAXC_GAUXC_SOURCE_DIR}/CMakeLists.txt") + message(STATUS "SkalaXC: using GauXC source tree at ${SKALAXC_GAUXC_SOURCE_DIR}") + set(_skalaxc_gauxc_source_dir "${SKALAXC_GAUXC_SOURCE_DIR}") + set(SKALAXC_GAUXC_REF_DATA_DIR "${SKALAXC_GAUXC_SOURCE_DIR}/tests/ref_data" + CACHE PATH "Path to GauXC reference fixture directory" FORCE) + add_subdirectory( + ${SKALAXC_GAUXC_SOURCE_DIR} + ${CMAKE_BINARY_DIR}/gauxc-master + EXCLUDE_FROM_ALL + ) +else() + # The submodule has not been initialized (and no override was given). Fall back + # to fetching the pinned commit so the build still works (e.g. from a source + # tarball) -- but `git submodule update --init` is the intended path. + message(STATUS + "SkalaXC: GauXC not found at ${SKALAXC_GAUXC_SOURCE_DIR} " + "(run: git submodule update --init SkalaXC/external/GauXC). " + "Falling back to FetchContent at ${SKALAXC_GAUXC_GIT_TAG}.") + include(FetchContent) + set(FETCHCONTENT_UPDATES_DISCONNECTED ON CACHE BOOL "Disable FC Updates") + FetchContent_Declare( + gauxc + GIT_REPOSITORY https://github.com/wavefunction91/GauXC.git + GIT_TAG ${SKALAXC_GAUXC_GIT_TAG} + ) + FetchContent_MakeAvailable(gauxc) + set(_skalaxc_gauxc_source_dir "${gauxc_SOURCE_DIR}") + set(SKALAXC_GAUXC_REF_DATA_DIR "${gauxc_SOURCE_DIR}/tests/ref_data" + CACHE PATH "Path to GauXC reference fixture directory" FORCE) +endif() + +# The IntegratorXX revision pinned by GauXC uses std::back_inserter without +# including . libstdc++ currently exposes it transitively, but libc++ +# does not. Patch only the populated build-tree dependency until this is fixed +# upstream; the bundled GauXC source tree remains unmodified. +FetchContent_GetProperties(integratorxx + POPULATED _skalaxc_integratorxx_populated + SOURCE_DIR _skalaxc_integratorxx_source_dir) +if(_skalaxc_integratorxx_populated) + set(_skalaxc_integratorxx_batcher + "${_skalaxc_integratorxx_source_dir}/include/integratorxx/batch/spherical_micro_batcher.hpp") + if(EXISTS "${_skalaxc_integratorxx_batcher}") + file(READ "${_skalaxc_integratorxx_batcher}" + _skalaxc_integratorxx_batcher_contents) + if(NOT _skalaxc_integratorxx_batcher_contents MATCHES + "#include[ \t]*<[Ii][Tt][Ee][Rr][Aa][Tt][Oo][Rr]>") + string(REPLACE + "#include " + "#include \n#include " + _skalaxc_integratorxx_batcher_patched + "${_skalaxc_integratorxx_batcher_contents}") + if(_skalaxc_integratorxx_batcher_patched STREQUAL + _skalaxc_integratorxx_batcher_contents) + message(FATAL_ERROR + "Could not add the missing include to IntegratorXX") + endif() + file(WRITE "${_skalaxc_integratorxx_batcher}" + "${_skalaxc_integratorxx_batcher_patched}") + message(STATUS "SkalaXC: added missing include to IntegratorXX") + endif() + endif() +endif() +unset(_skalaxc_integratorxx_batcher) +unset(_skalaxc_integratorxx_batcher_contents) +unset(_skalaxc_integratorxx_batcher_patched) +unset(_skalaxc_integratorxx_populated) +unset(_skalaxc_integratorxx_source_dir) + +if(_skalaxc_policy_version_minimum_defined) + set(CMAKE_POLICY_VERSION_MINIMUM "${_skalaxc_policy_version_minimum}") +else() + unset(CMAKE_POLICY_VERSION_MINIMUM) +endif() +unset(_skalaxc_policy_version_minimum) +unset(_skalaxc_policy_version_minimum_defined) + +if(_skalaxc_policy_default_cmp0063_defined) + set(CMAKE_POLICY_DEFAULT_CMP0063 "${_skalaxc_policy_default_cmp0063}") +else() + unset(CMAKE_POLICY_DEFAULT_CMP0063) +endif() +unset(_skalaxc_policy_default_cmp0063) +unset(_skalaxc_policy_default_cmp0063_defined) + +if(_skalaxc_cmake_warn_deprecated_defined) + set(CMAKE_WARN_DEPRECATED "${_skalaxc_cmake_warn_deprecated}" + CACHE BOOL "Whether to issue warnings for deprecated functionality" FORCE) +else() + set(CMAKE_WARN_DEPRECATED ON CACHE BOOL + "Whether to issue warnings for deprecated functionality" FORCE) + unset(CMAKE_WARN_DEPRECATED CACHE) +endif() +unset(_skalaxc_cmake_warn_deprecated) +unset(_skalaxc_cmake_warn_deprecated_defined) + +if(_skalaxc_cmake_suppress_developer_warnings_defined) + set(CMAKE_SUPPRESS_DEVELOPER_WARNINGS + "${_skalaxc_cmake_suppress_developer_warnings}" CACHE BOOL + "Suppress CMake developer warnings" FORCE) +else() + set(CMAKE_SUPPRESS_DEVELOPER_WARNINGS OFF CACHE BOOL + "Suppress CMake developer warnings" FORCE) + unset(CMAKE_SUPPRESS_DEVELOPER_WARNINGS CACHE) +endif() +unset(_skalaxc_cmake_suppress_developer_warnings) +unset(_skalaxc_cmake_suppress_developer_warnings_defined) + +if(NOT TARGET gauxc) + message(FATAL_ERROR "SkalaXC: GauXC target `gauxc` was not created") +endif() + +# The pinned GauXC revision uses the removed C++17 `register` specifier in +# active CUDA sources and headers. Substitute patched build-tree copies until +# the fixes are available in the pinned upstream revision; never modify the +# GauXC source tree itself. +if(SKALAXC_ENABLE_CUDA) + set(_skalaxc_gauxc_kernel_dir + "${_skalaxc_gauxc_source_dir}/src/xc_integrator/local_work_driver/device/cuda/kernels") + set(_skalaxc_gauxc_patch_dir + "${CMAKE_CURRENT_BINARY_DIR}/skalaxc-gauxc-compat") + file(MAKE_DIRECTORY "${_skalaxc_gauxc_patch_dir}") + + function(_skalaxc_remove_gauxc_register file_name) + file(READ "${_skalaxc_gauxc_kernel_dir}/${file_name}" + _skalaxc_gauxc_register_contents) + string(REPLACE "register " "" + _skalaxc_gauxc_register_patched_contents + "${_skalaxc_gauxc_register_contents}") + if(_skalaxc_gauxc_register_patched_contents STREQUAL + _skalaxc_gauxc_register_contents) + message(FATAL_ERROR + "Could not apply the GauXC register-specifier compatibility patch to ${file_name}") + endif() + file(WRITE + "${_skalaxc_gauxc_patch_dir}/${file_name}" + "${_skalaxc_gauxc_register_patched_contents}") + endfunction() + + _skalaxc_remove_gauxc_register(grid_to_center.cu) + _skalaxc_remove_gauxc_register(uvvars_lda.hpp) + _skalaxc_remove_gauxc_register(uvvars_gga.hpp) + _skalaxc_remove_gauxc_register(uvvars_mgga.hpp) + + foreach(_skalaxc_gauxc_support_file IN ITEMS + cuda_extensions.hpp grid_to_center.hpp uvvars.cu) + configure_file( + "${_skalaxc_gauxc_kernel_dir}/${_skalaxc_gauxc_support_file}" + "${_skalaxc_gauxc_patch_dir}/${_skalaxc_gauxc_support_file}" + COPYONLY) + endforeach() + + get_target_property(_skalaxc_gauxc_sources gauxc SOURCES) + set(_skalaxc_gauxc_patched_sources) + set(_skalaxc_gauxc_grid_replaced FALSE) + set(_skalaxc_gauxc_uvvars_replaced FALSE) + foreach(_skalaxc_gauxc_source IN LISTS _skalaxc_gauxc_sources) + if(_skalaxc_gauxc_source MATCHES "(^|/)kernels/grid_to_center\\.cu$") + list(APPEND _skalaxc_gauxc_patched_sources + "${_skalaxc_gauxc_patch_dir}/grid_to_center.cu") + set(_skalaxc_gauxc_grid_replaced TRUE) + elseif(_skalaxc_gauxc_source MATCHES "(^|/)kernels/uvvars\\.cu$") + list(APPEND _skalaxc_gauxc_patched_sources + "${_skalaxc_gauxc_patch_dir}/uvvars.cu") + set(_skalaxc_gauxc_uvvars_replaced TRUE) + else() + list(APPEND _skalaxc_gauxc_patched_sources "${_skalaxc_gauxc_source}") + endif() + endforeach() + if(NOT _skalaxc_gauxc_grid_replaced) + message(FATAL_ERROR + "Could not locate GauXC grid_to_center.cu in the gauxc target") + endif() + if(NOT _skalaxc_gauxc_uvvars_replaced) + message(FATAL_ERROR + "Could not locate GauXC uvvars.cu in the gauxc target") + endif() + set_property(TARGET gauxc PROPERTY SOURCES "${_skalaxc_gauxc_patched_sources}") + message(STATUS + "SkalaXC: patched GauXC register specifiers in build-tree copies") + + unset(_skalaxc_gauxc_grid_replaced) + unset(_skalaxc_gauxc_kernel_dir) + unset(_skalaxc_gauxc_patch_dir) + unset(_skalaxc_gauxc_patched_sources) + unset(_skalaxc_gauxc_source) + unset(_skalaxc_gauxc_sources) + unset(_skalaxc_gauxc_support_file) + unset(_skalaxc_gauxc_uvvars_replaced) +endif() +unset(_skalaxc_gauxc_source_dir) + +# Keep warnings actionable by silencing the unmodified external GauXC target +# without affecting SkalaXC sources or consumers. +if(MSVC) + set(_skalaxc_gauxc_host_disable_warnings /w) +else() + set(_skalaxc_gauxc_host_disable_warnings -w) +endif() +target_compile_options(gauxc PRIVATE + "$<$:${_skalaxc_gauxc_host_disable_warnings}>" + "$<$:${_skalaxc_gauxc_host_disable_warnings}>" + "$<$:-w>" + "$<$:-Xcompiler=${_skalaxc_gauxc_host_disable_warnings}>" +) +unset(_skalaxc_gauxc_host_disable_warnings) + +# SkalaXC privately embeds GauXC and ExchCXX static CUDA archives in its shared +# library, so their host and device objects must be PIC. +set_target_properties(gauxc PROPERTIES POSITION_INDEPENDENT_CODE ON) +if(TARGET exchcxx) + set_target_properties(exchcxx PROPERTIES POSITION_INDEPENDENT_CODE ON) +endif() + +# Treat third-party dependency headers as system includes for downstream +# consumers to reduce warning noise from external templates. +function(_skalaxc_mark_interface_includes_system target_name) + if(NOT TARGET ${target_name}) + return() + endif() + + get_target_property(_skalaxc_iface_includes ${target_name} INTERFACE_INCLUDE_DIRECTORIES) + if(_skalaxc_iface_includes) + set_target_properties(${target_name} PROPERTIES + INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${_skalaxc_iface_includes}") + endif() +endfunction() + +_skalaxc_mark_interface_includes_system(integratorxx) +_skalaxc_mark_interface_includes_system(exchcxx) +_skalaxc_mark_interface_includes_system(gauxc) + +# Sanity: master must NOT carry the skala/onedft surface API -- SkalaXC owns that. +if(GAUXC_HAS_ONEDFT) + message(FATAL_ERROR + "SkalaXC: GauXC source tree reports GAUXC_HAS_ONEDFT. SkalaXC must build " + "against an unmodified GauXC master (no onedft/skala surface API).") +endif() diff --git a/SkalaXC/cmake/skalaxc-models.cmake b/SkalaXC/cmake/skalaxc-models.cmake new file mode 100644 index 00000000..189e9e04 --- /dev/null +++ b/SkalaXC/cmake/skalaxc-models.cmake @@ -0,0 +1,78 @@ +# Helper utilities to fetch .fun models used by SkalaXC tests/examples. +# +# Hashes below are sourced from Hugging Face model metadata (LFS sha256): +# https://huggingface.co/api/models/?blobs=true + +function(skalaxc_download_baseline_models model_dir) + if(NOT model_dir) + message(FATAL_ERROR "skalaxc_download_baseline_models requires a model directory") + endif() + + if(ARGC LESS 2) + message(FATAL_ERROR + "skalaxc_download_baseline_models requires at least one model filename") + endif() + + file(MAKE_DIRECTORY "${model_dir}") + + foreach(_model_name IN LISTS ARGN) + set(_model_path "${model_dir}/${_model_name}") + set(_remote_model_name "${_model_name}") + + if(_model_name STREQUAL "ldax.fun") + set(_repo_id "microsoft/skala-baselines") + set(_expected_sha256 "dd30928579ac970ffccc0c6f4ff6e2f7d7eeda3665352229a3f2678b3d0cb32e") + elseif(_model_name STREQUAL "pbe.fun") + set(_repo_id "microsoft/skala-baselines") + set(_expected_sha256 "da4da7dfed02bde938606c77b38e785283f15ad3be69159051e11cf213a97862") + elseif(_model_name STREQUAL "tpss.fun") + set(_repo_id "microsoft/skala-baselines") + set(_expected_sha256 "c2775e8c9512e399e8b35f1d4424052fdafaa8631a8e638a28ff460619999449") + elseif(_model_name STREQUAL "skala-1.1.fun") + set(_repo_id "microsoft/skala-1.1") + set(_remote_model_name "skala-1.1-rev1.fun") + set(_expected_sha256 "7f3e8622e1eb520ccd88a55464c3e359ac4d7e5ccbd1fb77a26afa1e1c20a5cd") + elseif(_model_name STREQUAL "skala-1.1-cuda.fun") + set(_repo_id "microsoft/skala-1.1") + set(_remote_model_name "skala-1.1-rev1-cuda.fun") + set(_expected_sha256 "f848eae769dca91741a518ae7275d10caac398ab21db649f91bc1f136872f223") + else() + message(FATAL_ERROR + "No trusted hash configured for model ${_model_name}. " + "Refusing to download without verification.") + endif() + + if(EXISTS "${_model_path}") + file(SHA256 "${_model_path}" _actual_sha256) + if(NOT _actual_sha256 STREQUAL _expected_sha256) + message(FATAL_ERROR + "Hash verification failed for existing model ${_model_path}.\n" + "Expected: ${_expected_sha256}\n" + "Actual: ${_actual_sha256}\n" + "Remove the file and reconfigure to re-download a trusted copy.") + endif() + continue() + endif() + + set(_url "https://huggingface.co/${_repo_id}/resolve/main/${_remote_model_name}") + message(STATUS "SkalaXC: downloading ${_model_name}") + + file( + DOWNLOAD "${_url}" "${_model_path}" + SHOW_PROGRESS + EXPECTED_HASH "SHA256=${_expected_sha256}" + STATUS _download_status + LOG _download_log + TLS_VERIFY ON + ) + + list(GET _download_status 0 _download_code) + list(GET _download_status 1 _download_message) + if(NOT _download_code EQUAL 0) + message(FATAL_ERROR + "Failed to download ${_model_name} from ${_url}: ${_download_message}\n" + "CMake download log:\n${_download_log}") + endif() + endforeach() + +endfunction() diff --git a/SkalaXC/cmake/skalaxc-skala.cmake b/SkalaXC/cmake/skalaxc-skala.cmake new file mode 100644 index 00000000..b912de2f --- /dev/null +++ b/SkalaXC/cmake/skalaxc-skala.cmake @@ -0,0 +1,157 @@ +# skalaxc-skala.cmake +# +# SkalaXC ML-functional dependencies: Eigen + LibTorch + nlohmann_json + +if(TARGET Eigen3::Eigen) + if(DEFINED Eigen3_VERSION) + set(_skalaxc_eigen_version "${Eigen3_VERSION}") + elseif(DEFINED EIGEN3_VERSION_STRING) + set(_skalaxc_eigen_version "${EIGEN3_VERSION_STRING}") + else() + get_target_property(_skalaxc_eigen_major Eigen3::Eigen + INTERFACE_EIGEN3_MAJOR_VERSION) + if(_skalaxc_eigen_major) + set(_skalaxc_eigen_version "${_skalaxc_eigen_major}.0.0") + endif() + endif() + + if(NOT _skalaxc_eigen_version OR + _skalaxc_eigen_version VERSION_LESS 5.0.0 OR + NOT _skalaxc_eigen_version VERSION_LESS 6.0.0) + message(FATAL_ERROR + "SkalaXC requires Eigen >=5.0.0,<6.0.0, but Eigen3::Eigen already " + "exists with version '${_skalaxc_eigen_version}'.") + endif() +else() + find_package(Eigen3 5.0...<6 CONFIG QUIET NO_MODULE) + if(NOT Eigen3_FOUND) + message(STATUS "SkalaXC: Eigen 5 not found... fetching Eigen 5.0.1") + include(FetchContent) + FetchContent_Declare( + eigen3 + URL https://gitlab.com/libeigen/eigen/-/archive/5.0.1/eigen-5.0.1.tar.gz + DOWNLOAD_EXTRACT_TIMESTAMP TRUE + ) + FetchContent_MakeAvailable(eigen3) + set_property(DIRECTORY "${eigen3_SOURCE_DIR}" PROPERTY EXCLUDE_FROM_ALL TRUE) + endif() +endif() + +unset(_skalaxc_eigen_major) +unset(_skalaxc_eigen_version) + +if(NOT TARGET nlohmann_json::nlohmann_json) + find_package(nlohmann_json QUIET) + if(NOT nlohmann_json_FOUND) + message(STATUS "SkalaXC: could not find nlohmann_json... fetching") + include(FetchContent) + FetchContent_Declare( + nlohmann_json + GIT_REPOSITORY https://github.com/nlohmann/json.git + GIT_TAG v3.11.3 + ) + FetchContent_MakeAvailable(nlohmann_json) + endif() +endif() + +# Store and restore CMAKE_CUDA_ARCHITECTURES in case Torch clobbers it. +set(_SKALAXC_PREV_CUDA_ARCHS "${CMAKE_CUDA_ARCHITECTURES}") + +# CUDA-enabled TorchConfig expects CUDAToolkit imported targets to exist. +if(SKALAXC_ENABLE_CUDA) + find_package(CUDAToolkit REQUIRED) +endif() + +# Some LibTorch packages enable optional Kineto support but do not ship the +# corresponding library. TorchConfig warns and continues successfully; keep +# that third-party warning local while preserving package lookup errors. +if(DEFINED CMAKE_MESSAGE_LOG_LEVEL) + set(_SKALAXC_PREV_MESSAGE_LOG_LEVEL_DEFINED TRUE) + set(_SKALAXC_PREV_MESSAGE_LOG_LEVEL "${CMAKE_MESSAGE_LOG_LEVEL}") +else() + set(_SKALAXC_PREV_MESSAGE_LOG_LEVEL_DEFINED FALSE) +endif() +set(CMAKE_MESSAGE_LOG_LEVEL ERROR) +find_package(Torch REQUIRED) +if(_SKALAXC_PREV_MESSAGE_LOG_LEVEL_DEFINED) + set(CMAKE_MESSAGE_LOG_LEVEL "${_SKALAXC_PREV_MESSAGE_LOG_LEVEL}") +else() + unset(CMAKE_MESSAGE_LOG_LEVEL) +endif() +unset(_SKALAXC_PREV_MESSAGE_LOG_LEVEL) +unset(_SKALAXC_PREV_MESSAGE_LOG_LEVEL_DEFINED) + +set(SKALAXC_TORCH_VERSION "${Torch_VERSION}" CACHE INTERNAL + "LibTorch version used to build SkalaXC") +if(DEFINED SKALAXC_TORCH_CUDA_VERSION) + set(_skalaxc_torch_cuda_version "${SKALAXC_TORCH_CUDA_VERSION}") +elseif(DEFINED CUDAToolkit_VERSION) + set(_skalaxc_torch_cuda_version "${CUDAToolkit_VERSION}") +else() + set(_skalaxc_torch_cuda_version "none") +endif() +set(SKALAXC_TORCH_CUDA_VERSION "${_skalaxc_torch_cuda_version}" CACHE STRING + "CUDA runtime line used by LibTorch, or none" FORCE) +unset(_skalaxc_torch_cuda_version) +if(SKALAXC_ENABLE_CUDA) + set(SKALAXC_CUDA_TOOLKIT_VERSION "${CMAKE_CUDA_COMPILER_VERSION}" + CACHE INTERNAL "CUDA toolkit version used to build SkalaXC") + if(SKALAXC_TORCH_CUDA_VERSION STREQUAL "none") + message(FATAL_ERROR + "CUDA-enabled SkalaXC requires CUDA-enabled LibTorch metadata") + endif() + string(REGEX MATCH "^[0-9]+" _skalaxc_torch_cuda_major + "${SKALAXC_TORCH_CUDA_VERSION}") + string(REGEX MATCH "^[0-9]+" _skalaxc_toolkit_cuda_major + "${SKALAXC_CUDA_TOOLKIT_VERSION}") + if(NOT _skalaxc_torch_cuda_major OR NOT _skalaxc_toolkit_cuda_major OR + NOT _skalaxc_torch_cuda_major STREQUAL _skalaxc_toolkit_cuda_major) + message(FATAL_ERROR + "SkalaXC CUDA toolkit ${SKALAXC_CUDA_TOOLKIT_VERSION} does not match " + "the LibTorch CUDA ${SKALAXC_TORCH_CUDA_VERSION} major compatibility " + "family") + endif() + unset(_skalaxc_toolkit_cuda_major) + unset(_skalaxc_torch_cuda_major) +else() + set(SKALAXC_CUDA_TOOLKIT_VERSION "none" CACHE INTERNAL + "CUDA toolkit version used to build SkalaXC") +endif() +if(DEFINED SKALAXC_TORCH_CXX11_ABI) + set(_skalaxc_torch_cxx11_abi "${SKALAXC_TORCH_CXX11_ABI}") +else() + set(_skalaxc_torch_cxx11_abi "unknown") +endif() +set(SKALAXC_TORCH_CXX11_ABI "${_skalaxc_torch_cxx11_abi}" CACHE STRING + "LibTorch libstdc++ C++11 ABI (0, 1, or unknown)" FORCE) +unset(_skalaxc_torch_cxx11_abi) +set_property(CACHE SKALAXC_TORCH_CXX11_ABI PROPERTY STRINGS 0 1 unknown) +if(SKALAXC_TORCH_CXX11_ABI STREQUAL "unknown" AND + TORCH_CXX_FLAGS MATCHES "_GLIBCXX_USE_CXX11_ABI=([01])") + set(SKALAXC_TORCH_CXX11_ABI "${CMAKE_MATCH_1}" CACHE STRING + "LibTorch libstdc++ C++11 ABI (0, 1, or unknown)" FORCE) +endif() +if(NOT SKALAXC_TORCH_CXX11_ABI MATCHES "^(0|1|unknown)$") + message(FATAL_ERROR + "SKALAXC_TORCH_CXX11_ABI must be 0, 1, or unknown, got " + "'${SKALAXC_TORCH_CXX11_ABI}'") +endif() + +# Restore CMAKE_CUDA_ARCHITECTURES (Torch may set it to OFF). +if(NOT "${CMAKE_CUDA_ARCHITECTURES}" STREQUAL "${_SKALAXC_PREV_CUDA_ARCHS}") + set(CMAKE_CUDA_ARCHITECTURES "${_SKALAXC_PREV_CUDA_ARCHS}" CACHE STRING "" FORCE) + message(WARNING "SkalaXC: Torch changed CMAKE_CUDA_ARCHITECTURES. Restored: ${CMAKE_CUDA_ARCHITECTURES}") +endif() +unset(_SKALAXC_PREV_CUDA_ARCHS) + +# Strip Torch-injected -gencode flags from CMAKE_CUDA_FLAGS (PyTorch issue #71379). +string(REGEX REPLACE " -gencode [^ ]+" "" _cleaned_cuda_flags "${CMAKE_CUDA_FLAGS}") +if(NOT "${_cleaned_cuda_flags}" STREQUAL "${CMAKE_CUDA_FLAGS}") + set(CMAKE_CUDA_FLAGS "${_cleaned_cuda_flags}" CACHE STRING "" FORCE) + message(WARNING "SkalaXC: stripped Torch-injected -gencode flags from CMAKE_CUDA_FLAGS") +endif() + +if(TARGET torch::nvtoolsext) + list(REMOVE_ITEM TORCH_LIBRARIES torch::nvtoolsext) +endif() +message(STATUS "SkalaXC: Torch libraries: ${TORCH_LIBRARIES}") diff --git a/SkalaXC/external/GauXC b/SkalaXC/external/GauXC new file mode 160000 index 00000000..554bef74 --- /dev/null +++ b/SkalaXC/external/GauXC @@ -0,0 +1 @@ +Subproject commit 554bef7495b2a93f16a2fdedabf4e1cdcb3a1faf diff --git a/SkalaXC/include/skalaxc/skalaxc_config.hpp.in b/SkalaXC/include/skalaxc/skalaxc_config.hpp.in new file mode 100644 index 00000000..5b7ce6aa --- /dev/null +++ b/SkalaXC/include/skalaxc/skalaxc_config.hpp.in @@ -0,0 +1,23 @@ +#pragma once +/** + * @file + * @brief Generated SkalaXC build configuration. + * + * Internal header; not part of the public ABI-isolated API. + */ + +#define SKALAXC_VERSION_STRING "@PROJECT_VERSION@" + +/** @name Filesystem locations for bundled ML model checkpoints (*.fun). */ +/** @{ */ +#cmakedefine SKALAXC_MODEL_PATH_INSTALL "@SKALAXC_MODEL_PATH_INSTALL@" +/** @} */ + +/** @name Feature flags mirroring SKALAXC_ENABLE_* options. */ +/** @{ */ +#cmakedefine SKALAXC_HAS_SKALA +#cmakedefine SKALAXC_HAS_CUDA +#cmakedefine SKALAXC_HAS_MPI +#cmakedefine SKALAXC_HAS_OPENMP +#cmakedefine SKALAXC_HAS_HDF5 +/** @} */ diff --git a/SkalaXC/pixi.toml b/SkalaXC/pixi.toml new file mode 100644 index 00000000..1e03a551 --- /dev/null +++ b/SkalaXC/pixi.toml @@ -0,0 +1,11 @@ +[package] +name = "skalaxc" +version = "0.1.0" +description = "Standalone neural-network exchange-correlation functional library" +readme = "README.md" +repository = "https://github.com/microsoft/skala" +documentation = "https://microsoft.github.io/skala" +publish = false + +[package.build] +backend = { name = "pixi-build-rattler-build", version = "0.4.*", channels = ["https://prefix.dev/conda-forge"] } From dd7fc5d2fd55cf180c1a54ddef27f3fb4b8ef237 Mon Sep 17 00:00:00 2001 From: jenswehner Date: Fri, 4 Sep 2026 11:35:57 +0200 Subject: [PATCH 03/33] Add SkalaXC core data primitives --- SkalaXC/src/atomic_domain_assignment.cxx | 46 +++ SkalaXC/src/atomic_domain_assignment.hpp | 22 ++ SkalaXC/src/debug_log.cxx | 50 +++ SkalaXC/src/debug_log.hpp | 83 +++++ SkalaXC/src/diagnostics.cxx | 125 ++++++++ SkalaXC/src/diagnostics.hpp | 110 +++++++ SkalaXC/src/exceptions.hpp | 24 ++ .../src/host/atomic_domain_load_balancer.cxx | 198 ++++++++++++ .../src/host/atomic_domain_load_balancer.hpp | 29 ++ SkalaXC/src/host/component_matrix_map.hpp | 122 ++++++++ SkalaXC/src/host/eigen_types.hpp | 63 ++++ SkalaXC/src/host/mpi_wrapper.cxx | 192 ++++++++++++ SkalaXC/src/host/mpi_wrapper.hpp | 293 ++++++++++++++++++ SkalaXC/src/host/task_data.hpp | 23 ++ SkalaXC/src/index_types.hpp | 48 +++ SkalaXC/src/model_grid_layout.cxx | 153 +++++++++ SkalaXC/src/model_grid_layout.hpp | 108 +++++++ SkalaXC/src/saturating_math.hpp | 21 ++ 18 files changed, 1710 insertions(+) create mode 100644 SkalaXC/src/atomic_domain_assignment.cxx create mode 100644 SkalaXC/src/atomic_domain_assignment.hpp create mode 100644 SkalaXC/src/debug_log.cxx create mode 100644 SkalaXC/src/debug_log.hpp create mode 100644 SkalaXC/src/diagnostics.cxx create mode 100644 SkalaXC/src/diagnostics.hpp create mode 100644 SkalaXC/src/exceptions.hpp create mode 100644 SkalaXC/src/host/atomic_domain_load_balancer.cxx create mode 100644 SkalaXC/src/host/atomic_domain_load_balancer.hpp create mode 100644 SkalaXC/src/host/component_matrix_map.hpp create mode 100644 SkalaXC/src/host/eigen_types.hpp create mode 100644 SkalaXC/src/host/mpi_wrapper.cxx create mode 100644 SkalaXC/src/host/mpi_wrapper.hpp create mode 100644 SkalaXC/src/host/task_data.hpp create mode 100644 SkalaXC/src/index_types.hpp create mode 100644 SkalaXC/src/model_grid_layout.cxx create mode 100644 SkalaXC/src/model_grid_layout.hpp create mode 100644 SkalaXC/src/saturating_math.hpp diff --git a/SkalaXC/src/atomic_domain_assignment.cxx b/SkalaXC/src/atomic_domain_assignment.cxx new file mode 100644 index 00000000..374a981e --- /dev/null +++ b/SkalaXC/src/atomic_domain_assignment.cxx @@ -0,0 +1,46 @@ +#include "atomic_domain_assignment.hpp" +#include "saturating_math.hpp" + +#include +#include +#include + +namespace SkalaXC::detail { + +AtomicDomainAssignment assign_atomic_domains( + const std::vector& atom_costs, + types::CommunicatorSize rank_count) { + if (rank_count.raw() <= 0) + throw std::invalid_argument("rank_count must be positive"); + + AtomicDomainAssignment result; + result.owner_by_atom.resize(atom_costs.size()); + result.rank_costs.resize(static_cast(rank_count.raw())); + + std::vector atom_order(atom_costs.size()); + std::iota(atom_order.begin(), atom_order.end(), std::size_t{0}); + std::stable_sort(atom_order.begin(), atom_order.end(), + [&atom_costs](std::size_t lhs, std::size_t rhs) { + return atom_costs[lhs].raw() > atom_costs[rhs].raw(); + }); + + for (const auto atom : atom_order) { + const auto rank = types::CommunicatorRank{static_cast(std::distance( + result.rank_costs.begin(), + std::min_element( + result.rank_costs.begin(), result.rank_costs.end(), + [](types::WorkEstimate left, types::WorkEstimate right) { + return left.raw() < right.raw(); + })))}; + result.owner_by_atom[atom] = rank; + + const auto cost = atom_costs[atom]; + auto& rank_cost = result.rank_costs[static_cast(rank.raw())]; + rank_cost = + types::WorkEstimate{saturating_add(rank_cost.raw(), cost.raw())}; + } + + return result; +} + +} // namespace SkalaXC::detail \ No newline at end of file diff --git a/SkalaXC/src/atomic_domain_assignment.hpp b/SkalaXC/src/atomic_domain_assignment.hpp new file mode 100644 index 00000000..c88a394e --- /dev/null +++ b/SkalaXC/src/atomic_domain_assignment.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "index_types.hpp" + +#include +#include + +namespace SkalaXC::detail { + +/** @brief Deterministic atom ownership and accumulated cost for each rank. */ +struct AtomicDomainAssignment { + std::vector owner_by_atom; ///< Runtime rank per + ///< atom. + std::vector rank_costs; ///< Saturating cost per rank. +}; + +/** @brief Assign descending-cost atoms to the least-loaded runtime rank. */ +AtomicDomainAssignment assign_atomic_domains( + const std::vector& atom_costs, + types::CommunicatorSize rank_count); + +} // namespace SkalaXC::detail \ No newline at end of file diff --git a/SkalaXC/src/debug_log.cxx b/SkalaXC/src/debug_log.cxx new file mode 100644 index 00000000..13b24c07 --- /dev/null +++ b/SkalaXC/src/debug_log.cxx @@ -0,0 +1,50 @@ +#include "debug_log.hpp" + +#include +#include + +namespace SkalaXC::detail { + +std::string format_debug_line(ExecutionSpace backend, + types::CommunicatorRank rank, + types::CommunicatorSize size, + std::string_view phase, + std::string_view message) { + std::ostringstream line; + line << "[SkalaXC][debug][backend=" + << (backend == ExecutionSpace::Device ? "device" : "host") + << "][rank=" << rank.raw() << '/' << size.raw() << "][phase=" << phase + << "] "; + for (const char character : message) + line << (character == '\n' || character == '\r' ? ' ' : character); + line << '\n'; + return line.str(); +} + +DebugLogger::DebugLogger(TimingSettings settings, ExecutionSpace backend, + types::CommunicatorRank rank, + types::CommunicatorSize size, + std::FILE* output) noexcept + : enabled_(settings.debug_logging), + backend_(backend), + rank_(rank), + size_(size), + output_(output) {} + +void DebugLogger::log(std::string_view phase, + std::string_view message) const noexcept { + if (!enabled_ || !output_) return; + try { + emit(phase, message); + } catch (...) { + return; + } +} + +void DebugLogger::emit(std::string_view phase, std::string_view message) const { + const auto line = format_debug_line(backend_, rank_, size_, phase, message); + std::fwrite(line.data(), 1, line.size(), output_); + std::fflush(output_); +} + +} // namespace SkalaXC::detail \ No newline at end of file diff --git a/SkalaXC/src/debug_log.hpp b/SkalaXC/src/debug_log.hpp new file mode 100644 index 00000000..ff95655f --- /dev/null +++ b/SkalaXC/src/debug_log.hpp @@ -0,0 +1,83 @@ +#pragma once + +#include "index_types.hpp" + +#include + +#include +#include +#include +#include +#include +#include + +namespace SkalaXC::detail { + +/** + * @brief Format one rank-prefixed diagnostics line. + * @param backend Evaluation backend. + * @param rank Runtime-communicator rank. + * @param size Runtime-communicator size. + * @param phase Diagnostic phase name. + * @param message Diagnostic text. + * @return Complete line including its trailing newline. + */ +std::string format_debug_line(ExecutionSpace backend, + types::CommunicatorRank rank, + types::CommunicatorSize size, + std::string_view phase, std::string_view message); + +/** @brief Best-effort rank-local diagnostics writer. */ +class DebugLogger { + public: + /** + * @brief Configure a diagnostics writer. + * @param settings Timing and logging settings. + * @param backend Evaluation backend. + * @param rank Runtime-communicator rank. + * @param size Runtime-communicator size. + * @param output Destination stream, or `nullptr` to discard output. + */ + DebugLogger(TimingSettings settings, ExecutionSpace backend, + types::CommunicatorRank rank, types::CommunicatorSize size, + std::FILE* output = stderr) noexcept; + + /** @return Whether debug logging is enabled. */ + bool enabled() const noexcept { return enabled_; } + + /** + * @brief Write one already-formatted message. + * @param phase Diagnostic phase name. + * @param message Diagnostic text. + */ + void log(std::string_view phase, std::string_view message) const noexcept; + + /** + * @brief Build and write one message without propagating formatting errors. + * @tparam Writer Callable accepting an `std::ostream&`. + * @param phase Diagnostic phase name. + * @param write_message Message-writing callable. + */ + template + void log(std::string_view phase, Writer&& write_message) const noexcept { + if (!enabled_) return; + try { + std::ostringstream message; + std::forward(write_message)(message); + emit(phase, message.str()); + } catch (...) { + return; + } + } + + private: + void emit(std::string_view phase, std::string_view message) const; + + bool enabled_ = false; + ExecutionSpace backend_ = ExecutionSpace::Host; + types::CommunicatorRank rank_{}; + types::CommunicatorSize size_{1}; + std::FILE* output_ = nullptr; +}; + +} // namespace SkalaXC::detail diff --git a/SkalaXC/src/diagnostics.cxx b/SkalaXC/src/diagnostics.cxx new file mode 100644 index 00000000..27248e90 --- /dev/null +++ b/SkalaXC/src/diagnostics.cxx @@ -0,0 +1,125 @@ +#include "diagnostics.hpp" +#include "saturating_math.hpp" + +#include + +#ifdef _OPENMP +#include +#endif + +namespace SkalaXC::detail { + +namespace { + +std::uint64_t as_nanoseconds(std::chrono::nanoseconds duration) noexcept { + if (duration.count() <= 0) return 0; + return static_cast(duration.count()); +} + +} // namespace + +int maximum_openmp_threads() noexcept { +#ifdef _OPENMP + return omp_get_max_threads(); +#else + return 1; +#endif +} + +DiagnosticsRegistry::DiagnosticsRegistry(TimingSettings settings, + ExecutionSpace backend, + types::CommunicatorRank rank) noexcept + : settings_(settings) { + snapshot_.backend = backend; + snapshot_.rank = rank.raw(); +} + +void DiagnosticsRegistry::record(TimingMetric metric, + std::chrono::nanoseconds duration) noexcept { + if (metric == TimingMetric::Count) return; + auto& value = snapshot_.timings[static_cast(metric)]; + value.last_nanoseconds = as_nanoseconds(duration); + value.total_nanoseconds = + saturating_add(value.total_nanoseconds, value.last_nanoseconds); + value.call_count = saturating_add(value.call_count, 1); + value.status = TimingStatus::Complete; +} + +void DiagnosticsRegistry::increment_exc_vxc_calls() noexcept { + snapshot_.exc_vxc_calls = saturating_add(snapshot_.exc_vxc_calls, 1); +} + +void DiagnosticsRegistry::increment_exc_gradient_calls() noexcept { + snapshot_.exc_gradient_calls = + saturating_add(snapshot_.exc_gradient_calls, 1); +} + +void DiagnosticsRegistry::set_parallel_setup(ParallelSetup setup) noexcept { + snapshot_.communicator_size = setup.communicator_size.raw(); + snapshot_.device_id = setup.device_id.raw(); + snapshot_.openmp_threads = setup.openmp_threads.raw(); + snapshot_.device_memory_fraction = setup.device_memory_fraction; + snapshot_.domain_batch_mode = setup.domain_batch_mode; +} + +void DiagnosticsRegistry::set_local_workload(LocalWorkload workload) noexcept { + snapshot_.tasks = workload.tasks.raw(); + snapshot_.points = static_cast(workload.points.raw()); +} + +void DiagnosticsRegistry::set_model_workload(ModelWorkload workload) noexcept { + snapshot_.local_atoms = workload.local_atoms.raw(); + snapshot_.configured_model_batches = workload.configured_batches.raw(); + snapshot_.task_points_min = + static_cast(workload.task_points.minimum.raw()); + snapshot_.task_points_max = + static_cast(workload.task_points.maximum.raw()); + snapshot_.task_basis_min = + static_cast(workload.task_basis_functions.minimum.raw()); + snapshot_.task_basis_max = + static_cast(workload.task_basis_functions.maximum.raw()); + snapshot_.model_batch_points_min = + static_cast(workload.batch_points.minimum.raw()); + snapshot_.model_batch_points_max = + static_cast(workload.batch_points.maximum.raw()); + snapshot_.max_domains_per_model_batch = workload.max_domains_per_batch.raw(); +} + +void DiagnosticsRegistry::record_model_batch( + types::DomainCount domains) noexcept { + snapshot_.model_batches = saturating_add(snapshot_.model_batches, 1); + snapshot_.domains = saturating_add(snapshot_.domains, domains.raw()); +} + +DiagnosticsSnapshot DiagnosticsRegistry::snapshot() const noexcept { + return snapshot_; +} + +void DiagnosticsRegistry::reset_evaluation() noexcept { + for (std::size_t index = + static_cast(TimingMetric::ModelLoad) + 1; + index < timing_metric_count; ++index) + snapshot_.timings[index] = {}; + snapshot_.exc_vxc_calls = 0; + snapshot_.exc_gradient_calls = 0; + snapshot_.model_batches = 0; + snapshot_.domains = 0; +} + +HostTimingScope::HostTimingScope(DiagnosticsRegistry& registry, + TimingMetric metric) noexcept + : registry_(®istry), + metric_(metric), + start_(std::chrono::steady_clock::now()) {} + +HostTimingScope::~HostTimingScope() noexcept { finish(); } + +void HostTimingScope::finish() noexcept { + if (!registry_) return; + registry_->record(metric_, + std::chrono::duration_cast( + std::chrono::steady_clock::now() - start_)); + registry_ = nullptr; +} + +} // namespace SkalaXC::detail \ No newline at end of file diff --git a/SkalaXC/src/diagnostics.hpp b/SkalaXC/src/diagnostics.hpp new file mode 100644 index 00000000..27d9c226 --- /dev/null +++ b/SkalaXC/src/diagnostics.hpp @@ -0,0 +1,110 @@ +#pragma once + +#include "index_types.hpp" + +#include + +#include +#include + +namespace SkalaXC::detail { + +/** @return Maximum OpenMP thread count available to the caller. */ +int maximum_openmp_threads() noexcept; + +/** @brief Rank-local task and grid-point counts. */ +struct LocalWorkload { + types::TaskCount tasks{}; ///< Number of local tasks. + types::GridPointCount points{}; ///< Number of local grid points. +}; + +/** @brief Rank-local model batching geometry. */ +struct ModelWorkload { + types::AtomCount local_atoms{}; ///< Complete atomic domains owned locally. + types::ModelBatchCount configured_batches{}; ///< Configured local batches. + types::CountRange task_points{}; ///< Points per task. + types::CountRange + task_basis_functions{}; ///< Basis functions per task. + types::CountRange batch_points{}; ///< Points per + ///< batch. + types::DomainCount max_domains_per_batch{}; ///< Largest batch domain count. +}; + +/** @brief Parallel and backend setup recorded for one integrator. */ +struct ParallelSetup { + types::CommunicatorSize communicator_size{}; ///< Runtime communicator size. + types::DeviceId device_id{}; ///< Selected CUDA device. + types::OpenMPThreadCount openmp_threads{}; ///< Available OpenMP threads. + double device_memory_fraction = 0.0; ///< GauXC device arena fraction. + DomainBatchMode domain_batch_mode = + DomainBatchMode::Conservative; ///< Batching policy. +}; + +/** @brief Own and update one integrator's rank-local diagnostics snapshot. */ +class DiagnosticsRegistry { + public: + /** + * @brief Initialize one rank-local registry. + * @param settings Timing and logging settings. + * @param backend Evaluation backend. + * @param rank Runtime-communicator rank. + */ + DiagnosticsRegistry(TimingSettings settings, ExecutionSpace backend, + types::CommunicatorRank rank) noexcept; + + /** + * @brief Record one completed phase. + * @param metric Phase identifier. + * @param duration Elapsed wall time. + */ + void record(TimingMetric metric, std::chrono::nanoseconds duration) noexcept; + /** @brief Increment the EXC/VXC call count. */ + void increment_exc_vxc_calls() noexcept; + /** @brief Increment the gradient call count. */ + void increment_exc_gradient_calls() noexcept; + /** @brief Replace recorded parallel setup. @param setup Setup values. */ + void set_parallel_setup(ParallelSetup setup) noexcept; + /** @brief Replace recorded local workload. @param workload Workload values. + */ + void set_local_workload(LocalWorkload workload) noexcept; + /** @brief Replace recorded model workload. @param workload Workload values. + */ + void set_model_workload(ModelWorkload workload) noexcept; + /** @brief Record one processed model batch. @param domains Domains in the + * batch. */ + void record_model_batch(types::DomainCount domains) noexcept; + /** @return Current rank-local snapshot. */ + DiagnosticsSnapshot snapshot() const noexcept; + /** @brief Clear evaluation counters and timings while retaining setup. */ + void reset_evaluation() noexcept; + + private: + TimingSettings settings_; + DiagnosticsSnapshot snapshot_; +}; + +/** @brief Record elapsed host wall time for one diagnostics phase. */ +class HostTimingScope { + public: + /** + * @brief Start timing a host phase. + * @param registry Destination registry. + * @param metric Phase identifier. + */ + HostTimingScope(DiagnosticsRegistry& registry, TimingMetric metric) noexcept; + /** @brief Record elapsed time unless already finished. */ + ~HostTimingScope() noexcept; + + /** @brief Record elapsed time immediately; subsequent calls are no-ops. */ + void finish() noexcept; + + HostTimingScope(const HostTimingScope&) = delete; + HostTimingScope& operator=(const HostTimingScope&) = delete; + + private: + DiagnosticsRegistry* registry_ = nullptr; + TimingMetric metric_ = TimingMetric::Count; + std::chrono::steady_clock::time_point start_{}; +}; + +} // namespace SkalaXC::detail diff --git a/SkalaXC/src/exceptions.hpp b/SkalaXC/src/exceptions.hpp new file mode 100644 index 00000000..5813376e --- /dev/null +++ b/SkalaXC/src/exceptions.hpp @@ -0,0 +1,24 @@ +#pragma once + +#include + +#include +#include + +namespace SkalaXC::detail { + +[[noreturn]] inline void throw_exception(const char* file, const char* function, + int line, std::string message) { + std::ostringstream stream; + stream << "SkalaXC Exception (" << message << ")\n" + << " File " << file << '\n' + << " Function " << function << '\n' + << " Line " << line << '\n'; + throw Exception(stream.str()); +} + +} // namespace SkalaXC::detail + +#define SKALAXC_EXCEPTION(message) \ + ::SkalaXC::detail::throw_exception(__FILE__, __PRETTY_FUNCTION__, __LINE__, \ + (message)) diff --git a/SkalaXC/src/host/atomic_domain_load_balancer.cxx b/SkalaXC/src/host/atomic_domain_load_balancer.cxx new file mode 100644 index 00000000..892aeb4d --- /dev/null +++ b/SkalaXC/src/host/atomic_domain_load_balancer.cxx @@ -0,0 +1,198 @@ +#include "atomic_domain_load_balancer.hpp" + +#include "atomic_domain_assignment.hpp" +#include "saturating_math.hpp" + +#include "load_balancer/load_balancer_impl.hpp" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace SkalaXC::detail { +namespace { + +/** @brief Basis-shell screening policy for atomic-domain task generation. */ +enum class ScreeningMode { Petite, FillIn }; + +ScreeningMode parse_screening_mode(std::string kernel_name) { + std::transform(kernel_name.begin(), kernel_name.end(), kernel_name.begin(), + [](unsigned char value) { + return static_cast(std::toupper(value)); + }); + if (kernel_name.empty() || kernel_name == "DEFAULT" || + kernel_name == "REPLICATED" || kernel_name == "REPLICATED-PETITE") + return ScreeningMode::Petite; + if (kernel_name == "REPLICATED-FILLIN") return ScreeningMode::FillIn; + throw std::invalid_argument("Load Balancer Kernel Not Recognized: " + + kernel_name); +} + +/** @brief Materialize complete atomic grids on their assigned MPI ranks. */ +class AtomicDomainLoadBalancer final : public GauXC::detail::LoadBalancerImpl { + public: + AtomicDomainLoadBalancer(const GauXC::RuntimeEnvironment& runtime, + const GauXC::Molecule& molecule, + const GauXC::MolGrid& grid, + const GauXC::BasisSet& basis, + ScreeningMode screening_mode) + : LoadBalancerImpl(runtime, molecule, grid, basis), + screening_mode_(screening_mode) {} + + std::unique_ptr clone() const override { + return std::make_unique(*this); + } + + private: + std::pair, std::size_t> screen( + const std::array& box_lower, + const std::array& box_upper) const { + std::vector intersecting_shells; + intersecting_shells.reserve(basis_->nshells()); + for (std::size_t shell = 0; shell < basis_->size(); ++shell) { + const auto& basis_shell = (*basis_)[shell]; + if (GauXC::geometry::cube_sphere_intersect(box_lower, box_upper, + basis_shell.O(), + basis_shell.cutoff_radius())) + intersecting_shells.push_back(static_cast(shell)); + } + + if (screening_mode_ == ScreeningMode::FillIn && + !intersecting_shells.empty()) { + const auto first = intersecting_shells.front(); + const auto last = intersecting_shells.back(); + intersecting_shells.resize(static_cast(last) - + static_cast(first) + 1); + std::iota(intersecting_shells.begin(), intersecting_shells.end(), first); + } + + const auto basis_functions = std::accumulate( + intersecting_shells.begin(), intersecting_shells.end(), std::size_t{0}, + [this](std::size_t count, std::int32_t shell) { + return count + (*basis_)[static_cast(shell)].size(); + }); + return {std::move(intersecting_shells), basis_functions}; + } + + types::WorkEstimate atom_cost(types::AtomIndex atom_index) const { + const auto& atom = (*mol_)[atom_index.raw()]; + const std::array center{atom.x, atom.y, atom.z}; + auto& batcher = mg_->get_grid(atom.Z).batcher(); + batcher.quadrature().recenter(center); + const auto batch_count = batcher.nbatches(); + std::vector batch_costs(batch_count); + +#pragma omp parallel for + for (std::size_t batch = 0; batch < batch_count; ++batch) { + auto [lower, upper, points, weights] = batcher.at(batch); + (void)weights; + if (points.empty()) continue; + const auto [shells, basis_functions] = screen(lower, upper); + if (shells.empty()) continue; + batch_costs[batch] = types::WorkEstimate{ + saturating_multiply(points.size(), basis_functions)}; + } + + types::WorkEstimate total{}; + for (const auto cost : batch_costs) + total = types::WorkEstimate{saturating_add(total.raw(), cost.raw())}; + return total; + } + + std::vector materialize_atom( + types::AtomIndex atom_index) const { + const auto& atom = (*mol_)[atom_index.raw()]; + const std::array center{atom.x, atom.y, atom.z}; + auto& batcher = mg_->get_grid(atom.Z).batcher(); + batcher.quadrature().recenter(center); + const auto batch_count = batcher.nbatches(); + std::vector> batch_tasks(batch_count); + +#pragma omp parallel for + for (std::size_t batch = 0; batch < batch_count; ++batch) { + auto [lower, upper, points, weights] = batcher.at(batch); + if (points.empty()) continue; + auto [shells, basis_functions] = screen(lower, upper); + if (shells.empty()) continue; + + GauXC::XCTask task; + task.iParent = static_cast(atom_index.raw()); + task.npts = static_cast(points.size()); + task.points = std::move(points); + task.weights = std::move(weights); + task.bfn_screening.shell_list = std::move(shells); + task.bfn_screening.nbe = static_cast(basis_functions); + task.dist_nearest = molmeta_->dist_nearest()[atom_index.raw()]; + batch_tasks[batch] = std::move(task); + } + + std::vector tasks; + tasks.reserve(batch_count); + for (auto& task : batch_tasks) + if (task) tasks.push_back(std::move(*task)); + return tasks; + } + + std::vector create_local_tasks_() const override { + const auto atom_count = mol_->natoms(); + std::vector atom_costs(atom_count); + for (std::size_t atom = 0; atom < atom_count; ++atom) + atom_costs[atom] = atom_cost(types::AtomIndex{atom}); + + const auto assignment = assign_atomic_domains( + atom_costs, types::CommunicatorSize{runtime_.comm_size()}); + + const types::CommunicatorRank local_rank{runtime_.comm_rank()}; + std::vector local_tasks; + for (std::size_t atom = 0; atom < atom_count; ++atom) { + if (assignment.owner_by_atom[atom] != local_rank) continue; + auto atom_tasks = materialize_atom(types::AtomIndex{atom}); + local_tasks.insert(local_tasks.end(), + std::make_move_iterator(atom_tasks.begin()), + std::make_move_iterator(atom_tasks.end())); + } + + std::stable_sort(local_tasks.begin(), local_tasks.end(), + [](const GauXC::XCTask& lhs, const GauXC::XCTask& rhs) { + if (lhs.iParent != rhs.iParent) + return lhs.iParent < rhs.iParent; + return lhs.bfn_screening.shell_list < + rhs.bfn_screening.shell_list; + }); + + std::vector merged_tasks; + merged_tasks.reserve(local_tasks.size()); + for (auto& task : local_tasks) { + if (merged_tasks.empty() || !merged_tasks.back().equiv_with(task)) + merged_tasks.push_back(std::move(task)); + else + merged_tasks.back().merge_with(task); + } + return merged_tasks; + } + + ScreeningMode screening_mode_; +}; + +} // namespace + +GauXC::LoadBalancer make_atomic_domain_load_balancer( + const GauXC::RuntimeEnvironment& runtime, const GauXC::Molecule& molecule, + const GauXC::MolGrid& grid, const GauXC::BasisSet& basis, + std::string kernel_name) { + auto implementation = std::make_unique( + runtime, molecule, grid, basis, + parse_screening_mode(std::move(kernel_name))); + return GauXC::LoadBalancer(std::move(implementation)); +} + +} // namespace SkalaXC::detail \ No newline at end of file diff --git a/SkalaXC/src/host/atomic_domain_load_balancer.hpp b/SkalaXC/src/host/atomic_domain_load_balancer.hpp new file mode 100644 index 00000000..87ae6d78 --- /dev/null +++ b/SkalaXC/src/host/atomic_domain_load_balancer.hpp @@ -0,0 +1,29 @@ +#pragma once + +#include + +#include + +namespace GauXC { +class BasisSetMap; +class MolGrid; +class Molecule; +class RuntimeEnvironment; +template +class BasisSet; +} // namespace GauXC + +namespace SkalaXC::detail { + +/** + * @brief Build host-side tasks that keep each atomic grid on one MPI rank. + * + * The resulting GauXC task list is consumed by both host and CUDA local-work + * drivers; only grid generation, screening, and assignment execute on the host. + */ +GauXC::LoadBalancer make_atomic_domain_load_balancer( + const GauXC::RuntimeEnvironment& runtime, const GauXC::Molecule& molecule, + const GauXC::MolGrid& grid, const GauXC::BasisSet& basis, + std::string kernel_name); + +} // namespace SkalaXC::detail \ No newline at end of file diff --git a/SkalaXC/src/host/component_matrix_map.hpp b/SkalaXC/src/host/component_matrix_map.hpp new file mode 100644 index 00000000..b2ff7ec8 --- /dev/null +++ b/SkalaXC/src/host/component_matrix_map.hpp @@ -0,0 +1,122 @@ +#pragma once + +#include "eigen_types.hpp" + +#include + +namespace SkalaXC { + +/** @brief Checked view of component-major matrices stored contiguously. */ +class ComponentMatrixMap { + public: + /** + * @brief Construct a component matrix view. + * @param data Mutable contiguous storage. + * @param components Number of components. + * @param rows Rows per component. + * @param points Columns per component. + */ + ComponentMatrixMap(double* data, Eigen::Index components, Eigen::Index rows, + Eigen::Index points) + : values_(data, rows, points * components), + components_(components), + points_(points) { + if (components < 0 || rows < 0 || points < 0) + throw std::invalid_argument( + "ComponentMatrixMap dimensions must be nonnegative"); + } + + /** + * @brief Access one value. + * @param component Component index. + * @param row Row index. + * @param point Point index. + * @return Mutable value reference. + */ + double& operator()(Eigen::Index component, Eigen::Index row, + Eigen::Index point) { + validate(component, row, point); + return values_(row, component * points_ + point); + } + + /** + * @brief Access one value. + * @param component Component index. + * @param row Row index. + * @param point Point index. + * @return Read-only value reference. + */ + const double& operator()(Eigen::Index component, Eigen::Index row, + Eigen::Index point) const { + validate(component, row, point); + return values_(row, component * points_ + point); + } + + /** + * @brief View one component matrix. + * @param component Component index. + * @return Mutable matrix block. + */ + auto component(Eigen::Index component) { + validate_component(component); + return values_.middleCols(component * points_, points_); + } + + /** + * @brief View one component matrix. + * @param component Component index. + * @return Read-only matrix block. + */ + auto component(Eigen::Index component) const { + validate_component(component); + return values_.middleCols(component * points_, points_); + } + + /** + * @brief Get one component's contiguous storage. + * @param component Component index. + * @return Mutable storage pointer. + */ + double* component_data(Eigen::Index component) { + validate_component(component); + return values_.data() + component * values_.rows() * points_; + } + + /** + * @brief Get one component's contiguous storage. + * @param component Component index. + * @return Read-only storage pointer. + */ + const double* component_data(Eigen::Index component) const { + validate_component(component); + return values_.data() + component * values_.rows() * points_; + } + + /** @return Number of components. */ + Eigen::Index components() const noexcept { return components_; } + /** @return Rows per component. */ + Eigen::Index rows() const noexcept { return values_.rows(); } + /** @return Points per component. */ + Eigen::Index points() const noexcept { return points_; } + + private: + void validate_component(Eigen::Index component) const { + if (component < 0 || component >= components_) + throw std::out_of_range("ComponentMatrixMap component out of range"); + } + + void validate(Eigen::Index component, Eigen::Index row, + Eigen::Index point) const { + validate_component(component); + if (row < 0 || row >= values_.rows()) + throw std::out_of_range("ComponentMatrixMap row out of range"); + if (point < 0 || point >= points_) + throw std::out_of_range("ComponentMatrixMap point out of range"); + } + + Eigen::Map values_; + Eigen::Index components_; + Eigen::Index points_; +}; + +} // namespace SkalaXC diff --git a/SkalaXC/src/host/eigen_types.hpp b/SkalaXC/src/host/eigen_types.hpp new file mode 100644 index 00000000..72937bc8 --- /dev/null +++ b/SkalaXC/src/host/eigen_types.hpp @@ -0,0 +1,63 @@ +#pragma once + +#include + +namespace SkalaXC { + +/** @brief Number of collinear spin channels. */ +inline constexpr Eigen::Index spin_dimension = 2; +/** @brief Number of Cartesian directions. */ +inline constexpr Eigen::Index direction_dimension = 3; +/** @brief Number of flattened spin-gradient components. */ +inline constexpr Eigen::Index spin_gradient_dimension = + spin_dimension * direction_dimension; + +using Vector = Eigen::VectorXd; ///< Dynamic vector of doubles. +/** @brief Dynamic row-major matrix of doubles. */ +using RowMajorMatrix = + Eigen::Matrix; +/** @brief Dynamic column-major matrix of doubles. */ +using ColMajorMatrix = + Eigen::Matrix; +/** @brief Point-major alpha/beta matrix. */ +using AlphaBetaMatrix = + Eigen::Matrix; +/** @brief Alpha/beta-by-point matrix. */ +using AlphaBetaByPointMatrix = + Eigen::Matrix; +/** @brief Point-major Cartesian matrix. */ +using CartesianMatrix = + Eigen::Matrix; +/** @brief Point-major flattened spin-gradient records. */ +using SpinGradientRecordMatrix = + Eigen::Matrix; + +using VectorMap = Eigen::Map; ///< Mutable vector view. +using ConstVectorMap = Eigen::Map; ///< Read-only vector view. +/** @brief Mutable strided vector view. */ +using StridedVectorMap = + Eigen::Map>; +/** @brief Read-only strided vector view. */ +using ConstStridedVectorMap = Eigen::Map>; + +using RowMajorMatrixMap = + Eigen::Map; ///< Mutable row-major view. +using ConstRowMajorMatrixMap = + Eigen::Map; ///< Read-only row-major view. +using ColMajorMatrixMap = + Eigen::Map; ///< Mutable column-major view. +using ConstColMajorMatrixMap = + Eigen::Map; ///< Read-only column-major view. + +/** @brief Read-only reference to point-major alpha/beta values. */ +using ConstAlphaBetaMatrixRef = Eigen::Ref; + +static_assert(AlphaBetaMatrix::ColsAtCompileTime == spin_dimension); +static_assert(AlphaBetaByPointMatrix::RowsAtCompileTime == spin_dimension); +static_assert(CartesianMatrix::ColsAtCompileTime == direction_dimension); +static_assert(SpinGradientRecordMatrix::ColsAtCompileTime == + spin_gradient_dimension); + +} // namespace SkalaXC diff --git a/SkalaXC/src/host/mpi_wrapper.cxx b/SkalaXC/src/host/mpi_wrapper.cxx new file mode 100644 index 00000000..ba629eb5 --- /dev/null +++ b/SkalaXC/src/host/mpi_wrapper.cxx @@ -0,0 +1,192 @@ +#include "mpi_wrapper.hpp" + +#include + +#include + +namespace SkalaXC::mpi { +namespace { + +SpinGradientRecordMatrix pack_point_records(const SpinGradient& gradient) { + SpinGradientRecordMatrix records(gradient.points(), spin_gradient_dimension); + for (Eigen::Index point = 0; point < gradient.points(); ++point) + for (Eigen::Index spin = 0; spin < spin_dimension; ++spin) + for (Eigen::Index direction = 0; direction < direction_dimension; + ++direction) + records(point, spin * direction_dimension + direction) = + gradient(static_cast(direction), point, + static_cast(spin)); + return records; +} + +SpinGradient unpack_point_records(const SpinGradientRecordMatrix& records) { + SpinGradient gradient(records.rows()); + for (Eigen::Index point = 0; point < records.rows(); ++point) + for (Eigen::Index spin = 0; spin < spin_dimension; ++spin) + for (Eigen::Index direction = 0; direction < direction_dimension; + ++direction) + gradient(static_cast(direction), point, + static_cast(spin)) = + records(point, spin * direction_dimension + direction); + return gradient; +} + +SpinGradientRecordMatrix permute_point_records( + const SpinGradientRecordMatrix& source, + const std::vector& + destination_for_source) { + if (destination_for_source.empty()) return source; + if (destination_for_source.size() != static_cast(source.rows())) + throw std::invalid_argument("Gradient permutation size mismatch"); + + SpinGradientRecordMatrix result(source.rows(), spin_gradient_dimension); + std::vector assigned(destination_for_source.size(), false); + for (Eigen::Index source_point = 0; source_point < source.rows(); + ++source_point) { + const auto destination = destination_for_source[source_point].raw(); + if (destination < 0 || destination >= source.rows() || + assigned[destination]) + throw std::invalid_argument("Gradient permutation is invalid"); + assigned[destination] = true; + result.row(destination) = source.row(source_point); + } + return result; +} + +at::Tensor point_records_to_torch(const SpinGradientRecordMatrix& records) { + auto options = + torch::TensorOptions().dtype(torch::kFloat64).device(torch::kCPU); + if (records.rows() == 0) + return torch::empty({spin_dimension, direction_dimension, 0}, options) + .requires_grad_(true); + return torch::from_blob(const_cast(records.data()), + {spin_dimension, direction_dimension, records.rows()}, + {direction_dimension, 1, spin_gradient_dimension}, + options) + .clone() + .requires_grad_(true); +} + +void validate_torch_gradient(const at::Tensor& tensor, + Eigen::Index expected_points) { + if (!tensor.defined() || tensor.scalar_type() != torch::kFloat64 || + tensor.dim() != 3 || tensor.size(0) != spin_dimension || + tensor.size(1) != direction_dimension || + tensor.size(2) != expected_points) + throw std::invalid_argument( + "Torch gradient must be a double tensor shaped [2, 3, points]"); +} + +} // namespace + +at::Tensor spin_gradient_to_torch(const SpinGradient& gradient) { + return point_records_to_torch(pack_point_records(gradient)); +} + +SpinGradient torch_to_spin_gradient(const at::Tensor& tensor, + Eigen::Index expected_points) { + validate_torch_gradient(tensor, expected_points); + auto point_major = tensor.detach().cpu().permute({2, 0, 1}).contiguous(); + Eigen::Map records( + point_major.data_ptr(), expected_points, spin_gradient_dimension); + return unpack_point_records(records); +} + +void broadcast_string(std::string& value, const GauXC::RuntimeEnvironment& rt, + int root) { + if (root < 0 || root >= rt.comm_size()) + throw std::invalid_argument("Invalid broadcast root"); + if (rt.comm_size() == 1) return; + +#ifdef GAUXC_HAS_MPI + std::uint64_t size = rt.comm_rank() == root ? value.size() : 0; + MPI_Bcast(&size, 1, MPI_UINT64_T, root, rt.comm()); + if (size > value.max_size()) + throw std::length_error("Broadcast string exceeds local capacity"); + if (rt.comm_rank() != root) value.resize(static_cast(size)); + + std::uint64_t offset = 0; + while (offset < size) { + const auto remaining = size - offset; + const auto chunk = static_cast( + std::min(remaining, std::numeric_limits::max())); + MPI_Bcast(value.data() + static_cast(offset), chunk, MPI_CHAR, + root, rt.comm()); + offset += static_cast(chunk); + } +#else + (void)value; + throw std::logic_error("MPI broadcast requested without MPI support"); +#endif +} + +at::Tensor gather_torch_gradient( + const SpinGradient& local_gradient, + [[maybe_unused]] const CollectiveLayout& point_layout, + const std::vector& + rank_to_atom_permutation, + const GauXC::RuntimeEnvironment& rt, [[maybe_unused]] int root) { + auto local_records = pack_point_records(local_gradient); + if (rt.comm_size() == 1) { + return point_records_to_torch( + permute_point_records(local_records, rank_to_atom_permutation)); + } + +#ifdef GAUXC_HAS_MPI + SpinGradientRecordMatrix gathered_records; + const auto component_layout = point_layout.scaled(spin_gradient_dimension); + if (rt.comm_rank() == root) { + gathered_records.resize(point_layout.extent(), spin_gradient_dimension); + } + + gatherv(local_records, gathered_records, component_layout, rt, root); + + if (rt.comm_rank() != root) return {}; + return point_records_to_torch( + permute_point_records(gathered_records, rank_to_atom_permutation)); +#else + throw std::logic_error("MPI gradient gather requested without MPI support"); +#endif +} + +SpinGradient scatter_torch_gradient( + const at::Tensor& root_tensor, Eigen::Index local_points, + [[maybe_unused]] const CollectiveLayout& point_layout, + const std::vector& + atom_to_rank_permutation, + const GauXC::RuntimeEnvironment& rt, [[maybe_unused]] int root) { + if (local_points < 0) + throw std::invalid_argument("Local gradient point count is invalid"); + if (rt.comm_size() == 1) { + validate_torch_gradient(root_tensor, local_points); + auto point_major = + root_tensor.detach().cpu().permute({2, 0, 1}).contiguous(); + Eigen::Map records( + point_major.data_ptr(), local_points, spin_gradient_dimension); + return unpack_point_records( + permute_point_records(records, atom_to_rank_permutation)); + } + +#ifdef GAUXC_HAS_MPI + SpinGradientRecordMatrix rank_ordered_records; + at::Tensor point_major; + const auto component_layout = point_layout.scaled(spin_gradient_dimension); + if (rt.comm_rank() == root) { + const auto global_points = point_layout.extent(); + validate_torch_gradient(root_tensor, global_points); + point_major = root_tensor.detach().cpu().permute({2, 0, 1}).contiguous(); + Eigen::Map atom_ordered_records( + point_major.data_ptr(), global_points, spin_gradient_dimension); + rank_ordered_records = + permute_point_records(atom_ordered_records, atom_to_rank_permutation); + } + + SpinGradientRecordMatrix local_records(local_points, spin_gradient_dimension); + scatterv(rank_ordered_records, component_layout, local_records, rt, root); + return unpack_point_records(local_records); +#else + throw std::logic_error("MPI gradient scatter requested without MPI support"); +#endif +} + +} // namespace SkalaXC::mpi \ No newline at end of file diff --git a/SkalaXC/src/host/mpi_wrapper.hpp b/SkalaXC/src/host/mpi_wrapper.hpp new file mode 100644 index 00000000..afb0335e --- /dev/null +++ b/SkalaXC/src/host/mpi_wrapper.hpp @@ -0,0 +1,293 @@ +#pragma once + +#include "eigen_types.hpp" +#include "index_types.hpp" +#include "spin_gradient.hpp" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace SkalaXC::mpi { + +at::Tensor spin_gradient_to_torch(const SpinGradient& gradient); + +SpinGradient torch_to_spin_gradient(const at::Tensor& tensor, + Eigen::Index expected_points); + +void broadcast_string(std::string& value, const GauXC::RuntimeEnvironment& rt, + int root = 0); + +/** @brief Validated MPI counts and displacements for variable collectives. */ +class CollectiveLayout { + public: + /** @brief Construct an empty layout. */ + CollectiveLayout() = default; + + /** + * @brief Construct packed displacements from per-rank counts. + * @param counts Nonnegative element counts in rank order. + */ + explicit CollectiveLayout(std::vector counts) + : counts_(std::move(counts)), displacements_(counts_.size()) { + int displacement = 0; + for (std::size_t rank = 0; rank < counts_.size(); ++rank) { + if (counts_[rank] < 0 || + counts_[rank] > std::numeric_limits::max() - displacement) + throw std::invalid_argument("Invalid collective counts"); + displacements_[rank] = displacement; + displacement += counts_[rank]; + } + } + + /** + * @brief Construct from explicit per-rank metadata. + * @param counts Nonnegative element counts in rank order. + * @param displacements Nonnegative displacements in rank order. + */ + CollectiveLayout(std::vector counts, std::vector displacements) + : counts_(std::move(counts)), displacements_(std::move(displacements)) { + validate(); + } + + /** @return Per-rank element counts. */ + const std::vector& counts() const noexcept { return counts_; } + /** @return Per-rank element displacements. */ + const std::vector& displacements() const noexcept { + return displacements_; + } + + /** @return Minimum buffer extent covering all rank intervals. */ + int extent() const noexcept { + int result = 0; + for (std::size_t rank = 0; rank < counts_.size(); ++rank) + result = std::max(result, displacements_[rank] + counts_[rank]); + return result; + } + + /** + * @brief Scale every count and displacement. + * @param factor Positive scale factor. + * @return Scaled validated layout. + */ + CollectiveLayout scaled(int factor) const { + if (factor <= 0) throw std::invalid_argument("Invalid collective scale"); + std::vector counts(counts_.size()); + std::vector displacements(displacements_.size()); + for (std::size_t rank = 0; rank < counts_.size(); ++rank) { + if (counts_[rank] > std::numeric_limits::max() / factor || + displacements_[rank] > std::numeric_limits::max() / factor) + throw std::invalid_argument("Collective layout overflow"); + counts[rank] = counts_[rank] * factor; + displacements[rank] = displacements_[rank] * factor; + } + return {std::move(counts), std::move(displacements)}; + } + + private: + void validate() const { + if (counts_.size() != displacements_.size()) + throw std::invalid_argument("Collective metadata size mismatch"); + for (std::size_t rank = 0; rank < counts_.size(); ++rank) { + if (counts_[rank] < 0 || displacements_[rank] < 0 || + counts_[rank] > + std::numeric_limits::max() - displacements_[rank]) + throw std::invalid_argument("Invalid collective metadata"); + } + } + + std::vector counts_; + std::vector displacements_; +}; + +at::Tensor gather_torch_gradient( + const SpinGradient& local_gradient, const CollectiveLayout& point_layout, + const std::vector& + rank_to_atom_permutation, + const GauXC::RuntimeEnvironment& rt, int root = 0); + +SpinGradient scatter_torch_gradient( + const at::Tensor& root_tensor, Eigen::Index local_points, + const CollectiveLayout& point_layout, + const std::vector& + atom_to_rank_permutation, + const GauXC::RuntimeEnvironment& rt, int root = 0); + +#ifdef GAUXC_HAS_MPI + +namespace detail { + +template +struct ContiguousBuffer { + using value_type = std::remove_const_t; + + T* data; + std::size_t size; +}; + +template +MPI_Datatype datatype(); + +template <> +inline MPI_Datatype datatype() { + return MPI_DOUBLE; +} + +template <> +inline MPI_Datatype datatype() { + return MPI_INT; +} + +template <> +inline MPI_Datatype datatype() { + return MPI_INT64_T; +} + +template +void assert_contiguous(const Eigen::DenseBase& values) { + static_assert((Derived::Flags & Eigen::DirectAccessBit) != 0, + "MPI buffers require direct Eigen storage access"); + if (values.size() == 0) return; + assert(values.innerStride() == 1); + assert(values.outerStride() == + (Derived::IsRowMajor ? values.cols() : values.rows())); +} + +template +auto contiguous_buffer(const Eigen::DenseBase& values) { + assert_contiguous(values); + return ContiguousBuffer{ + values.derived().data(), static_cast(values.size())}; +} + +template +auto contiguous_buffer(Eigen::DenseBase& values) { + assert_contiguous(values); + return ContiguousBuffer{ + values.derived().data(), static_cast(values.size())}; +} + +template +auto contiguous_buffer(const std::vector& values) { + return ContiguousBuffer{values.data(), values.size()}; +} + +template +auto contiguous_buffer(std::vector& values) { + return ContiguousBuffer{values.data(), values.size()}; +} + +inline int mpi_count(std::size_t size) { + if (size > static_cast(std::numeric_limits::max())) + throw std::length_error("MPI buffer exceeds the supported count range"); + return static_cast(size); +} + +inline void assert_collective_metadata( + [[maybe_unused]] const CollectiveLayout& layout, + const GauXC::RuntimeEnvironment& rt, int root) { + if (rt.comm_rank() != root) return; + assert(layout.counts().size() == static_cast(rt.comm_size())); +} + +} // namespace detail + +template +void gather(const Source& source, Destination& root_destination, + const GauXC::RuntimeEnvironment& rt, int root = 0) { + const auto source_buffer = detail::contiguous_buffer(source); + auto destination_buffer = detail::contiguous_buffer(root_destination); + using value_type = typename decltype(source_buffer)::value_type; + static_assert( + std::is_same_v); + static_assert(!std::is_const_v< + std::remove_pointer_t>, + "MPI destination must be mutable"); + if (rt.comm_rank() == root) + assert(destination_buffer.size == source_buffer.size * rt.comm_size()); + + const int count = detail::mpi_count(source_buffer.size); + MPI_Gather(source_buffer.data, count, detail::datatype(), + destination_buffer.data, count, detail::datatype(), + root, rt.comm()); +} + +template +void gatherv(const Source& source, Destination& root_destination, + const CollectiveLayout& layout, + const GauXC::RuntimeEnvironment& rt, int root = 0) { + const auto source_buffer = detail::contiguous_buffer(source); + auto destination_buffer = detail::contiguous_buffer(root_destination); + using value_type = typename decltype(source_buffer)::value_type; + static_assert( + std::is_same_v); + static_assert(!std::is_const_v< + std::remove_pointer_t>, + "MPI destination must be mutable"); + detail::assert_collective_metadata(layout, rt, root); + if (rt.comm_rank() == root) { + assert(source_buffer.size == + static_cast(layout.counts()[root])); + assert(destination_buffer.size >= + static_cast(layout.extent())); + } + + MPI_Gatherv(source_buffer.data, detail::mpi_count(source_buffer.size), + detail::datatype(), destination_buffer.data, + layout.counts().data(), layout.displacements().data(), + detail::datatype(), root, rt.comm()); +} + +template +void scatterv(const Source& root_source, const CollectiveLayout& layout, + Destination& destination, const GauXC::RuntimeEnvironment& rt, + int root = 0) { + const auto source_buffer = detail::contiguous_buffer(root_source); + auto destination_buffer = detail::contiguous_buffer(destination); + using value_type = typename decltype(source_buffer)::value_type; + static_assert( + std::is_same_v); + static_assert(!std::is_const_v< + std::remove_pointer_t>, + "MPI destination must be mutable"); + detail::assert_collective_metadata(layout, rt, root); + if (rt.comm_rank() == root) { + assert(destination_buffer.size == + static_cast(layout.counts()[root])); + assert(source_buffer.size >= static_cast(layout.extent())); + } + + MPI_Scatterv(source_buffer.data, layout.counts().data(), + layout.displacements().data(), detail::datatype(), + destination_buffer.data, + detail::mpi_count(destination_buffer.size), + detail::datatype(), root, rt.comm()); +} + +template +void allreduce_sum(Values& values, const GauXC::RuntimeEnvironment& rt) { + auto buffer = detail::contiguous_buffer(values); + using value_type = typename decltype(buffer)::value_type; + static_assert(!std::is_const_v>, + "MPI reduction buffer must be mutable"); + if (buffer.size == 0) return; + MPI_Allreduce(MPI_IN_PLACE, buffer.data, detail::mpi_count(buffer.size), + detail::datatype(), MPI_SUM, rt.comm()); +} + +#endif + +} // namespace SkalaXC::mpi diff --git a/SkalaXC/src/host/task_data.hpp b/SkalaXC/src/host/task_data.hpp new file mode 100644 index 00000000..16b41ab4 --- /dev/null +++ b/SkalaXC/src/host/task_data.hpp @@ -0,0 +1,23 @@ +#pragma once + +#include "eigen_types.hpp" +#include "spin_gradient.hpp" + +namespace SkalaXC { + +/** @brief ML feature inputs associated with one GauXC grid task. */ +struct TaskFeatureData { + AlphaBetaMatrix density; ///< Alpha/beta density values. + SpinGradient density_gradient; ///< Alpha/beta Cartesian density gradients. + AlphaBetaMatrix kinetic; ///< Alpha/beta kinetic-density values. +}; + +/** @brief ML-derived potentials associated with one GauXC grid task. */ +struct TaskPotentialData { + AlphaBetaMatrix density; ///< Density-feature derivatives. + SpinGradient density_gradient; ///< Density-gradient derivatives. + AlphaBetaMatrix kinetic; ///< Kinetic-feature derivatives. + Vector dE_dw; ///< Integrated-energy weight derivatives. +}; + +} // namespace SkalaXC diff --git a/SkalaXC/src/index_types.hpp b/SkalaXC/src/index_types.hpp new file mode 100644 index 00000000..150f6018 --- /dev/null +++ b/SkalaXC/src/index_types.hpp @@ -0,0 +1,48 @@ +#pragma once + +#include + +#include +#include + +namespace SkalaXC::types { + +using AtomIndex = NamedType; +using TaskIndex = NamedType; +using GridPointOffset = NamedType; +using GridPointCount = + AdditiveNamedType; +using BasisFunctionCount = + AdditiveNamedType; +using AtomCount = AdditiveNamedType; +using TaskCount = AdditiveNamedType; +using ModelBatchCount = + AdditiveNamedType; +using DomainCount = AdditiveNamedType; +using CommunicatorRank = NamedType; +using CommunicatorSize = NamedType; +using DeviceId = NamedType; +using OpenMPThreadCount = NamedType; +using PermutationIndex = NamedType; +using WorkEstimate = NamedType; + +constexpr GridPointOffset operator+(GridPointOffset offset, + GridPointCount count) { + return GridPointOffset{offset.raw() + count.raw()}; +} + +constexpr GridPointOffset& operator+=(GridPointOffset& offset, + GridPointCount count) { + offset = offset + count; + return offset; +} + +template +/** @brief Inclusive observed range for a strongly typed count. @tparam Count + Count type. */ +struct CountRange { + Count minimum{}; ///< Smallest observed count. + Count maximum{}; ///< Largest observed count. +}; + +} // namespace SkalaXC::types diff --git a/SkalaXC/src/model_grid_layout.cxx b/SkalaXC/src/model_grid_layout.cxx new file mode 100644 index 00000000..d50d91f3 --- /dev/null +++ b/SkalaXC/src/model_grid_layout.cxx @@ -0,0 +1,153 @@ +#include "model_grid_layout.hpp" + +#include "exceptions.hpp" +#include "host/skala_util.hpp" + +#include +#include +#include +#include + +namespace SkalaXC { + +ModelGridLayout::ModelGridLayout( + const std::vector& tasks, types::AtomCount atom_count, + const GauXC::RuntimeEnvironment& rt, + [[maybe_unused]] bool build_collective_metadata) { + if (atom_count.raw() > + static_cast(std::numeric_limits::max())) + SKALAXC_EXCEPTION("Atom count exceeds supported size"); + const auto atom_count_value = static_cast(atom_count.raw()); + + std::vector task_order(tasks.size()); + std::iota(task_order.begin(), task_order.end(), std::size_t{0}); + std::stable_sort(task_order.begin(), task_order.end(), + [&](std::size_t left, std::size_t right) { + return tasks[left].iParent < tasks[right].iParent; + }); + + local_atom_point_counts_.assign(atom_count_value, types::GridPointCount{}); + task_blocks_.reserve(tasks.size()); + for (const std::size_t task_index : task_order) { + const auto& task = tasks[task_index]; + if (task.iParent < 0 || + static_cast(task.iParent) >= atom_count.raw()) + SKALAXC_EXCEPTION("Invalid task parent atom"); + if (task.points.size() > + static_cast(std::numeric_limits::max() - + local_point_count_.raw())) + SKALAXC_EXCEPTION("Local model grid exceeds supported size"); + + const auto point_count = + types::GridPointCount{static_cast(task.points.size())}; + const auto parent_atom = + types::AtomIndex{static_cast(task.iParent)}; + task_blocks_.push_back({types::TaskIndex{task_index}, + types::GridPointOffset{local_point_count_.raw()}, + point_count, parent_atom}); + local_point_count_ += point_count; + local_atom_point_counts_[parent_atom.raw()] += point_count; + } + + for (std::size_t atom = 0; atom < atom_count_value; ++atom) + if (local_atom_point_counts_[atom].raw() > 0) + local_atoms_.push_back(types::AtomIndex{atom}); + + global_point_count_ = local_point_count_; + global_atom_point_counts_ = local_atom_point_counts_; + point_layout_ = + mpi::CollectiveLayout({static_cast(local_point_count_.raw())}); + +#ifdef GAUXC_HAS_MPI + if (rt.comm_size() > 1 && build_collective_metadata) { + const types::CommunicatorRank rank{rt.comm_rank()}; + const types::CommunicatorSize rank_count{rt.comm_size()}; + std::vector local_count{static_cast(local_point_count_.raw())}; + std::vector rank_point_counts( + rank == types::CommunicatorRank{0} ? rank_count.raw() : 0); + mpi::gather(local_count, rank_point_counts, rt); + + std::vector local_atom_point_counts; + local_atom_point_counts.reserve(local_atom_point_counts_.size()); + for (const auto count : local_atom_point_counts_) + local_atom_point_counts.push_back(count.raw()); + std::vector all_rank_atom_point_count_values( + rank == types::CommunicatorRank{0} + ? static_cast(rank_count.raw()) * atom_count_value + : 0); + mpi::gather(local_atom_point_counts, all_rank_atom_point_count_values, rt); + + point_layout_ = {}; + global_atom_point_counts_.clear(); + global_point_count_ = types::GridPointCount{}; + if (rank == types::CommunicatorRank{0}) { + point_layout_ = mpi::CollectiveLayout(std::move(rank_point_counts)); + global_point_count_ = types::GridPointCount{point_layout_.extent()}; + global_atom_point_counts_.assign(atom_count_value, + types::GridPointCount{}); + for (int source_rank = 0; source_rank < rank_count.raw(); ++source_rank) + for (std::size_t atom = 0; atom < atom_count_value; ++atom) + global_atom_point_counts_[atom] += types::GridPointCount{ + all_rank_atom_point_count_values + [static_cast(source_rank) * atom_count_value + + atom]}; + + std::vector all_rank_atom_point_counts; + all_rank_atom_point_counts.reserve( + all_rank_atom_point_count_values.size()); + for (const auto count : all_rank_atom_point_count_values) + all_rank_atom_point_counts.push_back(types::GridPointCount{count}); + + auto permutations = build_atom_reorder_perm( + all_rank_atom_point_counts, point_layout_, atom_count, rank_count); + rank_to_atom_points_ = std::move(permutations.first); + atom_to_rank_points_ = std::move(permutations.second); + } + } +#else + if (rt.comm_size() > 1) + SKALAXC_EXCEPTION("MPI runtime used by a non-MPI SkalaXC build"); +#endif +} + +std::vector ModelGridLayout::make_local_batches( + DomainBatchMode batch_mode) const { + std::vector> batch_atoms; + if (batch_mode == DomainBatchMode::Conservative) { + batch_atoms.reserve(local_atoms_.size()); + for (const auto atom : local_atoms_) batch_atoms.push_back({atom}); + } else { + std::map> atoms_by_grid_size; + for (const auto atom : local_atoms_) + atoms_by_grid_size[local_atom_point_counts_[atom.raw()].raw()].push_back( + atom); + batch_atoms.reserve(atoms_by_grid_size.size()); + for (auto& [grid_size, atoms] : atoms_by_grid_size) { + (void)grid_size; + batch_atoms.push_back(std::move(atoms)); + } + } + + std::vector batches; + batches.reserve(batch_atoms.size()); + for (auto& atoms : batch_atoms) { + ModelDomainBatch batch; + batch.atoms = std::move(atoms); + batch.grid_size = local_atom_point_counts_[batch.atoms.front().raw()]; + for (const auto atom : batch.atoms) { + if (local_atom_point_counts_[atom.raw()] != batch.grid_size) + SKALAXC_EXCEPTION("Model batch mixes atomic grid sizes"); + for (const auto& block : task_blocks_) { + if (block.parent_atom != atom) continue; + batch.task_blocks.push_back( + {block.task_index, types::GridPointOffset{batch.point_count.raw()}, + block.point_count, atom}); + batch.point_count += block.point_count; + } + } + batches.push_back(std::move(batch)); + } + return batches; +} + +} // namespace SkalaXC \ No newline at end of file diff --git a/SkalaXC/src/model_grid_layout.hpp b/SkalaXC/src/model_grid_layout.hpp new file mode 100644 index 00000000..2075a67a --- /dev/null +++ b/SkalaXC/src/model_grid_layout.hpp @@ -0,0 +1,108 @@ +#pragma once + +#include "host/mpi_wrapper.hpp" +#include "index_types.hpp" + +#include +#include +#include + +#include +#include +#include + +namespace SkalaXC { + +/** @brief Stable mapping from one GauXC task to a packed point interval. */ +struct ModelTaskBlock { + types::TaskIndex task_index; ///< Rank-local GauXC task index. + types::GridPointOffset point_offset; ///< First packed point. + types::GridPointCount point_count; ///< Points in this task. + types::AtomIndex parent_atom; ///< Global owning atom index. +}; + +/** @brief Exact-size batch of complete atomic domains owned by one rank. */ +struct ModelDomainBatch { + std::vector atoms; ///< Global atom indices. + std::vector task_blocks; ///< Batch-local task layout. + types::GridPointCount point_count{}; ///< Total points in the batch. + types::GridPointCount grid_size{}; ///< Points in each domain. +}; + +/** @brief Cache task, atom, point, and optional MPI reorder metadata. */ +class ModelGridLayout { + public: + /** + * @brief Build fixed local layout and optional communicator-wide reorder + * metadata. + * @param tasks Sorted rank-local GauXC tasks. + * @param atom_count Global atom count. + * @param rt Runtime environment defining the communicator. + * @param build_collective_metadata Whether to gather global point metadata. + */ + ModelGridLayout(const std::vector& tasks, + types::AtomCount atom_count, + const GauXC::RuntimeEnvironment& rt, + bool build_collective_metadata = true); + + /** @return Rank-local task blocks in packed point order. */ + const std::vector& task_blocks() const noexcept { + return task_blocks_; + } + /** @return Total number of rank-local points. */ + types::GridPointCount local_point_count() const noexcept { + return local_point_count_; + } + /** @return Total number of points across the runtime communicator. */ + types::GridPointCount global_point_count() const noexcept { + return global_point_count_; + } + /** @return Rank-local point count for every global atom. */ + const std::vector& local_atom_point_counts() + const noexcept { + return local_atom_point_counts_; + } + /** @return Global indices of complete atomic domains owned locally. */ + const std::vector& local_atoms() const noexcept { + return local_atoms_; + } + /** + * @brief Group complete local domains according to a batching policy. + * @param batch_mode Exact-size domain batching policy. + * @return Rank-local model batches. + */ + std::vector make_local_batches( + DomainBatchMode batch_mode) const; + /** @return Per-rank global point counts and displacements. */ + const mpi::CollectiveLayout& point_layout() const noexcept { + return point_layout_; + } + /** @return Communicator-wide point count for every global atom. */ + const std::vector& global_atom_point_counts() + const noexcept { + return global_atom_point_counts_; + } + /** @return Destination atom-order index for each rank-order point. */ + const std::vector& rank_to_atom_points() + const noexcept { + return rank_to_atom_points_; + } + /** @return Destination rank-order index for each atom-order point. */ + const std::vector& atom_to_rank_points() + const noexcept { + return atom_to_rank_points_; + } + + private: + std::vector task_blocks_; + types::GridPointCount local_point_count_{}; + types::GridPointCount global_point_count_{}; + std::vector local_atom_point_counts_; + std::vector local_atoms_; + mpi::CollectiveLayout point_layout_; + std::vector global_atom_point_counts_; + std::vector rank_to_atom_points_; + std::vector atom_to_rank_points_; +}; + +} // namespace SkalaXC diff --git a/SkalaXC/src/saturating_math.hpp b/SkalaXC/src/saturating_math.hpp new file mode 100644 index 00000000..3c76f89b --- /dev/null +++ b/SkalaXC/src/saturating_math.hpp @@ -0,0 +1,21 @@ +#pragma once + +#include +#include + +namespace SkalaXC::detail { + +constexpr std::uint64_t saturating_add(std::uint64_t lhs, + std::uint64_t rhs) noexcept { + const auto maximum = std::numeric_limits::max(); + return rhs > maximum - lhs ? maximum : lhs + rhs; +} + +constexpr std::uint64_t saturating_multiply(std::uint64_t lhs, + std::uint64_t rhs) noexcept { + const auto maximum = std::numeric_limits::max(); + if (lhs == 0 || rhs == 0) return 0; + return lhs > maximum / rhs ? maximum : lhs * rhs; +} + +} // namespace SkalaXC::detail \ No newline at end of file From 1b3e4712128c877c93c7e528e31f9934342ee952 Mon Sep 17 00:00:00 2001 From: jenswehner Date: Fri, 4 Sep 2026 11:35:57 +0200 Subject: [PATCH 04/33] Add TorchScript model runtime --- SkalaXC/src/skala_driver.cxx | 274 +++++ SkalaXC/src/skala_driver.hpp | 140 +++ SkalaXC/src/skala_model.cxx | 169 +++ SkalaXC/src/skala_model.hpp | 62 + model/examples/cpp/cpp_integration/main.cpp | 98 +- .../fortran/ftorch_integration/app/main.f90 | 480 ++++---- .../ftorch_integration/src/skala_ftorch.cxx | 182 ++- .../ftorch_integration/src/skala_ftorch.f90 | 1020 ++++++++--------- 8 files changed, 1511 insertions(+), 914 deletions(-) create mode 100644 SkalaXC/src/skala_driver.cxx create mode 100644 SkalaXC/src/skala_driver.hpp create mode 100644 SkalaXC/src/skala_model.cxx create mode 100644 SkalaXC/src/skala_model.hpp diff --git a/SkalaXC/src/skala_driver.cxx b/SkalaXC/src/skala_driver.cxx new file mode 100644 index 00000000..ebada3b4 --- /dev/null +++ b/SkalaXC/src/skala_driver.cxx @@ -0,0 +1,274 @@ +#include "skala_driver.hpp" + +#include "model_grid_layout.hpp" +#include "saturating_math.hpp" + +#include + +#include +#include +#include +#include +#include + +namespace SkalaXC { +namespace { + +struct MatrixSummary { + double trace = 0.0; + double norm = 0.0; + double max_abs = 0.0; +}; + +template +MatrixSummary summarize_matrix(const Eigen::MatrixBase& matrix) { + return {matrix.trace(), matrix.norm(), matrix.cwiseAbs().maxCoeff()}; +} + +const char* metric_name(TimingMetric metric) { + switch (metric) { + case TimingMetric::ModelLoad: + return "model_load"; + case TimingMetric::FeatureConstruction: + return "feature_construction"; + case TimingMetric::ModelBatchPacking: + return "model_batch_packing"; + case TimingMetric::ModelForward: + return "model_forward"; + case TimingMetric::ModelBackward: + return "model_backward"; + case TimingMetric::PotentialMapping: + return "potential_mapping"; + case TimingMetric::AOAssembly: + return "ao_assembly"; + case TimingMetric::GradientAssembly: + return "gradient_assembly"; + case TimingMetric::MPIReduction: + return "mpi_reduction"; + case TimingMetric::TotalEXCVXC: + return "total_exc_vxc"; + case TimingMetric::TotalEXCGradient: + return "total_exc_gradient"; + case TimingMetric::Count: + return "count"; + } + return "unknown"; +} + +void write_summary(std::ostream& output, std::string_view name, + const MatrixSummary& summary) { + output << std::scientific << std::setprecision(8) << name + << "_trace=" << summary.trace << ' ' << name + << "_norm=" << summary.norm << ' ' << name + << "_max_abs=" << summary.max_abs; +} + +} // namespace + +void SkalaDriver::set_setup_diagnostics( + types::CommunicatorSize communicator_size, types::DeviceId device_id, + double device_memory_fraction, DomainBatchMode batch_mode, + const std::vector& tasks, + const std::vector& batches) noexcept { + std::int64_t local_points = 0; + types::CountRange task_points; + types::CountRange task_basis_functions; + if (!tasks.empty()) { + task_points.minimum = + types::GridPointCount{std::numeric_limits::max()}; + task_basis_functions.minimum = + types::BasisFunctionCount{std::numeric_limits::max()}; + for (const auto& task : tasks) { + const types::GridPointCount points{ + static_cast(task.points.size())}; + const types::BasisFunctionCount basis_functions{ + static_cast(task.bfn_screening.nbe)}; + local_points += points.raw(); + task_points.minimum = types::GridPointCount{ + std::min(task_points.minimum.raw(), points.raw())}; + task_points.maximum = types::GridPointCount{ + std::max(task_points.maximum.raw(), points.raw())}; + task_basis_functions.minimum = types::BasisFunctionCount{ + std::min(task_basis_functions.minimum.raw(), basis_functions.raw())}; + task_basis_functions.maximum = types::BasisFunctionCount{ + std::max(task_basis_functions.maximum.raw(), basis_functions.raw())}; + } + } + + std::uint64_t local_atoms = 0; + types::CountRange batch_points; + std::uint64_t max_domains_per_batch = 0; + if (!batches.empty()) { + batch_points.minimum = + types::GridPointCount{std::numeric_limits::max()}; + for (const auto& batch : batches) { + const auto domains = static_cast(batch.atoms.size()); + const auto points = batch.point_count; + local_atoms = detail::saturating_add(local_atoms, domains); + batch_points.minimum = types::GridPointCount{ + std::min(batch_points.minimum.raw(), points.raw())}; + batch_points.maximum = types::GridPointCount{ + std::max(batch_points.maximum.raw(), points.raw())}; + max_domains_per_batch = std::max(max_domains_per_batch, domains); + } + } + + diagnostics_.set_parallel_setup( + {communicator_size, device_id, + types::OpenMPThreadCount{detail::maximum_openmp_threads()}, + device_memory_fraction, batch_mode}); + diagnostics_.set_local_workload( + {types::TaskCount{tasks.size()}, types::GridPointCount{local_points}}); + diagnostics_.set_model_workload( + {types::AtomCount{local_atoms}, types::ModelBatchCount{batches.size()}, + task_points, task_basis_functions, batch_points, + types::DomainCount{max_domains_per_batch}}); +} + +void SkalaDriver::log_setup( + const std::string& model, const std::vector& feature_keys, + bool is_gga, bool is_mgga, + const std::vector& batches) const noexcept { + if (!debug_log_.enabled()) return; + const auto snapshot = diagnostics_.snapshot(); + debug_log_.log("setup", [&](std::ostream& output) { + output << "communicator_size=" << snapshot.communicator_size + << " openmp_threads=" << snapshot.openmp_threads; + if (snapshot.backend == ExecutionSpace::Device) + output << " device_id=" << snapshot.device_id + << " memory_fraction=" << snapshot.device_memory_fraction; + }); + debug_log_.log("model", [&](std::ostream& output) { + output << "selector=" << model + << " approximation=" << (is_mgga ? "MGGA" : (is_gga ? "GGA" : "LDA")) + << " features="; + for (std::size_t index = 0; index < feature_keys.size(); ++index) { + if (index != 0) output << ','; + output << feature_keys[index]; + } + }); + debug_log_.log("workload", [&](std::ostream& output) { + output << "tasks=" << snapshot.tasks << " points=" << snapshot.points + << " local_atoms=" << snapshot.local_atoms + << " task_points_min=" << snapshot.task_points_min + << " task_points_max=" << snapshot.task_points_max + << " task_basis_min=" << snapshot.task_basis_min + << " task_basis_max=" << snapshot.task_basis_max; + }); + debug_log_.log("batching", [&](std::ostream& output) { + output << "mode=" + << (snapshot.domain_batch_mode == DomainBatchMode::Aggressive + ? "aggressive" + : "conservative") + << " batches=" << snapshot.configured_model_batches + << " batch_points_min=" << snapshot.model_batch_points_min + << " batch_points_max=" << snapshot.model_batch_points_max + << " max_domains_per_batch=" << snapshot.max_domains_per_model_batch; + }); + for (std::size_t index = 0; index < batches.size(); ++index) { + const auto& batch = batches[index]; + debug_log_.log("batch", [&](std::ostream& output) { + output << "index=" << index << " atoms="; + for (std::size_t atom_index = 0; atom_index < batch.atoms.size(); + ++atom_index) { + if (atom_index != 0) output << ','; + output << batch.atoms[atom_index].raw(); + } + output << " task_blocks=" << batch.task_blocks.size() + << " grid_size=" << batch.grid_size.raw() + << " points=" << batch.point_count.raw(); + }); + } +} + +void SkalaDriver::log_model_load_timing() const noexcept { + if (!debug_log_.enabled()) return; + const auto snapshot = diagnostics_.snapshot(); + const auto& timing = snapshot.timing(TimingMetric::ModelLoad); + if (timing.status != TimingStatus::Complete) return; + debug_log_.log("timing", [&](std::ostream& output) { + output << "metric=" << metric_name(TimingMetric::ModelLoad) + << " milliseconds=" << std::fixed << std::setprecision(3) + << static_cast(timing.last_nanoseconds) / 1.0e6; + }); +} + +DiagnosticsSnapshot SkalaDriver::log_evaluation_start( + std::string_view evaluation, const ConstColMajorMatrixMap& scalar_density, + const ConstColMajorMatrixMap& spin_density) const noexcept { + const auto before = diagnostics_.snapshot(); + if (!debug_log_.enabled()) return before; + const auto scalar = summarize_matrix(scalar_density); + const auto spin = summarize_matrix(spin_density); + debug_log_.log("evaluation", [&](std::ostream& output) { + output << "kind=" << evaluation + << " event=start basis_size=" << scalar_density.rows() << ' '; + write_summary(output, "scalar_density", scalar); + output << ' '; + write_summary(output, "spin_density", spin); + }); + return before; +} + +void SkalaDriver::log_exc_vxc_result( + std::string_view evaluation, double exc, + const ColMajorMatrixMap& scalar_potential, + const ColMajorMatrixMap& spin_potential) const noexcept { + if (!debug_log_.enabled()) return; + const auto scalar = summarize_matrix(scalar_potential); + const auto spin = summarize_matrix(spin_potential); + debug_log_.log("evaluation", [&](std::ostream& output) { + output << std::scientific << std::setprecision(8) << "kind=" << evaluation + << " event=end exc=" << exc << ' '; + write_summary(output, "scalar_potential", scalar); + output << ' '; + write_summary(output, "spin_potential", spin); + }); +} + +void SkalaDriver::log_gradient_result( + std::string_view evaluation, + const RowMajorMatrixMap& gradient) const noexcept { + if (!debug_log_.enabled()) return; + const auto translation = gradient.colwise().sum(); + debug_log_.log("evaluation", [&](std::ostream& output) { + output << std::scientific << std::setprecision(8) << "kind=" << evaluation + << " event=end gradient_norm=" << gradient.norm() + << " gradient_max_abs=" << gradient.cwiseAbs().maxCoeff() + << " translation_residual=" << translation.norm(); + }); +} + +void SkalaDriver::log_host_timing_delta( + std::string_view evaluation, + const DiagnosticsSnapshot& before) const noexcept { + if (!debug_log_.enabled()) return; + const auto after = diagnostics_.snapshot(); + for (std::size_t index = + static_cast(TimingMetric::FeatureConstruction); + index < timing_metric_count; ++index) { + const auto& old_value = before.timings[index]; + const auto& new_value = after.timings[index]; + if (new_value.call_count <= old_value.call_count) continue; + const auto elapsed = + new_value.total_nanoseconds - old_value.total_nanoseconds; + debug_log_.log("timing", [&](std::ostream& output) { + output << "kind=" << evaluation + << " metric=" << metric_name(static_cast(index)) + << " milliseconds=" << std::fixed << std::setprecision(3) + << static_cast(elapsed) / 1.0e6 + << " calls=" << new_value.call_count - old_value.call_count; + }); + } +} + +void SkalaDriver::log_device_timing_unavailable( + std::string_view evaluation) const noexcept { + debug_log_.log("timing", [&](std::ostream& output) { + output + << "kind=" << evaluation + << " status=unavailable reason=cuda_event_collection_not_implemented"; + }); +} + +} // namespace SkalaXC \ No newline at end of file diff --git a/SkalaXC/src/skala_driver.hpp b/SkalaXC/src/skala_driver.hpp new file mode 100644 index 00000000..6350eb41 --- /dev/null +++ b/SkalaXC/src/skala_driver.hpp @@ -0,0 +1,140 @@ +#pragma once + +#include "debug_log.hpp" +#include "diagnostics.hpp" +#include "host/eigen_types.hpp" + +#include +#include +#include +#include + +namespace GauXC { +struct XCTask; +} + +namespace SkalaXC { + +struct ModelDomainBatch; + +/** @brief Backend-independent interface for UKS evaluation and diagnostics. */ +class SkalaDriver { + public: + /** + * @brief Initialize shared diagnostics. + * @param timing_settings Timing settings. + * @param backend Evaluation backend. + * @param rank Runtime rank. + * @param size Runtime size. + */ + SkalaDriver(TimingSettings timing_settings, ExecutionSpace backend, + types::CommunicatorRank rank, types::CommunicatorSize size) + : diagnostics_(timing_settings, backend, rank), + debug_log_(timing_settings, backend, rank, size) {} + virtual ~SkalaDriver() noexcept = default; + + /** @return Current rank-local diagnostics snapshot. */ + DiagnosticsSnapshot diagnostics() const noexcept { + return diagnostics_.snapshot(); + } + + /** @brief Clear evaluation diagnostics while retaining setup. */ + void reset_diagnostics() noexcept { diagnostics_.reset_evaluation(); } + + /** @brief Emit the completed model-load timing when logging is enabled. */ + void log_model_load_timing() const noexcept; + + /** + * @brief Evaluate UKS XC energy and potentials. + * @param scalar_density Scalar density matrix. + * @param spin_density Spin-z density matrix. + * @param scalar_potential Output scalar potential. + * @param spin_potential Output spin-z potential. + * @return XC energy. + */ + virtual double eval_exc_vxc_uks(ConstColMajorMatrixMap scalar_density, + ConstColMajorMatrixMap spin_density, + ColMajorMatrixMap scalar_potential, + ColMajorMatrixMap spin_potential) = 0; + + /** + * @brief Evaluate a UKS XC nuclear gradient. + * @param scalar_density Scalar density matrix. + * @param spin_density Spin-z density matrix. + * @param gradient Output atom-major Cartesian gradient. + */ + virtual void eval_exc_grad_uks(ConstColMajorMatrixMap scalar_density, + ConstColMajorMatrixMap spin_density, + RowMajorMatrixMap gradient) = 0; + + protected: + /** + * @brief Log model and batch setup. + * @param model Model selector. + * @param feature_keys Model features. + * @param is_gga Whether gradients are used. + * @param is_mgga Whether kinetic density is used. + * @param batches Configured batches. + */ + void log_setup(const std::string& model, + const std::vector& feature_keys, bool is_gga, + bool is_mgga, + const std::vector& batches) const noexcept; + /** + * @brief Record parallel and workload setup. + * @param communicator_size Runtime size. + * @param device_id Device identifier. + * @param device_memory_fraction Device arena fraction. + * @param batch_mode Batching policy. + * @param tasks Local tasks. + * @param batches Configured batches. + */ + void set_setup_diagnostics( + types::CommunicatorSize communicator_size, types::DeviceId device_id, + double device_memory_fraction, DomainBatchMode batch_mode, + const std::vector& tasks, + const std::vector& batches) noexcept; + /** + * @brief Log evaluation inputs. + * @param evaluation Operation name. + * @param scalar_density Scalar density. + * @param spin_density Spin density. + * @return Snapshot before evaluation. + */ + DiagnosticsSnapshot log_evaluation_start( + std::string_view evaluation, const ConstColMajorMatrixMap& scalar_density, + const ConstColMajorMatrixMap& spin_density) const noexcept; + /** + * @brief Log energy and potentials. + * @param evaluation Operation name. + * @param exc XC energy. + * @param scalar_potential Scalar potential. + * @param spin_potential Spin potential. + */ + void log_exc_vxc_result( + std::string_view evaluation, double exc, + const ColMajorMatrixMap& scalar_potential, + const ColMajorMatrixMap& spin_potential) const noexcept; + /** + * @brief Log a nuclear gradient. + * @param evaluation Operation name. + * @param gradient Atom-major gradient. + */ + void log_gradient_result(std::string_view evaluation, + const RowMajorMatrixMap& gradient) const noexcept; + /** + * @brief Log host timing changes. + * @param evaluation Operation name. + * @param before Snapshot before evaluation. + */ + void log_host_timing_delta(std::string_view evaluation, + const DiagnosticsSnapshot& before) const noexcept; + /** @brief Log unavailable device timing. @param evaluation Operation name. */ + void log_device_timing_unavailable( + std::string_view evaluation) const noexcept; + + detail::DiagnosticsRegistry diagnostics_; ///< Rank-local diagnostics state. + detail::DebugLogger debug_log_; ///< Best-effort debug writer. +}; + +} // namespace SkalaXC diff --git a/SkalaXC/src/skala_model.cxx b/SkalaXC/src/skala_model.cxx new file mode 100644 index 00000000..f0842c30 --- /dev/null +++ b/SkalaXC/src/skala_model.cxx @@ -0,0 +1,169 @@ +#include "skala_model.hpp" + +#include "exceptions.hpp" +#include "host/mpi_wrapper.hpp" +#include "host/skala_util.hpp" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace SkalaXC { + +namespace detail { + +std::string resolve_model_path(const std::string& model, + const std::filesystem::path& model_directory) { + if (std::filesystem::exists(model)) return model; + + if (model == "SKALA") + SKALAXC_EXCEPTION( + "To use the Skala functional, specify a local checkpoint path."); + + std::filesystem::path filename = model; + if (model == "PBE") filename = "pbe.fun"; + if (model == "TPSS") filename = "tpss.fun"; + if (model == "LDA") filename = "ldax.fun"; + + const auto candidate = model_directory / filename; + if (std::filesystem::exists(candidate)) return candidate.string(); + + SKALAXC_EXCEPTION("Model " + model + " not found at " + candidate.string()); +} + +} // namespace detail + +namespace { + +std::string read_model_archive(const std::string& model) { + const char* model_path_override = std::getenv("SKALAXC_MODEL_PATH"); + const std::filesystem::path model_directory = + model_path_override != nullptr && model_path_override[0] != '\0' + ? model_path_override + : SKALAXC_MODEL_PATH_INSTALL; + const auto path = detail::resolve_model_path(model, model_directory); + std::ifstream input(path, std::ios::binary); + if (!input) SKALAXC_EXCEPTION("Unable to open model archive " + path); + + std::string archive((std::istreambuf_iterator(input)), + std::istreambuf_iterator()); + if (input.bad()) SKALAXC_EXCEPTION("Unable to read model archive " + path); + return archive; +} + +std::string broadcast_model_archive(const std::string& model, + const GauXC::RuntimeEnvironment& runtime) { + std::string archive; + std::string read_error; + if (runtime.comm_rank() == 0) { + try { + archive = read_model_archive(model); + } catch (const std::exception& error) { + read_error = error.what(); + } catch (...) { + read_error = "unknown model archive read error"; + } + } + + mpi::broadcast_string(read_error, runtime); + if (!read_error.empty()) + SKALAXC_EXCEPTION("Runtime rank 0 could not read the Skala model: " + + read_error); + mpi::broadcast_string(archive, runtime); + return archive; +} + +} // namespace + +/** @brief Private TorchScript module, metadata, and callable model method. */ +struct SkalaModel::Impl { + Impl(const std::string& archive, const c10::Device& device) { + torch::jit::ExtraFilesMap extra_files{{"features", ""}, + {"protocol_version", ""}}; + try { + if (archive.size() > + static_cast(std::numeric_limits::max())) + SKALAXC_EXCEPTION("Skala model archive exceeds LibTorch limits"); + auto adapter = std::make_shared( + archive.data(), static_cast(archive.size())); + module = torch::jit::load(adapter, device, extra_files); + } catch (const c10::Error& error) { + SKALAXC_EXCEPTION("error loading skala model: " + + std::string(error.what())); + } + + const auto version = + nlohmann::json::parse(extra_files.at("protocol_version")).get(); + if (version != 2) + SKALAXC_EXCEPTION("Unsupported protocol version " + + std::to_string(version)); + + const auto features = nlohmann::json::parse(extra_files.at("features")); + if (!features.is_array()) SKALAXC_EXCEPTION("features is not an array"); + + for (const auto& feature : features) { + if (!feature.is_string()) SKALAXC_EXCEPTION("feature is not a string"); + feature_keys.push_back(feature.get()); + } + if (feature_keys.empty()) + SKALAXC_EXCEPTION("No feature keys found in model"); + + for (const auto& key : feature_keys) { + if (!valueExists(key)) + SKALAXC_EXCEPTION("Feature Key Required Not Implemented: " + key); + if (key == feat_map().at(SKALA_FEATURE::TAU)) is_mgga = true; + if (key == feat_map().at(SKALA_FEATURE::DDEN)) is_gga = true; + } + if (is_mgga) is_gga = false; + + module.eval(); + for (auto parameter : module.parameters()) + parameter.set_requires_grad(false); + energy_func = module.find_method("get_exc"); + if (!energy_func) + SKALAXC_EXCEPTION( + "Model archive does not define the required get_exc method"); + } + + torch::jit::script::Module module; + std::optional energy_func; + std::vector feature_keys; + bool is_gga = false; + bool is_mgga = false; +}; + +SkalaModel::SkalaModel(const std::string& model, c10::Device device) + : pimpl_(std::make_unique(read_model_archive(model), device)) {} + +SkalaModel::SkalaModel(const std::string& model, + const GauXC::RuntimeEnvironment& runtime, + c10::Device device) + : pimpl_(std::make_unique(broadcast_model_archive(model, runtime), + device)) {} + +SkalaModel::~SkalaModel() noexcept = default; + +const torch::jit::Method& SkalaModel::energy_function() const { + if (!pimpl_->energy_func) + SKALAXC_EXCEPTION("Model integrated-energy function is not initialized"); + return *pimpl_->energy_func; +} + +const std::vector& SkalaModel::feature_keys() const noexcept { + return pimpl_->feature_keys; +} + +bool SkalaModel::is_gga() const noexcept { return pimpl_->is_gga; } + +bool SkalaModel::is_mgga() const noexcept { return pimpl_->is_mgga; } + +} // namespace SkalaXC \ No newline at end of file diff --git a/SkalaXC/src/skala_model.hpp b/SkalaXC/src/skala_model.hpp new file mode 100644 index 00000000..49b7c26c --- /dev/null +++ b/SkalaXC/src/skala_model.hpp @@ -0,0 +1,62 @@ +#pragma once + +#include +#include + +#include +#include +#include +#include + +namespace GauXC { +class RuntimeEnvironment; +} + +namespace SkalaXC { + +namespace detail { + +std::string resolve_model_path(const std::string& model, + const std::filesystem::path& model_directory); + +} // namespace detail + +/** @brief Own a validated TorchScript XC model on one rank and device. */ +class SkalaModel { + public: + /** + * @brief Load a model directly on one device. + * @param model Alias, relative model name, or archive path. + * @param device Device on which the module executes. + */ + explicit SkalaModel(const std::string& model, + c10::Device device = c10::Device(c10::DeviceType::CPU)); + /** + * @brief Load a model collectively through a runtime communicator. + * @param model Alias, relative model name, or archive path. + * @param runtime Runtime environment defining the communicator. + * @param device Device on which the rank-local module executes. + */ + SkalaModel(const std::string& model, const GauXC::RuntimeEnvironment& runtime, + c10::Device device = c10::Device(c10::DeviceType::CPU)); + ~SkalaModel() noexcept; + + SkalaModel(const SkalaModel&) = delete; + SkalaModel& operator=(const SkalaModel&) = delete; + + /** @return Mandatory integrated XC energy method. */ + const torch::jit::Method& energy_function() const; + + /** @return Ordered model input feature keys. */ + const std::vector& feature_keys() const noexcept; + /** @return Whether the model requires density gradients. */ + bool is_gga() const noexcept; + /** @return Whether the model requires kinetic density. */ + bool is_mgga() const noexcept; + + private: + struct Impl; + std::unique_ptr pimpl_; +}; + +} // namespace SkalaXC diff --git a/model/examples/cpp/cpp_integration/main.cpp b/model/examples/cpp/cpp_integration/main.cpp index 2178be6e..f2b488f4 100644 --- a/model/examples/cpp/cpp_integration/main.cpp +++ b/model/examples/cpp/cpp_integration/main.cpp @@ -1,6 +1,6 @@ -#include -#include #include +#include +#include #include #include @@ -10,66 +10,56 @@ using IValueList = std::vector; using IValueMap = std::unordered_map; using FeatureDict = c10::Dict; -at::Tensor -load_feature(const std::string &filename, torch::DeviceType device) -{ +at::Tensor load_feature(const std::string &filename, torch::DeviceType device) { std::ifstream input(filename, std::ios::binary); - if (!input.is_open()) - { + if (!input.is_open()) { throw std::runtime_error("Failed to open feature file: " + filename); } - std::vector bytes( - (std::istreambuf_iterator(input)), - (std::istreambuf_iterator())); + std::vector bytes((std::istreambuf_iterator(input)), + (std::istreambuf_iterator())); input.close(); return torch::jit::pickle_load(bytes).toTensor().to(device); } -FeatureDict -load_features(const std::string &prefix, const std::vector &keys, torch::DeviceType device) -{ +FeatureDict load_features(const std::string &prefix, + const std::vector &keys, + torch::DeviceType device) { FeatureDict featmap; - for (const auto &key : keys) - { + for (const auto &key : keys) { featmap.insert(key, load_feature(prefix + "/" + key + ".pt", device)); } return featmap; } std::tuple> -load_model(const std::string &filename, torch::DeviceType device) -{ +load_model(const std::string &filename, torch::DeviceType device) { torch::jit::script::Module mod; - torch::jit::ExtraFilesMap extra_files{{"features", ""}, {"protocol_version", ""}}; + torch::jit::ExtraFilesMap extra_files{{"features", ""}, + {"protocol_version", ""}}; std::vector keys; - try - { + try { // Deserialize the ScriptModule from a file using torch::jit::load(). mod = torch::jit::load(filename, device, extra_files); - } - catch (const c10::Error &e) - { - throw std::runtime_error("Error loading the model from " + filename + ": " + e.what()); + } catch (const c10::Error &e) { + throw std::runtime_error("Error loading the model from " + filename + ": " + + e.what()); } auto version = json::parse(extra_files.at("protocol_version")).get(); - if (version != 2) - { - throw std::runtime_error("Unsupported protocol version " + std::to_string(version)); + if (version != 2) { + throw std::runtime_error("Unsupported protocol version " + + std::to_string(version)); } auto features = json::parse(extra_files.at("features")); // check if features is array - if (!features.is_array()) - { + if (!features.is_array()) { throw std::runtime_error("features is not an array"); } - for (const auto &feature : features) - { - if (!feature.is_string()) - { + for (const auto &feature : features) { + if (!feature.is_string()) { throw std::runtime_error("feature is not a string"); } keys.push_back(feature.get()); @@ -78,9 +68,8 @@ load_model(const std::string &filename, torch::DeviceType device) return std::make_tuple(mod.get_method("get_exc_density"), keys); } -at::Tensor -get_exc(const torch::jit::Method &exc_func, const FeatureDict &features) -{ +at::Tensor get_exc(const torch::jit::Method &exc_func, + const FeatureDict &features) { IValueList args; IValueMap kwargs; kwargs["mol"] = features; @@ -88,16 +77,19 @@ get_exc(const torch::jit::Method &exc_func, const FeatureDict &features) } std::tuple> -get_exc_and_grad(const torch::jit::Method &exc_func, const FeatureDict &features) -{ +get_exc_and_grad(const torch::jit::Method &exc_func, + const FeatureDict &features) { // Create a mutable copy only for the tensors that need gradients FeatureDict features_with_grad; std::vector input_tensors; std::vector tensor_keys; - for (const auto& entry : features) { - std::string key = entry.key(); - bool requires_grad = (key == "density" || key == "grad" || key == "kin" || key == "coarse_0_atomic_coords" || key == "grid_coords" || key == "grid_weights"); + for (const auto &entry : features) { + const std::string key = entry.key(); + const bool requires_grad = key == "density" || key == "grad" || + key == "kin" || + key == "coarse_0_atomic_coords" || + key == "grid_coords" || key == "grid_weights"; auto tensor = entry.value().clone().requires_grad_(requires_grad); if (requires_grad) { @@ -124,26 +116,26 @@ get_exc_and_grad(const torch::jit::Method &exc_func, const FeatureDict &features ); c10::Dict grad; - for (size_t i = 0; i < tensor_keys.size(); ++i) - { + for (size_t i = 0; i < tensor_keys.size(); ++i) { grad.insert(tensor_keys[i], gradients[i]); } return std::make_tuple(exc_on_grid, grad); } -int main(int argc, const char *argv[]) -{ - if (argc != 3) - { - std::cerr << "usage: skala_cpp_integration \n"; +int main(int argc, const char *argv[]) { + if (argc != 3) { + std::cerr << "usage: skala_cpp_integration " + "\n"; return -1; } const torch::DeviceType device = torch::kCPU; - const auto [exc_func, feature_keys] = load_model(std::string(argv[1]), device); - const auto features = load_features(std::string(argv[2]), feature_keys, device); + const auto [exc_func, feature_keys] = + load_model(std::string(argv[1]), device); + const auto features = + load_features(std::string(argv[2]), feature_keys, device); std::cout << "Compute Exc..." << std::endl; @@ -158,9 +150,9 @@ int main(int argc, const char *argv[]) const auto exc2 = (exc_on_grid2 * features.at("grid_weights")).sum(); std::cout << "Exc = " << exc2.item() << std::endl; - for (const auto &kv : grad) - { - std::cout << "|dExc/d(" << kv.key() << ")| = " << kv.value().norm().item() << std::endl; + for (const auto &kv : grad) { + std::cout << "|dExc/d(" << kv.key() << ")| = " << kv.value().norm().item() + << std::endl; } return 0; diff --git a/model/examples/fortran/ftorch_integration/app/main.f90 b/model/examples/fortran/ftorch_integration/app/main.f90 index f6528af6..c1a2d053 100644 --- a/model/examples/fortran/ftorch_integration/app/main.f90 +++ b/model/examples/fortran/ftorch_integration/app/main.f90 @@ -1,248 +1,248 @@ program main - use iso_c_binding, only : c_double - use ftorch, only : torch_tensor - use skala_ftorch, only : skala_model, skala_model_load, skala_feature, skala_tensor_load, & - & skala_tensor_sum, skala_tensor_mean, skala_tensor_mul, skala_tensor_item_double, & - & skala_tensor_to_array, skala_dict, skala_dict_new - - implicit none - - type(skala_model) :: model - type(skala_dict) :: input, vxc - type(torch_tensor) :: exc - type(torch_tensor) :: density, grad, kin, grid_coords, grid_weights, coarse_0_atomic_coords, & - & atomic_grid_weights, atomic_grid_sizes, atomic_grid_size_bound_shape - type(torch_tensor) :: dexc_ddensity, dexc_dgrad, dexc_dkin, dexc_dgrid_coords, & - & dexc_dgrid_weights, dexc_dcoarse_0_atomic_coords, vxc_norm - - character(len=:), allocatable :: path, feature_dir - - cli_input: block - call get_argument(1, path) - if (.not. allocated(path)) exit cli_input - call get_argument(2, feature_dir) - if (.not. allocated(feature_dir)) exit cli_input - end block cli_input - if (.not. allocated(path) .or. .not.allocated(feature_dir)) then - call get_argument(0, path) - print '(a)', "Usage: "//path//" " - stop 1 - end if - - ! Load the model - print '(a)', "[1] Loading model from "//path - call skala_model_load(model, path) - - print '(a)', "[2] Loading features from "//feature_dir - get_features: block - integer :: ift - do ift = 1, size(model%features) - select case(model%features(ift)) - case(skala_feature%density) - print '(a)', " -> Loading density" - call skala_tensor_load(density, feature_dir//"/density.pt") - case(skala_feature%grad) - print '(a)', " -> Loading grad" - call skala_tensor_load(grad, feature_dir//"/grad.pt") - case(skala_feature%kin) - print '(a)', " -> Loading kin" - call skala_tensor_load(kin, feature_dir//"/kin.pt") - case(skala_feature%grid_coords) - print '(a)', " -> Loading grid_coords" - call skala_tensor_load(grid_coords, feature_dir//"/grid_coords.pt") - case(skala_feature%grid_weights) - print '(a)', " -> Loading grid_weights" - call skala_tensor_load(grid_weights, feature_dir//"/grid_weights.pt") - case(skala_feature%coarse_0_atomic_coords) - print '(a)', " -> Loading coarse_0_atomic_coords" - call skala_tensor_load(coarse_0_atomic_coords, feature_dir//"/coarse_0_atomic_coords.pt") - case(skala_feature%atomic_grid_weights) - print '(a)', " -> Loading atomic_grid_weights" - call skala_tensor_load(atomic_grid_weights, feature_dir//"/atomic_grid_weights.pt") - case(skala_feature%atomic_grid_sizes) - print '(a)', " -> Loading atomic_grid_sizes" - call skala_tensor_load(atomic_grid_sizes, feature_dir//"/atomic_grid_sizes.pt") - case(skala_feature%atomic_grid_size_bound_shape) - print '(a)', " -> Loading atomic_grid_size_bound_shape" - call skala_tensor_load(atomic_grid_size_bound_shape, feature_dir//"/atomic_grid_size_bound_shape.pt") - end select - end do - end block get_features - - ! Prepare the input dictionary for the model - print '(a)', "[3] Preparing input dictionary" - call skala_dict_new(input) - if (model%needs_feature(skala_feature%density)) & - call input%insert(skala_feature%density, density) - if (model%needs_feature(skala_feature%grad)) & - call input%insert(skala_feature%grad, grad) - if (model%needs_feature(skala_feature%kin)) & - call input%insert(skala_feature%kin, kin) - if (model%needs_feature(skala_feature%grid_coords)) & - call input%insert(skala_feature%grid_coords, grid_coords) - if (model%needs_feature(skala_feature%grid_weights)) & - call input%insert(skala_feature%grid_weights, grid_weights) - if (model%needs_feature(skala_feature%coarse_0_atomic_coords)) & - call input%insert(skala_feature%coarse_0_atomic_coords, coarse_0_atomic_coords) - if (model%needs_feature(skala_feature%atomic_grid_weights)) & - call input%insert(skala_feature%atomic_grid_weights, atomic_grid_weights) - if (model%needs_feature(skala_feature%atomic_grid_sizes)) & - call input%insert(skala_feature%atomic_grid_sizes, atomic_grid_sizes) - if (model%needs_feature(skala_feature%atomic_grid_size_bound_shape)) & - call input%insert(skala_feature%atomic_grid_size_bound_shape, atomic_grid_size_bound_shape) - - ! Request exc and vxc from the model - print '(a)', "[4] Running model inference" - call model%get_exc_and_vxc(input, exc, vxc) - - ! Print the exchange-correlation energy - print '(a)', "[5] Computing XC energy = sum(exc * grid_weights)" - exc_weighted: block - type(torch_tensor) :: weighted, weighted_sum - call skala_tensor_mul(exc, grid_weights, weighted) - call skala_tensor_sum(weighted, weighted_sum) - print '(a, es22.14)', " -> E_xc = ", skala_tensor_item_double(weighted_sum) - end block exc_weighted - - print '(a)', "[6] Extracting vxc components" - if (model%needs_feature(skala_feature%density)) & - call vxc%at(skala_feature%density, dexc_ddensity) - if (model%needs_feature(skala_feature%grad)) & - call vxc%at(skala_feature%grad, dexc_dgrad) - if (model%needs_feature(skala_feature%kin)) & - call vxc%at(skala_feature%kin, dexc_dkin) - if (model%needs_feature(skala_feature%grid_coords)) & - call vxc%at(skala_feature%grid_coords, dexc_dgrid_coords) - if (model%needs_feature(skala_feature%grid_weights)) & - call vxc%at(skala_feature%grid_weights, dexc_dgrid_weights) - if (model%needs_feature(skala_feature%coarse_0_atomic_coords)) & - call vxc%at(skala_feature%coarse_0_atomic_coords, dexc_dcoarse_0_atomic_coords) - - ! Print mean of each gradient component - print '(a)', "[7] Gradient means (dexc/dx)" - print_gradients: block - type(torch_tensor) :: grad_mean - if (model%needs_feature(skala_feature%density)) then - call skala_tensor_mean(dexc_ddensity, grad_mean) - print '(a, es22.14)', " -> mean(dexc/d_density) = ", & - skala_tensor_item_double(grad_mean) - end if - if (model%needs_feature(skala_feature%grad)) then - call skala_tensor_mean(dexc_dgrad, grad_mean) - print '(a, es22.14)', " -> mean(dexc/d_grad) = ", & - skala_tensor_item_double(grad_mean) - end if - if (model%needs_feature(skala_feature%kin)) then - call skala_tensor_mean(dexc_dkin, grad_mean) - print '(a, es22.14)', " -> mean(dexc/d_kin) = ", & - skala_tensor_item_double(grad_mean) - end if - if (model%needs_feature(skala_feature%grid_coords)) then - call skala_tensor_mean(dexc_dgrid_coords, grad_mean) - print '(a, es22.14)', " -> mean(dexc/d_grid_coords) = ", & - skala_tensor_item_double(grad_mean) - end if - if (model%needs_feature(skala_feature%grid_weights)) then - call skala_tensor_mean(dexc_dgrid_weights, grad_mean) - print '(a, es22.14)', " -> mean(dexc/d_grid_weights) = ", & - skala_tensor_item_double(grad_mean) - end if - if (model%needs_feature(skala_feature%coarse_0_atomic_coords)) then - call skala_tensor_mean(dexc_dcoarse_0_atomic_coords, grad_mean) - print '(a, es22.14)', " -> mean(dexc/d_coarse_0_atomic_coords) = ", & - skala_tensor_item_double(grad_mean) - end if - end block print_gradients - - ! Demonstrate direct Fortran array access to tensor data - print '(a)', "[8] Accessing tensor data as Fortran arrays" - array_access: block - real(c_double), pointer :: arr1d(:), arr2d(:,:), arr3d(:,:,:) - - ! exc is 1-D (npts) - call skala_tensor_to_array(exc, arr1d) - print '(a, i0, a)', " -> exc: shape = (", size(arr1d), ")" - print '(a, 3es22.14, a)', & - " [", arr1d(:3), " ...]" - - ! density is 2-D (nspin, npts) - if (model%needs_feature(skala_feature%density)) then - call skala_tensor_to_array(dexc_ddensity, arr2d) - print '(a, i0, a, i0, a)', " -> dexc/d_density: shape = (", & - size(arr2d, 1), ", ", size(arr2d, 2), ")" - print '(a, 3es22.14, a)', & - " [[", arr2d(:3, 1), " ...]", & - " [", arr2d(:3, 2), " ...]]" - end if - - ! grad is 3-D (nspin, 3, npts) - if (model%needs_feature(skala_feature%grad)) then - call skala_tensor_to_array(dexc_dgrad, arr3d) - print '(a, i0, a, i0, a, i0, a)', " -> dexc/d_grad: shape = (", & - size(arr3d, 1), ", ", size(arr3d, 2), ", ", size(arr3d, 3), ")" - print '(a, 3es22.14, a)', & - " [[[", arr3d(:3, 1, 1), " ...]", & - " [", arr3d(:3, 2, 1), " ...]]", & - " [[ ... ]]]" - end if - - ! kin is 2-D (nspin, npts) - if (model%needs_feature(skala_feature%kin)) then - call skala_tensor_to_array(dexc_dkin, arr2d) - print '(a, i0, a, i0, a)', " -> dexc/d_kin: shape = (", & - size(arr2d, 1), ", ", size(arr2d, 2), ")" - print '(a, 3es22.14, a)', & - " [[", arr2d(:3, 1), " ...]", & - " [", arr2d(:3, 2), " ...]]" - end if - - ! grid_coords is 2-D (npts, 3) - if (model%needs_feature(skala_feature%grid_coords)) then - call skala_tensor_to_array(dexc_dgrid_coords, arr2d) - print '(a, i0, a, i0, a)', " -> dexc/d_grid_coords: shape = (", & - size(arr2d, 1), ", ", size(arr2d, 2), ")" - print '(a, 3es22.14, a)', & - " [[", arr2d(:3, 1), " ...]", & - " [", arr2d(:3, 2), " ...]]" - end if - - ! grid_weights is 1-D (npts) - if (model%needs_feature(skala_feature%grid_weights)) then - call skala_tensor_to_array(dexc_dgrid_weights, arr1d) - print '(a, i0, a)', " -> dexc/d_grid_weights: shape = (", size(arr1d), ")" - print '(a, 3es22.14, a)', & - " [", arr1d(:3), " ...]" - end if - - ! coarse_0_atomic_coords is 2-D (natoms, 3) - if (model%needs_feature(skala_feature%coarse_0_atomic_coords)) then - call skala_tensor_to_array(dexc_dcoarse_0_atomic_coords, arr2d) - print '(a, i0, a, i0, a)', " -> dexc/d_coarse_0_atomic_coords: shape = (", & - size(arr2d, 1), ", ", size(arr2d, 2), ")" - print '(a, 3es22.14, a)', & - " [[", arr2d(:3, 1), "]", " [ ...]]" - end if - end block array_access + use iso_c_binding, only: c_double + use ftorch, only: torch_tensor + use skala_ftorch, only: skala_model, skala_model_load, skala_feature, skala_tensor_load, & + & skala_tensor_sum, skala_tensor_mean, skala_tensor_mul, skala_tensor_item_double, & + & skala_tensor_to_array, skala_dict, skala_dict_new + + implicit none + + type(skala_model) :: model + type(skala_dict) :: input, vxc + type(torch_tensor) :: exc + type(torch_tensor) :: density, grad, kin, grid_coords, grid_weights, coarse_0_atomic_coords, & + & atomic_grid_weights, atomic_grid_sizes, atomic_grid_size_bound_shape + type(torch_tensor) :: dexc_ddensity, dexc_dgrad, dexc_dkin, dexc_dgrid_coords, & + & dexc_dgrid_weights, dexc_dcoarse_0_atomic_coords, vxc_norm + + character(len=:), allocatable :: path, feature_dir + + cli_input: block + call get_argument(1, path) + if (.not. allocated(path)) exit cli_input + call get_argument(2, feature_dir) + if (.not. allocated(feature_dir)) exit cli_input + end block cli_input + if (.not. allocated(path) .or. .not. allocated(feature_dir)) then + call get_argument(0, path) + print '(a)', "Usage: "//path//" " + stop 1 + end if + + ! Load the model + print '(a)', "[1] Loading model from "//path + call skala_model_load(model, path) + + print '(a)', "[2] Loading features from "//feature_dir + get_features: block + integer :: ift + do ift = 1, size(model%features) + select case (model%features(ift)) + case (skala_feature%density) + print '(a)', " -> Loading density" + call skala_tensor_load(density, feature_dir//"/density.pt") + case (skala_feature%grad) + print '(a)', " -> Loading grad" + call skala_tensor_load(grad, feature_dir//"/grad.pt") + case (skala_feature%kin) + print '(a)', " -> Loading kin" + call skala_tensor_load(kin, feature_dir//"/kin.pt") + case (skala_feature%grid_coords) + print '(a)', " -> Loading grid_coords" + call skala_tensor_load(grid_coords, feature_dir//"/grid_coords.pt") + case (skala_feature%grid_weights) + print '(a)', " -> Loading grid_weights" + call skala_tensor_load(grid_weights, feature_dir//"/grid_weights.pt") + case (skala_feature%coarse_0_atomic_coords) + print '(a)', " -> Loading coarse_0_atomic_coords" + call skala_tensor_load(coarse_0_atomic_coords, feature_dir//"/coarse_0_atomic_coords.pt") + case (skala_feature%atomic_grid_weights) + print '(a)', " -> Loading atomic_grid_weights" + call skala_tensor_load(atomic_grid_weights, feature_dir//"/atomic_grid_weights.pt") + case (skala_feature%atomic_grid_sizes) + print '(a)', " -> Loading atomic_grid_sizes" + call skala_tensor_load(atomic_grid_sizes, feature_dir//"/atomic_grid_sizes.pt") + case (skala_feature%atomic_grid_size_bound_shape) + print '(a)', " -> Loading atomic_grid_size_bound_shape" + call skala_tensor_load(atomic_grid_size_bound_shape, feature_dir//"/atomic_grid_size_bound_shape.pt") + end select + end do + end block get_features + + ! Prepare the input dictionary for the model + print '(a)', "[3] Preparing input dictionary" + call skala_dict_new(input) + if (model%needs_feature(skala_feature%density)) & + call input%insert(skala_feature%density, density) + if (model%needs_feature(skala_feature%grad)) & + call input%insert(skala_feature%grad, grad) + if (model%needs_feature(skala_feature%kin)) & + call input%insert(skala_feature%kin, kin) + if (model%needs_feature(skala_feature%grid_coords)) & + call input%insert(skala_feature%grid_coords, grid_coords) + if (model%needs_feature(skala_feature%grid_weights)) & + call input%insert(skala_feature%grid_weights, grid_weights) + if (model%needs_feature(skala_feature%coarse_0_atomic_coords)) & + call input%insert(skala_feature%coarse_0_atomic_coords, coarse_0_atomic_coords) + if (model%needs_feature(skala_feature%atomic_grid_weights)) & + call input%insert(skala_feature%atomic_grid_weights, atomic_grid_weights) + if (model%needs_feature(skala_feature%atomic_grid_sizes)) & + call input%insert(skala_feature%atomic_grid_sizes, atomic_grid_sizes) + if (model%needs_feature(skala_feature%atomic_grid_size_bound_shape)) & + call input%insert(skala_feature%atomic_grid_size_bound_shape, atomic_grid_size_bound_shape) + + ! Request exc and vxc from the model + print '(a)', "[4] Running model inference" + call model%get_exc_and_vxc(input, exc, vxc) + + ! Print the exchange-correlation energy + print '(a)', "[5] Computing XC energy = sum(exc * grid_weights)" + exc_weighted: block + type(torch_tensor) :: weighted, weighted_sum + call skala_tensor_mul(exc, grid_weights, weighted) + call skala_tensor_sum(weighted, weighted_sum) + print '(a, es22.14)', " -> E_xc = ", skala_tensor_item_double(weighted_sum) + end block exc_weighted + + print '(a)', "[6] Extracting vxc components" + if (model%needs_feature(skala_feature%density)) & + call vxc%at(skala_feature%density, dexc_ddensity) + if (model%needs_feature(skala_feature%grad)) & + call vxc%at(skala_feature%grad, dexc_dgrad) + if (model%needs_feature(skala_feature%kin)) & + call vxc%at(skala_feature%kin, dexc_dkin) + if (model%needs_feature(skala_feature%grid_coords)) & + call vxc%at(skala_feature%grid_coords, dexc_dgrid_coords) + if (model%needs_feature(skala_feature%grid_weights)) & + call vxc%at(skala_feature%grid_weights, dexc_dgrid_weights) + if (model%needs_feature(skala_feature%coarse_0_atomic_coords)) & + call vxc%at(skala_feature%coarse_0_atomic_coords, dexc_dcoarse_0_atomic_coords) + + ! Print mean of each gradient component + print '(a)', "[7] Gradient means (dexc/dx)" + print_gradients: block + type(torch_tensor) :: grad_mean + if (model%needs_feature(skala_feature%density)) then + call skala_tensor_mean(dexc_ddensity, grad_mean) + print '(a, es22.14)', " -> mean(dexc/d_density) = ", & + skala_tensor_item_double(grad_mean) + end if + if (model%needs_feature(skala_feature%grad)) then + call skala_tensor_mean(dexc_dgrad, grad_mean) + print '(a, es22.14)', " -> mean(dexc/d_grad) = ", & + skala_tensor_item_double(grad_mean) + end if + if (model%needs_feature(skala_feature%kin)) then + call skala_tensor_mean(dexc_dkin, grad_mean) + print '(a, es22.14)', " -> mean(dexc/d_kin) = ", & + skala_tensor_item_double(grad_mean) + end if + if (model%needs_feature(skala_feature%grid_coords)) then + call skala_tensor_mean(dexc_dgrid_coords, grad_mean) + print '(a, es22.14)', " -> mean(dexc/d_grid_coords) = ", & + skala_tensor_item_double(grad_mean) + end if + if (model%needs_feature(skala_feature%grid_weights)) then + call skala_tensor_mean(dexc_dgrid_weights, grad_mean) + print '(a, es22.14)', " -> mean(dexc/d_grid_weights) = ", & + skala_tensor_item_double(grad_mean) + end if + if (model%needs_feature(skala_feature%coarse_0_atomic_coords)) then + call skala_tensor_mean(dexc_dcoarse_0_atomic_coords, grad_mean) + print '(a, es22.14)', " -> mean(dexc/d_coarse_0_atomic_coords) = ", & + skala_tensor_item_double(grad_mean) + end if + end block print_gradients + + ! Demonstrate direct Fortran array access to tensor data + print '(a)', "[8] Accessing tensor data as Fortran arrays" + array_access: block + real(c_double), pointer :: arr1d(:), arr2d(:, :), arr3d(:, :, :) + + ! exc is 1-D (npts) + call skala_tensor_to_array(exc, arr1d) + print '(a, i0, a)', " -> exc: shape = (", size(arr1d), ")" + print '(a, 3es22.14, a)', & + " [", arr1d(:3), " ...]" + + ! density is 2-D (nspin, npts) + if (model%needs_feature(skala_feature%density)) then + call skala_tensor_to_array(dexc_ddensity, arr2d) + print '(a, i0, a, i0, a)', " -> dexc/d_density: shape = (", & + size(arr2d, 1), ", ", size(arr2d, 2), ")" + print '(a, 3es22.14, a)', & + " [[", arr2d(:3, 1), " ...]", & + " [", arr2d(:3, 2), " ...]]" + end if + + ! grad is 3-D (nspin, 3, npts) + if (model%needs_feature(skala_feature%grad)) then + call skala_tensor_to_array(dexc_dgrad, arr3d) + print '(a, i0, a, i0, a, i0, a)', " -> dexc/d_grad: shape = (", & + size(arr3d, 1), ", ", size(arr3d, 2), ", ", size(arr3d, 3), ")" + print '(a, 3es22.14, a)', & + " [[[", arr3d(:3, 1, 1), " ...]", & + " [", arr3d(:3, 2, 1), " ...]]", & + " [[ ... ]]]" + end if + + ! kin is 2-D (nspin, npts) + if (model%needs_feature(skala_feature%kin)) then + call skala_tensor_to_array(dexc_dkin, arr2d) + print '(a, i0, a, i0, a)', " -> dexc/d_kin: shape = (", & + size(arr2d, 1), ", ", size(arr2d, 2), ")" + print '(a, 3es22.14, a)', & + " [[", arr2d(:3, 1), " ...]", & + " [", arr2d(:3, 2), " ...]]" + end if + + ! grid_coords is 2-D (npts, 3) + if (model%needs_feature(skala_feature%grid_coords)) then + call skala_tensor_to_array(dexc_dgrid_coords, arr2d) + print '(a, i0, a, i0, a)', " -> dexc/d_grid_coords: shape = (", & + size(arr2d, 1), ", ", size(arr2d, 2), ")" + print '(a, 3es22.14, a)', & + " [[", arr2d(:3, 1), " ...]", & + " [", arr2d(:3, 2), " ...]]" + end if + + ! grid_weights is 1-D (npts) + if (model%needs_feature(skala_feature%grid_weights)) then + call skala_tensor_to_array(dexc_dgrid_weights, arr1d) + print '(a, i0, a)', " -> dexc/d_grid_weights: shape = (", size(arr1d), ")" + print '(a, 3es22.14, a)', & + " [", arr1d(:3), " ...]" + end if + + ! coarse_0_atomic_coords is 2-D (natoms, 3) + if (model%needs_feature(skala_feature%coarse_0_atomic_coords)) then + call skala_tensor_to_array(dexc_dcoarse_0_atomic_coords, arr2d) + print '(a, i0, a, i0, a)', " -> dexc/d_coarse_0_atomic_coords: shape = (", & + size(arr2d, 1), ", ", size(arr2d, 2), ")" + print '(a, 3es22.14, a)', & + " [[", arr2d(:3, 1), "]", " [ ...]]" + end if + end block array_access contains - subroutine get_argument(idx, arg) - integer, intent(in) :: idx - character(len=:), allocatable, intent(out) :: arg + subroutine get_argument(idx, arg) + integer, intent(in) :: idx + character(len=:), allocatable, intent(out) :: arg - integer :: length, stat + integer :: length, stat - call get_command_argument(idx, length=length, status=stat) - if (stat /= 0) return + call get_command_argument(idx, length=length, status=stat) + if (stat /= 0) return - allocate(character(len=length) :: arg, stat=stat) - if (stat /= 0) return + allocate (character(len=length) :: arg, stat=stat) + if (stat /= 0) return - if (length > 0) then - call get_command_argument(idx, arg, status=stat) - if (stat /= 0) then - deallocate(arg) - return + if (length > 0) then + call get_command_argument(idx, arg, status=stat) + if (stat /= 0) then + deallocate (arg) + return + end if end if - end if - end subroutine get_argument -end program main \ No newline at end of file + end subroutine get_argument +end program main diff --git a/model/examples/fortran/ftorch_integration/src/skala_ftorch.cxx b/model/examples/fortran/ftorch_integration/src/skala_ftorch.cxx index f4826476..dfb76587 100644 --- a/model/examples/fortran/ftorch_integration/src/skala_ftorch.cxx +++ b/model/examples/fortran/ftorch_integration/src/skala_ftorch.cxx @@ -1,12 +1,12 @@ -#include #include +#include -typedef void* torch_jit_script_module_t; -typedef void* torch_tensor_t; +typedef void *torch_jit_script_module_t; +typedef void *torch_tensor_t; typedef int torch_device_t; -typedef void* skala_dict_t; -typedef void* skala_list_t; +typedef void *skala_dict_t; +typedef void *skala_list_t; typedef c10::Dict> SkalaDict; typedef std::vector SkalaList; @@ -22,8 +22,7 @@ typedef enum SkalaFeature { Feature_AtomicGridSizeBoundShape = 9 } SkalaFeature; -static inline -void +static inline void ctorch_error(const std::string &message, const std::function &cleanup = nullptr) { std::cerr << "[ERROR]: " << message << std::endl; @@ -33,48 +32,38 @@ ctorch_error(const std::string &message, exit(EXIT_FAILURE); } -extern "C" -torch_tensor_t -skala_tensor_load(const char* filename) -{ +extern "C" torch_tensor_t skala_tensor_load(const char *filename) { std::ifstream input(std::string(filename), std::ios::binary); - if (!input.is_open()) - { - throw std::runtime_error("Failed to open feature file: " + std::string(filename)); + if (!input.is_open()) { + throw std::runtime_error("Failed to open feature file: " + + std::string(filename)); } - std::vector bytes( - (std::istreambuf_iterator(input)), - (std::istreambuf_iterator())); + std::vector bytes((std::istreambuf_iterator(input)), + (std::istreambuf_iterator())); input.close(); - auto tensor = torch::jit::pickle_load(bytes).toTensor().to(torch::Device(torch::kCPU)); + auto tensor = + torch::jit::pickle_load(bytes).toTensor().to(torch::Device(torch::kCPU)); return new torch::Tensor(std::move(tensor)); } -extern "C" -torch_tensor_t -skala_tensor_sum(const torch_tensor_t tensor) -{ +extern "C" torch_tensor_t skala_tensor_sum(const torch_tensor_t tensor) { auto t = reinterpret_cast(tensor); auto sum = t->sum(); return new torch::Tensor(std::move(sum)); } -extern "C" -double -skala_tensor_item_double(const torch_tensor_t tensor) -{ +extern "C" double skala_tensor_item_double(const torch_tensor_t tensor) { auto t = reinterpret_cast(tensor); return t->item(); } -extern "C" -torch_jit_script_module_t -skala_model_load(const char *filename, - const bool requires_grad, - SkalaFeature* features) { +extern "C" torch_jit_script_module_t skala_model_load(const char *filename, + const bool requires_grad, + SkalaFeature *features) { torch::AutoGradMode enable_grad(requires_grad); - torch::jit::ExtraFilesMap extra_files{{"features", ""}, {"protocol_version", ""}}; + torch::jit::ExtraFilesMap extra_files{{"features", ""}, + {"protocol_version", ""}}; torch::jit::script::Module *module = nullptr; try { module = new torch::jit::script::Module; @@ -85,17 +74,20 @@ skala_model_load(const char *filename, } if (std::stoi(extra_files.at("protocol_version")) != 2) { - std::string message = "Unsupported protocol version " + extra_files.at("protocol_version"); + std::string message = + "Unsupported protocol version " + extra_files.at("protocol_version"); ctorch_error(message, [&]() { delete module; }); } auto feature_str = extra_files.at("features"); - // formatted as ["feature1", "feature2", ...] parse without using a full json library + // formatted as ["feature1", "feature2", ...] parse without using a full json + // library std::unordered_map feature_keys; size_t pos = 0; while ((pos = feature_str.find('"', pos)) != std::string::npos) { size_t end_pos = feature_str.find('"', pos + 1); - if (end_pos == std::string::npos) break; + if (end_pos == std::string::npos) + break; auto feature_key = feature_str.substr(pos + 1, end_pos - pos - 1); if (feature_key == "density") { feature_keys.insert({feature_key, Feature_Density}); @@ -130,25 +122,23 @@ skala_model_load(const char *filename, return module; } -static inline -at::Tensor -skala_model_forward(torch::jit::script::Module module, const c10::Dict &features) -{ +static inline at::Tensor +skala_model_forward(torch::jit::script::Module module, + const c10::Dict &features) { std::vector args; std::unordered_map kwargs; kwargs["mol"] = features; return module.get_method("get_exc_density")(args, kwargs).toTensor(); } -extern "C" -void -skala_model_get_exc(torch_jit_script_module_t module, skala_dict_t input, torch_tensor_t* output) -{ +extern "C" void skala_model_get_exc(torch_jit_script_module_t module, + skala_dict_t input, + torch_tensor_t *output) { auto model = static_cast(module); auto dict = static_cast(input); c10::Dict features; - for (const auto& entry : *dict) { + for (const auto &entry : *dict) { auto tensor = torch::stack(entry.value()); features.insert(entry.key(), tensor); } @@ -157,20 +147,22 @@ skala_model_get_exc(torch_jit_script_module_t module, skala_dict_t input, torch_ *output = new at::Tensor(std::move(exc_on_grid)); } -extern "C" -void -skala_model_get_exc_and_vxc(torch_jit_script_module_t module, skala_dict_t input, torch_tensor_t* exc_output, skala_dict_t* grad_output) -{ +extern "C" void skala_model_get_exc_and_vxc(torch_jit_script_module_t module, + skala_dict_t input, + torch_tensor_t *exc_output, + skala_dict_t *grad_output) { auto model = static_cast(module); auto dict = static_cast(input); std::vector input_tensors; std::vector tensor_keys; c10::Dict features_with_grad; - for (const auto& entry : *dict) { + for (const auto &entry : *dict) { std::string key = entry.key(); - bool requires_grad = (key == "density" || key == "grad" || key == "kin" || key == "coarse_0_atomic_coords" || key == "grid_coords" || key == "grid_weights"); - const auto& values = entry.value(); + bool requires_grad = (key == "density" || key == "grad" || key == "kin" || + key == "coarse_0_atomic_coords" || + key == "grid_coords" || key == "grid_weights"); + const auto &values = entry.value(); std::vector tensors; for (const auto &value : values) { auto tensor_with_grad = value.clone().requires_grad_(requires_grad); @@ -200,7 +192,7 @@ skala_model_get_exc_and_vxc(torch_jit_script_module_t module, skala_dict_t input grad_map[tensor_keys[i]].push_back(grad_tensors[i]); } c10::Dict> gradients; - for (auto& [key, value] : grad_map) { + for (auto &[key, value] : grad_map) { gradients.insert(key, std::move(value)); } @@ -208,35 +200,28 @@ skala_model_get_exc_and_vxc(torch_jit_script_module_t module, skala_dict_t input *grad_output = new SkalaDict(std::move(gradients)); } -extern "C" -skala_dict_t -skala_dict_new() -{ - SkalaDict* input = new SkalaDict(); +extern "C" skala_dict_t skala_dict_new() { + SkalaDict *input = new SkalaDict(); return static_cast(input); } -extern "C" -void -skala_dict_insert(skala_dict_t input, const char* key, const torch_tensor_t* values, size_t size) -{ +extern "C" void skala_dict_insert(skala_dict_t input, const char *key, + const torch_tensor_t *values, size_t size) { auto dict = static_cast(input); std::vector tensors; tensors.reserve(size); for (size_t i = 0; i < size; ++i) { - auto tensor = static_cast(values[i]); + auto tensor = static_cast(values[i]); tensors.push_back(*tensor); } dict->insert(std::string(key), tensors); } -extern "C" -skala_list_t -skala_dict_at(skala_dict_t input, const char* key) -{ +extern "C" skala_list_t skala_dict_at(skala_dict_t input, const char *key) { auto dict = static_cast(input); if (!dict->contains(key)) { - std::string message = "Key '" + std::string(key) + "' not found in SkalaDict"; + std::string message = + "Key '" + std::string(key) + "' not found in SkalaDict"; ctorch_error(message, []() {}); } auto tensors = (*dict).at(key); @@ -245,54 +230,42 @@ skala_dict_at(skala_dict_t input, const char* key) ctorch_error(message, []() {}); } - SkalaList* list = new SkalaList(std::move(tensors)); + SkalaList *list = new SkalaList(std::move(tensors)); return list; } -extern "C" -size_t -skala_list_size(skala_list_t input) -{ +extern "C" size_t skala_list_size(skala_list_t input) { auto list = static_cast(input); return list->size(); } -extern "C" -torch_tensor_t -skala_list_at(skala_list_t input, size_t index) -{ +extern "C" torch_tensor_t skala_list_at(skala_list_t input, size_t index) { auto list = static_cast(input); if (index >= list->size()) { - std::string message = "Index " + std::to_string(index) + " out of bounds for SkalaList of size " + std::to_string(list->size()); + std::string message = "Index " + std::to_string(index) + + " out of bounds for SkalaList of size " + + std::to_string(list->size()); ctorch_error(message, []() {}); } auto tensor = (*list)[index]; return new at::Tensor(std::move(tensor)); } -extern "C" -torch_tensor_t -skala_tensor_mul(const torch_tensor_t a, const torch_tensor_t b) -{ +extern "C" torch_tensor_t skala_tensor_mul(const torch_tensor_t a, + const torch_tensor_t b) { auto ta = reinterpret_cast(a); auto tb = reinterpret_cast(b); auto result = (*ta) * (*tb); return new torch::Tensor(std::move(result)); } -extern "C" -torch_tensor_t -skala_tensor_mean(const torch_tensor_t tensor) -{ +extern "C" torch_tensor_t skala_tensor_mean(const torch_tensor_t tensor) { auto t = reinterpret_cast(tensor); auto m = t->mean(); return new torch::Tensor(std::move(m)); } -extern "C" -void* -skala_tensor_data_ptr(const torch_tensor_t tensor) -{ +extern "C" void *skala_tensor_data_ptr(const torch_tensor_t tensor) { auto t = reinterpret_cast(tensor); auto contiguous = t->contiguous().to(torch::kFloat64); // Replace the tensor in-place so the pointer stays valid @@ -300,44 +273,31 @@ skala_tensor_data_ptr(const torch_tensor_t tensor) return t->data_ptr(); } -extern "C" -int64_t -skala_tensor_ndim(const torch_tensor_t tensor) -{ +extern "C" int64_t skala_tensor_ndim(const torch_tensor_t tensor) { auto t = reinterpret_cast(tensor); return t->ndimension(); } -extern "C" -int64_t -skala_tensor_size(const torch_tensor_t tensor, int64_t dim) -{ +extern "C" int64_t skala_tensor_size(const torch_tensor_t tensor, int64_t dim) { auto t = reinterpret_cast(tensor); return t->size(dim); } -extern "C" -int64_t -skala_tensor_numel(const torch_tensor_t tensor) -{ +extern "C" int64_t skala_tensor_numel(const torch_tensor_t tensor) { auto t = reinterpret_cast(tensor); return t->numel(); } -extern "C" -void -skala_dict_delete(skala_dict_t input) -{ - if (input == nullptr) return; +extern "C" void skala_dict_delete(skala_dict_t input) { + if (input == nullptr) + return; auto dict = static_cast(input); delete dict; } -extern "C" -void -skala_list_delete(skala_list_t input) -{ - if (input == nullptr) return; +extern "C" void skala_list_delete(skala_list_t input) { + if (input == nullptr) + return; auto list = static_cast(input); delete list; } \ No newline at end of file diff --git a/model/examples/fortran/ftorch_integration/src/skala_ftorch.f90 b/model/examples/fortran/ftorch_integration/src/skala_ftorch.f90 index 3eaa2fd2..9324c475 100644 --- a/model/examples/fortran/ftorch_integration/src/skala_ftorch.f90 +++ b/model/examples/fortran/ftorch_integration/src/skala_ftorch.f90 @@ -1,514 +1,514 @@ module skala_ftorch - use iso_c_binding, only : c_ptr, c_char, c_int, c_int64_t, c_size_t, c_bool, & - & c_null_ptr, c_null_char, c_double, c_f_pointer - use ftorch, only : torch_model, torch_model_delete, torch_tensor - implicit none - private - - public :: skala_model, skala_model_load, skala_feature, skala_tensor_load, & - & skala_tensor_sum, skala_tensor_mean, skala_tensor_mul, skala_tensor_item_double, & - & skala_tensor_to_array, & - & skala_tensor_numel, skala_tensor_ndim, skala_tensor_size, & - & skala_dict, skala_dict_new - - interface skala_tensor_to_array - module procedure skala_tensor_to_array_1d - module procedure skala_tensor_to_array_2d - module procedure skala_tensor_to_array_3d - end interface skala_tensor_to_array - - type :: skala_feature_enum - integer :: density = 1 - integer :: grad = 2 - integer :: kin = 3 - integer :: grid_coords = 4 - integer :: grid_weights = 5 - integer :: coarse_0_atomic_coords = 6 - integer :: atomic_grid_weights = 7 - integer :: atomic_grid_sizes = 8 - integer :: atomic_grid_size_bound_shape = 9 - integer :: max_feature = 9 - end type skala_feature_enum - type(skala_feature_enum), parameter :: skala_feature = skala_feature_enum() - - type :: skala_dict - type(c_ptr) :: p = c_null_ptr - contains - generic :: at => at_one, at_vec - procedure, private :: at_one => skala_dict_at_one - procedure, private :: at_vec => skala_dict_at_vec - generic :: insert => insert_vec, insert_one - procedure, private :: insert_vec => skala_dict_insert_vec - procedure, private :: insert_one => skala_dict_insert_one - final :: skala_dict_delete - end type skala_dict - - type, extends(torch_model) :: skala_model - integer(c_int), allocatable :: features(:) - contains - procedure :: get_exc => skala_model_get_exc - procedure :: get_exc_and_vxc => skala_model_get_exc_and_vxc - procedure :: needs_feature => skala_model_needs_feature - final :: skala_model_delete - end type skala_model + use iso_c_binding, only: c_ptr, c_char, c_int, c_int64_t, c_size_t, c_bool, & + & c_null_ptr, c_null_char, c_double, c_f_pointer + use ftorch, only: torch_model, torch_model_delete, torch_tensor + implicit none + private + + public :: skala_model, skala_model_load, skala_feature, skala_tensor_load, & + & skala_tensor_sum, skala_tensor_mean, skala_tensor_mul, skala_tensor_item_double, & + & skala_tensor_to_array, & + & skala_tensor_numel, skala_tensor_ndim, skala_tensor_size, & + & skala_dict, skala_dict_new + + interface skala_tensor_to_array + module procedure skala_tensor_to_array_1d + module procedure skala_tensor_to_array_2d + module procedure skala_tensor_to_array_3d + end interface skala_tensor_to_array + + type :: skala_feature_enum + integer :: density = 1 + integer :: grad = 2 + integer :: kin = 3 + integer :: grid_coords = 4 + integer :: grid_weights = 5 + integer :: coarse_0_atomic_coords = 6 + integer :: atomic_grid_weights = 7 + integer :: atomic_grid_sizes = 8 + integer :: atomic_grid_size_bound_shape = 9 + integer :: max_feature = 9 + end type skala_feature_enum + type(skala_feature_enum), parameter :: skala_feature = skala_feature_enum() + + type :: skala_dict + type(c_ptr) :: p = c_null_ptr + contains + generic :: at => at_one, at_vec + procedure, private :: at_one => skala_dict_at_one + procedure, private :: at_vec => skala_dict_at_vec + generic :: insert => insert_vec, insert_one + procedure, private :: insert_vec => skala_dict_insert_vec + procedure, private :: insert_one => skala_dict_insert_one + final :: skala_dict_delete + end type skala_dict + + type, extends(torch_model) :: skala_model + integer(c_int), allocatable :: features(:) + contains + procedure :: get_exc => skala_model_get_exc + procedure :: get_exc_and_vxc => skala_model_get_exc_and_vxc + procedure :: needs_feature => skala_model_needs_feature + final :: skala_model_delete + end type skala_model contains - subroutine skala_model_load(model, path, requires_grad) - type(skala_model), intent(out) :: model - character(len=*), intent(in) :: path - logical, intent(in), optional :: requires_grad - - interface - function load_skala_model_c(path, requires_grad, features) result(model) & - & bind(c, name="skala_model_load") - import :: c_ptr, c_char, c_int, c_bool - character(kind=c_char), intent(in) :: path(*) - logical(c_bool), value :: requires_grad - integer(c_int), intent(out) :: features(*) - type(c_ptr) :: model - end function load_skala_model_c - end interface - - logical(c_bool) :: requires_grad_c - integer(c_int) :: features(skala_feature%max_feature) - - requires_grad_c = .false. - if (present(requires_grad)) requires_grad_c = requires_grad - - features(:) = 0 - model%p = load_skala_model_c(to_c_str(path), requires_grad_c, features) - model%features = pack(features, features > 0) - end subroutine skala_model_load - - subroutine skala_tensor_load(tensor, path) - type(torch_tensor), intent(out) :: tensor - character(len=*), intent(in) :: path - - interface - function skala_tensor_load_c(path) result(tensor) bind(c, name="skala_tensor_load") - import :: c_ptr, c_char - character(kind=c_char), intent(in) :: path(*) - type(c_ptr) :: tensor - end function skala_tensor_load_c - end interface - - tensor%p = skala_tensor_load_c(to_c_str(path)) - end subroutine skala_tensor_load - - subroutine skala_tensor_sum(tensor, sum) - type(torch_tensor), intent(in) :: tensor - type(torch_tensor), intent(out) :: sum - - interface - function skala_tensor_sum_c(tensor) result(sum) bind(c, name="skala_tensor_sum") - import :: c_ptr, c_double - type(c_ptr), value :: tensor - type(c_ptr) :: sum - end function skala_tensor_sum_c - end interface - - sum%p = skala_tensor_sum_c(tensor%p) - end subroutine skala_tensor_sum - - function skala_tensor_item_double(tensor) result(value) - type(torch_tensor), intent(in) :: tensor - real(c_double) :: value - - interface - function skala_tensor_item_double_c(tensor) result(value) bind(c, name="skala_tensor_item_double") - import :: c_ptr, c_double - type(c_ptr), value :: tensor - real(c_double) :: value - end function skala_tensor_item_double_c - end interface - - value = skala_tensor_item_double_c(tensor%p) - end function skala_tensor_item_double - - subroutine skala_tensor_mul(a, b, result) - type(torch_tensor), intent(in) :: a, b - type(torch_tensor), intent(out) :: result - - interface - function skala_tensor_mul_c(a, b) result(r) bind(c, name="skala_tensor_mul") - import :: c_ptr - type(c_ptr), value :: a, b - type(c_ptr) :: r - end function skala_tensor_mul_c - end interface - - result%p = skala_tensor_mul_c(a%p, b%p) - end subroutine skala_tensor_mul - - subroutine skala_tensor_mean(tensor, mean) - type(torch_tensor), intent(in) :: tensor - type(torch_tensor), intent(out) :: mean - - interface - function skala_tensor_mean_c(tensor) result(mean) bind(c, name="skala_tensor_mean") - import :: c_ptr - type(c_ptr), value :: tensor - type(c_ptr) :: mean - end function skala_tensor_mean_c - end interface - - mean%p = skala_tensor_mean_c(tensor%p) - end subroutine skala_tensor_mean - - function skala_tensor_numel(tensor) result(n) - type(torch_tensor), intent(in) :: tensor - integer(c_int64_t) :: n - - interface - function skala_tensor_numel_c(tensor) result(n) bind(c, name="skala_tensor_numel") - import :: c_ptr, c_int64_t - type(c_ptr), value :: tensor - integer(c_int64_t) :: n - end function skala_tensor_numel_c - end interface - - n = skala_tensor_numel_c(tensor%p) - end function skala_tensor_numel - - function skala_tensor_ndim(tensor) result(n) - type(torch_tensor), intent(in) :: tensor - integer(c_int64_t) :: n - - interface - function skala_tensor_ndim_c(tensor) result(n) bind(c, name="skala_tensor_ndim") - import :: c_ptr, c_int64_t - type(c_ptr), value :: tensor - integer(c_int64_t) :: n - end function skala_tensor_ndim_c - end interface - - n = skala_tensor_ndim_c(tensor%p) - end function skala_tensor_ndim - - function skala_tensor_size(tensor, dim) result(n) - type(torch_tensor), intent(in) :: tensor - integer, intent(in) :: dim - integer(c_int64_t) :: n - - interface - function skala_tensor_size_c(tensor, dim) result(n) bind(c, name="skala_tensor_size") - import :: c_ptr, c_int64_t - type(c_ptr), value :: tensor - integer(c_int64_t), value :: dim - integer(c_int64_t) :: n - end function skala_tensor_size_c - end interface - - n = skala_tensor_size_c(tensor%p, int(dim, c_int64_t)) - end function skala_tensor_size - - subroutine skala_tensor_to_array_1d(tensor, array) - type(torch_tensor), intent(in) :: tensor - real(c_double), pointer, intent(out) :: array(:) - - interface - function skala_tensor_data_ptr_c(tensor) result(ptr) bind(c, name="skala_tensor_data_ptr") - import :: c_ptr - type(c_ptr), value :: tensor - type(c_ptr) :: ptr - end function skala_tensor_data_ptr_c - end interface - - type(c_ptr) :: data_ptr - integer(c_int64_t) :: n - - n = skala_tensor_numel(tensor) - data_ptr = skala_tensor_data_ptr_c(tensor%p) - call c_f_pointer(data_ptr, array, [n]) - end subroutine skala_tensor_to_array_1d - - subroutine skala_tensor_to_array_2d(tensor, array) - type(torch_tensor), intent(in) :: tensor - real(c_double), pointer, intent(out) :: array(:,:) - - interface - function skala_tensor_data_ptr_c(tensor) result(ptr) bind(c, name="skala_tensor_data_ptr") - import :: c_ptr - type(c_ptr), value :: tensor - type(c_ptr) :: ptr - end function skala_tensor_data_ptr_c - end interface - - type(c_ptr) :: data_ptr - integer(c_int64_t) :: nrow, ncol - - ! C is row-major, Fortran is column-major: swap dimensions - nrow = skala_tensor_size(tensor, 1) - ncol = skala_tensor_size(tensor, 0) - data_ptr = skala_tensor_data_ptr_c(tensor%p) - call c_f_pointer(data_ptr, array, [nrow, ncol]) - end subroutine skala_tensor_to_array_2d - - subroutine skala_tensor_to_array_3d(tensor, array) - type(torch_tensor), intent(in) :: tensor - real(c_double), pointer, intent(out) :: array(:,:,:) - - interface - function skala_tensor_data_ptr_c(tensor) result(ptr) bind(c, name="skala_tensor_data_ptr") - import :: c_ptr - type(c_ptr), value :: tensor - type(c_ptr) :: ptr - end function skala_tensor_data_ptr_c - end interface - - type(c_ptr) :: data_ptr - integer(c_int64_t) :: n0, n1, n2 - - ! C is row-major, Fortran is column-major: reverse dimension order - n0 = skala_tensor_size(tensor, 2) - n1 = skala_tensor_size(tensor, 1) - n2 = skala_tensor_size(tensor, 0) - data_ptr = skala_tensor_data_ptr_c(tensor%p) - call c_f_pointer(data_ptr, array, [n0, n1, n2]) - end subroutine skala_tensor_to_array_3d - - subroutine skala_model_get_exc(model, input, exc) - class(skala_model), intent(inout) :: model - type(skala_dict), intent(in) :: input - type(torch_tensor), intent(out) :: exc - - interface - subroutine skala_model_get_exc_c(model_c, input_c, output_c) bind(c, name="skala_model_get_exc") - import :: c_ptr - type(c_ptr), value :: model_c - type(c_ptr), value :: input_c - type(c_ptr), intent(out) :: output_c - end subroutine skala_model_get_exc_c - end interface - - call skala_model_get_exc_c(model%torch_model%p, input%p, exc%p) - end subroutine skala_model_get_exc - - subroutine skala_model_get_exc_and_vxc(model, input, exc, vxc) - class(skala_model), intent(inout) :: model - type(skala_dict), intent(in) :: input - type(torch_tensor), intent(out) :: exc - type(skala_dict), intent(out) :: vxc - - interface - subroutine skala_model_get_exc_and_vxc_c(model_c, input_c, exc_c, vxc_c) bind(c, name="skala_model_get_exc_and_vxc") - import :: c_ptr - type(c_ptr), value :: model_c - type(c_ptr), value :: input_c - type(c_ptr), intent(out) :: exc_c - type(c_ptr), intent(out) :: vxc_c - end subroutine skala_model_get_exc_and_vxc_c - end interface - - call skala_model_get_exc_and_vxc_c(model%torch_model%p, input%p, exc%p, vxc%p) - end subroutine skala_model_get_exc_and_vxc - - function skala_model_needs_feature(model, feature) result(needs) - class(skala_model), intent(in) :: model - integer, intent(in) :: feature - logical :: needs - - needs = any(model%features == feature) - end function skala_model_needs_feature - - subroutine skala_model_delete(model) - type(skala_model), intent(inout) :: model - - call torch_model_delete(model%torch_model) - end subroutine skala_model_delete - - subroutine skala_dict_new(input) - type(skala_dict), intent(out) :: input - - interface - function skala_dict_new_c() result(input) bind(c, name="skala_dict_new") - import :: c_ptr - type(c_ptr) :: input - end function skala_dict_new_c - end interface - - input%p = skala_dict_new_c() - end subroutine skala_dict_new - - subroutine skala_feature_key(feature, key) - integer, intent(in) :: feature - character(kind=c_char, len=:), allocatable, intent(out) :: key - select case(feature) - case default - error stop "Unknown feature" - case (skala_feature%density) - key = "density" - case (skala_feature%grad) - key = "grad" - case (skala_feature%kin) - key = "kin" - case (skala_feature%grid_coords) - key = "grid_coords" - case (skala_feature%grid_weights) - key = "grid_weights" - case (skala_feature%coarse_0_atomic_coords) - key = "coarse_0_atomic_coords" - case (skala_feature%atomic_grid_weights) - key = "atomic_grid_weights" - case (skala_feature%atomic_grid_sizes) - key = "atomic_grid_sizes" - case (skala_feature%atomic_grid_size_bound_shape) - key = "atomic_grid_size_bound_shape" - end select - end subroutine skala_feature_key - - pure function to_c_str(str) result(c_str) - character(len=*), intent(in) :: str - character(kind=c_char) :: c_str(len(str)+1) - - c_str = transfer(str // c_null_char, [character(kind=c_char)::], len(str)+1) - end function to_c_str - - subroutine skala_dict_insert_one(dict, feature, tensor) - class(skala_dict), intent(inout) :: dict - integer, intent(in) :: feature - type(torch_tensor), intent(in) :: tensor - - interface - subroutine skala_dict_insert_c(dict, feature, tensors, ntensors) bind(c, name="skala_dict_insert") - import :: c_ptr, c_size_t, c_char - type(c_ptr), value :: dict - character(kind=c_char), intent(in) :: feature(*) - type(c_ptr), intent(in) :: tensors(*) - integer(c_size_t), value :: ntensors - end subroutine skala_dict_insert_c - end interface - - character(kind=c_char, len=:), allocatable :: key - type(c_ptr) :: tensor_ptr(1) - - tensor_ptr(1) = tensor%p - - call skala_feature_key(feature, key) - call skala_dict_insert_c(dict%p, to_c_str(key), tensor_ptr, 1_c_size_t) - end subroutine skala_dict_insert_one - - subroutine skala_dict_insert_vec(dict, feature, tensors) - class(skala_dict), intent(inout) :: dict - integer, intent(in) :: feature - type(torch_tensor), intent(in) :: tensors(:) - - interface - subroutine skala_dict_insert_c(dict, feature, tensors, ntensors) bind(c, name="skala_dict_insert") - import :: c_ptr, c_size_t, c_char - type(c_ptr), value :: dict - character(kind=c_char), intent(in) :: feature(*) - type(c_ptr), intent(in) :: tensors(*) - integer(c_size_t), value :: ntensors - end subroutine skala_dict_insert_c - end interface - - character(kind=c_char, len=:), allocatable :: key - type(c_ptr), allocatable :: tensor_ptrs(:) - integer :: iptr - - allocate(tensor_ptrs(size(tensors))) - do iptr = 1, size(tensors) - tensor_ptrs(iptr) = tensors(iptr)%p - end do - - call skala_feature_key(feature, key) - call skala_dict_insert_c(dict%p, to_c_str(key), tensor_ptrs, size(tensor_ptrs, kind=c_size_t)) - end subroutine skala_dict_insert_vec - - subroutine skala_dict_at_one(dict, feature, tensor) - class(skala_dict), intent(in) :: dict - integer, intent(in) :: feature - type(torch_tensor), intent(out) :: tensor - - interface - function skala_dict_at_c(dict, key) result(list) bind(c, name="skala_dict_at") - import :: c_ptr, c_char - type(c_ptr), value :: dict - character(kind=c_char), intent(in) :: key(*) - type(c_ptr) :: list - end function skala_dict_at_c - - function skala_list_at_c(list, index) result(tensor) bind(c, name="skala_list_at") - import :: c_ptr, c_size_t - type(c_ptr), value :: list - integer(c_size_t), value :: index - type(c_ptr) :: tensor - end function skala_list_at_c - - subroutine skala_list_delete_c(list) bind(c, name="skala_list_delete") - import :: c_ptr - type(c_ptr), value :: list - end subroutine skala_list_delete_c - end interface - - character(kind=c_char, len=:), allocatable :: key - type(c_ptr) :: list - - call skala_feature_key(feature, key) - list = skala_dict_at_c(dict%p, to_c_str(key)) - tensor%p = skala_list_at_c(list, 0_c_size_t) - call skala_list_delete_c(list) - end subroutine skala_dict_at_one - - subroutine skala_dict_at_vec(dict, feature, tensors, ntensors) - class(skala_dict), intent(in) :: dict - integer, intent(in) :: feature - type(torch_tensor), intent(out) :: tensors(:) - integer, intent(out) :: ntensors - - interface - function skala_dict_at_c(dict, key) result(list) bind(c, name="skala_dict_at") - import :: c_ptr, c_char - type(c_ptr), value :: dict - character(kind=c_char), intent(in) :: key(*) - type(c_ptr) :: list - end function skala_dict_at_c - - function skala_list_size_c(list) result(n) bind(c, name="skala_list_size") - import :: c_ptr, c_size_t - type(c_ptr), value :: list - integer(c_size_t) :: n - end function skala_list_size_c - - function skala_list_at_c(list, index) result(tensor) bind(c, name="skala_list_at") - import :: c_ptr, c_size_t - type(c_ptr), value :: list - integer(c_size_t), value :: index - type(c_ptr) :: tensor - end function skala_list_at_c - - subroutine skala_list_delete_c(list) bind(c, name="skala_list_delete") - import :: c_ptr - type(c_ptr), value :: list - end subroutine skala_list_delete_c - end interface - - character(kind=c_char, len=:), allocatable :: key - type(c_ptr) :: list - integer :: i - - call skala_feature_key(feature, key) - list = skala_dict_at_c(dict%p, to_c_str(key)) - ntensors = int(skala_list_size_c(list)) - do i = 1, min(ntensors, size(tensors)) - tensors(i)%p = skala_list_at_c(list, int(i - 1, c_size_t)) - end do - call skala_list_delete_c(list) - end subroutine skala_dict_at_vec - - subroutine skala_dict_delete(dict) - type(skala_dict), intent(inout) :: dict - - interface - subroutine skala_dict_delete_c(dict) bind(c, name="skala_dict_delete") - import :: c_ptr - type(c_ptr), value :: dict - end subroutine skala_dict_delete_c - end interface - - call skala_dict_delete_c(dict%p) - end subroutine skala_dict_delete - -end module skala_ftorch \ No newline at end of file + subroutine skala_model_load(model, path, requires_grad) + type(skala_model), intent(out) :: model + character(len=*), intent(in) :: path + logical, intent(in), optional :: requires_grad + + interface + function load_skala_model_c(path, requires_grad, features) result(model) & + & bind(c, name="skala_model_load") + import :: c_ptr, c_char, c_int, c_bool + character(kind=c_char), intent(in) :: path(*) + logical(c_bool), value :: requires_grad + integer(c_int), intent(out) :: features(*) + type(c_ptr) :: model + end function load_skala_model_c + end interface + + logical(c_bool) :: requires_grad_c + integer(c_int) :: features(skala_feature%max_feature) + + requires_grad_c = .false. + if (present(requires_grad)) requires_grad_c = requires_grad + + features(:) = 0 + model%p = load_skala_model_c(to_c_str(path), requires_grad_c, features) + model%features = pack(features, features > 0) + end subroutine skala_model_load + + subroutine skala_tensor_load(tensor, path) + type(torch_tensor), intent(out) :: tensor + character(len=*), intent(in) :: path + + interface + function skala_tensor_load_c(path) result(tensor) bind(c, name="skala_tensor_load") + import :: c_ptr, c_char + character(kind=c_char), intent(in) :: path(*) + type(c_ptr) :: tensor + end function skala_tensor_load_c + end interface + + tensor%p = skala_tensor_load_c(to_c_str(path)) + end subroutine skala_tensor_load + + subroutine skala_tensor_sum(tensor, sum) + type(torch_tensor), intent(in) :: tensor + type(torch_tensor), intent(out) :: sum + + interface + function skala_tensor_sum_c(tensor) result(sum) bind(c, name="skala_tensor_sum") + import :: c_ptr, c_double + type(c_ptr), value :: tensor + type(c_ptr) :: sum + end function skala_tensor_sum_c + end interface + + sum%p = skala_tensor_sum_c(tensor%p) + end subroutine skala_tensor_sum + + function skala_tensor_item_double(tensor) result(value) + type(torch_tensor), intent(in) :: tensor + real(c_double) :: value + + interface + function skala_tensor_item_double_c(tensor) result(value) bind(c, name="skala_tensor_item_double") + import :: c_ptr, c_double + type(c_ptr), value :: tensor + real(c_double) :: value + end function skala_tensor_item_double_c + end interface + + value = skala_tensor_item_double_c(tensor%p) + end function skala_tensor_item_double + + subroutine skala_tensor_mul(a, b, result) + type(torch_tensor), intent(in) :: a, b + type(torch_tensor), intent(out) :: result + + interface + function skala_tensor_mul_c(a, b) result(r) bind(c, name="skala_tensor_mul") + import :: c_ptr + type(c_ptr), value :: a, b + type(c_ptr) :: r + end function skala_tensor_mul_c + end interface + + result%p = skala_tensor_mul_c(a%p, b%p) + end subroutine skala_tensor_mul + + subroutine skala_tensor_mean(tensor, mean) + type(torch_tensor), intent(in) :: tensor + type(torch_tensor), intent(out) :: mean + + interface + function skala_tensor_mean_c(tensor) result(mean) bind(c, name="skala_tensor_mean") + import :: c_ptr + type(c_ptr), value :: tensor + type(c_ptr) :: mean + end function skala_tensor_mean_c + end interface + + mean%p = skala_tensor_mean_c(tensor%p) + end subroutine skala_tensor_mean + + function skala_tensor_numel(tensor) result(n) + type(torch_tensor), intent(in) :: tensor + integer(c_int64_t) :: n + + interface + function skala_tensor_numel_c(tensor) result(n) bind(c, name="skala_tensor_numel") + import :: c_ptr, c_int64_t + type(c_ptr), value :: tensor + integer(c_int64_t) :: n + end function skala_tensor_numel_c + end interface + + n = skala_tensor_numel_c(tensor%p) + end function skala_tensor_numel + + function skala_tensor_ndim(tensor) result(n) + type(torch_tensor), intent(in) :: tensor + integer(c_int64_t) :: n + + interface + function skala_tensor_ndim_c(tensor) result(n) bind(c, name="skala_tensor_ndim") + import :: c_ptr, c_int64_t + type(c_ptr), value :: tensor + integer(c_int64_t) :: n + end function skala_tensor_ndim_c + end interface + + n = skala_tensor_ndim_c(tensor%p) + end function skala_tensor_ndim + + function skala_tensor_size(tensor, dim) result(n) + type(torch_tensor), intent(in) :: tensor + integer, intent(in) :: dim + integer(c_int64_t) :: n + + interface + function skala_tensor_size_c(tensor, dim) result(n) bind(c, name="skala_tensor_size") + import :: c_ptr, c_int64_t + type(c_ptr), value :: tensor + integer(c_int64_t), value :: dim + integer(c_int64_t) :: n + end function skala_tensor_size_c + end interface + + n = skala_tensor_size_c(tensor%p, int(dim, c_int64_t)) + end function skala_tensor_size + + subroutine skala_tensor_to_array_1d(tensor, array) + type(torch_tensor), intent(in) :: tensor + real(c_double), pointer, intent(out) :: array(:) + + interface + function skala_tensor_data_ptr_c(tensor) result(ptr) bind(c, name="skala_tensor_data_ptr") + import :: c_ptr + type(c_ptr), value :: tensor + type(c_ptr) :: ptr + end function skala_tensor_data_ptr_c + end interface + + type(c_ptr) :: data_ptr + integer(c_int64_t) :: n + + n = skala_tensor_numel(tensor) + data_ptr = skala_tensor_data_ptr_c(tensor%p) + call c_f_pointer(data_ptr, array, [n]) + end subroutine skala_tensor_to_array_1d + + subroutine skala_tensor_to_array_2d(tensor, array) + type(torch_tensor), intent(in) :: tensor + real(c_double), pointer, intent(out) :: array(:, :) + + interface + function skala_tensor_data_ptr_c(tensor) result(ptr) bind(c, name="skala_tensor_data_ptr") + import :: c_ptr + type(c_ptr), value :: tensor + type(c_ptr) :: ptr + end function skala_tensor_data_ptr_c + end interface + + type(c_ptr) :: data_ptr + integer(c_int64_t) :: nrow, ncol + + ! C is row-major, Fortran is column-major: swap dimensions + nrow = skala_tensor_size(tensor, 1) + ncol = skala_tensor_size(tensor, 0) + data_ptr = skala_tensor_data_ptr_c(tensor%p) + call c_f_pointer(data_ptr, array, [nrow, ncol]) + end subroutine skala_tensor_to_array_2d + + subroutine skala_tensor_to_array_3d(tensor, array) + type(torch_tensor), intent(in) :: tensor + real(c_double), pointer, intent(out) :: array(:, :, :) + + interface + function skala_tensor_data_ptr_c(tensor) result(ptr) bind(c, name="skala_tensor_data_ptr") + import :: c_ptr + type(c_ptr), value :: tensor + type(c_ptr) :: ptr + end function skala_tensor_data_ptr_c + end interface + + type(c_ptr) :: data_ptr + integer(c_int64_t) :: n0, n1, n2 + + ! C is row-major, Fortran is column-major: reverse dimension order + n0 = skala_tensor_size(tensor, 2) + n1 = skala_tensor_size(tensor, 1) + n2 = skala_tensor_size(tensor, 0) + data_ptr = skala_tensor_data_ptr_c(tensor%p) + call c_f_pointer(data_ptr, array, [n0, n1, n2]) + end subroutine skala_tensor_to_array_3d + + subroutine skala_model_get_exc(model, input, exc) + class(skala_model), intent(inout) :: model + type(skala_dict), intent(in) :: input + type(torch_tensor), intent(out) :: exc + + interface + subroutine skala_model_get_exc_c(model_c, input_c, output_c) bind(c, name="skala_model_get_exc") + import :: c_ptr + type(c_ptr), value :: model_c + type(c_ptr), value :: input_c + type(c_ptr), intent(out) :: output_c + end subroutine skala_model_get_exc_c + end interface + + call skala_model_get_exc_c(model%torch_model%p, input%p, exc%p) + end subroutine skala_model_get_exc + + subroutine skala_model_get_exc_and_vxc(model, input, exc, vxc) + class(skala_model), intent(inout) :: model + type(skala_dict), intent(in) :: input + type(torch_tensor), intent(out) :: exc + type(skala_dict), intent(out) :: vxc + + interface + subroutine skala_model_get_exc_and_vxc_c(model_c, input_c, exc_c, vxc_c) bind(c, name="skala_model_get_exc_and_vxc") + import :: c_ptr + type(c_ptr), value :: model_c + type(c_ptr), value :: input_c + type(c_ptr), intent(out) :: exc_c + type(c_ptr), intent(out) :: vxc_c + end subroutine skala_model_get_exc_and_vxc_c + end interface + + call skala_model_get_exc_and_vxc_c(model%torch_model%p, input%p, exc%p, vxc%p) + end subroutine skala_model_get_exc_and_vxc + + function skala_model_needs_feature(model, feature) result(needs) + class(skala_model), intent(in) :: model + integer, intent(in) :: feature + logical :: needs + + needs = any(model%features == feature) + end function skala_model_needs_feature + + subroutine skala_model_delete(model) + type(skala_model), intent(inout) :: model + + call torch_model_delete(model%torch_model) + end subroutine skala_model_delete + + subroutine skala_dict_new(input) + type(skala_dict), intent(out) :: input + + interface + function skala_dict_new_c() result(input) bind(c, name="skala_dict_new") + import :: c_ptr + type(c_ptr) :: input + end function skala_dict_new_c + end interface + + input%p = skala_dict_new_c() + end subroutine skala_dict_new + + subroutine skala_feature_key(feature, key) + integer, intent(in) :: feature + character(kind=c_char, len=:), allocatable, intent(out) :: key + select case (feature) + case default + error stop "Unknown feature" + case (skala_feature%density) + key = "density" + case (skala_feature%grad) + key = "grad" + case (skala_feature%kin) + key = "kin" + case (skala_feature%grid_coords) + key = "grid_coords" + case (skala_feature%grid_weights) + key = "grid_weights" + case (skala_feature%coarse_0_atomic_coords) + key = "coarse_0_atomic_coords" + case (skala_feature%atomic_grid_weights) + key = "atomic_grid_weights" + case (skala_feature%atomic_grid_sizes) + key = "atomic_grid_sizes" + case (skala_feature%atomic_grid_size_bound_shape) + key = "atomic_grid_size_bound_shape" + end select + end subroutine skala_feature_key + + pure function to_c_str(str) result(c_str) + character(len=*), intent(in) :: str + character(kind=c_char) :: c_str(len(str) + 1) + + c_str = transfer(str//c_null_char, [character(kind=c_char)::], len(str) + 1) + end function to_c_str + + subroutine skala_dict_insert_one(dict, feature, tensor) + class(skala_dict), intent(inout) :: dict + integer, intent(in) :: feature + type(torch_tensor), intent(in) :: tensor + + interface + subroutine skala_dict_insert_c(dict, feature, tensors, ntensors) bind(c, name="skala_dict_insert") + import :: c_ptr, c_size_t, c_char + type(c_ptr), value :: dict + character(kind=c_char), intent(in) :: feature(*) + type(c_ptr), intent(in) :: tensors(*) + integer(c_size_t), value :: ntensors + end subroutine skala_dict_insert_c + end interface + + character(kind=c_char, len=:), allocatable :: key + type(c_ptr) :: tensor_ptr(1) + + tensor_ptr(1) = tensor%p + + call skala_feature_key(feature, key) + call skala_dict_insert_c(dict%p, to_c_str(key), tensor_ptr, 1_c_size_t) + end subroutine skala_dict_insert_one + + subroutine skala_dict_insert_vec(dict, feature, tensors) + class(skala_dict), intent(inout) :: dict + integer, intent(in) :: feature + type(torch_tensor), intent(in) :: tensors(:) + + interface + subroutine skala_dict_insert_c(dict, feature, tensors, ntensors) bind(c, name="skala_dict_insert") + import :: c_ptr, c_size_t, c_char + type(c_ptr), value :: dict + character(kind=c_char), intent(in) :: feature(*) + type(c_ptr), intent(in) :: tensors(*) + integer(c_size_t), value :: ntensors + end subroutine skala_dict_insert_c + end interface + + character(kind=c_char, len=:), allocatable :: key + type(c_ptr), allocatable :: tensor_ptrs(:) + integer :: iptr + + allocate (tensor_ptrs(size(tensors))) + do iptr = 1, size(tensors) + tensor_ptrs(iptr) = tensors(iptr)%p + end do + + call skala_feature_key(feature, key) + call skala_dict_insert_c(dict%p, to_c_str(key), tensor_ptrs, size(tensor_ptrs, kind=c_size_t)) + end subroutine skala_dict_insert_vec + + subroutine skala_dict_at_one(dict, feature, tensor) + class(skala_dict), intent(in) :: dict + integer, intent(in) :: feature + type(torch_tensor), intent(out) :: tensor + + interface + function skala_dict_at_c(dict, key) result(list) bind(c, name="skala_dict_at") + import :: c_ptr, c_char + type(c_ptr), value :: dict + character(kind=c_char), intent(in) :: key(*) + type(c_ptr) :: list + end function skala_dict_at_c + + function skala_list_at_c(list, index) result(tensor) bind(c, name="skala_list_at") + import :: c_ptr, c_size_t + type(c_ptr), value :: list + integer(c_size_t), value :: index + type(c_ptr) :: tensor + end function skala_list_at_c + + subroutine skala_list_delete_c(list) bind(c, name="skala_list_delete") + import :: c_ptr + type(c_ptr), value :: list + end subroutine skala_list_delete_c + end interface + + character(kind=c_char, len=:), allocatable :: key + type(c_ptr) :: list + + call skala_feature_key(feature, key) + list = skala_dict_at_c(dict%p, to_c_str(key)) + tensor%p = skala_list_at_c(list, 0_c_size_t) + call skala_list_delete_c(list) + end subroutine skala_dict_at_one + + subroutine skala_dict_at_vec(dict, feature, tensors, ntensors) + class(skala_dict), intent(in) :: dict + integer, intent(in) :: feature + type(torch_tensor), intent(out) :: tensors(:) + integer, intent(out) :: ntensors + + interface + function skala_dict_at_c(dict, key) result(list) bind(c, name="skala_dict_at") + import :: c_ptr, c_char + type(c_ptr), value :: dict + character(kind=c_char), intent(in) :: key(*) + type(c_ptr) :: list + end function skala_dict_at_c + + function skala_list_size_c(list) result(n) bind(c, name="skala_list_size") + import :: c_ptr, c_size_t + type(c_ptr), value :: list + integer(c_size_t) :: n + end function skala_list_size_c + + function skala_list_at_c(list, index) result(tensor) bind(c, name="skala_list_at") + import :: c_ptr, c_size_t + type(c_ptr), value :: list + integer(c_size_t), value :: index + type(c_ptr) :: tensor + end function skala_list_at_c + + subroutine skala_list_delete_c(list) bind(c, name="skala_list_delete") + import :: c_ptr + type(c_ptr), value :: list + end subroutine skala_list_delete_c + end interface + + character(kind=c_char, len=:), allocatable :: key + type(c_ptr) :: list + integer :: i + + call skala_feature_key(feature, key) + list = skala_dict_at_c(dict%p, to_c_str(key)) + ntensors = int(skala_list_size_c(list)) + do i = 1, min(ntensors, size(tensors)) + tensors(i)%p = skala_list_at_c(list, int(i - 1, c_size_t)) + end do + call skala_list_delete_c(list) + end subroutine skala_dict_at_vec + + subroutine skala_dict_delete(dict) + type(skala_dict), intent(inout) :: dict + + interface + subroutine skala_dict_delete_c(dict) bind(c, name="skala_dict_delete") + import :: c_ptr + type(c_ptr), value :: dict + end subroutine skala_dict_delete_c + end interface + + call skala_dict_delete_c(dict%p) + end subroutine skala_dict_delete + +end module skala_ftorch From 08b00affe673201026ce86f25c8977ce49cef488 Mon Sep 17 00:00:00 2001 From: jenswehner Date: Fri, 4 Sep 2026 11:35:57 +0200 Subject: [PATCH 05/33] Implement host XC backend --- SkalaXC/src/host/model_grid_exchange.cxx | 285 +++++++ SkalaXC/src/host/model_grid_exchange.hpp | 107 +++ SkalaXC/src/host/skala_host_driver.cxx | 923 +++++++++++++++++++++++ SkalaXC/src/host/skala_host_driver.hpp | 149 ++++ SkalaXC/src/host/skala_util.cxx | 213 ++++++ SkalaXC/src/host/skala_util.hpp | 184 +++++ SkalaXC/src/host/spin_gradient.cxx | 74 ++ SkalaXC/src/host/spin_gradient.hpp | 194 +++++ 8 files changed, 2129 insertions(+) create mode 100644 SkalaXC/src/host/model_grid_exchange.cxx create mode 100644 SkalaXC/src/host/model_grid_exchange.hpp create mode 100644 SkalaXC/src/host/skala_host_driver.cxx create mode 100644 SkalaXC/src/host/skala_host_driver.hpp create mode 100644 SkalaXC/src/host/skala_util.cxx create mode 100644 SkalaXC/src/host/skala_util.hpp create mode 100644 SkalaXC/src/host/spin_gradient.cxx create mode 100644 SkalaXC/src/host/spin_gradient.hpp diff --git a/SkalaXC/src/host/model_grid_exchange.cxx b/SkalaXC/src/host/model_grid_exchange.cxx new file mode 100644 index 00000000..89b69899 --- /dev/null +++ b/SkalaXC/src/host/model_grid_exchange.cxx @@ -0,0 +1,285 @@ +#include "model_grid_exchange.hpp" +#include "exceptions.hpp" + +#include + +namespace SkalaXC { + +ModelGridExchange::ModelGridExchange(const std::vector& tasks, + types::AtomCount atom_count, + const GauXC::RuntimeEnvironment& rt, + DomainBatchMode batch_mode) + : layout_(tasks, atom_count, rt, false), + local_batches_(layout_.make_local_batches(batch_mode)) {} + +FeatureDict ModelGridExchange::prepare_local_features( + const ModelDomainBatch& batch, const std::vector& tasks, + const std::vector& task_features, + const std::vector>& raw_weights, + const GauXC::Molecule& molecule, + const std::vector& feature_keys) const { + const bool has_density_gradient = + std::find(feature_keys.begin(), feature_keys.end(), + feat_map().at(SKALA_FEATURE::DDEN)) != feature_keys.end(); + const bool has_kinetic = + std::find(feature_keys.begin(), feature_keys.end(), + feat_map().at(SKALA_FEATURE::TAU)) != feature_keys.end(); + const Eigen::Index point_count = + static_cast(batch.point_count.raw()); + + AlphaBetaMatrix density(point_count, spin_dimension); + AlphaBetaMatrix kinetic(has_kinetic ? point_count : 0, spin_dimension); + CartesianMatrix grid_coordinates(point_count, direction_dimension); + Vector grid_weights(point_count); + Vector raw_grid_weights(point_count); + SpinGradient density_gradient(has_density_gradient ? point_count : 0); + + for (const auto& block : batch.task_blocks) { + const auto task_index = block.task_index.raw(); + const Eigen::Index block_offset = + static_cast(block.point_offset.raw()); + const Eigen::Index block_point_count = + static_cast(block.point_count.raw()); + const auto& task = tasks[task_index]; + const auto& features = task_features[task_index]; + if (raw_weights[task_index].size() != + static_cast(block_point_count)) + SKALAXC_EXCEPTION("Invalid raw grid-weight dimensions"); + + for (Eigen::Index point = 0; point < block_point_count; ++point) + for (Eigen::Index direction = 0; direction < direction_dimension; + ++direction) + grid_coordinates(block_offset + point, direction) = + task.points[point][direction]; + grid_weights.segment(block_offset, block_point_count) = + ConstVectorMap(task.weights.data(), block_point_count); + raw_grid_weights.segment(block_offset, block_point_count) = + ConstVectorMap(raw_weights[task_index].data(), block_point_count); + density.middleRows(block_offset, block_point_count) = features.density; + if (has_kinetic) + kinetic.middleRows(block_offset, block_point_count) = features.kinetic; + + if (has_density_gradient) { + if (features.density_gradient.points() != block_point_count) + SKALAXC_EXCEPTION("Invalid task density-gradient dimensions"); + for (Eigen::Index point = 0; point < block_point_count; ++point) + for (Eigen::Index direction = 0; direction < direction_dimension; + ++direction) + for (Eigen::Index spin = 0; spin < spin_dimension; ++spin) + density_gradient(static_cast(direction), + block_offset + point, + static_cast(spin)) = + features.density_gradient(static_cast(direction), + point, + static_cast(spin)); + } + } + + const int atom_count = static_cast(batch.atoms.size()); + std::vector atom_point_counts(batch.atoms.size(), + batch.grid_size.raw()); + CartesianMatrix atomic_coordinates(atom_count, direction_dimension); + for (int local_atom = 0; local_atom < atom_count; ++local_atom) { + const auto atom = batch.atoms[static_cast(local_atom)].raw(); + atomic_coordinates(local_atom, X) = molecule[atom].x; + atomic_coordinates(local_atom, Y) = molecule[atom].y; + atomic_coordinates(local_atom, Z) = molecule[atom].z; + } + const std::int64_t max_grid_size = batch.grid_size.raw(); + + const auto options = + torch::TensorOptions().dtype(torch::kFloat64).device(torch::kCPU); + FeatureDict feature_dict; + for (const auto& key : feature_keys) { + at::Tensor tensor; + switch (reverse_feat_map().at(key)) { + case SKALA_FEATURE::DEN: + tensor = torch::from_blob(density.data(), {spin_dimension, point_count}, + {1, spin_dimension}, options) + .clone() + .requires_grad_(true); + break; + case SKALA_FEATURE::DDEN: + tensor = mpi::spin_gradient_to_torch(density_gradient); + break; + case SKALA_FEATURE::TAU: + tensor = torch::from_blob(kinetic.data(), {spin_dimension, point_count}, + {1, spin_dimension}, options) + .clone() + .requires_grad_(true); + break; + case SKALA_FEATURE::POINTS: + tensor = torch::from_blob(grid_coordinates.data(), + {point_count, direction_dimension}, options) + .clone(); + break; + case SKALA_FEATURE::WEIGHTS: + tensor = torch::from_blob(grid_weights.data(), {point_count}, options) + .clone(); + break; + case SKALA_FEATURE::COORDS: + tensor = torch::from_blob(atomic_coordinates.data(), + {atom_count, direction_dimension}, options) + .clone(); + break; + case SKALA_FEATURE::ATOMIC_GRID_WEIGHTS: + tensor = + torch::from_blob(raw_grid_weights.data(), {point_count}, options) + .clone(); + break; + case SKALA_FEATURE::ATOMIC_GRID_SIZES: { + const auto sizes_options = + torch::TensorOptions().dtype(torch::kInt64).device(torch::kCPU); + tensor = torch::from_blob(atom_point_counts.data(), {atom_count}, + sizes_options) + .clone(); + break; + } + case SKALA_FEATURE::ATOMIC_GRID_SIZE_BOUND_SHAPE: { + const auto sizes_options = + torch::TensorOptions().dtype(torch::kInt64).device(torch::kCPU); + tensor = torch::zeros({max_grid_size, 0}, sizes_options); + break; + } + default: + SKALAXC_EXCEPTION("Feature Key Not Implemented: " + key); + } + if (tensor.isnan().any().item()) + SKALAXC_EXCEPTION("NaN detected in feature tensor: " + key); + feature_dict.insert(key, tensor); + } + return feature_dict; +} + +void ModelGridExchange::distribute_local_potentials( + const ModelDomainBatch& batch, bool has_density_gradient, bool has_kinetic, + const FeatureDict& feature_dict, + std::vector& task_potentials) const { + const auto density_tensor = validated_model_gradient( + feature_dict.at(feat_map().at(SKALA_FEATURE::DEN)), + "host density potential"); + validate_model_tensor_finite(density_tensor, "host density potential"); + const Eigen::Map density_channels( + density_tensor.data_ptr(), spin_dimension, + static_cast(batch.point_count.raw())); + const AlphaBetaMatrix density_potential = density_channels.transpose(); + + AlphaBetaMatrix kinetic_potential; + if (has_kinetic) { + const auto kinetic_tensor = validated_model_gradient( + feature_dict.at(feat_map().at(SKALA_FEATURE::TAU)), + "host kinetic potential"); + validate_model_tensor_finite(kinetic_tensor, "host kinetic potential"); + const Eigen::Map kinetic_channels( + kinetic_tensor.data_ptr(), spin_dimension, + static_cast(batch.point_count.raw())); + kinetic_potential = kinetic_channels.transpose(); + } + + SpinGradient density_gradient; + if (has_density_gradient) { + const auto gradient_tensor = validated_model_gradient( + feature_dict.at(feat_map().at(SKALA_FEATURE::DDEN)), + "host density-gradient potential"); + validate_model_tensor_finite(gradient_tensor, + "host density-gradient potential"); + density_gradient = + mpi::torch_to_spin_gradient(gradient_tensor, batch.point_count.raw()); + } + + for (const auto& block : batch.task_blocks) { + const auto task_index = block.task_index.raw(); + const Eigen::Index block_offset = + static_cast(block.point_offset.raw()); + const Eigen::Index block_point_count = + static_cast(block.point_count.raw()); + auto& potentials = task_potentials[task_index]; + potentials.density = + density_potential.middleRows(block_offset, block_point_count); + if (has_density_gradient) { + potentials.density_gradient.resize(block_point_count); + for (Eigen::Index point = 0; point < block_point_count; ++point) + for (Eigen::Index direction = 0; direction < direction_dimension; + ++direction) + for (Eigen::Index spin = 0; spin < spin_dimension; ++spin) + potentials.density_gradient(static_cast(direction), + point, static_cast(spin)) = + density_gradient(static_cast(direction), + block_offset + point, + static_cast(spin)); + } + if (has_kinetic) + potentials.kinetic = + kinetic_potential.middleRows(block_offset, block_point_count); + } +} + +void ModelGridExchange::distribute_local_dE_dw( + const ModelDomainBatch& batch, std::vector atom_ordered_values, + std::vector& task_potentials) const { + if (atom_ordered_values.size() != + static_cast(batch.point_count.raw())) + SKALAXC_EXCEPTION("Mismatch in number of model dE/dw values"); + for (const auto& block : batch.task_blocks) + task_potentials[block.task_index.raw()].dE_dw = + ConstVectorMap(atom_ordered_values.data() + block.point_offset.raw(), + static_cast(block.point_count.raw())); +} + +void ModelGridExchange::accumulate_local_point_gradient( + const ModelDomainBatch& batch, const at::Tensor& point_gradient, + RowMajorMatrixMap atom_gradient) const { + if (!point_gradient.defined()) return; + if (atom_gradient.rows() != + static_cast(layout_.local_atom_point_counts().size()) || + atom_gradient.cols() != direction_dimension) + SKALAXC_EXCEPTION("Invalid local model point-gradient dimensions"); + + validate_model_tensor(point_gradient, "host model point gradient", + c10::Device(c10::DeviceType::CPU), torch::kFloat64, + {batch.point_count.raw(), direction_dimension}); + const auto contiguous_gradient = point_gradient.contiguous(); + validate_model_tensor_finite(contiguous_gradient, + "host model point gradient"); + const Eigen::Map point_gradients( + contiguous_gradient.data_ptr(), + static_cast(batch.point_count.raw()), direction_dimension); + Eigen::Index point_offset = 0; + for (const auto atom : batch.atoms) { + atom_gradient.row(static_cast(atom.raw())) += + point_gradients + .middleRows(point_offset, + static_cast(batch.grid_size.raw())) + .colwise() + .sum(); + point_offset += static_cast(batch.grid_size.raw()); + } +} + +void ModelGridExchange::accumulate_local_coordinate_gradient( + const ModelDomainBatch& batch, const at::Tensor& coordinate_gradient, + RowMajorMatrixMap atom_gradient) const { + if (!coordinate_gradient.defined()) return; + if (atom_gradient.rows() != + static_cast(layout_.local_atom_point_counts().size()) || + atom_gradient.cols() != direction_dimension) + SKALAXC_EXCEPTION("Invalid local model coordinate-gradient dimensions"); + + validate_model_tensor( + coordinate_gradient, "host model coordinate gradient", + c10::Device(c10::DeviceType::CPU), torch::kFloat64, + {static_cast(batch.atoms.size()), direction_dimension}); + const auto contiguous_gradient = coordinate_gradient.contiguous(); + validate_model_tensor_finite(contiguous_gradient, + "host model coordinate gradient"); + const Eigen::Map local_gradient( + contiguous_gradient.data_ptr(), batch.atoms.size(), + direction_dimension); + for (std::size_t local_atom = 0; local_atom < batch.atoms.size(); + ++local_atom) + atom_gradient.row( + static_cast(batch.atoms[local_atom].raw())) += + local_gradient.row(static_cast(local_atom)); +} + +} // namespace SkalaXC diff --git a/SkalaXC/src/host/model_grid_exchange.hpp b/SkalaXC/src/host/model_grid_exchange.hpp new file mode 100644 index 00000000..8ffd7789 --- /dev/null +++ b/SkalaXC/src/host/model_grid_exchange.hpp @@ -0,0 +1,107 @@ +#pragma once + +#include "model_grid_layout.hpp" +#include "skala_util.hpp" +#include "task_data.hpp" + +#include +#include +#include +#include + +#include + +namespace SkalaXC { + +/** @brief Exchanges task features and model derivatives in cached grid order. + */ +class ModelGridExchange { + public: + /** @brief Build exchange metadata for a fixed task decomposition. */ + /** + * @param tasks Sorted rank-local integration tasks. + * @param atom_count Global atom count. + * @param rt Runtime environment defining the communicator. + * @param batch_mode Exact-size complete-domain batching policy. + */ + ModelGridExchange(const std::vector& tasks, + types::AtomCount atom_count, + const GauXC::RuntimeEnvironment& rt, + DomainBatchMode batch_mode = DomainBatchMode::Conservative); + + /** @return Exact-size batches of complete locally owned domains. */ + const std::vector& local_batches() const noexcept { + return local_batches_; + } + + /** + * @brief Pack one batch of complete locally owned atomic domains. + * @param batch Batch metadata. + * @param tasks Sorted rank-local tasks. + * @param task_features Per-task feature buffers. + * @param raw_weights Per-task pre-partition weights. + * @param molecule Molecular coordinates. + * @param feature_keys Requested model feature keys. + * @return Model feature dictionary for the batch. + */ + FeatureDict prepare_local_features( + const ModelDomainBatch& batch, const std::vector& tasks, + const std::vector& task_features, + const std::vector>& raw_weights, + const GauXC::Molecule& molecule, + const std::vector& feature_keys) const; + + /** + * @brief Map one local batch's derivatives into local task buffers. + * @param batch Batch metadata. + * @param has_density_gradient Whether density-gradient derivatives exist. + * @param has_kinetic Whether kinetic-density derivatives exist. + * @param feature_dict Model derivative tensors. + * @param task_potentials Destination per-task buffers. + */ + void distribute_local_potentials( + const ModelDomainBatch& batch, bool has_density_gradient, + bool has_kinetic, const FeatureDict& feature_dict, + std::vector& task_potentials) const; + + /** + * @brief Map one local batch's `dE/dw` values into local tasks. + * @param batch Batch metadata. + * @param atom_ordered_values Batch values in atom-major point order. + * @param task_potentials Destination per-task buffers. + */ + void distribute_local_dE_dw( + const ModelDomainBatch& batch, std::vector atom_ordered_values, + std::vector& task_potentials) const; + + /** + * @brief Accumulate one local batch's point derivatives by parent atom. + * @param batch Batch metadata. + * @param point_gradient Point-coordinate derivatives. + * @param atom_gradient Destination atom-major Cartesian gradient. + */ + void accumulate_local_point_gradient(const ModelDomainBatch& batch, + const at::Tensor& point_gradient, + RowMajorMatrixMap atom_gradient) const; + + /** + * @brief Accumulate one batch's coordinate derivatives by parent atom. + * @param batch Batch metadata. + * @param coordinate_gradient Explicit atomic-coordinate derivatives. + * @param atom_gradient Destination atom-major Cartesian gradient. + */ + void accumulate_local_coordinate_gradient( + const ModelDomainBatch& batch, const at::Tensor& coordinate_gradient, + RowMajorMatrixMap atom_gradient) const; + + /** @return Number of complete atomic domains owned by this rank. */ + std::size_t local_domain_count() const noexcept { + return layout_.local_atoms().size(); + } + + private: + ModelGridLayout layout_; + std::vector local_batches_; +}; + +} // namespace SkalaXC diff --git a/SkalaXC/src/host/skala_host_driver.cxx b/SkalaXC/src/host/skala_host_driver.cxx new file mode 100644 index 00000000..b8728780 --- /dev/null +++ b/SkalaXC/src/host/skala_host_driver.cxx @@ -0,0 +1,923 @@ +/** + * SkalaXC host ML backend implementation. + * + * Ported from GauXC/skala reference_replicated_xc_host_integrator_onedft.hpp + * (onedft -> skala) and restructured from integrator methods into a standalone + * driver that OWNS the reusable GauXC components and drives their primitives + * directly. Per-task ML data lives in parallel input and output vectors; + * GauXC master's XCTask is never modified, and the LoadBalancer's task list + * is never reordered (atom ordering is applied through an index permutation). + */ +#include "skala_host_driver.hpp" +#include "component_matrix_map.hpp" +#include "exceptions.hpp" +#include "model_grid_exchange.hpp" +#include "mpi_wrapper.hpp" +#include "skala_model.hpp" +#include "skala_util.hpp" + +// GauXC reusable internals (reachable via the in-tree `gauxc` target's +// PUBLIC BUILD_INTERFACE include of ${GauXC}/src). +#include "xc_integrator/integrator_util/integrator_common.hpp" +#include "xc_integrator/local_work_driver/host/local_host_work_driver.hpp" +#include "xc_integrator/replicated/host/xc_host_data.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace SkalaXC { + +namespace { + +class GauXCTaskAdapter { + public: + GauXCTaskAdapter(GauXC::LocalHostWorkDriver& driver, + const GauXC::XCTask& task, + const GauXC::BasisSet& basis) + : driver_(driver), + task_(task), + basis_(basis), + npts_(task.points.size()), + nbe_(task.bfn_screening.nbe), + nshells_(task.bfn_screening.shell_list.size()) {} + + void eval_collocation(ComponentMatrixMap& basis_components, + bool needs_gradient) const { + if (needs_gradient) { + driver_.eval_collocation_gradient(npts_, nshells_, nbe_, + task_.points.data()->data(), basis_, + task_.bfn_screening.shell_list.data(), + basis_components.component_data(0), + basis_components.component_data(1), + basis_components.component_data(2), + basis_components.component_data(3)); + } else { + driver_.eval_collocation(npts_, nshells_, nbe_, + task_.points.data()->data(), basis_, + task_.bfn_screening.shell_list.data(), + basis_components.component_data(0)); + } + } + + void eval_collocation_hessian(ComponentMatrixMap& basis_components) const { + driver_.eval_collocation_hessian( + npts_, nshells_, nbe_, task_.points.data()->data(), basis_, + task_.bfn_screening.shell_list.data(), + basis_components.component_data(0), basis_components.component_data(1), + basis_components.component_data(2), basis_components.component_data(3), + basis_components.component_data(4), basis_components.component_data(5), + basis_components.component_data(6), basis_components.component_data(7), + basis_components.component_data(8), basis_components.component_data(9)); + } + + void eval_xmat(std::size_t point_components, std::size_t nbf, + const GauXC::LocalHostWorkDriver::submat_map_t& submat_map, + ConstColMajorMatrixMap density, + const ComponentMatrixMap& basis_components, + ComponentMatrixMap& x_components, Eigen::Index x_component, + std::vector& scratch) const { + driver_.eval_xmat( + point_components * npts_, nbf, nbe_, submat_map, 1.0, density.data(), + density.outerStride(), basis_components.component_data(0), nbe_, + x_components.component_data(x_component), nbe_, scratch.data()); + } + + void eval_lda_model_features_uks(const ComponentMatrixMap& basis_components, + const ComponentMatrixMap& x_components, + Eigen::Index spin_component, + AlphaBetaMatrix& alpha_beta_density) const { + driver_.eval_uvvar_lda_uks(npts_, nbe_, basis_components.component_data(0), + x_components.component_data(0), nbe_, + x_components.component_data(spin_component), + nbe_, alpha_beta_density.data()); + } + + void eval_gga_model_features_uks(const ComponentMatrixMap& basis_components, + const ComponentMatrixMap& x_components, + Eigen::Index spin_component, + AlphaBetaMatrix& alpha_beta_density, + SpinGradient& alpha_beta_density_gradient, + std::vector& gamma, + ScalarZGradient& scalar_z_scratch) const { + scalar_z_scratch.resize(npts_); + driver_.eval_uvvar_gga_uks( + npts_, nbe_, basis_components.component_data(0), + basis_components.component_data(1), basis_components.component_data(2), + basis_components.component_data(3), x_components.component_data(0), + nbe_, x_components.component_data(spin_component), nbe_, + alpha_beta_density.data(), scalar_z_scratch.direction_data(X), + scalar_z_scratch.direction_data(Y), scalar_z_scratch.direction_data(Z), + gamma.data()); + convert_scalar_z_to_alpha_beta(scalar_z_scratch, + alpha_beta_density_gradient); + } + + void eval_mgga_model_features_uks(const ComponentMatrixMap& basis_components, + const ComponentMatrixMap& x_components, + Eigen::Index spin_component, + AlphaBetaMatrix& alpha_beta_density, + SpinGradient& alpha_beta_density_gradient, + std::vector& gamma, + AlphaBetaMatrix& alpha_beta_kinetic, + std::vector& laplacian, + ScalarZGradient& scalar_z_scratch) const { + scalar_z_scratch.resize(npts_); + driver_.eval_uvvar_mgga_uks( + npts_, nbe_, basis_components.component_data(0), + basis_components.component_data(1), basis_components.component_data(2), + basis_components.component_data(3), nullptr, + x_components.component_data(0), nbe_, + x_components.component_data(spin_component), nbe_, + x_components.component_data(1), x_components.component_data(2), + x_components.component_data(3), nbe_, + x_components.component_data(spin_component + 1), + x_components.component_data(spin_component + 2), + x_components.component_data(spin_component + 3), nbe_, + alpha_beta_density.data(), scalar_z_scratch.direction_data(X), + scalar_z_scratch.direction_data(Y), scalar_z_scratch.direction_data(Z), + gamma.data(), alpha_beta_kinetic.data(), laplacian.data()); + convert_scalar_z_to_alpha_beta(scalar_z_scratch, + alpha_beta_density_gradient); + } + + void eval_zmat_lda_vxc_uks(const AlphaBetaMatrix& density_potential, + const ComponentMatrixMap& basis_components, + ComponentMatrixMap& zmat_components, + Eigen::Index spin_component) const { + driver_.eval_zmat_lda_vxc_uks( + npts_, nbe_, density_potential.data(), + basis_components.component_data(0), zmat_components.component_data(0), + nbe_, zmat_components.component_data(spin_component), nbe_); + } + + void eval_mmat_mgga_vxc_uks(const AlphaBetaMatrix& kinetic_potential, + const ComponentMatrixMap& basis_components, + ComponentMatrixMap& zmat_components, + Eigen::Index spin_component) const { + driver_.eval_mmat_mgga_vxc_uks( + npts_, nbe_, kinetic_potential.data(), nullptr, + basis_components.component_data(1), basis_components.component_data(2), + basis_components.component_data(3), zmat_components.component_data(1), + zmat_components.component_data(2), zmat_components.component_data(3), + nbe_, zmat_components.component_data(spin_component + 1), + zmat_components.component_data(spin_component + 2), + zmat_components.component_data(spin_component + 3), nbe_); + } + + void inc_vxc(std::size_t point_components, std::size_t nbf, + const ComponentMatrixMap& basis_components, + const GauXC::LocalHostWorkDriver::submat_map_t& submat_map, + const ComponentMatrixMap& zmat_components, + Eigen::Index zmat_component, ColMajorMatrixMap potential, + std::vector& scratch) const { + driver_.inc_vxc(point_components * npts_, nbf, nbe_, + basis_components.component_data(0), submat_map, + zmat_components.component_data(zmat_component), nbe_, + potential.data(), potential.outerStride(), scratch.data()); + } + + void eval_weight_1st_deriv_contracted( + GauXC::XCWeightAlg weight_alg, const GauXC::Molecule& molecule, + const GauXC::MolMeta& molecule_metadata, + const std::vector& weighted_dE_dw, + RowMajorMatrixMap gradient) const { + driver_.eval_weight_1st_deriv_contracted( + weight_alg, molecule, molecule_metadata, task_, weighted_dE_dw.data(), + gradient.data()); + } + + private: + GauXC::LocalHostWorkDriver& driver_; + const GauXC::XCTask& task_; + const GauXC::BasisSet& basis_; + std::size_t npts_; + std::size_t nbe_; + std::size_t nshells_; +}; + +// --------------------------------------------------------------------------- +// File-local helpers (ported from the branch free functions; adapted to read +// per-task ML data from parallel storage rather than a mutated XCTask list). +// --------------------------------------------------------------------------- + +void validate_zmat_inputs(const AlphaBetaMatrix& density_potential, + const SpinGradient& gradient_potential, + const ComponentMatrixMap& basis_components, + const ComponentMatrixMap& zmat_components, + Eigen::Index spin_component) { + if (basis_components.components() < 4 || spin_component < 0 || + spin_component >= zmat_components.components() || + zmat_components.rows() != basis_components.rows() || + zmat_components.points() != basis_components.points()) + SKALAXC_EXCEPTION("Invalid Z-matrix dimensions"); + + const auto point_count = basis_components.points(); + if (density_potential.rows() != point_count || + density_potential.cols() != spin_dimension || + gradient_potential.points() != point_count) + SKALAXC_EXCEPTION("Invalid Z-matrix potential dimensions"); +} + +void eval_zmat_gga_vxc_uks(const AlphaBetaMatrix& density_potential, + const SpinGradient& gradient_potential, + const ComponentMatrixMap& basis_components, + ComponentMatrixMap& zmat_components, + Eigen::Index spin_component) { + validate_zmat_inputs(density_potential, gradient_potential, basis_components, + zmat_components, spin_component); + + const auto density_scalar_z = alpha_beta_to_scalar_z(density_potential); + const auto basis_value = basis_components.component(0); + auto zmat_scalar = zmat_components.component(0); + auto zmat_spin = zmat_components.component(spin_component); + zmat_scalar.array() = + basis_value.array().rowwise() * + (0.5 * density_scalar_z.col(PauliChannel::Scalar)).transpose().array(); + zmat_spin.array() = + basis_value.array().rowwise() * + (0.5 * density_scalar_z.col(PauliChannel::SpinZ)).transpose().array(); + + for (Eigen::Index direction = 0; direction < direction_dimension; + ++direction) { + const auto potential = + gradient_potential.direction(static_cast(direction)); + const auto gradient_scalar_z = alpha_beta_to_scalar_z(potential); + const auto basis_derivative = basis_components.component(direction + 1); + zmat_scalar.array() += + basis_derivative.array().rowwise() * + gradient_scalar_z.col(PauliChannel::Scalar).transpose().array(); + zmat_spin.array() += + basis_derivative.array().rowwise() * + gradient_scalar_z.col(PauliChannel::SpinZ).transpose().array(); + } +} + +} // anonymous namespace + +// =========================================================================== +// SkalaHostDriver +// =========================================================================== + +SkalaHostDriver::SkalaHostDriver( + const GauXC::LoadBalancer& weighted_lb, + const std::vector>& raw_weights, + const std::string& model, TimingSettings timing_settings, + DomainBatchMode domain_batch_mode) + : SkalaDriver(timing_settings, ExecutionSpace::Host, + types::CommunicatorRank{weighted_lb.runtime().comm_rank()}, + types::CommunicatorSize{weighted_lb.runtime().comm_size()}), + lb_(weighted_lb), + lwd_(GauXC::LocalWorkDriverFactory::make_local_work_driver( + GauXC::ExecutionSpace::Host, "Default")), + raw_weights_(raw_weights) { + + { + detail::HostTimingScope timer(diagnostics_, TimingMetric::ModelLoad); + model_ = std::make_unique(model, weighted_lb.runtime()); + } + + // The balancer's tasks are already sorted and weight-partitioned (by + // MolecularWeights::modify_weights); raw_weights_ holds the pre-partition + // quadrature weights aligned to that sorted task order. The driver only + // builds its host LocalWorkDriver, ML model, and per-task feature storage. + if (not lb_.state().modified_weights_are_stored) + SKALAXC_EXCEPTION( + "SkalaHostDriver requires weight-partitioned tasks; call " + "MolecularWeights::modify_weights first"); + + auto& tasks = lb_.get_tasks(); + const auto& rt = lb_.runtime(); + model_grid_exchange_ = std::make_unique( + tasks, + types::AtomCount{static_cast(lb_.molecule().natoms())}, rt, + domain_batch_mode); + const auto& local_batches = model_grid_exchange_->local_batches(); + set_setup_diagnostics(types::CommunicatorSize{rt.comm_size()}, + types::DeviceId{-1}, 0.0, domain_batch_mode, tasks, + local_batches); + + const bool needs_gradient = model_->is_gga() || model_->is_mgga(); + task_features_.resize(tasks.size()); + task_potentials_.resize(tasks.size()); + for (std::size_t task_index = 0; task_index < tasks.size(); ++task_index) { + const Eigen::Index point_count = tasks[task_index].points.size(); + auto& features = task_features_[task_index]; + features.density.resize(point_count, spin_dimension); + features.density_gradient.resize(needs_gradient ? point_count : 0); + features.kinetic.resize(model_->is_mgga() ? point_count : 0, + spin_dimension); + + auto& potentials = task_potentials_[task_index]; + potentials.density.resize(point_count, spin_dimension); + potentials.density_gradient.resize(needs_gradient ? point_count : 0); + potentials.kinetic.resize(model_->is_mgga() ? point_count : 0, + spin_dimension); + potentials.dE_dw.resize(point_count); + } + log_setup(model, model_->feature_keys(), model_->is_gga(), model_->is_mgga(), + local_batches); +} + +SkalaHostDriver::~SkalaHostDriver() noexcept = default; + +SkalaHostDriver SkalaHostDriver::from_system( + const GauXC::RuntimeEnvironment& rt, const GauXC::Molecule& mol, + const GauXC::MolGrid& mg, const GauXC::BasisSet& basis, + const std::string& model, DomainBatchMode domain_batch_mode, + TimingSettings timing_settings) { + // Mirror the public SkalaXC pipeline (LoadBalancerFactory -> + // MolecularWeights::modify_weights): build the load balancer, then sort and + // weight-partition its tasks while snapshotting the pre-partition ("raw") + // quadrature weights that Skala ML models consume. + GauXC::LoadBalancerFactory lb_factory(GauXC::ExecutionSpace::Host, "Default"); + GauXC::LoadBalancer lb = lb_factory.get_instance(rt, mol, mg, basis); + + auto lwd = GauXC::LocalWorkDriverFactory::make_local_work_driver( + GauXC::ExecutionSpace::Host, "Default"); + auto* host_lwd = dynamic_cast(lwd.get()); + if (!host_lwd) SKALAXC_EXCEPTION("Expected a LocalHostWorkDriver"); + + auto& tasks = lb.get_tasks(); + std::stable_sort(tasks.begin(), tasks.end(), + [](const GauXC::XCTask& a, const GauXC::XCTask& b) { + return (a.points.size() * a.bfn_screening.nbe) > + (b.points.size() * b.bfn_screening.nbe); + }); + + std::vector> raw_weights(tasks.size()); + for (std::size_t i = 0; i < tasks.size(); ++i) + raw_weights[i] = tasks[i].weights; + + const GauXC::XCWeightAlg weight_alg = GauXC::XCWeightAlg::SSF; + host_lwd->partition_weights(weight_alg, lb.molecule(), lb.molmeta(), + tasks.begin(), tasks.end()); + lb.state().modified_weights_are_stored = true; + lb.state().weight_alg = weight_alg; + + return SkalaHostDriver(lb, raw_weights, model, timing_settings, + domain_batch_mode); +} + +double SkalaHostDriver::eval_exc_vxc_uks(ConstColMajorMatrixMap scalar_density, + ConstColMajorMatrixMap spin_density, + ColMajorMatrixMap scalar_potential, + ColMajorMatrixMap spin_potential) { + const auto& basis = lb_.basis(); + const Eigen::Index basis_size = basis.nbf(); + const auto valid_ao_matrix = [basis_size](const auto& matrix) { + return matrix.rows() == basis_size && matrix.cols() == basis_size && + matrix.innerStride() == 1 && matrix.outerStride() == basis_size; + }; + if (!valid_ao_matrix(scalar_density) || !valid_ao_matrix(spin_density) || + !valid_ao_matrix(scalar_potential) || !valid_ao_matrix(spin_potential)) + SKALAXC_EXCEPTION( + "UKS density and potential matrices must be dense nbf x nbf " + "column-major views"); + + const auto diagnostics_before = + log_evaluation_start("exc_vxc", scalar_density, spin_density); + detail::HostTimingScope total_timer(diagnostics_, TimingMetric::TotalEXCVXC); + diagnostics_.increment_exc_vxc_calls(); + + auto& tasks = lb_.get_tasks(); + auto rt = lb_.runtime(); + double N_EL = 0.0; + + const auto& feature_keys = model_->feature_keys(); + const bool is_gga = model_->is_gga(); + const bool is_mgga = model_->is_mgga(); + + // Local features: collocation -> xmat -> uvvar. + { + detail::HostTimingScope timer(diagnostics_, + TimingMetric::FeatureConstruction); + pre_skala_local_work_(basis, scalar_density, spin_density, N_EL, is_gga, + is_mgga, false); + } + + double EXC = 0.0; + for (const auto& batch : model_grid_exchange_->local_batches()) { + FeatureDict features_dict; + { + detail::HostTimingScope timer(diagnostics_, + TimingMetric::ModelBatchPacking); + features_dict = model_grid_exchange_->prepare_local_features( + batch, tasks, task_features_, raw_weights_, lb_.molecule(), + feature_keys); + } + diagnostics_.record_model_batch(types::DomainCount{batch.atoms.size()}); + at::Tensor exc; + { + detail::HostTimingScope timer(diagnostics_, TimingMetric::ModelForward); + exc = evaluate_model_energy(*model_, features_dict, + c10::Device(c10::DeviceType::CPU)); + validate_model_tensor_finite(exc, "host model energy"); + } + { + detail::HostTimingScope timer(diagnostics_, TimingMetric::ModelBackward); + exc.backward(); + } + EXC += exc.item().to(); + { + detail::HostTimingScope timer(diagnostics_, + TimingMetric::PotentialMapping); + model_grid_exchange_->distribute_local_potentials( + batch, is_gga || is_mgga, is_mgga, features_dict, task_potentials_); + } + } + + { + detail::HostTimingScope timer(diagnostics_, TimingMetric::AOAssembly); + post_skala_local_work_(basis, scalar_potential, spin_potential, is_gga, + is_mgga, false); + } + +#ifdef GAUXC_HAS_MPI + if (rt.comm_size() > 1) { + detail::HostTimingScope timer(diagnostics_, TimingMetric::MPIReduction); + SkalaXC::mpi::allreduce_sum(scalar_potential, rt); + SkalaXC::mpi::allreduce_sum(spin_potential, rt); + MPI_Allreduce(MPI_IN_PLACE, &EXC, 1, MPI_DOUBLE, MPI_SUM, rt.comm()); + MPI_Allreduce(MPI_IN_PLACE, &N_EL, 1, MPI_DOUBLE, MPI_SUM, rt.comm()); + } +#endif + (void)N_EL; + total_timer.finish(); + log_exc_vxc_result("exc_vxc", EXC, scalar_potential, spin_potential); + log_host_timing_delta("exc_vxc", diagnostics_before); + return EXC; +} + +void SkalaHostDriver::eval_exc_grad_uks(ConstColMajorMatrixMap scalar_density, + ConstColMajorMatrixMap spin_density, + RowMajorMatrixMap gradient) { + const auto& basis = lb_.basis(); + auto& tasks = lb_.get_tasks(); + const auto rt = lb_.runtime(); + const int natoms = lb_.molecule().natoms(); + const Eigen::Index basis_size = basis.nbf(); + const Eigen::Index atom_count = natoms; + const auto valid_density = [basis_size](const auto& density) { + return density.rows() == basis_size && density.cols() == basis_size && + density.innerStride() == 1 && density.outerStride() == basis_size; + }; + if (!valid_density(scalar_density) || !valid_density(spin_density) || + gradient.rows() != atom_count || gradient.cols() != 3 || + gradient.innerStride() != 1 || gradient.outerStride() != 3) + SKALAXC_EXCEPTION("Invalid density matrix or atom-major gradient view"); + + const auto diagnostics_before = + log_evaluation_start("exc_gradient", scalar_density, spin_density); + detail::HostTimingScope total_timer(diagnostics_, + TimingMetric::TotalEXCGradient); + diagnostics_.increment_exc_gradient_calls(); + + const auto& feature_keys = model_->feature_keys(); + const bool is_gga = model_->is_gga(); + const bool is_mgga = model_->is_mgga(); + + double N_EL = 0.0; + { + detail::HostTimingScope timer(diagnostics_, + TimingMetric::FeatureConstruction); + pre_skala_local_work_(basis, scalar_density, spin_density, N_EL, is_gga, + is_mgga, false); + } + + gradient.setZero(); + for (const auto& batch : model_grid_exchange_->local_batches()) { + FeatureDict features_dict; + { + detail::HostTimingScope timer(diagnostics_, + TimingMetric::ModelBatchPacking); + features_dict = model_grid_exchange_->prepare_local_features( + batch, tasks, task_features_, raw_weights_, lb_.molecule(), + feature_keys); + } + diagnostics_.record_model_batch(types::DomainCount{batch.atoms.size()}); + const auto points_key = feat_map().at(SKALA_FEATURE::POINTS); + const auto coords_key = feat_map().at(SKALA_FEATURE::COORDS); + const auto weights_key = feat_map().at(SKALA_FEATURE::WEIGHTS); + if (features_dict.find(points_key) != features_dict.end()) + features_dict.at(points_key).requires_grad_(true); + if (features_dict.find(coords_key) != features_dict.end()) + features_dict.at(coords_key).requires_grad_(true); + features_dict.at(weights_key).requires_grad_(true); + + at::Tensor exc; + { + detail::HostTimingScope timer(diagnostics_, TimingMetric::ModelForward); + exc = evaluate_model_energy(*model_, features_dict, + c10::Device(c10::DeviceType::CPU)); + validate_model_tensor_finite(exc, "host model energy"); + } + { + detail::HostTimingScope timer(diagnostics_, TimingMetric::ModelBackward); + exc.backward(); + } + + auto dE_dw_cpu = validated_model_gradient(features_dict.at(weights_key), + "host model dE/dw"); + validate_model_tensor_finite(dE_dw_cpu, "host model dE/dw"); + std::vector dE_dw_values( + static_cast(batch.point_count.raw())); + std::memcpy(dE_dw_values.data(), dE_dw_cpu.data_ptr(), + dE_dw_values.size() * sizeof(double)); + + { + detail::HostTimingScope timer(diagnostics_, + TimingMetric::GradientAssembly); + if (features_dict.find(points_key) != features_dict.end()) { + auto point_grad = features_dict.at(points_key).grad(); + model_grid_exchange_->accumulate_local_point_gradient(batch, point_grad, + gradient); + } + + if (features_dict.find(coords_key) != features_dict.end()) { + auto coords_grad = features_dict.at(coords_key).grad(); + model_grid_exchange_->accumulate_local_coordinate_gradient( + batch, coords_grad, gradient); + } + } + { + detail::HostTimingScope timer(diagnostics_, + TimingMetric::PotentialMapping); + model_grid_exchange_->distribute_local_potentials( + batch, is_gga || is_mgga, is_mgga, features_dict, task_potentials_); + model_grid_exchange_->distribute_local_dE_dw( + batch, std::move(dE_dw_values), task_potentials_); + } + } + + { + detail::HostTimingScope timer(diagnostics_, TimingMetric::GradientAssembly); + exc_grad_local_work_(scalar_density, spin_density, gradient, is_gga, + is_mgga); + } + +#ifdef GAUXC_HAS_MPI + if (rt.comm_size() > 1) { + detail::HostTimingScope timer(diagnostics_, TimingMetric::MPIReduction); + SkalaXC::mpi::allreduce_sum(gradient, rt); + } +#endif + (void)N_EL; + total_timer.finish(); + log_gradient_result("exc_gradient", gradient); + log_host_timing_delta("exc_gradient", diagnostics_before); +} + +void SkalaHostDriver::exc_grad_local_work_( + ConstColMajorMatrixMap scalar_density, ConstColMajorMatrixMap spin_density, + RowMajorMatrixMap gradient, bool is_gga, bool is_mgga) { + auto* lwd = dynamic_cast(lwd_.get()); + if (!lwd) SKALAXC_EXCEPTION("Expected a LocalHostWorkDriver"); + + const auto& basis = lb_.basis(); + const auto& mol = lb_.molecule(); + const auto& molmeta = lb_.molmeta(); + auto& lb_state = lb_.state(); + if (!lb_state.modified_weights_are_stored) + SKALAXC_EXCEPTION("Weights Have Not Been Modified"); + const GauXC::XCWeightAlg weight_alg = lb_state.weight_alg; + + GauXC::BasisSetMap basis_map(basis, mol); + const int32_t nbf = basis.nbf(); + const auto& tasks = lb_.get_tasks(); + const size_t ntasks = tasks.size(); + constexpr std::array, 3> hessian_components{ + {{{4, 5, 6}}, {{5, 7, 8}}, {{6, 8, 9}}}}; + +#ifdef _OPENMP +#pragma omp parallel +#endif + { + GauXC::XCHostData host_data; + +#ifdef _OPENMP +#pragma omp for schedule(dynamic) +#endif + for (size_t iT = 0; iT < ntasks; ++iT) { + const auto& task = tasks[iT]; + const auto& potentials = task_potentials_[iT]; + const GauXCTaskAdapter task_work(*lwd, task, basis); + const int32_t npts = task.points.size(); + const int32_t nbe = task.bfn_screening.nbe; + const int32_t nshells = task.bfn_screening.shell_list.size(); + + host_data.basis_eval.resize((is_gga || is_mgga ? 10 : 4) * npts * nbe); + host_data.zmat.resize((is_gga || is_mgga ? 8 : 2) * npts * nbe); + host_data.nbe_scr.resize(nbe * nbe); + host_data.eps.resize(npts); + + const Eigen::Index basis_component_count = (is_gga || is_mgga) ? 10 : 4; + ComponentMatrixMap basis_components(host_data.basis_eval.data(), + basis_component_count, nbe, npts); + + const Eigen::Index zmat_component_count = (is_gga || is_mgga) ? 8 : 2; + ComponentMatrixMap zmat_components(host_data.zmat.data(), + zmat_component_count, nbe, npts); + const Eigen::Index spin_zmat_component = (is_gga || is_mgga) ? 4 : 1; + std::vector> submat_map; + std::tie(submat_map, std::ignore) = GauXC::gen_compressed_submat_map( + basis_map, task.bfn_screening.shell_list, nbf, nbf); + if (is_gga || is_mgga) { + task_work.eval_collocation_hessian(basis_components); + } else { + task_work.eval_collocation(basis_components, true); + } + + const int xmat_len = (is_gga || is_mgga) ? 4 : 1; + task_work.eval_xmat(xmat_len, nbf, submat_map, scalar_density, + basis_components, zmat_components, 0, + host_data.nbe_scr); + task_work.eval_xmat(xmat_len, nbf, submat_map, spin_density, + basis_components, zmat_components, + spin_zmat_component, host_data.nbe_scr); + + // GauXC's contracted partition derivative expects w_i * f_i. The model + // boundary cotangent is f_i = dE/dw_i. + VectorMap(host_data.eps.data(), npts) = + potentials.dE_dw.array() * + ConstVectorMap(task.weights.data(), npts).array(); + task_work.eval_weight_1st_deriv_contracted(weight_alg, mol, molmeta, + host_data.eps, gradient); + + const auto density_scalar_z = alpha_beta_to_scalar_z(potentials.density); + + CartesianMatrix gradient_scalar; + CartesianMatrix gradient_spin; + if (is_gga || is_mgga) { + gradient_scalar.resize(npts, direction_dimension); + gradient_spin.resize(npts, direction_dimension); + for (Eigen::Index direction = 0; direction < direction_dimension; + ++direction) { + const auto potential = potentials.density_gradient.direction( + static_cast(direction)); + const auto gradient_scalar_z = alpha_beta_to_scalar_z(potential); + gradient_scalar.col(direction) = + gradient_scalar_z.col(PauliChannel::Scalar); + gradient_spin.col(direction) = + gradient_scalar_z.col(PauliChannel::SpinZ); + } + } + + ScalarZChannels kinetic_scalar_z; + if (is_mgga) + kinetic_scalar_z = alpha_beta_to_scalar_z(potentials.kinetic); + + const auto contract = [](const auto& left, const auto& right, + const auto& point_potential) { + return ((left.array().rowwise() * point_potential.transpose().array()) * + right.array()) + .sum(); + }; + + const auto xN_component = zmat_components.component(0); + const auto xZ_component = zmat_components.component(spin_zmat_component); + Eigen::Index basis_offset = 0; + for (int32_t ish = 0; ish < nshells; ++ish) { + const int sh_idx = task.bfn_screening.shell_list[ish]; + const Eigen::Index shell_size = basis[sh_idx].size(); + const int iAt = basis_map.shell_to_center(sh_idx); + if (iAt == task.iParent) { + basis_offset += shell_size; + continue; + } + + const auto xN = xN_component.middleRows(basis_offset, shell_size); + const auto xZ = xZ_component.middleRows(basis_offset, shell_size); + Eigen::Vector3d shell_gradient = Eigen::Vector3d::Zero(); + for (Eigen::Index force = 0; force < direction_dimension; ++force) { + const auto basis_derivative = + basis_components.component(force + 1).middleRows(basis_offset, + shell_size); + shell_gradient(force) = + contract(xN, basis_derivative, + density_scalar_z.col(PauliChannel::Scalar)) + + contract(xZ, basis_derivative, + density_scalar_z.col(PauliChannel::SpinZ)); + + if (is_gga || is_mgga) { + for (Eigen::Index response = 0; response < direction_dimension; + ++response) { + const auto basis_hessian = + basis_components + .component(hessian_components[force][response]) + .middleRows(basis_offset, shell_size); + const auto xN_derivative = + zmat_components.component(response + 1) + .middleRows(basis_offset, shell_size); + const auto xZ_derivative = + zmat_components.component(response + 5) + .middleRows(basis_offset, shell_size); + shell_gradient(force) += + contract(basis_hessian, xN, gradient_scalar.col(response)) + + contract(basis_derivative, xN_derivative, + gradient_scalar.col(response)) + + contract(basis_hessian, xZ, gradient_spin.col(response)) + + contract(basis_derivative, xZ_derivative, + gradient_spin.col(response)); + + if (is_mgga) + shell_gradient(force) += + 0.5 * + (contract(basis_hessian, xN_derivative, + kinetic_scalar_z.col(PauliChannel::Scalar)) + + contract(basis_hessian, xZ_derivative, + kinetic_scalar_z.col(PauliChannel::SpinZ))); + } + } + } + + for (Eigen::Index direction = 0; direction < direction_dimension; + ++direction) { + const double contribution = -2.0 * shell_gradient(direction); +#ifdef _OPENMP +#pragma omp atomic +#endif + gradient(iAt, direction) += contribution; +#ifdef _OPENMP +#pragma omp atomic +#endif + gradient(task.iParent, direction) -= contribution; + } + basis_offset += shell_size; + } + } + } +} + +void SkalaHostDriver::pre_skala_local_work_( + const GauXC::BasisSet& basis, ConstColMajorMatrixMap scalar_density, + ConstColMajorMatrixMap spin_density, double& electron_count, bool is_gga, + bool is_mgga, bool /*needs_laplacian*/) { + + const bool needs_gradient = is_gga || is_mgga; + auto* lwd = dynamic_cast(lwd_.get()); + if (!lwd) SKALAXC_EXCEPTION("Expected a LocalHostWorkDriver"); + const auto& mol = lb_.molecule(); + GauXC::BasisSetMap basis_map(basis, mol); + const int32_t nbf = basis.nbf(); + + auto& tasks = lb_.get_tasks(); + const size_t ntasks = tasks.size(); + + auto& lb_state = lb_.state(); + if (not lb_state.modified_weights_are_stored) + SKALAXC_EXCEPTION("Weights Have Not Been Modified"); + + double NEL_WORK = 0.0; + +#ifdef _OPENMP +#pragma omp parallel reduction(+ : NEL_WORK) +#endif + { + GauXC::XCHostData host_data; + ScalarZGradient scalar_z_gradient; + +#ifdef _OPENMP +#pragma omp for schedule(dynamic) +#endif + for (size_t iT = 0; iT < ntasks; ++iT) { + auto& task = tasks[iT]; + auto& features = task_features_[iT]; + const GauXCTaskAdapter task_work(*lwd, task, basis); + + const int32_t npts = task.points.size(); + const int32_t nbe = task.bfn_screening.nbe; + const int32_t mgga_component_count = is_mgga ? 4 : 1; + const int32_t basis_component_count = needs_gradient ? 4 : 1; + + host_data.nbe_scr.resize(nbe * nbe); + host_data.zmat.resize(npts * nbe * spin_dimension * mgga_component_count); + host_data.basis_eval.resize(basis_component_count * npts * nbe); + if (needs_gradient) host_data.gamma.resize(direction_dimension * npts); + + ComponentMatrixMap basis_components(host_data.basis_eval.data(), + basis_component_count, nbe, npts); + ComponentMatrixMap zmat_components(host_data.zmat.data(), + spin_dimension * mgga_component_count, + nbe, npts); + std::vector> submat_map; + std::tie(submat_map, std::ignore) = GauXC::gen_compressed_submat_map( + basis_map, task.bfn_screening.shell_list, nbf, nbf); + + task_work.eval_collocation(basis_components, needs_gradient); + task_work.eval_xmat(mgga_component_count, nbf, submat_map, scalar_density, + basis_components, zmat_components, 0, + host_data.nbe_scr); + task_work.eval_xmat(mgga_component_count, nbf, submat_map, spin_density, + basis_components, zmat_components, + mgga_component_count, host_data.nbe_scr); + + if (is_mgga) { + task_work.eval_mgga_model_features_uks( + basis_components, zmat_components, mgga_component_count, + features.density, features.density_gradient, host_data.gamma, + features.kinetic, host_data.lapl, scalar_z_gradient); + } else if (is_gga) { + task_work.eval_gga_model_features_uks( + basis_components, zmat_components, mgga_component_count, + features.density, features.density_gradient, host_data.gamma, + scalar_z_gradient); + } else { + task_work.eval_lda_model_features_uks(basis_components, zmat_components, + mgga_component_count, + features.density); + } + + NEL_WORK += ConstVectorMap(task.weights.data(), npts) + .dot(features.density.rowwise().sum()); + } + } // omp parallel + electron_count = NEL_WORK; +} + +void SkalaHostDriver::post_skala_local_work_( + const GauXC::BasisSet& basis, ColMajorMatrixMap scalar_potential, + ColMajorMatrixMap spin_potential, bool is_gga, bool is_mgga, + bool /*needs_laplacian*/) { + + const bool needs_gradient = is_gga || is_mgga; + auto* lwd = dynamic_cast(lwd_.get()); + if (!lwd) SKALAXC_EXCEPTION("Expected a LocalHostWorkDriver"); + const auto& mol = lb_.molecule(); + GauXC::BasisSetMap basis_map(basis, mol); + const int32_t nbf = basis.nbf(); + scalar_potential.setZero(); + spin_potential.setZero(); + + auto& tasks = lb_.get_tasks(); + const size_t ntasks = tasks.size(); + +#ifdef _OPENMP +#pragma omp parallel +#endif + { + GauXC::XCHostData host_data; + +#ifdef _OPENMP +#pragma omp for schedule(dynamic) +#endif + for (size_t iT = 0; iT < ntasks; ++iT) { + const auto& task = tasks[iT]; + const auto& potentials = task_potentials_[iT]; + const GauXCTaskAdapter task_work(*lwd, task, basis); + + const int32_t npts = task.points.size(); + const int32_t nbe = task.bfn_screening.nbe; + const int32_t mgga_component_count = is_mgga ? 4 : 1; + const int32_t basis_component_count = needs_gradient ? 4 : 1; + + host_data.nbe_scr.resize(nbe * nbe); + host_data.zmat.resize(npts * nbe * spin_dimension * mgga_component_count); + host_data.basis_eval.resize(basis_component_count * npts * nbe); + + ComponentMatrixMap basis_components(host_data.basis_eval.data(), + basis_component_count, nbe, npts); + ComponentMatrixMap zmat_components(host_data.zmat.data(), + spin_dimension * mgga_component_count, + nbe, npts); + + std::vector> submat_map; + std::tie(submat_map, std::ignore) = GauXC::gen_compressed_submat_map( + basis_map, task.bfn_screening.shell_list, nbf, nbf); + + task_work.eval_collocation(basis_components, needs_gradient); + + if (needs_gradient) { + eval_zmat_gga_vxc_uks(potentials.density, potentials.density_gradient, + basis_components, zmat_components, + mgga_component_count); + if (is_mgga) + task_work.eval_mmat_mgga_vxc_uks(potentials.kinetic, basis_components, + zmat_components, + mgga_component_count); + } else { + task_work.eval_zmat_lda_vxc_uks(potentials.density, basis_components, + zmat_components, mgga_component_count); + } + + task_work.inc_vxc(mgga_component_count, nbf, basis_components, submat_map, + zmat_components, 0, scalar_potential, + host_data.nbe_scr); + task_work.inc_vxc(mgga_component_count, nbf, basis_components, submat_map, + zmat_components, mgga_component_count, spin_potential, + host_data.nbe_scr); + } + } // omp parallel + + scalar_potential.template triangularView() = + scalar_potential.transpose(); + spin_potential.template triangularView() = + spin_potential.transpose(); +} + +} // namespace SkalaXC diff --git a/SkalaXC/src/host/skala_host_driver.hpp b/SkalaXC/src/host/skala_host_driver.hpp new file mode 100644 index 00000000..76386ae6 --- /dev/null +++ b/SkalaXC/src/host/skala_host_driver.hpp @@ -0,0 +1,149 @@ +#pragma once +/** + * @file + * @brief SkalaXC host ML backend. + * + * Reimplementation of GauXC/skala + * reference_replicated_xc_host_integrator_onedft.hpp as a standalone driver. + * + * Instead of living as methods on GauXC's ReferenceReplicatedXCHostIntegrator + * and entering GauXC's XCIntegrator dispatch, SkalaHostDriver owns the + * reusable GauXC components (LoadBalancer + LocalWorkDriver) and drives their + * collocation / xmat / uvvar primitives directly. + * + * Per-task ML data lives in parallel input and output vectors (GauXC master's + * XCTask has no `feat` member and is never modified). + * + * Internal header: uses GauXC types freely and must never be included by any + * SkalaXC public header (ABI isolation). LibTorch stays confined to the .cxx. + */ +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "eigen_types.hpp" +#include "skala_driver.hpp" +#include "task_data.hpp" + +namespace SkalaXC { + +class ModelGridExchange; +class SkalaModel; + +/** + * @brief Standalone host driver for SkalaXC ML exchange-correlation + * functionals. + */ +class SkalaHostDriver final : public SkalaDriver { + public: + /** + * @brief Construct a host driver from a weight-partitioned load balancer. + * @param weighted_lb LoadBalancer whose tasks are already sorted and + * weight-partitioned (see MolecularWeights::modify_weights). + * @param raw_weights Per-task pre-partition quadrature weights, aligned to + * the balancer's (sorted) task order. + * @param model ML model selector ("LDA"/"PBE"/"TPSS") or a .fun path. + * @param timing_settings Diagnostics timing and logging settings. + * @param domain_batch_mode Exact-size complete-domain batching policy. + * + * The runtime environment, molecule, and basis are taken from + * @p weighted_lb; the driver builds only its host LocalWorkDriver and ML + * state. It does not partition weights (that is done up front by + * MolecularWeights::modify_weights). + */ + SkalaHostDriver( + const GauXC::LoadBalancer& weighted_lb, + const std::vector>& raw_weights, + const std::string& model, TimingSettings timing_settings = {}, + DomainBatchMode domain_batch_mode = DomainBatchMode::Conservative); + ~SkalaHostDriver() noexcept override; + + SkalaHostDriver(const SkalaHostDriver&) = delete; + SkalaHostDriver& operator=(const SkalaHostDriver&) = delete; + + /** + * @brief Build a host driver directly from a system description. + * @param rt Runtime environment. + * @param mol Molecule. + * @param mg Molecular integration grid. + * @param basis AO basis set. + * @param model ML model selector ("LDA"/"PBE"/"TPSS") or a .fun path. + * @param domain_batch_mode Exact-size complete-domain batching policy. + * @param timing_settings Diagnostics timing and logging settings. + * @return A ready-to-use, weight-partitioned host driver. + * + * Convenience for white-box tests: constructs the GauXC load balancer, sorts + * and SSF-partitions its tasks while snapshotting the pre-partition ("raw") + * quadrature weights, and returns the driver. This mirrors the public SkalaXC + * pipeline (LoadBalancerFactory then MolecularWeights::modify_weights) in one + * call so tests need no GauXC internal headers. + */ + static SkalaHostDriver from_system( + const GauXC::RuntimeEnvironment& rt, const GauXC::Molecule& mol, + const GauXC::MolGrid& mg, const GauXC::BasisSet& basis, + const std::string& model, + DomainBatchMode domain_batch_mode = DomainBatchMode::Conservative, + TimingSettings timing_settings = {}); + + /** + * @brief Evaluate UKS ML exchange-correlation energy and potential. + * @param scalar_density Scalar-spin density matrix. + * @param spin_density Z-spin density matrix. + * @param scalar_potential Output scalar XC potential matrix. + * @param spin_potential Output z XC potential matrix. + * @return Exchange-correlation energy EXC. + */ + double eval_exc_vxc_uks(ConstColMajorMatrixMap scalar_density, + ConstColMajorMatrixMap spin_density, + ColMajorMatrixMap scalar_potential, + ColMajorMatrixMap spin_potential) override; + + /** + * @brief Evaluate the UKS ML exchange-correlation nuclear gradient. + * @param scalar_density Scalar-spin density matrix. + * @param spin_density Z-spin density matrix. + * @param gradient Output atom-major Cartesian gradient. + */ + void eval_exc_grad_uks(ConstColMajorMatrixMap scalar_density, + ConstColMajorMatrixMap spin_density, + RowMajorMatrixMap gradient) override; + + private: + std::unique_ptr model_; + GauXC::LoadBalancer lb_; + std::unique_ptr lwd_; + std::vector task_features_; + std::vector task_potentials_; + std::vector> raw_weights_; ///< Pre-partition quadrature + ///< weights per task. + std::unique_ptr model_grid_exchange_; + + /** @brief Prepare per-task local data before ML evaluation. */ + void pre_skala_local_work_(const GauXC::BasisSet& basis, + ConstColMajorMatrixMap scalar_density, + ConstColMajorMatrixMap spin_density, + double& electron_count, bool is_gga, bool is_mgga, + bool needs_laplacian); + + /** @brief Accumulate ML potentials into AO matrices after ML evaluation. */ + void post_skala_local_work_(const GauXC::BasisSet& basis, + ColMajorMatrixMap scalar_potential, + ColMajorMatrixMap spin_potential, bool is_gga, + bool is_mgga, bool needs_laplacian); + + /** @brief Accumulate local Pulay and grid-weight derivative terms. */ + void exc_grad_local_work_(ConstColMajorMatrixMap scalar_density, + ConstColMajorMatrixMap spin_density, + RowMajorMatrixMap gradient, bool is_gga, + bool is_mgga); +}; + +} // namespace SkalaXC diff --git a/SkalaXC/src/host/skala_util.cxx b/SkalaXC/src/host/skala_util.cxx new file mode 100644 index 00000000..b68bc2d6 --- /dev/null +++ b/SkalaXC/src/host/skala_util.cxx @@ -0,0 +1,213 @@ +#include "skala_util.hpp" +#include "exceptions.hpp" +#include "mpi_wrapper.hpp" +#include "skala_model.hpp" +#include +#ifdef GAUXC_HAS_CUDA +#include +#endif +#include +#include +namespace SkalaXC { + +namespace { + +template +void permute_rows( + Matrix& values, + const std::vector& destination_for_source) { + if (values.size() == 0) return; + Matrix permuted(values.rows(), values.cols()); + for (Eigen::Index source = 0; source < values.rows(); ++source) { + const auto destination = destination_for_source[source].raw(); + if (destination < 0 || destination >= values.rows()) + SKALAXC_EXCEPTION("Invalid point-record permutation"); + permuted.row(destination) = values.row(source); + } + values = std::move(permuted); +} + +void permute_values( + Vector& values, + const std::vector& destination_for_source) { + if (values.size() == 0) return; + Vector permuted(values.size()); + for (Eigen::Index source = 0; source < values.size(); ++source) { + const auto destination = destination_for_source[source].raw(); + if (destination < 0 || destination >= values.size()) + SKALAXC_EXCEPTION("Invalid point permutation"); + permuted(destination) = values(source); + } + values = std::move(permuted); +} + +} // namespace + +bool valueExists(const std::string& value) { + for (const auto& pair : feat_map()) { + if (pair.second == value) { + return true; + } + } + return false; +} + +at::Tensor get_exc(const torch::jit::Method& exc_func, FeatureDict features) { + IValueList args; + IValueMap kwargs; + kwargs["mol"] = features; + auto output = exc_func(args, kwargs); + if (!output.isTensor()) + SKALAXC_EXCEPTION("Integrated model energy must be a tensor"); + return output.toTensor(); +} + +void validate_model_tensor(const at::Tensor& tensor, + std::string_view description, + const c10::Device& expected_device, + c10::ScalarType expected_type, + at::IntArrayRef expected_sizes, + bool require_contiguous, bool require_gradient) { + const std::string label(description); + if (!tensor.defined()) SKALAXC_EXCEPTION("Undefined " + label); + if (tensor.device() != expected_device) + SKALAXC_EXCEPTION(label + " is on the wrong device"); + if (tensor.scalar_type() != expected_type) + SKALAXC_EXCEPTION(label + " has the wrong dtype"); + if (!tensor.sizes().equals(expected_sizes)) + SKALAXC_EXCEPTION(label + " has invalid dimensions"); + if (require_contiguous && !tensor.is_contiguous()) + SKALAXC_EXCEPTION(label + " must be contiguous"); + if (require_gradient && !tensor.requires_grad()) + SKALAXC_EXCEPTION(label + " is not connected to autograd"); +} + +at::Tensor validated_model_gradient(const at::Tensor& feature, + std::string_view description) { + if (!feature.defined()) + SKALAXC_EXCEPTION("Undefined model feature for " + + std::string(description)); + const auto& gradient = feature.grad(); + validate_model_tensor(gradient, description, feature.device(), + feature.scalar_type(), feature.sizes()); + return gradient.contiguous(); +} + +at::Tensor model_tensor_finite_check(const at::Tensor& tensor) { + if (!tensor.defined()) SKALAXC_EXCEPTION("Cannot check undefined tensor"); + return tensor.isfinite().all(); +} + +void validate_model_tensor_finite(const at::Tensor& tensor, + std::string_view description) { + if (!model_tensor_finite_check(tensor).item()) + SKALAXC_EXCEPTION("Non-finite " + std::string(description)); +} + +at::Tensor evaluate_model_energy(const SkalaModel& model, + const FeatureDict& features, + const c10::Device& expected_device) { + auto energy = get_exc(model.energy_function(), features); + validate_model_tensor(energy, "integrated model energy", expected_device, + torch::kFloat64, {}, false, true); + return energy; +} + +std::pair, + std::vector> + build_atom_reorder_perm( + const std::vector& all_rank_atom_sizes, + const mpi::CollectiveLayout& point_layout, types::AtomCount atom_count, + types::CommunicatorSize communicator_size) { + const auto& displacements = point_layout.displacements(); + const auto total_points = types::GridPointCount{point_layout.extent()}; + const auto atom_count_value = static_cast(atom_count.raw()); + const auto communicator_size_value = + static_cast(communicator_size.raw()); + if (all_rank_atom_sizes.size() != atom_count_value * communicator_size_value) + SKALAXC_EXCEPTION("Invalid per-rank atom point counts"); + + std::vector perm( + static_cast(total_points.raw())); + std::vector inv_perm( + static_cast(total_points.raw())); + const auto atom_size = [&](std::size_t rank, std::size_t atom) { + return all_rank_atom_sizes[rank * atom_count_value + atom].raw(); + }; + + // Precompute per-rank per-atom offsets within each rank's chunk + // src_off[r][a] = rank displacement + sizes of earlier atoms on that rank. + std::vector> source_offsets( + communicator_size_value, std::vector(atom_count_value)); + for (std::size_t rank = 0; rank < communicator_size_value; ++rank) { + std::int64_t offset = displacements[rank]; + for (std::size_t atom = 0; atom < atom_count_value; ++atom) { + source_offsets[rank][atom] = offset; + offset += atom_size(rank, atom); + } + } + + // Precompute global atom offsets (destination start for each atom) + std::vector global_atom_offsets(atom_count_value); + { + std::int64_t offset = 0; + for (std::size_t atom = 0; atom < atom_count_value; ++atom) { + global_atom_offsets[atom] = offset; + for (std::size_t rank = 0; rank < communicator_size_value; ++rank) + offset += atom_size(rank, atom); + } + } + + // Build perm: for each atom, concatenate contributions from all ranks in rank + // order dst_cursor tracks the next write position for each atom + std::vector destination_cursors = global_atom_offsets; + for (std::size_t atom = 0; atom < atom_count_value; ++atom) { + for (std::size_t rank = 0; rank < communicator_size_value; ++rank) { + const auto count = atom_size(rank, atom); + const auto source = source_offsets[rank][atom]; + for (std::int64_t point = 0; point < count; ++point) { + perm[static_cast(source + point)] = + types::PermutationIndex{destination_cursors[atom] + point}; + } + destination_cursors[atom] += count; + } + } + + // Build inverse: inv_perm[perm[i]] = i + for (std::int64_t point = 0; point < total_points.raw(); ++point) + inv_perm[static_cast(perm[point].raw())] = + types::PermutationIndex{point}; + + return {std::move(perm), std::move(inv_perm)}; +} + +void reorder_to_atom_order(Vector& grid_weights, AlphaBetaMatrix& density, + CartesianMatrix& grid_coords, + AlphaBetaMatrix& kinetic, + const std::vector& perm, + types::GridPointCount total_points) { + const auto point_count = total_points.raw(); + if (grid_weights.size() != point_count || density.rows() != point_count || + grid_coords.rows() != point_count || + (kinetic.size() != 0 && kinetic.rows() != point_count) || + perm.size() != static_cast(point_count)) + SKALAXC_EXCEPTION("Invalid atom-order permutation dimensions"); + permute_values(grid_weights, perm); + permute_rows(density, perm); + permute_rows(grid_coords, perm); + permute_rows(kinetic, perm); +} + +void reorder_to_rank_order(AlphaBetaMatrix& density, AlphaBetaMatrix& kinetic, + const std::vector& inv_perm, + types::GridPointCount total_points) { + const auto point_count = total_points.raw(); + if (density.rows() != point_count || + (kinetic.size() != 0 && kinetic.rows() != point_count) || + inv_perm.size() != static_cast(point_count)) + SKALAXC_EXCEPTION("Invalid rank-order permutation dimensions"); + permute_rows(density, inv_perm); + permute_rows(kinetic, inv_perm); +} + +} // namespace SkalaXC diff --git a/SkalaXC/src/host/skala_util.hpp b/SkalaXC/src/host/skala_util.hpp new file mode 100644 index 00000000..d0821bce --- /dev/null +++ b/SkalaXC/src/host/skala_util.hpp @@ -0,0 +1,184 @@ +#pragma once +#include "eigen_types.hpp" +#include "index_types.hpp" +#include "mpi_wrapper.hpp" + +/** + * @file + * @brief SkalaXC ML utility declarations. + * + * Ported from GauXC/skala onedft_util.hpp (onedft -> skala). + * + * Internal header: freely uses GauXC + LibTorch types and must never be + * included by any SkalaXC public header (ABI isolation). + */ +#include +#include +#include +#include +#include + +#include + +using IValueList = std::vector; ///< Ordered TorchScript values. +using IValueMap = + std::unordered_map; ///< Named TorchScript + ///< values. +using FeatureDict = + c10::Dict; ///< Named model tensors. + +namespace SkalaXC { + +class SkalaModel; + +/// Canonical feature keys used by the Skala model inputs/outputs. +enum SKALA_FEATURE { + DEN, ///< Density. + DDEN, ///< Density gradient. + TAU, ///< Kinetic density. + POINTS, ///< Grid coordinates. + WEIGHTS, ///< Partitioned quadrature weights. + COORDS, ///< Atomic coordinates. + ATOMIC_GRID_WEIGHTS, ///< Per-domain raw weights. + ATOMIC_GRID_SIZES, ///< Per-domain point counts. + ATOMIC_GRID_SIZE_BOUND_SHAPE ///< Bound-shape metadata. +}; + +/// @return Mapping from feature enum to model key string. +inline const std::map& feat_map() { + static const std::map map = { + {DEN, "density"}, + {DDEN, "grad"}, + {TAU, "kin"}, + {POINTS, "grid_coords"}, + {WEIGHTS, "grid_weights"}, + {COORDS, "coarse_0_atomic_coords"}, + {ATOMIC_GRID_WEIGHTS, "atomic_grid_weights"}, + {ATOMIC_GRID_SIZES, "atomic_grid_sizes"}, + {ATOMIC_GRID_SIZE_BOUND_SHAPE, "atomic_grid_size_bound_shape"}}; + return map; +} + +/// @return Reverse mapping from model key string to feature enum. +inline const std::map& reverse_feat_map() { + static const std::map map = { + {"density", DEN}, + {"grad", DDEN}, + {"kin", TAU}, + {"grid_coords", POINTS}, + {"grid_weights", WEIGHTS}, + {"coarse_0_atomic_coords", COORDS}, + {"atomic_grid_weights", ATOMIC_GRID_WEIGHTS}, + {"atomic_grid_sizes", ATOMIC_GRID_SIZES}, + {"atomic_grid_size_bound_shape", ATOMIC_GRID_SIZE_BOUND_SHAPE}}; + return map; +} + +/// @brief Check whether a feature key exists in the known feature map. +/// @param value Feature key. +/// @return Whether the key is known. +bool valueExists(const std::string& value); + +/// @brief Run the model forward pass and return EXC tensor output. +/// @param exc_func Integrated-energy TorchScript method. +/// @param features Model input tensors. +/// @return Raw model output tensor. +at::Tensor get_exc(const torch::jit::Method& exc_func, FeatureDict features); + +/** + * @brief Validate a tensor before model-boundary use or raw storage access. + * @param tensor Tensor to validate. + * @param description Diagnostic description of the tensor. + * @param expected_device Required device and CUDA device index. + * @param expected_type Required scalar type. + * @param expected_sizes Required exact dimensions. + * @param require_contiguous Whether storage must be contiguous. + * @param require_gradient Whether the tensor must participate in autograd. + * @throws Exception If any required tensor property is absent. + */ +void validate_model_tensor(const at::Tensor& tensor, + std::string_view description, + const c10::Device& expected_device, + c10::ScalarType expected_type, + at::IntArrayRef expected_sizes, + bool require_contiguous = false, + bool require_gradient = false); + +/** + * @brief Return a validated contiguous feature gradient. + * @param feature Differentiable model input whose gradient is required. + * @param description Diagnostic description of the gradient. + * @return Gradient with the feature's device, dtype, and exact shape. + */ +at::Tensor validated_model_gradient(const at::Tensor& feature, + std::string_view description); + +/** + * @brief Produce a scalar finite-value check without reading it on the host. + * @param tensor Tensor to inspect. + * @return Scalar boolean tensor on the same device. + */ +at::Tensor model_tensor_finite_check(const at::Tensor& tensor); + +/** + * @brief Validate finite values immediately, synchronizing if required. + * @param tensor Tensor to inspect. + * @param description Diagnostic description of the tensor. + * @throws Exception If any value is non-finite. + */ +void validate_model_tensor_finite(const at::Tensor& tensor, + std::string_view description); + +/** + * @brief Evaluate a model's integrated XC energy. + * + * @param model Loaded model whose method is invoked. + * @param features Model feature dictionary. + * @param expected_device Device on which output is required. + * @return Scalar integrated XC energy tensor. + */ +at::Tensor evaluate_model_energy(const SkalaModel& model, + const FeatureDict& features, + const c10::Device& expected_device); + +/** + * @brief Build rank-order to atom-order point permutations. + * @param all_rank_atom_sizes Atom sizes for all ranks in row-major rank order. + * @param point_layout Per-rank point counts and displacements. + * @param atom_count Number of atoms. + * @param communicator_size Number of MPI ranks. + * @return Pair (perm, inv_perm) with perm[rank_ordered_idx] = atom_ordered_idx. + */ +std::pair, + std::vector> + build_atom_reorder_perm( + const std::vector& all_rank_atom_sizes, + const mpi::CollectiveLayout& point_layout, types::AtomCount atom_count, + types::CommunicatorSize communicator_size); + +/** + * @brief Reorder ordinary point records from rank-order to atom-order. + * @param grid_weights Point weights to reorder. + * @param density Point densities to reorder. + * @param grid_coords Point coordinates to reorder. + * @param kinetic Point kinetic densities to reorder. + * @param perm Destination atom-order index for each source point. + * @param total_points Number of point records. + */ +void reorder_to_atom_order(Vector& grid_weights, AlphaBetaMatrix& density, + CartesianMatrix& grid_coords, + AlphaBetaMatrix& kinetic, + const std::vector& perm, + types::GridPointCount total_points); + +/** + * @brief Reorder ordinary point records from atom-order to rank-order. + * @param density Point densities to reorder. + * @param kinetic Point kinetic densities to reorder. + * @param inv_perm Destination rank-order index for each source point. + * @param total_points Number of point records. + */ +void reorder_to_rank_order(AlphaBetaMatrix& density, AlphaBetaMatrix& kinetic, + const std::vector& inv_perm, + types::GridPointCount total_points); +} // namespace SkalaXC diff --git a/SkalaXC/src/host/spin_gradient.cxx b/SkalaXC/src/host/spin_gradient.cxx new file mode 100644 index 00000000..a7a9d913 --- /dev/null +++ b/SkalaXC/src/host/spin_gradient.cxx @@ -0,0 +1,74 @@ +#include "spin_gradient.hpp" + +#include + +#include + +namespace SkalaXC { + +SpinGradient spin_gradient_from_torch(const at::Tensor& tensor) { + if (!tensor.defined()) + throw std::invalid_argument("SpinGradient tensor must be defined"); + if (tensor.scalar_type() != torch::kFloat64) + throw std::invalid_argument("SpinGradient tensor must contain doubles"); + if (tensor.dim() != 3 || tensor.size(0) != spin_dimension || + tensor.size(1) != direction_dimension) + throw std::invalid_argument( + "SpinGradient tensor shape must be [2, 3, points]"); + + auto contiguous = tensor.detach().cpu().contiguous(); + auto source = contiguous.accessor(); + SpinGradient result(contiguous.size(2)); + for (Eigen::Index point = 0; point < result.points(); ++point) + for (Eigen::Index direction = 0; direction < direction_dimension; + ++direction) + for (Eigen::Index spin = 0; spin < spin_dimension; ++spin) + result(static_cast(direction), point, + static_cast(spin)) = source[spin][direction][point]; + return result; +} + +at::Tensor spin_gradient_to_torch(const SpinGradient& gradient, + bool requires_grad) { + auto tensor = torch::empty( + {spin_dimension, direction_dimension, gradient.points()}, + torch::TensorOptions().dtype(torch::kFloat64).device(torch::kCPU)); + auto destination = tensor.accessor(); + for (Eigen::Index point = 0; point < gradient.points(); ++point) + for (Eigen::Index direction = 0; direction < direction_dimension; + ++direction) + for (Eigen::Index spin = 0; spin < spin_dimension; ++spin) + destination[spin][direction][point] = + gradient(static_cast(direction), point, + static_cast(spin)); + return tensor.requires_grad_(requires_grad); +} + +void convert_scalar_z_to_alpha_beta(const ScalarZGradient& scalar_z, + SpinGradient& alpha_beta) { + alpha_beta.resize(scalar_z.points()); + for (Eigen::Index direction = 0; direction < direction_dimension; + ++direction) { + const auto source = scalar_z.direction(static_cast(direction)); + auto destination = alpha_beta.direction(static_cast(direction)); + destination.col(SpinChannel::Alpha) = + 0.5 * + (source.col(PauliChannel::Scalar) + source.col(PauliChannel::SpinZ)); + destination.col(SpinChannel::Beta) = + 0.5 * + (source.col(PauliChannel::Scalar) - source.col(PauliChannel::SpinZ)); + } +} + +ScalarZChannels alpha_beta_to_scalar_z(ConstAlphaBetaMatrixRef alpha_beta) { + ScalarZChannels scalar_z(alpha_beta.rows(), spin_dimension); + scalar_z.col(PauliChannel::Scalar) = + 0.5 * + (alpha_beta.col(SpinChannel::Alpha) + alpha_beta.col(SpinChannel::Beta)); + scalar_z.col(PauliChannel::SpinZ) = + 0.5 * + (alpha_beta.col(SpinChannel::Alpha) - alpha_beta.col(SpinChannel::Beta)); + return scalar_z; +} + +} // namespace SkalaXC \ No newline at end of file diff --git a/SkalaXC/src/host/spin_gradient.hpp b/SkalaXC/src/host/spin_gradient.hpp new file mode 100644 index 00000000..57301fe8 --- /dev/null +++ b/SkalaXC/src/host/spin_gradient.hpp @@ -0,0 +1,194 @@ +#pragma once + +#include "eigen_types.hpp" +#include "index_types.hpp" + +#include +#include +#include +#include + +namespace at { +class Tensor; +} + +namespace SkalaXC { + +/** @brief Collinear alpha/beta spin channel. */ +enum SpinChannel { Alpha, Beta }; +/** @brief Scalar and Pauli-z channel. */ +enum PauliChannel { Scalar, SpinZ }; +/** @brief Cartesian direction. */ +enum Direction { X, Y, Z }; + +/** @brief Point-major scalar/spin-z values. */ +using ScalarZChannels = + Eigen::Matrix; + +/** @brief Pointwise Cartesian gradients with two semantic channels. */ +template +class ChannelGradient final { + public: + /** @brief Contiguous direction-major storage. */ + using Storage = Eigen::Matrix; + /** @brief Point-major two-channel values for one direction. */ + using DirectionMatrix = + Eigen::Matrix; + /** @brief Mutable one-direction view. */ + using DirectionMap = Eigen::Map; + /** @brief Read-only one-direction view. */ + using ConstDirectionMap = Eigen::Map; + + static_assert(DirectionMatrix::ColsAtCompileTime == spin_dimension); + + /** @brief Construct empty gradient storage. */ + ChannelGradient() = default; + /** @brief Construct storage for points. @param points Number of points. */ + explicit ChannelGradient(Eigen::Index points) { resize(points); } + + /** @brief Resize and discard values. @param points Number of points. */ + void resize(Eigen::Index points) { + if (points < 0) + throw std::invalid_argument( + "ChannelGradient point count must be nonnegative"); + values_.resize(direction_dimension, points * spin_dimension); + } + + /** @return Number of represented points. */ + Eigen::Index points() const noexcept { + return values_.cols() / spin_dimension; + } + + /** + * @brief Access one value. + * @param direction Cartesian direction. + * @param point Point index. + * @param channel Semantic channel. + * @return Mutable value reference. + */ + double& operator()(Direction direction, Eigen::Index point, Channel channel) { + return values_(direction, column(point, channel)); + } + + /** + * @brief Access one value. + * @param direction Cartesian direction. + * @param point Point index. + * @param channel Semantic channel. + * @return Read-only value reference. + */ + const double& operator()(Direction direction, Eigen::Index point, + Channel channel) const { + return values_(direction, column(point, channel)); + } + + /** + * @brief View one Cartesian direction. + * @param direction Direction index. + * @return Mutable point-major view. + */ + DirectionMap direction(Direction direction) { + return DirectionMap(direction_data(direction), points(), spin_dimension); + } + + /** + * @brief View one Cartesian direction. + * @param direction Direction index. + * @return Read-only point-major view. + */ + ConstDirectionMap direction(Direction direction) const { + return ConstDirectionMap(direction_data(direction), points(), + spin_dimension); + } + + /** + * @brief Get one direction's storage. + * @param direction Direction index. + * @return Mutable storage pointer. + */ + double* direction_data(Direction direction) { + return values_.row(direction).data(); + } + + /** + * @brief Get one direction's storage. + * @param direction Direction index. + * @return Read-only storage pointer. + */ + const double* direction_data(Direction direction) const { + return values_.row(direction).data(); + } + + /** + * @brief Reorder points using a destination index for each source point. + * @param destination_for_source Destination index for every source point. + */ + void permute_points( + const std::vector& destination_for_source) { + if (destination_for_source.size() != static_cast(points())) + throw std::invalid_argument("ChannelGradient permutation size mismatch"); + + Storage permuted(direction_dimension, values_.cols()); + std::vector assigned(destination_for_source.size(), false); + for (Eigen::Index source = 0; source < points(); ++source) { + const auto destination = destination_for_source[source].raw(); + if (destination < 0 || destination >= points() || assigned[destination]) + throw std::invalid_argument("ChannelGradient permutation is invalid"); + assigned[destination] = true; + permuted.middleCols(destination * spin_dimension, spin_dimension) = + values_.middleCols(source * spin_dimension, spin_dimension); + } + values_ = std::move(permuted); + } + + private: + Eigen::Index column(Eigen::Index point, Channel channel) const { + if (point < 0 || point >= points()) + throw std::out_of_range("ChannelGradient point index out of range"); + if (channel < 0 || channel >= spin_dimension) + throw std::out_of_range("ChannelGradient channel index out of range"); + return point * spin_dimension + channel; + } + + Storage values_; +}; + +/** @brief Pointwise Cartesian density gradients in scalar/spin-z form. */ +using ScalarZGradient = ChannelGradient; + +/** @brief Pointwise Cartesian density gradients for alpha and beta spin. */ +using SpinGradient = ChannelGradient; + +/** + * @brief Convert a double tensor shaped `[spin, direction, points]`. + * @param tensor Source tensor. + * @return Converted gradient. + */ +SpinGradient spin_gradient_from_torch(const at::Tensor& tensor); + +/** + * @brief Convert to a tensor shaped `[spin, direction, points]`. + * @param gradient Source gradient. + * @param requires_grad Whether the tensor tracks gradients. + * @return Converted tensor. + */ +at::Tensor spin_gradient_to_torch(const SpinGradient& gradient, + bool requires_grad = false); + +/** + * @brief Convert scalar/spin-z gradients to alpha/beta gradients. + * @param scalar_z Source channels. + * @param alpha_beta Destination channels. + */ +void convert_scalar_z_to_alpha_beta(const ScalarZGradient& scalar_z, + SpinGradient& alpha_beta); + +/** + * @brief Convert alpha/beta point values to scalar/spin-z channels. + * @param alpha_beta Source values. + * @return Converted values. + */ +ScalarZChannels alpha_beta_to_scalar_z(ConstAlphaBetaMatrixRef alpha_beta); + +} // namespace SkalaXC From 961c96c75eec8fccc3edd0521a37f8eb5c9dd5ba Mon Sep 17 00:00:00 2001 From: jenswehner Date: Fri, 4 Sep 2026 11:36:33 +0200 Subject: [PATCH 06/33] Add ABI-isolated C++ API --- SkalaXC/cmake/SkalaXCConfig.cmake.in | 58 ++ SkalaXC/cmake/skalaxc-exports-macos.txt | 10 + SkalaXC/cmake/skalaxc-exports.map | 28 + .../skalaxc/detail/integrator_core.hpp | 68 ++ SkalaXC/include/skalaxc/skalaxc.hpp | 955 ++++++++++++++++++ SkalaXC/include/skalaxc/skalaxc_export.h | 21 + SkalaXC/src/skalaxc_api.cxx | 590 +++++++++++ 7 files changed, 1730 insertions(+) create mode 100644 SkalaXC/cmake/SkalaXCConfig.cmake.in create mode 100644 SkalaXC/cmake/skalaxc-exports-macos.txt create mode 100644 SkalaXC/cmake/skalaxc-exports.map create mode 100644 SkalaXC/include/skalaxc/detail/integrator_core.hpp create mode 100644 SkalaXC/include/skalaxc/skalaxc.hpp create mode 100644 SkalaXC/include/skalaxc/skalaxc_export.h create mode 100644 SkalaXC/src/skalaxc_api.cxx diff --git a/SkalaXC/cmake/SkalaXCConfig.cmake.in b/SkalaXC/cmake/SkalaXCConfig.cmake.in new file mode 100644 index 00000000..3763a25a --- /dev/null +++ b/SkalaXC/cmake/SkalaXCConfig.cmake.in @@ -0,0 +1,58 @@ +@PACKAGE_INIT@ + +set(SkalaXC_VERSION "@PROJECT_VERSION@") +set(SkalaXC_MODEL_DIR "@PACKAGE_SKALAXC_INSTALL_MODEL_DIR@") +set(SkalaXC_C_FOUND TRUE) +set(SkalaXC_CXX_FOUND TRUE) +set(SkalaXC_Fortran_FOUND FALSE) +set(SkalaXC_MPI_ENABLED @SKALAXC_ENABLE_MPI@) +set(SkalaXC_CUDA_ENABLED @SKALAXC_ENABLE_CUDA@) +set(SkalaXC_OpenMP_ENABLED @SKALAXC_ENABLE_OPENMP@) +set(SkalaXC_HDF5_ENABLED @SKALAXC_HAS_HDF5@) +set(SkalaXC_TORCH_VERSION "@SKALAXC_TORCH_VERSION@") +set(SkalaXC_TORCH_CXX11_ABI "@SKALAXC_TORCH_CXX11_ABI@") +set(SkalaXC_TORCH_CUDA_VERSION "@SKALAXC_TORCH_CUDA_VERSION@") +set(SkalaXC_CUDA_TOOLKIT_VERSION "@SKALAXC_CUDA_TOOLKIT_VERSION@") + +if(@SKALAXC_ENABLE_MPI@) + include(CMakeFindDependencyMacro) + get_property(_skalaxc_enabled_languages GLOBAL PROPERTY ENABLED_LANGUAGES) + set(_skalaxc_mpi_components) + foreach(_skalaxc_language IN ITEMS C CXX Fortran) + if(_skalaxc_language IN_LIST _skalaxc_enabled_languages) + list(APPEND _skalaxc_mpi_components ${_skalaxc_language}) + endif() + endforeach() + if(_skalaxc_mpi_components) + find_dependency(MPI COMPONENTS ${_skalaxc_mpi_components}) + endif() +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/SkalaXCCoreTargets.cmake") + +set(_skalaxc_fortran_targets + "${CMAKE_CURRENT_LIST_DIR}/SkalaXCFortranTargets.cmake") +if(EXISTS "${_skalaxc_fortran_targets}") + include("${_skalaxc_fortran_targets}") + set(SkalaXC_Fortran_FOUND TRUE) +endif() + +if(@SKALAXC_ENABLE_MPI@) + if(TARGET MPI::MPI_C) + target_link_libraries(SkalaXC::skalaxc INTERFACE + "$<$:MPI::MPI_C>") + endif() + if(TARGET MPI::MPI_CXX) + target_link_libraries(SkalaXC::skalaxc INTERFACE + "$<$:MPI::MPI_CXX>") + endif() + if(TARGET SkalaXC::skalaxc_fortran AND TARGET MPI::MPI_Fortran) + target_link_libraries(SkalaXC::skalaxc_fortran INTERFACE MPI::MPI_Fortran) + endif() +endif() + +unset(_skalaxc_enabled_languages) +unset(_skalaxc_fortran_targets) +unset(_skalaxc_language) +unset(_skalaxc_mpi_components) +check_required_components(SkalaXC) diff --git a/SkalaXC/cmake/skalaxc-exports-macos.txt b/SkalaXC/cmake/skalaxc-exports-macos.txt new file mode 100644 index 00000000..377d4789 --- /dev/null +++ b/SkalaXC/cmake/skalaxc-exports-macos.txt @@ -0,0 +1,10 @@ +# Mach-O exported-symbol allowlist. Apple prefixes C and Itanium C++ +# symbols with an additional underscore in the object file symbol table. +_skalaxc_* +_SkalaXC_* +___skalaxc_* +__ZN7SkalaXC* +__ZNK7SkalaXC* +__ZTIN7SkalaXC* +__ZTSN7SkalaXC* +__ZTVN7SkalaXC* diff --git a/SkalaXC/cmake/skalaxc-exports.map b/SkalaXC/cmake/skalaxc-exports.map new file mode 100644 index 00000000..f4e64fa2 --- /dev/null +++ b/SkalaXC/cmake/skalaxc-exports.map @@ -0,0 +1,28 @@ +# SkalaXC public symbol export map (linker version script). +# +# Wired onto the final SkalaXC shared library (Phase 6) via +# -Wl,--version-script=${CMAKE_CURRENT_LIST_DIR}/skalaxc-exports.map +# -Wl,--exclude-libs,ALL +# together with -fvisibility=hidden. +# +# Only the SkalaXC C / C++ / Fortran public API is exported. Every GauXC and +# LibTorch symbol statically embedded into the library stays local, so a host +# application that links its own GauXC cannot suffer an ODR / symbol clash. +# +# C++ symbols are matched by their Itanium-ABI mangled prefix (namespace +# `SkalaXC` = `7SkalaXC`), which is more portable across binutils versions than +# the `extern "C++"` demangled-glob form. This is defense-in-depth on top of +# -fvisibility=hidden + SKALAXC_EXPORT. +{ + global: + skalaxc_*; + SkalaXC_*; + __skalaxc_*; + _ZN7SkalaXC*; /* namespace SkalaXC: constructors, methods, functions */ + _ZNK7SkalaXC*; /* namespace SkalaXC: const methods */ + _ZTIN7SkalaXC*; /* typeinfo for SkalaXC::* */ + _ZTSN7SkalaXC*; /* typeinfo name for SkalaXC::* */ + _ZTVN7SkalaXC*; /* vtable for SkalaXC::* */ + local: + *; +}; diff --git a/SkalaXC/include/skalaxc/detail/integrator_core.hpp b/SkalaXC/include/skalaxc/detail/integrator_core.hpp new file mode 100644 index 00000000..a3210088 --- /dev/null +++ b/SkalaXC/include/skalaxc/detail/integrator_core.hpp @@ -0,0 +1,68 @@ +/** + * @file + * @brief Non-template evaluation core hidden behind XCIntegrator. + * + * ABI isolation contract: this header exposes no GauXC/LibTorch/Eigen types. + * IntegratorCore confines the templated public facade from the GauXC/LibTorch + * host driver: the facade marshals caller matrices to/from column-major double + * buffers and forwards to these non-template raw-pointer methods, whose + * definitions live in the implementation translation unit. + */ +#pragma once + +#include +#include + +#include + +namespace SkalaXC { + +// Forward declarations (full definitions live in ). +enum class ExecutionSpace; +enum class DomainBatchMode; +class functional_type; +class LoadBalancer; +struct DiagnosticsSnapshot; +struct TimingSettings; + +namespace detail { + +/** @brief Opaque, non-template SkalaXC host evaluation core. */ +class SKALAXC_EXPORT IntegratorCore { + public: + struct Impl; + explicit IntegratorCore(std::unique_ptr impl); + ~IntegratorCore(); + + IntegratorCore(IntegratorCore&&) noexcept; + IntegratorCore& operator=(IntegratorCore&&) noexcept; + IntegratorCore(const IntegratorCore&) = delete; + IntegratorCore& operator=(const IntegratorCore&) = delete; + + std::int64_t nbf() const; + std::int64_t natoms() const; + + /// Evaluate UKS EXC/VXC from column-major nbf x nbf buffers. + double eval_exc_vxc(const double* Ps, const double* Pz, double* VXCs, + double* VXCz); + + /// Evaluate the UKS XC nuclear gradient (3 * natoms, atom-major xyz). + void eval_exc_grad(const double* Ps, const double* Pz, double* gradient); + + /// Return rank-local diagnostics without performing MPI collectives. + DiagnosticsSnapshot diagnostics() const; + + /// Clear evaluation timings and counters while preserving setup data. + void reset_diagnostics(); + + private: + std::unique_ptr pimpl_; +}; + +/// Build a host evaluation core from a weighted load balancer and functional. +SKALAXC_EXPORT std::unique_ptr make_integrator_core( + ExecutionSpace ex, const functional_type& func, const LoadBalancer& lb, + TimingSettings timing_settings, DomainBatchMode domain_batch_mode); + +} // namespace detail +} // namespace SkalaXC diff --git a/SkalaXC/include/skalaxc/skalaxc.hpp b/SkalaXC/include/skalaxc/skalaxc.hpp new file mode 100644 index 00000000..7d2042f9 --- /dev/null +++ b/SkalaXC/include/skalaxc/skalaxc.hpp @@ -0,0 +1,955 @@ +/** + * @file + * @brief SkalaXC public C++ API. + * + * The public surface mirrors GauXC's public XC pipeline + * (RuntimeEnvironment -> Molecule / BasisSet -> MolGrid -> LoadBalancer -> + * MolecularWeights -> functional_type -> XCIntegratorFactory -> XCIntegrator) + * so GauXC-style host code ports by changing only the namespace. SkalaXC owns + * ABI-isolated replicas of the value types; only the host UKS methods SkalaXC + * actually supports (eval_exc_vxc, eval_exc_grad) are exposed. The Skala ML + * model selector lives on SkalaXC::functional_type -- the single semantic + * deviation from GauXC (whose functional_type is an ExchCXX functional). + * + * ABI isolation contract: this header includes no GauXC or LibTorch headers + * and exposes no GauXC/Torch/Eigen types. All such usage is confined to the + * implementation translation units behind a PIMPL. + * + * The sole exception is a native MPI_Comm on the RuntimeEnvironment + * constructor in MPI builds (SKALAXC_HAS_MPI). MPI_Comm is a standard MPI C + * type, not a GauXC/Torch type, so the isolation guarantee is preserved. + */ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace SkalaXC { + +/** + * @brief Return the SkalaXC semantic version. + * + * The returned view references static storage owned by the library. + * @return SkalaXC semantic version string. + */ +SKALAXC_EXPORT std::string_view version() noexcept; + +/** + * @brief Exception type thrown across the SkalaXC boundary. + * + * GauXC exceptions are translated internally and re-thrown as this + * std::runtime_error-derived type so no GauXC exception type escapes. + */ +class SKALAXC_EXPORT Exception : public std::runtime_error { + public: + using std::runtime_error::runtime_error; +}; + +// =========================================================================== +// Strong scalar wrappers. +// =========================================================================== +namespace types { + +/** + * @brief Type-safe scalar wrapper with opt-in additive arithmetic. + * @tparam T Stored scalar type. + * @tparam ParameterType Tag distinguishing otherwise identical scalar types. + * @tparam Additive Whether additive operators are available. + */ +template +class NamedType { + public: + using value_type = T; ///< Stored scalar type. + + static constexpr bool is_additive = Additive; ///< Additive-operator policy. + + /** @brief Construct a value initialized scalar wrapper. */ + constexpr NamedType() : value_() {} + + /** + * @brief Construct from a scalar value. + * @param value Scalar value to copy. + */ + constexpr explicit NamedType(const T& value) : value_(value) {} + + /** + * @brief Construct by moving a scalar value. + * @param value Scalar value to move. + */ + constexpr explicit NamedType(T&& value) : value_(std::move(value)) {} + + /** @return Stored scalar value. */ + constexpr T raw() const noexcept { return value_; } + + private: + T value_; +}; + +/** + * @brief Compare two named values for equality. + * @param a Left operand. + * @param b Right operand. + * @return Whether the stored values are equal. + */ +template +constexpr bool operator==(const NamedType& a, + const NamedType& b) { + return a.raw() == b.raw(); +} + +/** + * @brief Compare two named values for inequality. + * @param a Left operand. + * @param b Right operand. + * @return Whether the stored values differ. + */ +template +constexpr bool operator!=(const NamedType& a, + const NamedType& b) { + return !(a == b); +} + +/** @brief Named scalar type that supports addition. */ +template +using AdditiveNamedType = NamedType; + +/** + * @brief Add two values of the same additive named type. + * @param left Left operand. + * @param right Right operand. + * @return Sum with the same named type. + */ +template +constexpr AdditiveNamedType operator+( + AdditiveNamedType left, + AdditiveNamedType right) { + return AdditiveNamedType{left.raw() + right.raw()}; +} + +/** + * @brief Add a named value in place. + * @param left Value to update. + * @param right Value to add. + * @return Reference to @p left. + */ +template +constexpr AdditiveNamedType& operator+=( + AdditiveNamedType& left, + AdditiveNamedType right) { + left = left + right; + return left; +} + +} // namespace types + +namespace detail { + +/// Grants the implementation translation unit access to stage internals. +struct Access; + +} // namespace detail + +/** @brief Type-safe atomic number. */ +using AtomicNumber = types::NamedType; +/** @brief Type-safe number of primitives in a basis shell. */ +using PrimSize = types::NamedType; +/** @brief Type-safe basis-shell angular momentum. */ +using AngularMomentum = + types::NamedType; +/** @brief Type-safe spherical-shell indicator. */ +using SphericalType = types::NamedType; +/** @brief Type-safe radial quadrature size. */ +using RadialSize = types::NamedType; +/** @brief Type-safe angular quadrature size. */ +using AngularSize = types::NamedType; +/** @brief Type-safe quadrature batch size. */ +using BatchSize = types::NamedType; +/** @brief Type-safe radial quadrature scale. */ +using RadialScale = types::NamedType; + +// =========================================================================== +// Molecule / basis value types (mirror GauXC). +// =========================================================================== + +/** @brief A single atom (nucleus). Coordinates are in bohr. */ +struct Atom { + AtomicNumber Z; ///< atomic number + double x; ///< nuclear x-coordinate (bohr) + double y; ///< nuclear y-coordinate (bohr) + double z; ///< nuclear z-coordinate (bohr) + + Atom() = default; + + /** + * @brief Construct an atom from its nuclear charge and coordinates. + * @param Z_ Atomic number. + * @param x_ Nuclear x-coordinate in bohr. + * @param y_ Nuclear y-coordinate in bohr. + * @param z_ Nuclear z-coordinate in bohr. + */ + Atom(AtomicNumber Z_, double x_, double y_, double z_) + : Z(Z_), x(x_), y(y_), z(z_) {} +}; + +/** @brief Molecular geometry (mirrors GauXC::Molecule : std::vector). */ +class Molecule : public std::vector { + public: + using std::vector::vector; + + /** @return Number of atoms in the molecule. */ + std::size_t natoms() const { return this->size(); } + + /** @return Largest atomic number in the molecule, or zero when empty. */ + AtomicNumber maxZ() const { + std::int64_t z = 0; + for (const auto& a : *this) z = std::max(z, a.Z.raw()); + return AtomicNumber(z); + } +}; + +/** + * @brief A single contracted Gaussian basis shell (mirrors GauXC::Shell). + * + * Stores the primitive exponents/coefficients and center as supplied; the + * @p normalize flag is honored when the shell is realized inside the library. + * @tparam F Primitive exponent and coefficient scalar type. + */ +template +class Shell { + public: + using prim_array = std::array; ///< Primitive storage type. + using cart_array = std::array; ///< Cartesian center type. + + Shell() = default; + + /** + * @brief Construct a contracted Gaussian shell. + * @param nprim Number of active entries in @p alpha and @p coeff. + * @param l Angular momentum. + * @param pure Nonzero for a pure spherical shell; zero for Cartesian. + * @param alpha Primitive exponents; only the first @p nprim are used. + * @param coeff Contraction coefficients; only the first @p nprim are used. + * @param O Shell center in bohr. + * @param normalize Whether to normalize the realized shell. + */ + Shell(PrimSize nprim, AngularMomentum l, SphericalType pure, prim_array alpha, + prim_array coeff, cart_array O, bool normalize = true) + : nprim_(nprim.raw()), + l_(l.raw()), + pure_(pure.raw()), + alpha_(alpha), + coeff_(coeff), + O_(O), + normalize_(normalize) {} + + /** @return Number of primitives. */ + std::int32_t nprim() const { return nprim_; } + /** @return Angular momentum. */ + std::int32_t l() const { return l_; } + /** @return Nonzero for a pure spherical shell. */ + std::int32_t pure() const { return pure_; } + /** @return Whether normalization was requested. */ + bool normalized() const { return normalize_; } + + /** @return Pointer to the primitive exponent storage. */ + const F* alpha_data() const { return alpha_.data(); } + /** @return Pointer to the contraction coefficient storage. */ + const F* coeff_data() const { return coeff_.data(); } + /** @return Pointer to the three shell-center coordinates in bohr. */ + const double* O_data() const { return O_.data(); } + + /** @return Number of Cartesian basis functions in the shell. */ + std::int32_t cart_size() const { return (l_ + 1) * (l_ + 2) / 2; } + /** @return Number of pure spherical basis functions in the shell. */ + std::int32_t pure_size() const { return 2 * l_ + 1; } + /** @return Active basis-function count for the configured shell type. */ + std::int32_t size() const { return pure_ ? pure_size() : cart_size(); } + + private: + std::int32_t nprim_ = 0; + std::int32_t l_ = 0; + std::int32_t pure_ = 1; + prim_array alpha_{}; + prim_array coeff_{}; + cart_array O_{}; + bool normalize_ = true; +}; + +/** + * @brief Basis set (mirrors GauXC::BasisSet : std::vector>). + * @tparam F Primitive exponent and coefficient scalar type. + */ +template +struct BasisSet : public std::vector> { + using std::vector>::vector; + + /** @return Number of shells. */ + std::int32_t nshells() const { + return static_cast(this->size()); + } + + /** @return Number of basis functions in the configured shell types. */ + std::int32_t nbf() const { + std::int32_t n = 0; + for (const auto& s : *this) n += s.size(); + return n; + } + + /** @return Number of basis functions when all shells are Cartesian. */ + std::int32_t nbf_cart() const { + std::int32_t n = 0; + for (const auto& s : *this) n += s.cart_size(); + return n; + } + + /** @return Maximum angular momentum, or zero for an empty basis. */ + std::int32_t max_l() const { + std::int32_t l = 0; + for (const auto& s : *this) l = std::max(l, s.l()); + return l; + } +}; + +// =========================================================================== +// Enums (mirror GauXC, same enumerator names). +// =========================================================================== + +/** @brief Radial quadrature scheme (mirrors GauXC::RadialQuad). */ +enum class RadialQuad { + Becke, + MuraKnowles, + MurrayHandyLaming, + TreutlerAhlrichs +}; + +/** @brief Atomic grid size preset (mirrors GauXC::AtomicGridSizeDefault). */ +enum class AtomicGridSizeDefault { + FineGrid, + UltraFineGrid, + SuperFineGrid, + GM3, + GM5 +}; + +/** @brief Pruning scheme for atomic quadratures (mirrors GauXC). */ +enum class PruningScheme { Unpruned, Robust, Treutler }; + +/** @brief Execution space (mirrors GauXC::ExecutionSpace). */ +enum class ExecutionSpace { Host, Device }; + +/** @brief XC weight partitioning scheme (mirrors GauXC::XCWeightAlg). */ +enum class XCWeightAlg { NOTPARTITIONED, Becke, SSF, LKO }; + +// =========================================================================== +// Settings value types (mirror GauXC). +// =========================================================================== + +/** @brief Molecular-weight partitioning settings (mirrors GauXC). */ +struct MolecularWeightsSettings { + XCWeightAlg weight_alg = XCWeightAlg::SSF; ///< Partitioning algorithm. +}; + +/** @brief CUDA runtime allocation and device-selection settings. */ +struct DeviceRuntimeSettings { + int device_id = 0; ///< CUDA device ordinal. + double memory_fraction = 0.75; ///< Fraction of available device memory. +}; + +/** @brief Policy for grouping complete local atomic domains into model calls. + */ +enum class DomainBatchMode { + /** @brief Evaluate one complete atomic domain per model call. */ + Conservative, + /** @brief Batch all local domains having the same exact grid size. */ + Aggressive +}; + +/** @brief Configuration for lightweight, rank-local diagnostics. */ +struct TimingSettings { + /** @brief Wait for complete CUDA event timings when diagnostics are read. */ + bool verbose = false; + /** @brief Emit human-readable, rank-local diagnostics to stderr. */ + bool debug_logging = false; +}; + +/** @brief Stable identifiers for integrator timing phases. */ +enum class TimingMetric : std::size_t { + ModelLoad, + FeatureConstruction, + ModelBatchPacking, + ModelForward, + ModelBackward, + PotentialMapping, + AOAssembly, + GradientAssembly, + MPIReduction, + TotalEXCVXC, + TotalEXCGradient, + Count +}; + +/** @brief Number of stable timing metrics. */ +inline constexpr std::size_t timing_metric_count = + static_cast(TimingMetric::Count); + +/** @brief Availability of one timing value in a diagnostics snapshot. */ +enum class TimingStatus { Unavailable, Pending, Complete }; + +/** @brief Last and cumulative values for one timing phase. */ +struct TimingValue { + std::uint64_t last_nanoseconds = 0; ///< Most recent completed duration. + std::uint64_t total_nanoseconds = 0; ///< Sum of completed durations. + std::uint64_t call_count = 0; ///< Number of phase invocations. + TimingStatus status = TimingStatus::Unavailable; ///< Value availability. +}; + +/** + * @brief Rank-local, non-collective snapshot of integrator diagnostics. + * + * Setup topology and model-load timing persist across reset_diagnostics(); + * evaluation timings, calls, processed batches, and domains do not. + */ +struct DiagnosticsSnapshot { + ExecutionSpace backend = ExecutionSpace::Host; ///< Evaluation backend. + int rank = 0; ///< Rank in the runtime communicator. + int communicator_size = 1; ///< Runtime communicator size. + int device_id = -1; ///< CUDA ordinal, or -1 on the host. + int openmp_threads = 1; ///< OpenMP threads at construction. + double device_memory_fraction = 0.0; ///< GauXC CUDA arena fraction. + DomainBatchMode domain_batch_mode = DomainBatchMode::Conservative; + ///< Configured complete-domain batching policy. + std::array timings{}; ///< Phase timings. + std::uint64_t exc_vxc_calls = 0; ///< EXC/VXC evaluations since reset. + std::uint64_t exc_gradient_calls = 0; ///< Gradient evaluations since reset. + std::uint64_t model_batches = 0; ///< Model batches since reset. + std::uint64_t domains = 0; ///< Atomic domains since reset. + std::uint64_t tasks = 0; ///< Local quadrature tasks processed. + std::uint64_t points = 0; ///< Local quadrature points processed. + std::uint64_t local_atoms = 0; ///< Atomic domains owned by this rank. + std::uint64_t configured_model_batches = 0; ///< Planned model batches. + std::uint64_t task_points_min = 0; ///< Minimum points per task. + std::uint64_t task_points_max = 0; ///< Maximum points per task. + std::uint64_t task_basis_min = 0; ///< Minimum basis functions per task. + std::uint64_t task_basis_max = 0; ///< Maximum basis functions per task. + std::uint64_t model_batch_points_min = 0; ///< Minimum batch point count. + std::uint64_t model_batch_points_max = 0; ///< Maximum batch point count. + std::uint64_t max_domains_per_model_batch = + 0; ///< Maximum domains per batch. + + /** + * @brief Access one timing value. + * @param metric Timing phase to access. + * @return Timing value for @p metric. + */ + const TimingValue& timing(TimingMetric metric) const { + return timings.at(static_cast(metric)); + } +}; + +/** @brief Base XC integrator settings (mirrors GauXC::IntegratorSettingsXC). */ +struct IntegratorSettingsXC { + virtual ~IntegratorSettingsXC() = default; +}; + +/** + * @brief XC-gradient settings (mirrors GauXC::IntegratorSettingsEXC_GRAD). + * + * SkalaXC supports only @c include_weight_derivatives == true (the GauXC + * default); requesting @c false throws from XCIntegrator::eval_exc_grad. + */ +struct IntegratorSettingsEXC_GRAD : public IntegratorSettingsXC { + bool include_weight_derivatives = true; ///< Include molecular-weight terms. +}; + +/** + * @brief Skala ML functional selector. + * + * SkalaXC deviation from GauXC: GauXC's functional_type is an ExchCXX + * functional; here it carries the Skala model selector ("LDA"/"PBE"/"TPSS" or + * a path to a .fun TorchScript model), consumed when the integrator is built. + */ +class functional_type { + public: + functional_type() = default; + + /** + * @brief Construct a functional selector. + * @param model Model name or path to a TorchScript @c .fun file. + */ + functional_type(std::string model) : model_(std::move(model)) {} + + /** + * @brief Construct a functional selector from a C string. + * @param model Model name or path; a null pointer selects an empty model. + */ + functional_type(const char* model) : model_(model ? model : "") {} + + /** @return Configured model name or path. */ + const std::string& model() const { return model_; } + /** @return Whether no model selector is configured. */ + bool empty() const { return model_.empty(); } + + private: + std::string model_; +}; + +#ifdef SKALAXC_HAS_HDF5 +// =========================================================================== +// HDF5 record readers (mirror GauXC::read_hdf5_record overloads). +// =========================================================================== + +/** + * @brief Read a molecule record from an HDF5 file (mirrors GauXC). + * @param mol Destination atom vector. + * @param fname HDF5 file path. + * @param dset Molecule dataset path. + */ +SKALAXC_EXPORT void read_hdf5_record(std::vector& mol, std::string fname, + std::string dset); + +/** + * @brief Read a basis-set record from an HDF5 file (mirrors GauXC). + * @param basis Destination basis-shell vector. + * @param fname HDF5 file path. + * @param dset Basis-set dataset path. + */ +SKALAXC_EXPORT void read_hdf5_record(std::vector>& basis, + std::string fname, std::string dset); +#endif // SKALAXC_HAS_HDF5 + +// =========================================================================== +// Pipeline stages (opaque; own GauXC state behind PIMPL). +// =========================================================================== + +/** @brief Runtime environment (mirrors GauXC::RuntimeEnvironment). */ +class SKALAXC_EXPORT RuntimeEnvironment { + public: + /** + * @brief Construct a host runtime environment. + * @param comm MPI communicator used by the runtime. + */ + explicit RuntimeEnvironment(SKALAXC_MPI_CODE(MPI_Comm comm)); + + /** + * @brief Construct a device runtime environment. + * @param comm MPI communicator used by the runtime. + * @param settings CUDA device and memory-allocation settings. + */ + explicit RuntimeEnvironment(SKALAXC_MPI_CODE(MPI_Comm comm, ) + DeviceRuntimeSettings settings); + ~RuntimeEnvironment(); + + /** + * @brief Move-construct a runtime environment. + * @param other Runtime environment to move from. + */ + RuntimeEnvironment(RuntimeEnvironment&& other) noexcept; + + /** + * @brief Move-assign a runtime environment. + * @param other Runtime environment to move from. + * @return Reference to this runtime environment. + */ + RuntimeEnvironment& operator=(RuntimeEnvironment&& other) noexcept; + RuntimeEnvironment(const RuntimeEnvironment&) = delete; + RuntimeEnvironment& operator=(const RuntimeEnvironment&) = delete; + + /** @return Rank in the configured communicator. */ + int comm_rank() const; + /** @return Number of ranks in the configured communicator. */ + int comm_size() const; + + struct Impl; + + private: + friend struct detail::Access; + std::unique_ptr pimpl_; +}; + +/** @brief Molecular integration grid (mirrors GauXC::MolGrid). */ +class SKALAXC_EXPORT MolGrid { + public: + ~MolGrid(); + + /** + * @brief Move-construct a molecular grid. + * @param other Molecular grid to move from. + */ + MolGrid(MolGrid&& other) noexcept; + + /** + * @brief Move-assign a molecular grid. + * @param other Molecular grid to move from. + * @return Reference to this molecular grid. + */ + MolGrid& operator=(MolGrid&& other) noexcept; + MolGrid(const MolGrid&) = delete; + MolGrid& operator=(const MolGrid&) = delete; + + struct Impl; + + private: + friend struct detail::Access; + explicit MolGrid(std::unique_ptr impl); + std::unique_ptr pimpl_; +}; + +/** @brief Factory for default molecular grids (mirrors GauXC::MolGridFactory). + */ +struct SKALAXC_EXPORT MolGridFactory { + /** + * @brief Create a molecular grid from a standard atomic-grid preset. + * @param mol Molecular geometry in bohr. + * @param pruning_scheme Atomic-grid pruning scheme. + * @param batch_size Maximum quadrature batch size. + * @param radial_quad Radial quadrature scheme. + * @param grid_size Atomic-grid size preset. + * @return Constructed molecular integration grid. + */ + static MolGrid create_default_molgrid(const Molecule& mol, + PruningScheme pruning_scheme, + BatchSize batch_size, + RadialQuad radial_quad, + AtomicGridSizeDefault grid_size); +}; + +/** @brief Quadrature load balancer (mirrors GauXC::LoadBalancer). */ +class SKALAXC_EXPORT LoadBalancer { + public: + ~LoadBalancer(); + + /** + * @brief Move-construct a load balancer. + * @param other Load balancer to move from. + */ + LoadBalancer(LoadBalancer&& other) noexcept; + + /** + * @brief Move-assign a load balancer. + * @param other Load balancer to move from. + * @return Reference to this load balancer. + */ + LoadBalancer& operator=(LoadBalancer&& other) noexcept; + LoadBalancer(const LoadBalancer&) = delete; + LoadBalancer& operator=(const LoadBalancer&) = delete; + + struct Impl; + + private: + friend struct detail::Access; + explicit LoadBalancer(std::unique_ptr impl); + std::unique_ptr pimpl_; +}; + +/** @brief Factory for load balancers (mirrors GauXC::LoadBalancerFactory). */ +class SKALAXC_EXPORT LoadBalancerFactory { + public: + /** + * @brief Construct a load-balancer factory. + * @param ex Execution space for the generated load balancer. + * @param kernel_name GauXC load-balancing kernel name. + */ + explicit LoadBalancerFactory(ExecutionSpace ex, + std::string kernel_name = "Default"); + + /** + * @brief Build a load balancer for a molecule, grid, and basis set. + * @param rt Runtime environment retained by the load balancer. + * @param mol Molecular geometry in bohr. + * @param mg Molecular integration grid. + * @param basis Gaussian basis set. + * @return Constructed quadrature load balancer. + */ + LoadBalancer get_instance(const RuntimeEnvironment& rt, const Molecule& mol, + const MolGrid& mg, const BasisSet& basis); + + private: + ExecutionSpace ex_; + std::string kernel_name_; +}; + +/** @brief Molecular partition weights (mirrors GauXC::MolecularWeights). */ +class SKALAXC_EXPORT MolecularWeights { + public: + ~MolecularWeights(); + + /** + * @brief Move-construct a molecular-weights object. + * @param other Molecular-weights object to move from. + */ + MolecularWeights(MolecularWeights&& other) noexcept; + + /** + * @brief Move-assign a molecular-weights object. + * @param other Molecular-weights object to move from. + * @return Reference to this molecular-weights object. + */ + MolecularWeights& operator=(MolecularWeights&& other) noexcept; + MolecularWeights(const MolecularWeights&) = delete; + MolecularWeights& operator=(const MolecularWeights&) = delete; + + /** + * @brief Partition the quadrature weights stored on a load balancer. + * @param lb Load balancer whose quadrature weights are modified in place. + */ + void modify_weights(LoadBalancer& lb) const; + + struct Impl; + + private: + friend struct detail::Access; + explicit MolecularWeights(std::unique_ptr impl); + std::unique_ptr pimpl_; +}; + +/** + * @brief Factory for molecular weights (mirrors + * GauXC::MolecularWeightsFactory). + */ +class SKALAXC_EXPORT MolecularWeightsFactory { + public: + /** + * @brief Construct a molecular-weights factory. + * @param ex Execution space for weight partitioning. + * @param kernel_name GauXC molecular-weights kernel name. + * @param settings Molecular-weight partitioning settings. + */ + MolecularWeightsFactory(ExecutionSpace ex, std::string kernel_name, + MolecularWeightsSettings settings = {}); + + /** @return Molecular-weights object configured by this factory. */ + MolecularWeights get_instance(); + + private: + ExecutionSpace ex_; + std::string kernel_name_; + MolecularWeightsSettings settings_; +}; + +// =========================================================================== +// XCIntegrator (mirrors GauXC::XCIntegrator, host UKS subset). +// =========================================================================== + +/** + * @brief SkalaXC ML exchange-correlation integrator (mirrors GauXC). + * + * A thin templated facade that marshals the caller's column-major @p MatrixType + * to/from the non-template evaluation core (detail::IntegratorCore). Only the + * host UKS methods SkalaXC supports are exposed. + * + * @warning An integrator instance is not safe for concurrent calls, moves, or + * destruction. Serialize access to a shared instance or use one integrator per + * calling thread. Distinct instances may execute concurrently. + */ +template +class XCIntegrator { + public: + using matrix_type = MatrixType; ///< Caller-provided matrix type. + using value_type = typename MatrixType::value_type; ///< Matrix scalar type. + using exc_vxc_type_uks = + std::tuple; ///< EXC/VXC result. + using exc_grad_type = std::vector; ///< Atom-major XC gradient. + + static_assert(std::is_same::value, + "SkalaXC XCIntegrator requires a double matrix type"); + + XCIntegrator() = default; + + /** + * @brief Construct an integrator from an evaluation core. + * @param core Evaluation core owned by the integrator. + */ + explicit XCIntegrator(std::unique_ptr core) + : core_(std::move(core)) {} + + XCIntegrator(const XCIntegrator&) = delete; + XCIntegrator& operator=(const XCIntegrator&) = delete; + + /** + * @brief Move-construct an XC integrator. + * @param other XC integrator to move from. + */ + XCIntegrator(XCIntegrator&& other) noexcept = default; + + /** + * @brief Move-assign an XC integrator. + * @param other XC integrator to move from. + * @return Reference to this XC integrator. + */ + XCIntegrator& operator=(XCIntegrator&& other) noexcept = default; + + /** + * @brief Evaluate the UKS ML XC energy and potential (scalar, z). + * @param Ps Scalar density matrix in column-major storage. + * @param Pz Spin-density matrix in column-major storage. + * @param settings XC evaluation settings. + * @return XC energy, scalar potential matrix, and spin potential matrix. + */ + exc_vxc_type_uks eval_exc_vxc( + const MatrixType& Ps, const MatrixType& Pz, + const IntegratorSettingsXC& settings = IntegratorSettingsXC{}) { + require_core(); + const std::int64_t n = core_->nbf(); + MatrixType VXCs(n, n); + MatrixType VXCz(n, n); + const value_type EXC = eval_exc_vxc(Ps, Pz, VXCs, VXCz, settings); + return std::make_tuple(EXC, std::move(VXCs), std::move(VXCz)); + } + + /** + * @brief Evaluate UKS ML XC energy and potential into caller-owned matrices. + * @param Ps Scalar density matrix in column-major storage. + * @param Pz Spin-density matrix in column-major storage. + * @param VXCs Pre-sized `nbf` by `nbf` scalar potential output. + * @param VXCz Pre-sized `nbf` by `nbf` spin potential output. + * @param settings XC evaluation settings. + * @return XC energy. + * @throws Exception If the integrator is uninitialized or a matrix extent is + * invalid. Extents are validated before either output is modified. + */ + value_type eval_exc_vxc( + const MatrixType& Ps, const MatrixType& Pz, MatrixType& VXCs, + MatrixType& VXCz, + const IntegratorSettingsXC& settings = IntegratorSettingsXC{}) { + (void)settings; + require_core(); + const std::int64_t n = core_->nbf(); + check_square(Ps, n, "density"); + check_square(Pz, n, "density"); + check_square(VXCs, n, "potential output"); + check_square(VXCz, n, "potential output"); + return core_->eval_exc_vxc(Ps.data(), Pz.data(), VXCs.data(), VXCz.data()); + } + + /** + * @brief Evaluate the UKS ML XC nuclear gradient (atom-major xyz). + * @param Ps Scalar density matrix in column-major storage. + * @param Pz Spin-density matrix in column-major storage. + * @param settings XC-gradient evaluation settings. + * @return XC nuclear gradient with exactly three values per atom. + */ + exc_grad_type eval_exc_grad( + const MatrixType& Ps, const MatrixType& Pz, + const IntegratorSettingsXC& settings = IntegratorSettingsXC{}) { + require_core(); + exc_grad_type gradient(static_cast(3 * core_->natoms())); + eval_exc_grad(Ps, Pz, gradient, settings); + return gradient; + } + + /** + * @brief Evaluate the UKS ML XC nuclear gradient into caller-owned storage. + * @param Ps Scalar density matrix in column-major storage. + * @param Pz Spin-density matrix in column-major storage. + * @param gradient Pre-sized `3 * natoms` atom-major xyz output. + * @param settings XC-gradient evaluation settings. + * @throws Exception If the integrator is uninitialized, an input matrix + * extent is invalid, the gradient extent is invalid, or unsupported settings + * are requested. Inputs and output extent are validated before the output is + * modified. + */ + void eval_exc_grad( + const MatrixType& Ps, const MatrixType& Pz, exc_grad_type& gradient, + const IntegratorSettingsXC& settings = IntegratorSettingsXC{}) { + require_core(); + if (const auto* g = + dynamic_cast(&settings)) { + if (!g->include_weight_derivatives) + throw Exception( + "SkalaXC eval_exc_grad supports include_weight_derivatives=true " + "only"); + } + const std::int64_t n = core_->nbf(); + check_square(Ps, n, "density"); + check_square(Pz, n, "density"); + if (gradient.size() != static_cast(3 * core_->natoms())) + throw Exception("SkalaXC gradient output must contain 3 * natoms values"); + core_->eval_exc_grad(Ps.data(), Pz.data(), gradient.data()); + } + + /** + * @brief Return rank-local diagnostics without performing MPI collectives. + * @return Snapshot of rank-local timing and workload diagnostics. + */ + DiagnosticsSnapshot diagnostics() const { + require_core(); + return core_->diagnostics(); + } + + /** @brief Clear evaluation timings and counters for this integrator. */ + void reset_diagnostics() { + require_core(); + core_->reset_diagnostics(); + } + + private: + void require_core() const { + if (!core_) throw Exception("SkalaXC XCIntegrator is not initialized"); + } + + template + static void check_square(const M& m, std::int64_t n, const char* kind) { + static_assert( + std::is_convertible().data()), + const value_type*>::value, + "SkalaXC matrices must expose contiguous double data via .data()"); + if (m.rows() != n || m.cols() != n) + throw Exception(std::string("SkalaXC ") + kind + + " matrices must be nbf x nbf"); + } + + std::unique_ptr core_; +}; + +/** + * @brief Factory for XC integrators (mirrors GauXC::XCIntegratorFactory). + */ +template +class XCIntegratorFactory { + public: + /** + * @brief Construct an XC-integrator factory. + * @param ex Host or device execution space. + * @param timing_settings Rank-local timing behavior. + * @param domain_batch_mode Complete-domain model batching policy. + */ + explicit XCIntegratorFactory( + ExecutionSpace ex, TimingSettings timing_settings = {}, + DomainBatchMode domain_batch_mode = DomainBatchMode::Conservative) + : ex_(ex), + timing_settings_(timing_settings), + domain_batch_mode_(domain_batch_mode) {} + + /** + * @brief Build an integrator from a model functional and weighted balancer. + * @param func Functional carrying the model selector. + * @param lb Load balancer with partitioned weights. + * @return Ready-to-use XC integrator. + */ + XCIntegrator get_instance(const functional_type& func, + const LoadBalancer& lb) { + return XCIntegrator(detail::make_integrator_core( + ex_, func, lb, timing_settings_, domain_batch_mode_)); + } + + private: + ExecutionSpace ex_; ///< Selected execution space. + TimingSettings timing_settings_; ///< Rank-local timing behavior. + DomainBatchMode domain_batch_mode_; ///< Complete-domain batching policy. +}; + +} // namespace SkalaXC diff --git a/SkalaXC/include/skalaxc/skalaxc_export.h b/SkalaXC/include/skalaxc/skalaxc_export.h new file mode 100644 index 00000000..e754a3ac --- /dev/null +++ b/SkalaXC/include/skalaxc/skalaxc_export.h @@ -0,0 +1,21 @@ +/** + * @file + * @brief SkalaXC symbol-visibility macro. + * + * SkalaXC is built with -fvisibility=hidden; only symbols annotated with + * SKALAXC_EXPORT are placed in the shared library's dynamic symbol table. This + * is the compile-time half of the ABI-isolation guarantee (the link-time half + * is the version script + --exclude-libs,ALL that hide the statically embedded + * GauXC / LibTorch symbols). + */ +#pragma once + +#if defined(_WIN32) || defined(__CYGWIN__) +#ifdef SKALAXC_BUILDING_LIBRARY +#define SKALAXC_EXPORT __declspec(dllexport) +#else +#define SKALAXC_EXPORT __declspec(dllimport) +#endif +#else +#define SKALAXC_EXPORT __attribute__((visibility("default"))) +#endif diff --git a/SkalaXC/src/skalaxc_api.cxx b/SkalaXC/src/skalaxc_api.cxx new file mode 100644 index 00000000..295c3965 --- /dev/null +++ b/SkalaXC/src/skalaxc_api.cxx @@ -0,0 +1,590 @@ +/** + * SkalaXC public C++ API implementation. + * + * This translation unit is the ONLY place (together with the C wrapper) where + * the public SkalaXC API meets GauXC / LibTorch. The public pipeline mirrors + * GauXC (RuntimeEnvironment -> MolGrid -> LoadBalancer -> MolecularWeights -> + * XCIntegratorFactory -> XCIntegrator) but every stage owns its GauXC state + * behind a PIMPL, and GauXC exceptions are translated to SkalaXC::Exception so + * no GauXC type escapes the boundary. + */ +#include +#include + +#include +#include +#include +#ifdef SKALAXC_HAS_HDF5 +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// GauXC reusable internal (host local work driver: partition_weights). +// Reachable via the in-tree `gauxc` target's PUBLIC BUILD_INTERFACE include of +// ${GauXC}/src. +#include "xc_integrator/local_work_driver/host/local_host_work_driver.hpp" + +#include "host/atomic_domain_load_balancer.hpp" +#include "host/eigen_types.hpp" +#include "host/skala_host_driver.hpp" +#include "skala_driver.hpp" + +#ifdef SKALAXC_HAS_CUDA +#include "device/skala_device_driver.hpp" +#endif + +#include +#include +#include +#include +#include + +#ifdef SKALAXC_HAS_CUDA +#include +#endif + +namespace SkalaXC { + +std::string_view version() noexcept { return SKALAXC_VERSION_STRING; } + +// =========================================================================== +// PIMPL definitions: each pipeline stage owns its GauXC state. +// =========================================================================== +struct RuntimeEnvironment::Impl { + GauXC::RuntimeEnvironment rt; + ExecutionSpace ex = ExecutionSpace::Host; + types::DeviceId device_id{-1}; + double device_memory_fraction = 0.0; + explicit Impl(SKALAXC_MPI_CODE(MPI_Comm comm)) : rt{GAUXC_MPI_CODE(comm)} {} +#ifdef SKALAXC_HAS_CUDA + Impl(SKALAXC_MPI_CODE(MPI_Comm comm, ) DeviceRuntimeSettings settings) + : rt{GauXC::DeviceRuntimeEnvironment(SKALAXC_MPI_CODE(comm, ) + settings.memory_fraction)}, + ex(ExecutionSpace::Device), + device_id(types::DeviceId{settings.device_id}), + device_memory_fraction(settings.memory_fraction) {} +#endif +}; + +struct MolGrid::Impl { + GauXC::MolGrid mg; + explicit Impl(GauXC::MolGrid grid) : mg(std::move(grid)) {} +}; + +struct LoadBalancer::Impl { + GauXC::LoadBalancer lb; + ExecutionSpace ex = ExecutionSpace::Host; + types::DeviceId device_id{-1}; + double device_memory_fraction = 0.0; + /// Pre-partition ("raw") quadrature weights, captured by modify_weights. + std::vector> raw_weights; + Impl(GauXC::LoadBalancer balancer, ExecutionSpace execution_space, + types::DeviceId selected_device, double selected_memory_fraction) + : lb(std::move(balancer)), + ex(execution_space), + device_id(selected_device), + device_memory_fraction(selected_memory_fraction) {} +}; + +struct MolecularWeights::Impl { + ExecutionSpace ex = ExecutionSpace::Host; + std::string kernel; + MolecularWeightsSettings settings; +}; + +namespace detail { + +struct IntegratorCore::Impl { + std::unique_ptr driver; + std::int64_t nbf = 0; + std::int64_t natoms = 0; +}; + +/// Grants this implementation TU access to the opaque pipeline-stage internals. +struct Access { + static RuntimeEnvironment::Impl* impl(RuntimeEnvironment& r) { + return r.pimpl_.get(); + } + static const RuntimeEnvironment::Impl* impl(const RuntimeEnvironment& r) { + return r.pimpl_.get(); + } + static MolGrid::Impl* impl(MolGrid& m) { return m.pimpl_.get(); } + static const MolGrid::Impl* impl(const MolGrid& m) { return m.pimpl_.get(); } + static LoadBalancer::Impl* impl(LoadBalancer& l) { return l.pimpl_.get(); } + static const LoadBalancer::Impl* impl(const LoadBalancer& l) { + return l.pimpl_.get(); + } + static MolecularWeights::Impl* impl(MolecularWeights& w) { + return w.pimpl_.get(); + } + static const MolecularWeights::Impl* impl(const MolecularWeights& w) { + return w.pimpl_.get(); + } + + static MolGrid make_molgrid(std::unique_ptr p) { + return MolGrid(std::move(p)); + } + static LoadBalancer make_load_balancer( + std::unique_ptr p) { + return LoadBalancer(std::move(p)); + } + static MolecularWeights make_molecular_weights( + std::unique_ptr p) { + return MolecularWeights(std::move(p)); + } +}; + +} // namespace detail + +namespace { + +#ifdef SKALAXC_HAS_CUDA +void activate_cuda_device(types::DeviceId device_id) { + int device_count = 0; + auto status = cudaGetDeviceCount(&device_count); + if (status != cudaSuccess) + throw Exception(std::string("Failed to query CUDA devices: ") + + cudaGetErrorString(status)); + if (device_id.raw() < 0 || device_id.raw() >= device_count) + throw Exception("CUDA device_id is outside the available device range"); + status = cudaSetDevice(device_id.raw()); + if (status != cudaSuccess) + throw Exception(std::string("Failed to select CUDA device: ") + + cudaGetErrorString(status)); +} +#endif + +// ---- SkalaXC value type -> GauXC conversions ----------------------------- +GauXC::Molecule to_gauxc(const Molecule& mol) { + GauXC::Molecule out; + out.reserve(mol.size()); + for (const auto& a : mol) + out.push_back(GauXC::Atom{GauXC::AtomicNumber(a.Z.raw()), a.x, a.y, a.z}); + return out; +} + +GauXC::BasisSet to_gauxc(const BasisSet& basis) { + GauXC::BasisSet out; + out.reserve(basis.size()); + for (const auto& s : basis) { + const std::int32_t nprim = s.nprim(); + if (nprim < 1 || nprim > 32) + throw Exception("Shell primitive count must be in [1,32]"); + GauXC::Shell::prim_array alpha; + alpha.fill(0.0); + GauXC::Shell::prim_array coeff; + coeff.fill(0.0); + for (std::int32_t i = 0; i < nprim; ++i) { + alpha[i] = s.alpha_data()[i]; + coeff[i] = s.coeff_data()[i]; + } + GauXC::Shell::cart_array O{s.O_data()[0], s.O_data()[1], + s.O_data()[2]}; + out.push_back(GauXC::Shell( + GauXC::PrimSize(nprim), GauXC::AngularMomentum(s.l()), + GauXC::SphericalType(s.pure()), alpha, coeff, O, s.normalized())); + } + return out; +} + +GauXC::PruningScheme to_gauxc(PruningScheme s) { + switch (s) { + case PruningScheme::Unpruned: + return GauXC::PruningScheme::Unpruned; + case PruningScheme::Robust: + return GauXC::PruningScheme::Robust; + case PruningScheme::Treutler: + return GauXC::PruningScheme::Treutler; + } + throw Exception("Unknown SkalaXC PruningScheme"); +} + +GauXC::RadialQuad to_gauxc(RadialQuad q) { + switch (q) { + case RadialQuad::Becke: + return GauXC::RadialQuad::Becke; + case RadialQuad::MuraKnowles: + return GauXC::RadialQuad::MuraKnowles; + case RadialQuad::MurrayHandyLaming: + return GauXC::RadialQuad::MurrayHandyLaming; + case RadialQuad::TreutlerAhlrichs: + return GauXC::RadialQuad::TreutlerAhlrichs; + } + throw Exception("Unknown SkalaXC RadialQuad"); +} + +GauXC::AtomicGridSizeDefault to_gauxc(AtomicGridSizeDefault g) { + switch (g) { + case AtomicGridSizeDefault::FineGrid: + return GauXC::AtomicGridSizeDefault::FineGrid; + case AtomicGridSizeDefault::UltraFineGrid: + return GauXC::AtomicGridSizeDefault::UltraFineGrid; + case AtomicGridSizeDefault::SuperFineGrid: + return GauXC::AtomicGridSizeDefault::SuperFineGrid; + case AtomicGridSizeDefault::GM3: + return GauXC::AtomicGridSizeDefault::GM3; + case AtomicGridSizeDefault::GM5: + return GauXC::AtomicGridSizeDefault::GM5; + } + throw Exception("Unknown SkalaXC AtomicGridSize"); +} + +GauXC::XCWeightAlg to_gauxc(XCWeightAlg a) { + switch (a) { + case XCWeightAlg::NOTPARTITIONED: + return GauXC::XCWeightAlg::NOTPARTITIONED; + case XCWeightAlg::Becke: + return GauXC::XCWeightAlg::Becke; + case XCWeightAlg::SSF: + return GauXC::XCWeightAlg::SSF; + case XCWeightAlg::LKO: + return GauXC::XCWeightAlg::LKO; + } + throw Exception("Unknown SkalaXC XCWeightAlg"); +} + +} // namespace + +#ifdef SKALAXC_HAS_HDF5 +// =========================================================================== +// HDF5 record readers (mirror GauXC::read_hdf5_record). +// =========================================================================== +void read_hdf5_record(std::vector& mol, std::string fname, + std::string dset) { + try { + GauXC::Molecule gmol; + GauXC::read_hdf5_record(gmol, std::move(fname), std::move(dset)); + mol.clear(); + mol.reserve(gmol.size()); + for (const auto& a : gmol) + mol.push_back(Atom{AtomicNumber(a.Z.get()), a.x, a.y, a.z}); + } catch (const Exception&) { + throw; + } catch (const std::exception& e) { + throw Exception(e.what()); + } +} + +void read_hdf5_record(std::vector>& basis, std::string fname, + std::string dset) { + try { + GauXC::BasisSet gbasis; + GauXC::read_hdf5_record(gbasis, std::move(fname), std::move(dset)); + basis.clear(); + basis.reserve(gbasis.size()); + for (const auto& gs : gbasis) { + Shell::prim_array alpha{}; + Shell::prim_array coeff{}; + const std::int32_t nprim = gs.nprim(); + for (std::int32_t i = 0; i < nprim && i < 32; ++i) { + alpha[i] = gs.alpha_data()[i]; + coeff[i] = gs.coeff_data()[i]; + } + Shell::cart_array O{gs.O_data()[0], gs.O_data()[1], + gs.O_data()[2]}; + // GauXC has already normalized the coefficients on read; wrap them + // verbatim (normalize=false) so the pipeline reuses them unchanged. + basis.push_back(Shell(PrimSize(nprim), AngularMomentum(gs.l()), + SphericalType(gs.pure()), alpha, coeff, O, + /*normalize=*/false)); + } + } catch (const Exception&) { + throw; + } catch (const std::exception& e) { + throw Exception(e.what()); + } +} +#endif // SKALAXC_HAS_HDF5 + +// =========================================================================== +// RuntimeEnvironment +// =========================================================================== +RuntimeEnvironment::RuntimeEnvironment(SKALAXC_MPI_CODE(MPI_Comm comm)) + : pimpl_(std::make_unique(SKALAXC_MPI_CODE(comm))) {} +RuntimeEnvironment::RuntimeEnvironment(SKALAXC_MPI_CODE(MPI_Comm comm, ) + DeviceRuntimeSettings settings) { +#ifdef SKALAXC_HAS_CUDA + if (!(settings.memory_fraction > 0.0 && settings.memory_fraction <= 1.0)) + throw Exception("CUDA memory_fraction must be in (0, 1]"); + activate_cuda_device(types::DeviceId{settings.device_id}); + pimpl_ = std::make_unique(SKALAXC_MPI_CODE(comm, ) settings); +#else + (void)settings; + SKALAXC_MPI_CODE((void)comm;) + throw Exception("SkalaXC was built without CUDA support"); +#endif +} +RuntimeEnvironment::~RuntimeEnvironment() = default; +RuntimeEnvironment::RuntimeEnvironment(RuntimeEnvironment&&) noexcept = default; +RuntimeEnvironment& RuntimeEnvironment::operator=( + RuntimeEnvironment&&) noexcept = default; + +int RuntimeEnvironment::comm_rank() const { return pimpl_->rt.comm_rank(); } +int RuntimeEnvironment::comm_size() const { return pimpl_->rt.comm_size(); } + +// =========================================================================== +// MolGrid / MolGridFactory +// =========================================================================== +MolGrid::MolGrid(std::unique_ptr impl) : pimpl_(std::move(impl)) {} +MolGrid::~MolGrid() = default; +MolGrid::MolGrid(MolGrid&&) noexcept = default; +MolGrid& MolGrid::operator=(MolGrid&&) noexcept = default; + +MolGrid MolGridFactory::create_default_molgrid( + const Molecule& mol, PruningScheme pruning_scheme, BatchSize batch_size, + RadialQuad radial_quad, AtomicGridSizeDefault grid_size) { + try { + GauXC::Molecule gmol = to_gauxc(mol); + GauXC::MolGrid gmg = GauXC::MolGridFactory::create_default_molgrid( + gmol, to_gauxc(pruning_scheme), GauXC::BatchSize(batch_size.raw()), + to_gauxc(radial_quad), to_gauxc(grid_size)); + return detail::Access::make_molgrid( + std::make_unique(std::move(gmg))); + } catch (const Exception&) { + throw; + } catch (const std::exception& e) { + throw Exception(e.what()); + } +} + +// =========================================================================== +// LoadBalancer / LoadBalancerFactory +// =========================================================================== +LoadBalancer::LoadBalancer(std::unique_ptr impl) + : pimpl_(std::move(impl)) {} +LoadBalancer::~LoadBalancer() = default; +LoadBalancer::LoadBalancer(LoadBalancer&&) noexcept = default; +LoadBalancer& LoadBalancer::operator=(LoadBalancer&&) noexcept = default; + +LoadBalancerFactory::LoadBalancerFactory(ExecutionSpace ex, + std::string kernel_name) + : ex_(ex), kernel_name_(std::move(kernel_name)) {} + +LoadBalancer LoadBalancerFactory::get_instance(const RuntimeEnvironment& rt, + const Molecule& mol, + const MolGrid& mg, + const BasisSet& basis) { + try { + const auto* rtimpl = detail::Access::impl(rt); + const auto* mgimpl = detail::Access::impl(mg); + if (ex_ == ExecutionSpace::Device) { +#ifdef SKALAXC_HAS_CUDA + if (rtimpl->ex != ExecutionSpace::Device) + throw Exception("Device load balancing requires a device runtime"); + activate_cuda_device(rtimpl->device_id); +#else + throw Exception("SkalaXC was built without CUDA support"); +#endif + } + GauXC::Molecule gmol = to_gauxc(mol); + GauXC::BasisSet gbasis = to_gauxc(basis); + GauXC::LoadBalancer glb = detail::make_atomic_domain_load_balancer( + rtimpl->rt, gmol, mgimpl->mg, gbasis, kernel_name_); + return detail::Access::make_load_balancer( + std::make_unique(std::move(glb), ex_, + rtimpl->device_id, + rtimpl->device_memory_fraction)); + } catch (const Exception&) { + throw; + } catch (const std::exception& e) { + throw Exception(e.what()); + } +} + +// =========================================================================== +// MolecularWeights / MolecularWeightsFactory +// =========================================================================== +MolecularWeights::MolecularWeights(std::unique_ptr impl) + : pimpl_(std::move(impl)) {} +MolecularWeights::~MolecularWeights() = default; +MolecularWeights::MolecularWeights(MolecularWeights&&) noexcept = default; +MolecularWeights& MolecularWeights::operator=(MolecularWeights&&) noexcept = + default; + +void MolecularWeights::modify_weights(LoadBalancer& lb) const { + try { + auto* lbimpl = detail::Access::impl(lb); + auto& glb = lbimpl->lb; + if (pimpl_->ex != lbimpl->ex) + throw Exception( + "Molecular weights and load balancer execution spaces must match"); + if (glb.state().modified_weights_are_stored) + throw Exception("Attempting to overwrite modified weights"); + + // Replicate GauXC::MolecularWeights::modify_weights (sort tasks -> + // partition) but snapshot the pre-partition ("raw") quadrature weights in + // between. SkalaXC owns those raw weights so GauXC master stays untouched; + // ML models that request the atomic_grid_weights feature consume them. + auto lwd = GauXC::LocalWorkDriverFactory::make_local_work_driver( + GauXC::ExecutionSpace::Host, "Default"); + auto* host_lwd = dynamic_cast(lwd.get()); + if (!host_lwd) throw Exception("Expected a LocalHostWorkDriver"); + + auto& tasks = glb.get_tasks(); + std::stable_sort(tasks.begin(), tasks.end(), + [](const GauXC::XCTask& a, const GauXC::XCTask& b) { + return (a.points.size() * a.bfn_screening.nbe) > + (b.points.size() * b.bfn_screening.nbe); + }); + + lbimpl->raw_weights.resize(tasks.size()); + for (std::size_t i = 0; i < tasks.size(); ++i) + lbimpl->raw_weights[i] = tasks[i].weights; + + const GauXC::XCWeightAlg weight_alg = to_gauxc(pimpl_->settings.weight_alg); + if (pimpl_->ex == ExecutionSpace::Host) { + host_lwd->partition_weights(weight_alg, glb.molecule(), glb.molmeta(), + tasks.begin(), tasks.end()); + glb.state().modified_weights_are_stored = true; + glb.state().weight_alg = weight_alg; + } else { +#ifdef SKALAXC_HAS_CUDA + activate_cuda_device(lbimpl->device_id); + GauXC::MolecularWeightsSettings settings; + settings.weight_alg = weight_alg; + GauXC::MolecularWeightsFactory factory(GauXC::ExecutionSpace::Device, + pimpl_->kernel, settings); + factory.get_shared_instance()->modify_weights(glb); +#else + throw Exception("SkalaXC was built without CUDA support"); +#endif + } + } catch (const Exception&) { + throw; + } catch (const std::exception& e) { + throw Exception(e.what()); + } +} + +MolecularWeightsFactory::MolecularWeightsFactory( + ExecutionSpace ex, std::string kernel_name, + MolecularWeightsSettings settings) + : ex_(ex), kernel_name_(std::move(kernel_name)), settings_(settings) {} + +MolecularWeights MolecularWeightsFactory::get_instance() { +#ifndef SKALAXC_HAS_CUDA + if (ex_ == ExecutionSpace::Device) + throw Exception("SkalaXC was built without CUDA support"); +#endif + auto impl = std::make_unique(); + impl->ex = ex_; + impl->kernel = kernel_name_; + impl->settings = settings_; + return detail::Access::make_molecular_weights(std::move(impl)); +} + +// =========================================================================== +// detail::IntegratorCore + make_integrator_core +// =========================================================================== +namespace detail { + +IntegratorCore::IntegratorCore(std::unique_ptr impl) + : pimpl_(std::move(impl)) {} +IntegratorCore::~IntegratorCore() = default; +IntegratorCore::IntegratorCore(IntegratorCore&&) noexcept = default; +IntegratorCore& IntegratorCore::operator=(IntegratorCore&&) noexcept = default; + +std::int64_t IntegratorCore::nbf() const { return pimpl_->nbf; } +std::int64_t IntegratorCore::natoms() const { return pimpl_->natoms; } + +double IntegratorCore::eval_exc_vxc(const double* Ps, const double* Pz, + double* VXCs, double* VXCz) { + if (!Ps || !Pz || !VXCs || !VXCz) + throw Exception("SkalaXC matrix data must not be null"); + const std::int64_t n = pimpl_->nbf; + try { + const Eigen::Map scalar_density(Ps, n, n); + const Eigen::Map spin_density(Pz, n, n); + Eigen::Map scalar_potential(VXCs, n, n); + Eigen::Map spin_potential(VXCz, n, n); + return pimpl_->driver->eval_exc_vxc_uks(scalar_density, spin_density, + scalar_potential, spin_potential); + } catch (const Exception&) { + throw; + } catch (const std::exception& e) { + throw Exception(e.what()); + } +} + +void IntegratorCore::eval_exc_grad(const double* Ps, const double* Pz, + double* gradient) { + if (!Ps || !Pz || !gradient) + throw Exception("SkalaXC gradient data must not be null"); + const std::int64_t n = pimpl_->nbf; + const std::int64_t na = pimpl_->natoms; + try { + const Eigen::Map scalar_density(Ps, n, n); + const Eigen::Map spin_density(Pz, n, n); + Eigen::Map gradient_matrix(gradient, na, 3); + pimpl_->driver->eval_exc_grad_uks(scalar_density, spin_density, + gradient_matrix); + } catch (const Exception&) { + throw; + } catch (const std::exception& e) { + throw Exception(e.what()); + } +} + +DiagnosticsSnapshot IntegratorCore::diagnostics() const { + return pimpl_->driver->diagnostics(); +} + +void IntegratorCore::reset_diagnostics() { + pimpl_->driver->reset_diagnostics(); +} + +std::unique_ptr make_integrator_core( + ExecutionSpace ex, const functional_type& func, const LoadBalancer& lb, + TimingSettings timing_settings, DomainBatchMode domain_batch_mode) { + try { + if (func.empty()) + throw Exception("SkalaXC functional model must not be empty"); + const auto* lbimpl = Access::impl(lb); + if (ex != lbimpl->ex) + throw Exception( + "XC integrator and load balancer execution spaces must match"); + // GauXC exposes only a non-const state() accessor; reading the + // modified-weights flag is a logically const observation. + if (!const_cast(lbimpl->lb) + .state() + .modified_weights_are_stored) + throw Exception( + "SkalaXC XCIntegratorFactory requires modified weights; call " + "MolecularWeights::modify_weights first"); + auto impl = std::make_unique(); + if (ex == ExecutionSpace::Host) { + impl->driver = std::make_unique( + lbimpl->lb, lbimpl->raw_weights, func.model(), timing_settings, + domain_batch_mode); + } else { +#ifdef SKALAXC_HAS_CUDA + impl->driver = std::make_unique( + lbimpl->lb, lbimpl->raw_weights, func.model(), lbimpl->device_id, + lbimpl->device_memory_fraction, timing_settings, domain_batch_mode); +#else + throw Exception("SkalaXC was built without CUDA support"); +#endif + } + impl->driver->log_model_load_timing(); + impl->nbf = lbimpl->lb.basis().nbf(); + impl->natoms = static_cast(lbimpl->lb.molecule().size()); + return std::make_unique(std::move(impl)); + } catch (const Exception&) { + throw; + } catch (const std::exception& e) { + throw Exception(e.what()); + } +} + +} // namespace detail + +} // namespace SkalaXC From 436b9acdd12e19c11913eaf62bbf92032d84dfca Mon Sep 17 00:00:00 2001 From: jenswehner Date: Fri, 4 Sep 2026 11:36:33 +0200 Subject: [PATCH 07/33] Add C API --- SkalaXC/include/skalaxc/c/basisset.h | 96 +++ SkalaXC/include/skalaxc/c/config.h.in | 17 + SkalaXC/include/skalaxc/c/diagnostics.h | 94 ++ SkalaXC/include/skalaxc/c/enums.h | 80 ++ SkalaXC/include/skalaxc/c/functional.h | 40 + SkalaXC/include/skalaxc/c/grid.h | 46 + SkalaXC/include/skalaxc/c/integrator.h | 165 ++++ SkalaXC/include/skalaxc/c/load_balancer.h | 52 ++ SkalaXC/include/skalaxc/c/molecular_weights.h | 55 ++ SkalaXC/include/skalaxc/c/molecule.h | 86 ++ SkalaXC/include/skalaxc/c/molgrid.h | 44 + SkalaXC/include/skalaxc/c/mpi.h | 28 + SkalaXC/include/skalaxc/c/runtime.h | 112 +++ SkalaXC/include/skalaxc/c/status.h | 38 + SkalaXC/include/skalaxc/c/version.h | 26 + SkalaXC/include/skalaxc/skalaxc.h | 32 + SkalaXC/src/c-api/CMakeLists.txt | 9 + SkalaXC/src/c-api/skalaxc_c_api.cxx | 807 ++++++++++++++++++ 18 files changed, 1827 insertions(+) create mode 100644 SkalaXC/include/skalaxc/c/basisset.h create mode 100644 SkalaXC/include/skalaxc/c/config.h.in create mode 100644 SkalaXC/include/skalaxc/c/diagnostics.h create mode 100644 SkalaXC/include/skalaxc/c/enums.h create mode 100644 SkalaXC/include/skalaxc/c/functional.h create mode 100644 SkalaXC/include/skalaxc/c/grid.h create mode 100644 SkalaXC/include/skalaxc/c/integrator.h create mode 100644 SkalaXC/include/skalaxc/c/load_balancer.h create mode 100644 SkalaXC/include/skalaxc/c/molecular_weights.h create mode 100644 SkalaXC/include/skalaxc/c/molecule.h create mode 100644 SkalaXC/include/skalaxc/c/molgrid.h create mode 100644 SkalaXC/include/skalaxc/c/mpi.h create mode 100644 SkalaXC/include/skalaxc/c/runtime.h create mode 100644 SkalaXC/include/skalaxc/c/status.h create mode 100644 SkalaXC/include/skalaxc/c/version.h create mode 100644 SkalaXC/include/skalaxc/skalaxc.h create mode 100644 SkalaXC/src/c-api/CMakeLists.txt create mode 100644 SkalaXC/src/c-api/skalaxc_c_api.cxx diff --git a/SkalaXC/include/skalaxc/c/basisset.h b/SkalaXC/include/skalaxc/c/basisset.h new file mode 100644 index 00000000..f9b10196 --- /dev/null +++ b/SkalaXC/include/skalaxc/c/basisset.h @@ -0,0 +1,96 @@ +/** + * @file + * @brief SkalaXC C API: basis-set handle. + * + * Mirrors SkalaXC::BasisSet. Part of the public C API; include + * to get the whole API. + */ +#pragma once + +#include + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Opaque basis-set handle (mirrors SkalaXC::BasisSet). + */ +typedef struct skalaxc_basisset* skalaxc_basisset_t; + +/** + * @brief Create an empty basis set. + * @param out Output owning handle on success (free with + * skalaxc_basisset_destroy). + * @return SKALAXC_SUCCESS on success, or an error status. + */ +skalaxc_status_t skalaxc_basisset_create(skalaxc_basisset_t* out) + SKALAXC_EXPORT; + +/** + * @brief Append a contracted Gaussian shell to a basis set. + * @param basis Basis-set handle. + * @param l Angular momentum. + * @param pure 1 = pure spherical, 0 = cartesian. + * @param center_xyz [3] Shell center (bohr). + * @param nprim Primitive count (1..32). + * @param exponents [nprim] Primitive exponents. + * @param coefficients [nprim] Contraction coefficients. + * @param normalize 1 to normalize the shell inside the library, 0 to take the + * coefficients as-is. + * @return SKALAXC_SUCCESS on success, or an error status. + */ +skalaxc_status_t skalaxc_basisset_add_shell( + skalaxc_basisset_t basis, int32_t l, int32_t pure, const double* center_xyz, + int32_t nprim, const double* exponents, const double* coefficients, + int32_t normalize) SKALAXC_EXPORT; + +/** + * @brief Create a basis set from native arrays. + * @param nshells Number of basis shells. + * @param shell_l [nshells] Angular momentum per shell. + * @param shell_pure [nshells] 1 = pure spherical, 0 = cartesian. + * @param shell_xyz [3*nshells] Shell centers (bohr), shell-major. + * @param shell_nprim [nshells] Primitive count per shell. + * @param prim_exp [sum(shell_nprim)] Primitive exponents, concatenated. + * @param prim_coeff [sum(shell_nprim)] Contraction coefficients, concatenated. + * @param out Output owning handle on success. + * @return SKALAXC_SUCCESS on success, or an error status. + */ +skalaxc_status_t skalaxc_basisset_from_arrays( + int64_t nshells, const int32_t* shell_l, const int32_t* shell_pure, + const double* shell_xyz, const int32_t* shell_nprim, const double* prim_exp, + const double* prim_coeff, skalaxc_basisset_t* out) SKALAXC_EXPORT; + +#ifdef SKALAXC_HAS_HDF5 +/** + * @brief Create a basis set from an HDF5 record. + * @param path Path to the HDF5 file. + * @param dset Dataset/record name (e.g. "/BASIS"). + * @param out Output owning handle on success. + * @return SKALAXC_SUCCESS on success, or an error status. + */ +skalaxc_status_t skalaxc_basisset_from_hdf5( + const char* path, const char* dset, skalaxc_basisset_t* out) SKALAXC_EXPORT; +#endif + +/** + * @brief Return the number of basis functions, or -1 if basis is null. + * @param basis Basis-set handle. + * @return Number of basis functions. + */ +int64_t skalaxc_basisset_nbf(skalaxc_basisset_t basis) SKALAXC_EXPORT; + +/** + * @brief Destroy a basis-set handle (NULL is tolerated). + * @param basis Basis-set handle to destroy. + */ +void skalaxc_basisset_destroy(skalaxc_basisset_t basis) SKALAXC_EXPORT; + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/SkalaXC/include/skalaxc/c/config.h.in b/SkalaXC/include/skalaxc/c/config.h.in new file mode 100644 index 00000000..5de9e0d2 --- /dev/null +++ b/SkalaXC/include/skalaxc/c/config.h.in @@ -0,0 +1,17 @@ +/** + * @file + * @brief SkalaXC public build-configuration flags. + * + * These mirror the SKALAXC_ENABLE_* CMake options and are safe to include from + * both C and C++ public headers. They let a consumer conditionally compile + * against optional features -- most importantly SKALAXC_HAS_MPI, which gates the + * MPI_Comm-taking calculator constructors. + */ +#pragma once + +#cmakedefine SKALAXC_HAS_SKALA +#cmakedefine SKALAXC_HAS_CUDA +#cmakedefine SKALAXC_HAS_MPI +#cmakedefine SKALAXC_HAS_OPENMP +#cmakedefine SKALAXC_HAS_HDF5 + diff --git a/SkalaXC/include/skalaxc/c/diagnostics.h b/SkalaXC/include/skalaxc/c/diagnostics.h new file mode 100644 index 00000000..fa43a972 --- /dev/null +++ b/SkalaXC/include/skalaxc/c/diagnostics.h @@ -0,0 +1,94 @@ +/** + * @file + * @brief SkalaXC C API: lightweight rank-local diagnostics. + */ +#pragma once + +#include + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** @brief Number of entries in a diagnostics timing array. */ +#define SKALAXC_TIMING_METRIC_COUNT 11 + +/** @brief Stable identifiers for XC-integrator timing phases. */ +enum SkalaXC_TimingMetric { + SkalaXC_TimingMetric_ModelLoad, ///< TorchScript model loading + SkalaXC_TimingMetric_FeatureConstruction, ///< ML feature construction + SkalaXC_TimingMetric_ModelBatchPacking, ///< Complete-domain batch packing + SkalaXC_TimingMetric_ModelForward, ///< ML model forward evaluation + SkalaXC_TimingMetric_ModelBackward, ///< ML model backward evaluation + SkalaXC_TimingMetric_PotentialMapping, ///< Potential mapping to grid data + SkalaXC_TimingMetric_AOAssembly, ///< AO matrix assembly + SkalaXC_TimingMetric_GradientAssembly, ///< Nuclear-gradient assembly + SkalaXC_TimingMetric_MPIReduction, ///< MPI result reduction + SkalaXC_TimingMetric_TotalEXCVXC, ///< Complete EXC/VXC evaluation + SkalaXC_TimingMetric_TotalEXCGradient ///< Complete gradient evaluation +}; + +/** @brief Availability of a timing value in a diagnostics snapshot. */ +enum SkalaXC_TimingStatus { + SkalaXC_TimingStatus_Unavailable, ///< Timing is unavailable for this backend + SkalaXC_TimingStatus_Pending, ///< Asynchronous timing is not yet complete + SkalaXC_TimingStatus_Complete ///< Timing contains a complete value +}; + +/** @brief Rank-local timing and debug-logging configuration. */ +typedef struct skalaxc_timing_settings { + int32_t verbose; /**< Nonzero requests complete CUDA timings on read. */ + int32_t debug_logging; /**< Nonzero emits rank-local diagnostics to stderr. */ +} skalaxc_timing_settings_t; + +/** @brief Last and cumulative values for one timing phase. */ +typedef struct skalaxc_timing_value { + int64_t last_nanoseconds; ///< Most recent completed duration + int64_t total_nanoseconds; ///< Sum of all completed durations + int64_t call_count; ///< Number of recorded phase invocations + int32_t status; ///< One of enum SkalaXC_TimingStatus +} skalaxc_timing_value_t; + +/** @brief Rank-local, non-collective snapshot of integrator diagnostics. */ +typedef struct skalaxc_diagnostics_snapshot { + int32_t backend; /**< Host or device execution space. */ + int32_t rank; /**< Rank in the runtime communicator. */ + int32_t communicator_size; /**< Size of the runtime communicator. */ + int32_t device_id; /**< CUDA ordinal, or -1 for host execution. */ + int32_t openmp_threads; /**< Maximum OpenMP threads at construction. */ + double device_memory_fraction; /**< GauXC CUDA arena fraction, or zero. */ + int32_t domain_batch_mode; /**< Configured SkalaXC_DomainBatchMode. */ + skalaxc_timing_value_t timings[SKALAXC_TIMING_METRIC_COUNT]; + /**< Timing values indexed by enum SkalaXC_TimingMetric. */ + int64_t exc_vxc_calls; ///< Number of EXC/VXC evaluations + int64_t exc_gradient_calls; ///< Number of gradient evaluations + int64_t model_batches; ///< Model batches evaluated since reset + int64_t domains; ///< Atomic domains evaluated since reset + int64_t tasks; ///< Local quadrature tasks processed + int64_t points; ///< Local quadrature points processed + int64_t local_atoms; ///< Atomic domains owned by this rank + int64_t configured_model_batches; /**< Model batches planned at construction. + */ + int64_t task_points_min; ///< Minimum points in a processed task + int64_t task_points_max; ///< Maximum points in a processed task + int64_t task_basis_min; ///< Minimum basis functions in a task + int64_t task_basis_max; ///< Maximum basis functions in a task + int64_t model_batch_points_min; ///< Minimum points in a model batch + int64_t model_batch_points_max; ///< Maximum points in a model batch + int64_t max_domains_per_model_batch; /**< Maximum domains per model batch. */ +} skalaxc_diagnostics_snapshot_t; + +/** + * @brief Initialize timing settings with synchronization and logging disabled. + * @param settings Output settings; NULL is tolerated. + */ +void skalaxc_timing_settings_default(skalaxc_timing_settings_t* settings) + SKALAXC_EXPORT; + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/SkalaXC/include/skalaxc/c/enums.h b/SkalaXC/include/skalaxc/c/enums.h new file mode 100644 index 00000000..17b2574d --- /dev/null +++ b/SkalaXC/include/skalaxc/c/enums.h @@ -0,0 +1,80 @@ +/** + * @file + * @brief SkalaXC C API: pipeline enumerations. + * + * These mirror the SkalaXC:: C++ enums (which in turn mirror GauXC). The + * integer values are pinned to match the C++ enums, so they may be cast across + * the boundary. + * + * Part of the public C API; include to get the whole API. + */ +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Radial quadrature scheme (mirrors SkalaXC::RadialQuad). + */ +enum SkalaXC_RadialQuad { + SkalaXC_RadialQuad_Becke, ///< Becke radial quadrature + SkalaXC_RadialQuad_MuraKnowles, ///< Mura-Knowles radial quadrature (default) + SkalaXC_RadialQuad_MurrayHandyLaming, ///< Murray-Handy-Laming radial + ///< quadrature + SkalaXC_RadialQuad_TreutlerAhlrichs ///< Treutler-Ahlrichs radial quadrature +}; + +/** + * @brief Atomic grid size preset, in ascending accuracy (mirrors + * SkalaXC::AtomicGridSizeDefault). + */ +enum SkalaXC_AtomicGridSizeDefault { + SkalaXC_AtomicGridSizeDefault_FineGrid, ///< Fine grid (least accurate) + SkalaXC_AtomicGridSizeDefault_UltraFineGrid, ///< Ultrafine grid (default) + SkalaXC_AtomicGridSizeDefault_SuperFineGrid, ///< Superfine grid (most + ///< accurate) + SkalaXC_AtomicGridSizeDefault_GM3, ///< Treutler-Ahlrichs GM3 + SkalaXC_AtomicGridSizeDefault_GM5 ///< Treutler-Ahlrichs GM5 +}; + +/** + * @brief Atomic quadrature pruning scheme (mirrors SkalaXC::PruningScheme). + */ +enum SkalaXC_PruningScheme { + SkalaXC_PruningScheme_Unpruned, ///< Unpruned atomic quadrature (default) + SkalaXC_PruningScheme_Robust, ///< The "Robust" scheme of Psi4 + SkalaXC_PruningScheme_Treutler ///< The Treutler-Ahlrichs scheme +}; + +/** + * @brief Execution space selector (mirrors SkalaXC::ExecutionSpace). + * + * Device execution is available when SkalaXC is built with CUDA. + */ +enum SkalaXC_ExecutionSpace { + SkalaXC_ExecutionSpace_Host, ///< Host (CPU) evaluation + SkalaXC_ExecutionSpace_Device ///< CUDA device evaluation +}; + +/** + * @brief Complete atomic-domain model batching policy. + */ +enum SkalaXC_DomainBatchMode { + SkalaXC_DomainBatchMode_Conservative, ///< One domain per model call + SkalaXC_DomainBatchMode_Aggressive ///< All exact-size local domains +}; + +/** + * @brief XC weight partitioning scheme (mirrors SkalaXC::XCWeightAlg). + */ +enum SkalaXC_XCWeightAlg { + SkalaXC_XCWeightAlg_NOTPARTITIONED, ///< Weights are not partitioned + SkalaXC_XCWeightAlg_Becke, ///< Becke partitioning + SkalaXC_XCWeightAlg_SSF, ///< Stratmann-Scuseria-Frisch (default) + SkalaXC_XCWeightAlg_LKO ///< Laqua-Kussmann-Ochsenfeld +}; + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/SkalaXC/include/skalaxc/c/functional.h b/SkalaXC/include/skalaxc/c/functional.h new file mode 100644 index 00000000..71b804e7 --- /dev/null +++ b/SkalaXC/include/skalaxc/c/functional.h @@ -0,0 +1,40 @@ +/** + * @file + * @brief SkalaXC C API: functional (model selector) handle. + * + * Mirrors SkalaXC::functional_type. Part of the public C API; include + * to get the whole API. + */ +#pragma once + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Opaque functional handle (mirrors SkalaXC::functional_type). + */ +typedef struct skalaxc_functional* skalaxc_functional_t; + +/** + * @brief Create a functional from a Skala model selector. + * @param model Model identifier ("LDA"/"PBE"/"TPSS") or a path to a .fun model. + * @param out Output owning handle on success (free with + * skalaxc_functional_destroy). + * @return SKALAXC_SUCCESS on success, or an error status. + */ +skalaxc_status_t skalaxc_functional_create( + const char* model, skalaxc_functional_t* out) SKALAXC_EXPORT; + +/** + * @brief Destroy a functional handle (NULL is tolerated). + * @param func Functional handle to destroy. + */ +void skalaxc_functional_destroy(skalaxc_functional_t func) SKALAXC_EXPORT; + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/SkalaXC/include/skalaxc/c/grid.h b/SkalaXC/include/skalaxc/c/grid.h new file mode 100644 index 00000000..00fad90c --- /dev/null +++ b/SkalaXC/include/skalaxc/c/grid.h @@ -0,0 +1,46 @@ +/** + * @file + * @brief SkalaXC C API: molecular integration-grid settings. + * + * Part of the public C API; include to get the whole API. + */ +#pragma once + +#include + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Molecular integration-grid parameters. + * + * The equivalents of every argument to the default molecular-grid factory + * (SkalaXC::MolGridFactory::create_default_molgrid). Initialize with + * skalaxc_grid_settings_default() (do NOT zero-initialize: the defaults are not + * all zero), then override individual fields. Passing NULL to + * skalaxc_molgrid_create_default selects the built-in preset. + */ +typedef struct { + enum SkalaXC_PruningScheme pruning; ///< Pruning scheme + int64_t batch_size; ///< Grid-point batch size (> 0) + enum SkalaXC_RadialQuad radial_quad; ///< Radial quadrature + enum SkalaXC_AtomicGridSizeDefault atomic_grid; ///< Atomic grid size preset +} skalaxc_grid_settings_t; + +/** + * @brief Initialize settings with the SkalaXC built-in preset. + * + * The preset is: unpruned, batch size 512, Mura-Knowles radial quadrature, + * ultrafine atomic grid. No-op if settings is NULL. + * @param settings Output grid settings to populate. + */ +void skalaxc_grid_settings_default(skalaxc_grid_settings_t* settings) + SKALAXC_EXPORT; + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/SkalaXC/include/skalaxc/c/integrator.h b/SkalaXC/include/skalaxc/c/integrator.h new file mode 100644 index 00000000..c01552db --- /dev/null +++ b/SkalaXC/include/skalaxc/c/integrator.h @@ -0,0 +1,165 @@ +/** + * @file + * @brief SkalaXC C API: XC integrator handle. + * + * Mirrors SkalaXC::XCIntegrator / SkalaXC::XCIntegratorFactory (UKS subset). + * Part of the public C API; include to get the whole API. + */ +#pragma once + +#include + +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Opaque XC-integrator handle (mirrors SkalaXC::XCIntegrator). + * + * One handle must not be used concurrently from multiple threads. Serialize + * access to a shared handle or use a separate handle per calling thread. + */ +typedef struct skalaxc_xc_integrator* skalaxc_xc_integrator_t; + +/** @brief XC-integrator construction settings. */ +typedef struct skalaxc_integrator_settings { + skalaxc_timing_settings_t timing; /**< Rank-local timing behavior. */ + enum SkalaXC_DomainBatchMode domain_batch_mode; /**< Complete-domain model + batching policy. */ +} skalaxc_integrator_settings_t; + +/** + * @brief Fill XC-integrator settings with conservative defaults. + * @param settings Output settings; NULL is tolerated. + */ +void skalaxc_integrator_settings_default( + skalaxc_integrator_settings_t* settings) SKALAXC_EXPORT; + +/** + * @brief Create an XC integrator (mirrors + * SkalaXC::XCIntegratorFactory::get_instance). + * + * The load balancer must carry partitioned weights (see + * skalaxc_molecular_weights_modify_weights) before this call. + * @param ex Execution space; device requires a CUDA-enabled build and runtime. + * @param func Functional handle selecting the Skala model. + * @param lb Load-balancer handle with partitioned weights. + * @param out Output owning handle on success (free with + * skalaxc_xc_integrator_destroy). + * @return SKALAXC_SUCCESS on success, or an error status. + */ +skalaxc_status_t skalaxc_xc_integrator_create( + enum SkalaXC_ExecutionSpace ex, skalaxc_functional_t func, + skalaxc_load_balancer_t lb, skalaxc_xc_integrator_t* out) SKALAXC_EXPORT; + +/** + * @brief Create an XC integrator with explicit timing behavior. + * + * This is the settings-bearing counterpart to skalaxc_xc_integrator_create. + * Passing NULL for @p settings uses non-synchronizing timing defaults. + * @param ex Execution space; device requires a CUDA-enabled build and runtime. + * @param func Functional handle selecting the Skala model. + * @param lb Load-balancer handle with partitioned weights. + * @param settings Timing settings, or NULL for defaults. + * @param out Output owning handle on success. + * @return SKALAXC_SUCCESS on success, or an error status. + */ +skalaxc_status_t skalaxc_xc_integrator_create_with_timing( + enum SkalaXC_ExecutionSpace ex, skalaxc_functional_t func, + skalaxc_load_balancer_t lb, const skalaxc_timing_settings_t* settings, + skalaxc_xc_integrator_t* out) SKALAXC_EXPORT; + +/** + * @brief Create an XC integrator with timing and domain batching settings. + * @param ex Execution space for complete-domain model batching. + * @param func Functional handle selecting the Skala model. + * @param lb Load-balancer handle with partitioned weights. + * @param settings Integrator settings, or NULL for conservative defaults. + * @param out Output owning handle on success. + * @return SKALAXC_SUCCESS on success, or an error status. + */ +skalaxc_status_t skalaxc_xc_integrator_create_with_settings( + enum SkalaXC_ExecutionSpace ex, skalaxc_functional_t func, + skalaxc_load_balancer_t lb, const skalaxc_integrator_settings_t* settings, + skalaxc_xc_integrator_t* out) SKALAXC_EXPORT; + +/** + * @brief Return the number of basis functions, or -1 if xc is null. + * @param xc XC-integrator handle. + * @return Number of basis functions. + */ +int64_t skalaxc_xc_integrator_nbf(skalaxc_xc_integrator_t xc) SKALAXC_EXPORT; + +/** + * @brief Return the number of atoms, or -1 if xc is null. + * @param xc XC-integrator handle. + * @return Number of atoms. + */ +int64_t skalaxc_xc_integrator_natoms(skalaxc_xc_integrator_t xc) SKALAXC_EXPORT; + +/** + * @brief Evaluate the UKS ML exchange-correlation energy and potential. + * + * Ps/Pz are the input scalar/z spin-density matrices; VXCs/VXCz receive the + * corresponding potentials. All are nbf x nbf, column-major, leading dim nbf. + * @param xc XC-integrator handle. + * @param Ps Scalar spin-density matrix. + * @param Pz Z spin-density matrix. + * @param VXCs Output scalar XC potential. + * @param VXCz Output z XC potential. + * @param exc_out Output exchange-correlation energy. + * @return SKALAXC_SUCCESS on success, or an error status. + */ +skalaxc_status_t skalaxc_xc_integrator_eval_exc_vxc_uks( + skalaxc_xc_integrator_t xc, const double* Ps, const double* Pz, + double* VXCs, double* VXCz, double* exc_out) SKALAXC_EXPORT; + +/** + * @brief Evaluate the UKS ML exchange-correlation energy gradient. + * + * Ps/Pz are nbf x nbf column-major density matrices. The caller must provide + * space for 3 * natoms doubles in gradient_out, ordered xyz per atom. + * @param xc XC-integrator handle. + * @param Ps Scalar spin-density matrix. + * @param Pz Z spin-density matrix. + * @param gradient_out Output atom-major Cartesian gradient. + * @return SKALAXC_SUCCESS on success, or an error status. + */ +skalaxc_status_t skalaxc_xc_integrator_eval_exc_grad_uks( + skalaxc_xc_integrator_t xc, const double* Ps, const double* Pz, + double* gradient_out) SKALAXC_EXPORT; + +/** + * @brief Retrieve a rank-local diagnostics snapshot without MPI collectives. + * @param xc XC-integrator handle. + * @param out Output diagnostics snapshot. + * @return SKALAXC_SUCCESS on success, or an error status. + */ +skalaxc_status_t skalaxc_xc_integrator_get_diagnostics( + skalaxc_xc_integrator_t xc, + skalaxc_diagnostics_snapshot_t* out) SKALAXC_EXPORT; + +/** + * @brief Clear evaluation timings and counters on this integrator. + * @param xc XC-integrator handle. + * @return SKALAXC_SUCCESS on success, or an error status. + */ +skalaxc_status_t skalaxc_xc_integrator_reset_diagnostics( + skalaxc_xc_integrator_t xc) SKALAXC_EXPORT; + +/** + * @brief Destroy an XC-integrator handle (NULL is tolerated). + * @param xc XC-integrator handle to destroy. + */ +void skalaxc_xc_integrator_destroy(skalaxc_xc_integrator_t xc) SKALAXC_EXPORT; + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/SkalaXC/include/skalaxc/c/load_balancer.h b/SkalaXC/include/skalaxc/c/load_balancer.h new file mode 100644 index 00000000..0cfe222c --- /dev/null +++ b/SkalaXC/include/skalaxc/c/load_balancer.h @@ -0,0 +1,52 @@ +/** + * @file + * @brief SkalaXC C API: load-balancer handle. + * + * Mirrors SkalaXC::LoadBalancer / SkalaXC::LoadBalancerFactory. Part of the + * public C API; include to get the whole API. + */ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Opaque load-balancer handle (mirrors SkalaXC::LoadBalancer). + */ +typedef struct skalaxc_load_balancer* skalaxc_load_balancer_t; + +/** + * @brief Create a load balancer for the given system (mirrors + * SkalaXC::LoadBalancerFactory::get_instance). + * @param ex Execution space; device requires a CUDA-enabled build and runtime. + * @param rt Runtime environment handle. + * @param mol Molecule handle. + * @param mg Molecular-grid handle. + * @param basis Basis-set handle. + * @param out Output owning handle on success (free with + * skalaxc_load_balancer_destroy). + * @return SKALAXC_SUCCESS on success, or an error status. + */ +skalaxc_status_t skalaxc_load_balancer_create( + enum SkalaXC_ExecutionSpace ex, skalaxc_runtime_environment_t rt, + skalaxc_molecule_t mol, skalaxc_molgrid_t mg, skalaxc_basisset_t basis, + skalaxc_load_balancer_t* out) SKALAXC_EXPORT; + +/** + * @brief Destroy a load-balancer handle (NULL is tolerated). + * @param lb Load-balancer handle to destroy. + */ +void skalaxc_load_balancer_destroy(skalaxc_load_balancer_t lb) SKALAXC_EXPORT; + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/SkalaXC/include/skalaxc/c/molecular_weights.h b/SkalaXC/include/skalaxc/c/molecular_weights.h new file mode 100644 index 00000000..4d744b39 --- /dev/null +++ b/SkalaXC/include/skalaxc/c/molecular_weights.h @@ -0,0 +1,55 @@ +/** + * @file + * @brief SkalaXC C API: molecular-weights handle. + * + * Mirrors SkalaXC::MolecularWeights / SkalaXC::MolecularWeightsFactory. Part of + * the public C API; include to get the whole API. + */ +#pragma once + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Opaque molecular-weights handle (mirrors SkalaXC::MolecularWeights). + */ +typedef struct skalaxc_molecular_weights* skalaxc_molecular_weights_t; + +/** + * @brief Create a molecular-weights partitioner (mirrors + * SkalaXC::MolecularWeightsFactory::get_instance). + * @param ex Execution space; device requires a CUDA-enabled build and runtime. + * @param weight_alg Weight partitioning scheme. + * @param out Output owning handle on success (free with + * skalaxc_molecular_weights_destroy). + * @return SKALAXC_SUCCESS on success, or an error status. + */ +skalaxc_status_t skalaxc_molecular_weights_create( + enum SkalaXC_ExecutionSpace ex, enum SkalaXC_XCWeightAlg weight_alg, + skalaxc_molecular_weights_t* out) SKALAXC_EXPORT; + +/** + * @brief Partition the quadrature weights stored on a load balancer in place. + * @param mw Molecular-weights handle. + * @param lb Load-balancer handle whose weights are modified. + * @return SKALAXC_SUCCESS on success, or an error status. + */ +skalaxc_status_t skalaxc_molecular_weights_modify_weights( + skalaxc_molecular_weights_t mw, skalaxc_load_balancer_t lb) SKALAXC_EXPORT; + +/** + * @brief Destroy a molecular-weights handle (NULL is tolerated). + * @param mw Molecular-weights handle to destroy. + */ +void skalaxc_molecular_weights_destroy(skalaxc_molecular_weights_t mw) + SKALAXC_EXPORT; + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/SkalaXC/include/skalaxc/c/molecule.h b/SkalaXC/include/skalaxc/c/molecule.h new file mode 100644 index 00000000..22254c00 --- /dev/null +++ b/SkalaXC/include/skalaxc/c/molecule.h @@ -0,0 +1,86 @@ +/** + * @file + * @brief SkalaXC C API: molecule handle. + * + * Mirrors SkalaXC::Molecule. Part of the public C API; include + * to get the whole API. + */ +#pragma once + +#include + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Opaque molecule handle (mirrors SkalaXC::Molecule). + */ +typedef struct skalaxc_molecule* skalaxc_molecule_t; + +/** + * @brief Create an empty molecule. + * @param out Output owning handle on success (free with + * skalaxc_molecule_destroy). + * @return SKALAXC_SUCCESS on success, or an error status. + */ +skalaxc_status_t skalaxc_molecule_create(skalaxc_molecule_t* out) + SKALAXC_EXPORT; + +/** + * @brief Append an atom to a molecule. + * @param mol Molecule handle. + * @param atomic_number Atomic number of the nucleus. + * @param x Nuclear x-coordinate (bohr). + * @param y Nuclear y-coordinate (bohr). + * @param z Nuclear z-coordinate (bohr). + * @return SKALAXC_SUCCESS on success, or an error status. + */ +skalaxc_status_t skalaxc_molecule_add_atom(skalaxc_molecule_t mol, + int64_t atomic_number, double x, + double y, double z) SKALAXC_EXPORT; + +/** + * @brief Create a molecule from native arrays. + * @param natoms Number of atoms. + * @param Z [natoms] Atomic numbers. + * @param atom_xyz [3*natoms] Nuclear coordinates (bohr), atom-major. + * @param out Output owning handle on success. + * @return SKALAXC_SUCCESS on success, or an error status. + */ +skalaxc_status_t skalaxc_molecule_from_arrays( + int64_t natoms, const int64_t* Z, const double* atom_xyz, + skalaxc_molecule_t* out) SKALAXC_EXPORT; + +#ifdef SKALAXC_HAS_HDF5 +/** + * @brief Create a molecule from an HDF5 record. + * @param path Path to the HDF5 file. + * @param dset Dataset/record name (e.g. "/MOLECULE"). + * @param out Output owning handle on success. + * @return SKALAXC_SUCCESS on success, or an error status. + */ +skalaxc_status_t skalaxc_molecule_from_hdf5( + const char* path, const char* dset, skalaxc_molecule_t* out) SKALAXC_EXPORT; +#endif + +/** + * @brief Return the number of atoms, or -1 if mol is null. + * @param mol Molecule handle. + * @return Number of atoms. + */ +int64_t skalaxc_molecule_natoms(skalaxc_molecule_t mol) SKALAXC_EXPORT; + +/** + * @brief Destroy a molecule handle (NULL is tolerated). + * @param mol Molecule handle to destroy. + */ +void skalaxc_molecule_destroy(skalaxc_molecule_t mol) SKALAXC_EXPORT; + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/SkalaXC/include/skalaxc/c/molgrid.h b/SkalaXC/include/skalaxc/c/molgrid.h new file mode 100644 index 00000000..85af0555 --- /dev/null +++ b/SkalaXC/include/skalaxc/c/molgrid.h @@ -0,0 +1,44 @@ +/** + * @file + * @brief SkalaXC C API: molecular integration-grid handle. + * + * Mirrors SkalaXC::MolGrid / SkalaXC::MolGridFactory. Part of the public C API; + * include to get the whole API. + */ +#pragma once + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Opaque molecular-grid handle (mirrors SkalaXC::MolGrid). + */ +typedef struct skalaxc_molgrid* skalaxc_molgrid_t; + +/** + * @brief Create a default molecular grid for a molecule. + * @param mol Molecule handle. + * @param grid Grid settings, or NULL for the built-in preset. + * @param out Output owning handle on success (free with + * skalaxc_molgrid_destroy). + * @return SKALAXC_SUCCESS on success, or an error status. + */ +skalaxc_status_t skalaxc_molgrid_create_default( + skalaxc_molecule_t mol, const skalaxc_grid_settings_t* grid, + skalaxc_molgrid_t* out) SKALAXC_EXPORT; + +/** + * @brief Destroy a molecular-grid handle (NULL is tolerated). + * @param mg Molecular-grid handle to destroy. + */ +void skalaxc_molgrid_destroy(skalaxc_molgrid_t mg) SKALAXC_EXPORT; + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/SkalaXC/include/skalaxc/c/mpi.h b/SkalaXC/include/skalaxc/c/mpi.h new file mode 100644 index 00000000..c42bd4e3 --- /dev/null +++ b/SkalaXC/include/skalaxc/c/mpi.h @@ -0,0 +1,28 @@ +/** + * @file + * @brief SkalaXC public MPI interop helper macros. + * + * Mirrors GauXC's : SKALAXC_MPI_CODE(...) expands to its + * arguments when SkalaXC was built with MPI support and to nothing otherwise. + * This lets the public calculator constructors take a native MPI_Comm only in + * MPI builds, leaving the serial ABI byte-for-byte unchanged. + * + * MPI_Comm is a standard MPI C type -- not a GauXC or LibTorch type -- so it is + * the sole third-party type permitted across the SkalaXC public boundary, and + * only when SkalaXC (and hence the host) is built with MPI. + */ +#pragma once + +#include + +#ifdef SKALAXC_HAS_MPI +/** @brief Retain optional public-API tokens in MPI-enabled builds. */ +#define SKALAXC_MPI_CODE(...) __VA_ARGS__ +#else +/** @brief Remove optional public-API tokens in serial builds. */ +#define SKALAXC_MPI_CODE(...) +#endif + +#ifdef SKALAXC_HAS_MPI +#include +#endif diff --git a/SkalaXC/include/skalaxc/c/runtime.h b/SkalaXC/include/skalaxc/c/runtime.h new file mode 100644 index 00000000..1fca9714 --- /dev/null +++ b/SkalaXC/include/skalaxc/c/runtime.h @@ -0,0 +1,112 @@ +/** + * @file + * @brief SkalaXC C API: runtime environment handle. + * + * Mirrors SkalaXC::RuntimeEnvironment. Part of the public C API; include + * to get the whole API. + */ +#pragma once + +#include + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Opaque runtime-environment handle (mirrors + * SkalaXC::RuntimeEnvironment). + */ +typedef struct skalaxc_runtime_environment* skalaxc_runtime_environment_t; + +/** @brief CUDA device selection and GauXC memory-pool settings. */ +typedef struct { + int32_t device_id; ///< CUDA device ordinal + double memory_fraction; ///< Fraction of available memory in (0, 1] +} skalaxc_device_runtime_settings_t; + +/** + * @brief Populate device settings with device 0 and memory fraction 0.75. + * @param settings Output settings; NULL is tolerated. + */ +void skalaxc_device_runtime_settings_default( + skalaxc_device_runtime_settings_t* settings) SKALAXC_EXPORT; + +/** + * @brief Create a runtime environment. + * @param comm MPI communicator (MPI builds only) defining the cooperating + * ranks. + * @param out Output owning handle on success (free with + * skalaxc_runtime_environment_destroy). + * @return SKALAXC_SUCCESS on success, or an error status. + */ +skalaxc_status_t skalaxc_runtime_environment_create(SKALAXC_MPI_CODE( + MPI_Comm comm, ) skalaxc_runtime_environment_t* out) SKALAXC_EXPORT; + +/** + * @brief Create a CUDA runtime environment. + * @param comm MPI communicator (MPI builds only). + * @param settings Device settings, or NULL for the built-in defaults. + * @param out Output owning handle on success. + * @return SKALAXC_SUCCESS on success, or an error status. + */ +skalaxc_status_t skalaxc_device_runtime_environment_create( + SKALAXC_MPI_CODE(MPI_Comm comm, ) + const skalaxc_device_runtime_settings_t* settings, + skalaxc_runtime_environment_t* out) SKALAXC_EXPORT; + +#ifdef SKALAXC_HAS_MPI +/** + * @brief Create a runtime environment from a Fortran MPI handle (MPI builds + * only). + * @param comm Fortran MPI communicator handle. + * @param out Output owning handle on success. + * @return SKALAXC_SUCCESS on success, or an error status. + */ +skalaxc_status_t skalaxc_runtime_environment_create_f( + MPI_Fint comm, skalaxc_runtime_environment_t* out) SKALAXC_EXPORT; + +/** + * @brief Create a CUDA runtime from a Fortran MPI handle. + * @param comm Fortran MPI communicator handle. + * @param settings Device settings, or NULL for the built-in defaults. + * @param out Output owning handle on success. + * @return SKALAXC_SUCCESS on success, or an error status. + */ +skalaxc_status_t skalaxc_device_runtime_environment_create_f( + MPI_Fint comm, const skalaxc_device_runtime_settings_t* settings, + skalaxc_runtime_environment_t* out) SKALAXC_EXPORT; +#endif + +/** + * @brief Return the calling rank within the environment (0 in serial builds), + * or -1 if rt is null. + * @param rt Runtime environment handle. + * @return MPI rank of the caller. + */ +int skalaxc_runtime_environment_comm_rank(skalaxc_runtime_environment_t rt) + SKALAXC_EXPORT; + +/** + * @brief Return the number of cooperating ranks (1 in serial builds), or -1 if + * rt is null. + * @param rt Runtime environment handle. + * @return MPI size of the environment. + */ +int skalaxc_runtime_environment_comm_size(skalaxc_runtime_environment_t rt) + SKALAXC_EXPORT; + +/** + * @brief Destroy a runtime-environment handle (NULL is tolerated). + * @param rt Runtime environment handle to destroy. + */ +void skalaxc_runtime_environment_destroy(skalaxc_runtime_environment_t rt) + SKALAXC_EXPORT; + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/SkalaXC/include/skalaxc/c/status.h b/SkalaXC/include/skalaxc/c/status.h new file mode 100644 index 00000000..7796cccc --- /dev/null +++ b/SkalaXC/include/skalaxc/c/status.h @@ -0,0 +1,38 @@ +/** + * @file + * @brief SkalaXC C API: status codes and error reporting. + * + * Part of the public C API; include to get the whole API. + */ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Status codes returned by SkalaXC C API functions. + */ +typedef enum { + SKALAXC_SUCCESS = 0, ///< Success + SKALAXC_ERROR = 1, ///< Generic failure (see skalaxc_last_error_message) + SKALAXC_INVALID_ARGUMENT = + 2 ///< A null pointer, invalid dimension, or invalid enum was passed +} skalaxc_status_t; + +/** + * @brief Thread-local message describing the most recent failure on the calling + * thread. + * + * The returned pointer remains valid until the next failure on the same thread. + * Long implementation or dependency messages may be truncated. The caller must + * not modify or free the returned storage. + * @return Null-terminated error string (empty if no error has occurred). + */ +const char* skalaxc_last_error_message(void) SKALAXC_EXPORT; + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/SkalaXC/include/skalaxc/c/version.h b/SkalaXC/include/skalaxc/c/version.h new file mode 100644 index 00000000..f8188309 --- /dev/null +++ b/SkalaXC/include/skalaxc/c/version.h @@ -0,0 +1,26 @@ +/** + * @file + * @brief SkalaXC C API: library version information. + * + * Part of the public C API; include to get the whole API. + */ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Return the SkalaXC semantic version. + * + * The returned null-terminated string has static storage duration and must not + * be modified or freed. + * @return Null-terminated semantic version string. + */ +const char* skalaxc_version(void) SKALAXC_EXPORT; + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/SkalaXC/include/skalaxc/skalaxc.h b/SkalaXC/include/skalaxc/skalaxc.h new file mode 100644 index 00000000..f4829297 --- /dev/null +++ b/SkalaXC/include/skalaxc/skalaxc.h @@ -0,0 +1,32 @@ +/** + * @file + * @brief SkalaXC public C API umbrella header. + * + * ABI isolation contract: this API exposes only opaque handles and C POD types. + * No GauXC or LibTorch type crosses this boundary. Densities and potentials are + * passed as raw double arrays (column-major, nbf x nbf). + * No C++ exception crosses this API. Failures are reported through status + * codes, documented sentinel return values, and skalaxc_last_error_message(). + * + * The C API mirrors the SkalaXC C++ pipeline + * (runtime environment -> molecule / basis set -> molecular grid -> + * load balancer -> molecular weights -> functional -> XC integrator) with one + * opaque handle per stage. The API is organized into the skalaxc/c/ headers; + * this umbrella includes them all. Consumers may include the individual headers + * instead if preferred. + */ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include diff --git a/SkalaXC/src/c-api/CMakeLists.txt b/SkalaXC/src/c-api/CMakeLists.txt new file mode 100644 index 00000000..74319490 --- /dev/null +++ b/SkalaXC/src/c-api/CMakeLists.txt @@ -0,0 +1,9 @@ +# SkalaXC public C API. +# +# The extern "C" wrapper over SkalaXC::XCIntegrator. These sources are added +# directly to the `skalaxc` shared library (defined in ../CMakeLists.txt) rather +# than to an archive, so their skalaxc_* symbols survive --exclude-libs,ALL and +# remain the only exported entry points. +target_sources(skalaxc PRIVATE + skalaxc_c_api.cxx +) diff --git a/SkalaXC/src/c-api/skalaxc_c_api.cxx b/SkalaXC/src/c-api/skalaxc_c_api.cxx new file mode 100644 index 00000000..161146cd --- /dev/null +++ b/SkalaXC/src/c-api/skalaxc_c_api.cxx @@ -0,0 +1,807 @@ +/** + * SkalaXC public C API implementation. + * + * Thin extern "C" wrapper over the SkalaXC C++ pipeline. Each stage is an + * opaque handle owning the corresponding move-only SkalaXC value type; status + * codes and a thread-local fixed error buffer are used so no GauXC / Torch / + * C++ exception crosses this boundary. The XC-integrator handle holds the + * non-template evaluation core (SkalaXC::detail::IntegratorCore) directly, + * which exposes nbf/natoms and raw-pointer UKS evaluation. + */ +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + +constexpr std::size_t error_message_capacity = 2048; +thread_local std::array g_last_error{}; + +void set_error(const char* message) noexcept { + std::size_t length = 0; + if (message) + while (length + 1 < g_last_error.size() && message[length] != '\0') { + g_last_error[length] = message[length]; + ++length; + } + g_last_error[length] = '\0'; +} + +template +skalaxc_status_t translate_exceptions(Function&& function) noexcept { + try { + return function(); + } catch (const std::invalid_argument& error) { + set_error(error.what()); + return InvalidArgumentStatus ? SKALAXC_INVALID_ARGUMENT : SKALAXC_ERROR; + } catch (const std::exception& error) { + set_error(error.what()); + return SKALAXC_ERROR; + } catch (...) { + set_error("unknown error"); + return SKALAXC_ERROR; + } +} + +template +Result translate_query_exceptions(Function&& function, + Result failure) noexcept { + try { + return function(); + } catch (const std::exception& error) { + set_error(error.what()); + } catch (...) { + set_error("unknown error"); + } + return failure; +} + +template +int enum_value(const Enum& value) noexcept { + // C callers may supply values outside the C++ enum's range. Read the C ABI + // representation without an enum-to-integer conversion so those values can + // be validated by the switch statements below without triggering undefined + // behavior or sanitizer checks first. + static_assert(sizeof(Enum) == sizeof(int)); + int result; + std::memcpy(&result, &value, sizeof(result)); + return result; +} + +SkalaXC::ExecutionSpace to_exec(const enum SkalaXC_ExecutionSpace& ex) { + switch (enum_value(ex)) { + case SkalaXC_ExecutionSpace_Host: + return SkalaXC::ExecutionSpace::Host; + case SkalaXC_ExecutionSpace_Device: + return SkalaXC::ExecutionSpace::Device; + default: + throw std::invalid_argument("invalid execution space"); + } +} + +SkalaXC::PruningScheme to_pruning(const enum SkalaXC_PruningScheme& pruning) { + switch (enum_value(pruning)) { + case SkalaXC_PruningScheme_Unpruned: + return SkalaXC::PruningScheme::Unpruned; + case SkalaXC_PruningScheme_Robust: + return SkalaXC::PruningScheme::Robust; + case SkalaXC_PruningScheme_Treutler: + return SkalaXC::PruningScheme::Treutler; + default: + throw std::invalid_argument("invalid pruning scheme"); + } +} + +SkalaXC::RadialQuad to_radial_quad(const enum SkalaXC_RadialQuad& radial_quad) { + switch (enum_value(radial_quad)) { + case SkalaXC_RadialQuad_Becke: + return SkalaXC::RadialQuad::Becke; + case SkalaXC_RadialQuad_MuraKnowles: + return SkalaXC::RadialQuad::MuraKnowles; + case SkalaXC_RadialQuad_MurrayHandyLaming: + return SkalaXC::RadialQuad::MurrayHandyLaming; + case SkalaXC_RadialQuad_TreutlerAhlrichs: + return SkalaXC::RadialQuad::TreutlerAhlrichs; + default: + throw std::invalid_argument("invalid radial quadrature"); + } +} + +SkalaXC::AtomicGridSizeDefault to_atomic_grid( + const enum SkalaXC_AtomicGridSizeDefault& atomic_grid) { + switch (enum_value(atomic_grid)) { + case SkalaXC_AtomicGridSizeDefault_FineGrid: + return SkalaXC::AtomicGridSizeDefault::FineGrid; + case SkalaXC_AtomicGridSizeDefault_UltraFineGrid: + return SkalaXC::AtomicGridSizeDefault::UltraFineGrid; + case SkalaXC_AtomicGridSizeDefault_SuperFineGrid: + return SkalaXC::AtomicGridSizeDefault::SuperFineGrid; + case SkalaXC_AtomicGridSizeDefault_GM3: + return SkalaXC::AtomicGridSizeDefault::GM3; + case SkalaXC_AtomicGridSizeDefault_GM5: + return SkalaXC::AtomicGridSizeDefault::GM5; + default: + throw std::invalid_argument("invalid atomic grid size"); + } +} + +SkalaXC::TimingSettings to_timing_settings( + const skalaxc_timing_settings_t* settings) { + SkalaXC::TimingSettings result; + if (settings) { + result.verbose = settings->verbose != 0; + result.debug_logging = settings->debug_logging != 0; + } + return result; +} + +SkalaXC::DomainBatchMode to_domain_batch_mode( + const enum SkalaXC_DomainBatchMode& mode) { + switch (enum_value(mode)) { + case SkalaXC_DomainBatchMode_Conservative: + return SkalaXC::DomainBatchMode::Conservative; + case SkalaXC_DomainBatchMode_Aggressive: + return SkalaXC::DomainBatchMode::Aggressive; + default: + throw std::invalid_argument("invalid domain batch mode"); + } +} + +std::int64_t clamp_nanoseconds(std::uint64_t value) { + constexpr auto maximum = + static_cast(std::numeric_limits::max()); + return value > maximum ? std::numeric_limits::max() + : static_cast(value); +} + +void copy_diagnostics(const SkalaXC::DiagnosticsSnapshot& source, + skalaxc_diagnostics_snapshot_t& destination) { + static_assert(SKALAXC_TIMING_METRIC_COUNT == SkalaXC::timing_metric_count); + destination.backend = static_cast(source.backend); + destination.rank = source.rank; + destination.communicator_size = source.communicator_size; + destination.device_id = source.device_id; + destination.openmp_threads = source.openmp_threads; + destination.device_memory_fraction = source.device_memory_fraction; + destination.domain_batch_mode = + static_cast(source.domain_batch_mode); + for (std::size_t index = 0; index < SkalaXC::timing_metric_count; ++index) { + const auto& source_timing = source.timings[index]; + auto& destination_timing = destination.timings[index]; + destination_timing.last_nanoseconds = + clamp_nanoseconds(source_timing.last_nanoseconds); + destination_timing.total_nanoseconds = + clamp_nanoseconds(source_timing.total_nanoseconds); + destination_timing.call_count = + static_cast(source_timing.call_count); + destination_timing.status = static_cast(source_timing.status); + } + destination.exc_vxc_calls = static_cast(source.exc_vxc_calls); + destination.exc_gradient_calls = + static_cast(source.exc_gradient_calls); + destination.model_batches = static_cast(source.model_batches); + destination.domains = static_cast(source.domains); + destination.tasks = static_cast(source.tasks); + destination.points = static_cast(source.points); + destination.local_atoms = static_cast(source.local_atoms); + destination.configured_model_batches = + static_cast(source.configured_model_batches); + destination.task_points_min = static_cast(source.task_points_min); + destination.task_points_max = static_cast(source.task_points_max); + destination.task_basis_min = static_cast(source.task_basis_min); + destination.task_basis_max = static_cast(source.task_basis_max); + destination.model_batch_points_min = + static_cast(source.model_batch_points_min); + destination.model_batch_points_max = + static_cast(source.model_batch_points_max); + destination.max_domains_per_model_batch = + static_cast(source.max_domains_per_model_batch); +} + +SkalaXC::XCWeightAlg to_weight(const enum SkalaXC_XCWeightAlg& a) { + switch (enum_value(a)) { + case SkalaXC_XCWeightAlg_NOTPARTITIONED: + return SkalaXC::XCWeightAlg::NOTPARTITIONED; + case SkalaXC_XCWeightAlg_Becke: + return SkalaXC::XCWeightAlg::Becke; + case SkalaXC_XCWeightAlg_LKO: + return SkalaXC::XCWeightAlg::LKO; + case SkalaXC_XCWeightAlg_SSF: + return SkalaXC::XCWeightAlg::SSF; + default: + throw std::invalid_argument("invalid XC weight algorithm"); + } +} + +} // namespace + +// =========================================================================== +// Opaque handle definitions (one per pipeline stage). +// =========================================================================== + +struct skalaxc_runtime_environment { + SkalaXC::RuntimeEnvironment rt; + explicit skalaxc_runtime_environment(SkalaXC::RuntimeEnvironment r) + : rt(std::move(r)) {} +}; + +struct skalaxc_molecule { + SkalaXC::Molecule mol; +}; + +struct skalaxc_basisset { + SkalaXC::BasisSet basis; +}; + +struct skalaxc_molgrid { + SkalaXC::MolGrid mg; + explicit skalaxc_molgrid(SkalaXC::MolGrid m) : mg(std::move(m)) {} +}; + +struct skalaxc_load_balancer { + SkalaXC::LoadBalancer lb; + explicit skalaxc_load_balancer(SkalaXC::LoadBalancer l) : lb(std::move(l)) {} +}; + +struct skalaxc_molecular_weights { + SkalaXC::MolecularWeights mw; + explicit skalaxc_molecular_weights(SkalaXC::MolecularWeights m) + : mw(std::move(m)) {} +}; + +struct skalaxc_functional { + SkalaXC::functional_type func; +}; + +struct skalaxc_xc_integrator { + std::unique_ptr core; +}; + +extern "C" { + +const char* skalaxc_version(void) { return SkalaXC::version().data(); } + +void skalaxc_timing_settings_default(skalaxc_timing_settings_t* settings) { + if (!settings) return; + settings->verbose = 0; + settings->debug_logging = 0; +} + +// --------------------------------------------------------------------------- +// Runtime environment +// --------------------------------------------------------------------------- + +skalaxc_status_t skalaxc_runtime_environment_create( + SKALAXC_MPI_CODE(MPI_Comm comm, ) skalaxc_runtime_environment_t* out) { + if (out) *out = nullptr; + if (!out) { + set_error("null argument"); + return SKALAXC_INVALID_ARGUMENT; + } + return translate_exceptions([&] { + auto handle = std::make_unique( + SkalaXC::RuntimeEnvironment(SKALAXC_MPI_CODE(comm))); + *out = handle.release(); + return SKALAXC_SUCCESS; + }); +} + +void skalaxc_device_runtime_settings_default( + skalaxc_device_runtime_settings_t* settings) { + if (!settings) return; + settings->device_id = 0; + settings->memory_fraction = 0.75; +} + +skalaxc_status_t skalaxc_device_runtime_environment_create( + SKALAXC_MPI_CODE(MPI_Comm comm, ) + const skalaxc_device_runtime_settings_t* settings, + skalaxc_runtime_environment_t* out) { + if (out) *out = nullptr; + if (!out) { + set_error("null argument"); + return SKALAXC_INVALID_ARGUMENT; + } + return translate_exceptions([&] { + SkalaXC::DeviceRuntimeSettings cpp_settings; + if (settings) { + cpp_settings.device_id = settings->device_id; + cpp_settings.memory_fraction = settings->memory_fraction; + } + auto handle = std::make_unique( + SkalaXC::RuntimeEnvironment(SKALAXC_MPI_CODE(comm, ) cpp_settings)); + *out = handle.release(); + return SKALAXC_SUCCESS; + }); +} + +#ifdef SKALAXC_HAS_MPI +skalaxc_status_t skalaxc_runtime_environment_create_f( + MPI_Fint comm, skalaxc_runtime_environment_t* out) { + return skalaxc_runtime_environment_create(MPI_Comm_f2c(comm), out); +} + +skalaxc_status_t skalaxc_device_runtime_environment_create_f( + MPI_Fint comm, const skalaxc_device_runtime_settings_t* settings, + skalaxc_runtime_environment_t* out) { + return skalaxc_device_runtime_environment_create(MPI_Comm_f2c(comm), settings, + out); +} +#endif + +int skalaxc_runtime_environment_comm_rank(skalaxc_runtime_environment_t rt) { + if (!rt) { + set_error("null argument"); + return -1; + } + return translate_query_exceptions([&] { return rt->rt.comm_rank(); }, -1); +} + +int skalaxc_runtime_environment_comm_size(skalaxc_runtime_environment_t rt) { + if (!rt) { + set_error("null argument"); + return -1; + } + return translate_query_exceptions([&] { return rt->rt.comm_size(); }, -1); +} + +void skalaxc_runtime_environment_destroy(skalaxc_runtime_environment_t rt) { + delete rt; +} + +// --------------------------------------------------------------------------- +// Molecule +// --------------------------------------------------------------------------- + +skalaxc_status_t skalaxc_molecule_create(skalaxc_molecule_t* out) { + if (out) *out = nullptr; + if (!out) { + set_error("null argument"); + return SKALAXC_INVALID_ARGUMENT; + } + return translate_exceptions([&] { + auto handle = std::make_unique(); + *out = handle.release(); + return SKALAXC_SUCCESS; + }); +} + +skalaxc_status_t skalaxc_molecule_add_atom(skalaxc_molecule_t mol, + int64_t atomic_number, double x, + double y, double z) { + if (!mol) { + set_error("null argument"); + return SKALAXC_INVALID_ARGUMENT; + } + return translate_exceptions([&] { + mol->mol.emplace_back(SkalaXC::AtomicNumber(atomic_number), x, y, z); + return SKALAXC_SUCCESS; + }); +} + +skalaxc_status_t skalaxc_molecule_from_arrays(int64_t natoms, const int64_t* Z, + const double* atom_xyz, + skalaxc_molecule_t* out) { + if (out) *out = nullptr; + if (!Z || !atom_xyz || !out || natoms < 0) { + set_error("null argument"); + return SKALAXC_INVALID_ARGUMENT; + } + return translate_exceptions([&] { + auto handle = std::make_unique(); + handle->mol.reserve(static_cast(natoms)); + for (int64_t i = 0; i < natoms; ++i) { + handle->mol.emplace_back(SkalaXC::AtomicNumber(Z[i]), atom_xyz[3 * i], + atom_xyz[3 * i + 1], atom_xyz[3 * i + 2]); + } + *out = handle.release(); + return SKALAXC_SUCCESS; + }); +} + +#ifdef SKALAXC_HAS_HDF5 +skalaxc_status_t skalaxc_molecule_from_hdf5(const char* path, const char* dset, + skalaxc_molecule_t* out) { + if (out) *out = nullptr; + if (!path || !dset || !out) { + set_error("null argument"); + return SKALAXC_INVALID_ARGUMENT; + } + return translate_exceptions([&] { + auto handle = std::make_unique(); + SkalaXC::read_hdf5_record(handle->mol, path, dset); + *out = handle.release(); + return SKALAXC_SUCCESS; + }); +} +#endif + +int64_t skalaxc_molecule_natoms(skalaxc_molecule_t mol) { + if (!mol) { + set_error("null argument"); + return -1; + } + return translate_query_exceptions( + [&] { return static_cast(mol->mol.natoms()); }, int64_t{-1}); +} + +void skalaxc_molecule_destroy(skalaxc_molecule_t mol) { delete mol; } + +// --------------------------------------------------------------------------- +// Basis set +// --------------------------------------------------------------------------- + +skalaxc_status_t skalaxc_basisset_create(skalaxc_basisset_t* out) { + if (out) *out = nullptr; + if (!out) { + set_error("null argument"); + return SKALAXC_INVALID_ARGUMENT; + } + return translate_exceptions([&] { + auto handle = std::make_unique(); + *out = handle.release(); + return SKALAXC_SUCCESS; + }); +} + +skalaxc_status_t skalaxc_basisset_add_shell( + skalaxc_basisset_t basis, int32_t l, int32_t pure, const double* center_xyz, + int32_t nprim, const double* exponents, const double* coefficients, + int32_t normalize) { + if (!basis || !center_xyz || !exponents || !coefficients) { + set_error("null argument"); + return SKALAXC_INVALID_ARGUMENT; + } + if (nprim < 1 || nprim > 32) { + set_error("nprim must be in [1, 32]"); + return SKALAXC_INVALID_ARGUMENT; + } + return translate_exceptions([&] { + SkalaXC::Shell::prim_array alpha{}; + SkalaXC::Shell::prim_array coeff{}; + for (int32_t i = 0; i < nprim; ++i) { + alpha[static_cast(i)] = exponents[i]; + coeff[static_cast(i)] = coefficients[i]; + } + const SkalaXC::Shell::cart_array center{ + center_xyz[0], center_xyz[1], center_xyz[2]}; + basis->basis.emplace_back( + SkalaXC::PrimSize(nprim), SkalaXC::AngularMomentum(l), + SkalaXC::SphericalType(pure), alpha, coeff, center, normalize != 0); + return SKALAXC_SUCCESS; + }); +} + +skalaxc_status_t skalaxc_basisset_from_arrays( + int64_t nshells, const int32_t* shell_l, const int32_t* shell_pure, + const double* shell_xyz, const int32_t* shell_nprim, const double* prim_exp, + const double* prim_coeff, skalaxc_basisset_t* out) { + if (out) *out = nullptr; + if (!shell_l || !shell_pure || !shell_xyz || !shell_nprim || !prim_exp || + !prim_coeff || !out || nshells < 0) { + set_error("null argument"); + return SKALAXC_INVALID_ARGUMENT; + } + return translate_exceptions([&] { + auto handle = std::make_unique(); + handle->basis.reserve(static_cast(nshells)); + int64_t offset = 0; + for (int64_t s = 0; s < nshells; ++s) { + const int32_t nprim = shell_nprim[s]; + if (nprim < 1 || nprim > 32) { + set_error("nprim must be in [1, 32]"); + return SKALAXC_INVALID_ARGUMENT; + } + SkalaXC::Shell::prim_array alpha{}; + SkalaXC::Shell::prim_array coeff{}; + for (int32_t i = 0; i < nprim; ++i) { + alpha[static_cast(i)] = prim_exp[offset + i]; + coeff[static_cast(i)] = prim_coeff[offset + i]; + } + const SkalaXC::Shell::cart_array center{ + shell_xyz[3 * s], shell_xyz[3 * s + 1], shell_xyz[3 * s + 2]}; + handle->basis.emplace_back( + SkalaXC::PrimSize(nprim), SkalaXC::AngularMomentum(shell_l[s]), + SkalaXC::SphericalType(shell_pure[s]), alpha, coeff, center, true); + offset += nprim; + } + *out = handle.release(); + return SKALAXC_SUCCESS; + }); +} + +#ifdef SKALAXC_HAS_HDF5 +skalaxc_status_t skalaxc_basisset_from_hdf5(const char* path, const char* dset, + skalaxc_basisset_t* out) { + if (out) *out = nullptr; + if (!path || !dset || !out) { + set_error("null argument"); + return SKALAXC_INVALID_ARGUMENT; + } + return translate_exceptions([&] { + auto handle = std::make_unique(); + SkalaXC::read_hdf5_record(handle->basis, path, dset); + *out = handle.release(); + return SKALAXC_SUCCESS; + }); +} +#endif + +int64_t skalaxc_basisset_nbf(skalaxc_basisset_t basis) { + if (!basis) { + set_error("null argument"); + return -1; + } + return translate_query_exceptions( + [&] { return static_cast(basis->basis.nbf()); }, int64_t{-1}); +} + +void skalaxc_basisset_destroy(skalaxc_basisset_t basis) { delete basis; } + +// --------------------------------------------------------------------------- +// Molecular grid +// --------------------------------------------------------------------------- + +skalaxc_status_t skalaxc_molgrid_create_default( + skalaxc_molecule_t mol, const skalaxc_grid_settings_t* grid, + skalaxc_molgrid_t* out) { + if (out) *out = nullptr; + if (!mol || !out) { + set_error("null argument"); + return SKALAXC_INVALID_ARGUMENT; + } + return translate_exceptions([&] { + SkalaXC::PruningScheme pruning = SkalaXC::PruningScheme::Unpruned; + int64_t batch_size = 512; + SkalaXC::RadialQuad radial = SkalaXC::RadialQuad::MuraKnowles; + SkalaXC::AtomicGridSizeDefault atomic = + SkalaXC::AtomicGridSizeDefault::UltraFineGrid; + if (grid) { + pruning = to_pruning(grid->pruning); + batch_size = grid->batch_size; + radial = to_radial_quad(grid->radial_quad); + atomic = to_atomic_grid(grid->atomic_grid); + } + auto mg = SkalaXC::MolGridFactory::create_default_molgrid( + mol->mol, pruning, SkalaXC::BatchSize(batch_size), radial, atomic); + auto handle = std::make_unique(std::move(mg)); + *out = handle.release(); + return SKALAXC_SUCCESS; + }); +} + +void skalaxc_molgrid_destroy(skalaxc_molgrid_t mg) { delete mg; } + +// --------------------------------------------------------------------------- +// Load balancer +// --------------------------------------------------------------------------- + +skalaxc_status_t skalaxc_load_balancer_create(enum SkalaXC_ExecutionSpace ex, + skalaxc_runtime_environment_t rt, + skalaxc_molecule_t mol, + skalaxc_molgrid_t mg, + skalaxc_basisset_t basis, + skalaxc_load_balancer_t* out) { + if (out) *out = nullptr; + if (!rt || !mol || !mg || !basis || !out) { + set_error("null argument"); + return SKALAXC_INVALID_ARGUMENT; + } + return translate_exceptions([&] { + SkalaXC::LoadBalancerFactory factory(to_exec(ex)); + auto lb = factory.get_instance(rt->rt, mol->mol, mg->mg, basis->basis); + auto handle = std::make_unique(std::move(lb)); + *out = handle.release(); + return SKALAXC_SUCCESS; + }); +} + +void skalaxc_load_balancer_destroy(skalaxc_load_balancer_t lb) { delete lb; } + +// --------------------------------------------------------------------------- +// Molecular weights +// --------------------------------------------------------------------------- + +skalaxc_status_t skalaxc_molecular_weights_create( + enum SkalaXC_ExecutionSpace ex, enum SkalaXC_XCWeightAlg weight_alg, + skalaxc_molecular_weights_t* out) { + if (out) *out = nullptr; + if (!out) { + set_error("null argument"); + return SKALAXC_INVALID_ARGUMENT; + } + return translate_exceptions([&] { + SkalaXC::MolecularWeightsSettings settings; + settings.weight_alg = to_weight(weight_alg); + SkalaXC::MolecularWeightsFactory factory(to_exec(ex), "Default", settings); + auto mw = factory.get_instance(); + auto handle = std::make_unique(std::move(mw)); + *out = handle.release(); + return SKALAXC_SUCCESS; + }); +} + +skalaxc_status_t skalaxc_molecular_weights_modify_weights( + skalaxc_molecular_weights_t mw, skalaxc_load_balancer_t lb) { + if (!mw || !lb) { + set_error("null argument"); + return SKALAXC_INVALID_ARGUMENT; + } + return translate_exceptions([&] { + mw->mw.modify_weights(lb->lb); + return SKALAXC_SUCCESS; + }); +} + +void skalaxc_molecular_weights_destroy(skalaxc_molecular_weights_t mw) { + delete mw; +} + +// --------------------------------------------------------------------------- +// Functional +// --------------------------------------------------------------------------- + +skalaxc_status_t skalaxc_functional_create(const char* model, + skalaxc_functional_t* out) { + if (out) *out = nullptr; + if (!model || !out) { + set_error("null argument"); + return SKALAXC_INVALID_ARGUMENT; + } + return translate_exceptions([&] { + auto handle = std::make_unique( + skalaxc_functional{SkalaXC::functional_type(model)}); + *out = handle.release(); + return SKALAXC_SUCCESS; + }); +} + +void skalaxc_functional_destroy(skalaxc_functional_t func) { delete func; } + +// --------------------------------------------------------------------------- +// XC integrator +// --------------------------------------------------------------------------- + +void skalaxc_integrator_settings_default( + skalaxc_integrator_settings_t* settings) { + if (!settings) return; + skalaxc_timing_settings_default(&settings->timing); + settings->domain_batch_mode = SkalaXC_DomainBatchMode_Conservative; +} + +skalaxc_status_t skalaxc_xc_integrator_create(enum SkalaXC_ExecutionSpace ex, + skalaxc_functional_t func, + skalaxc_load_balancer_t lb, + skalaxc_xc_integrator_t* out) { + return skalaxc_xc_integrator_create_with_timing(ex, func, lb, nullptr, out); +} + +skalaxc_status_t skalaxc_xc_integrator_create_with_timing( + enum SkalaXC_ExecutionSpace ex, skalaxc_functional_t func, + skalaxc_load_balancer_t lb, const skalaxc_timing_settings_t* settings, + skalaxc_xc_integrator_t* out) { + skalaxc_integrator_settings_t integrator_settings; + skalaxc_integrator_settings_default(&integrator_settings); + if (settings) integrator_settings.timing = *settings; + return skalaxc_xc_integrator_create_with_settings(ex, func, lb, + &integrator_settings, out); +} + +skalaxc_status_t skalaxc_xc_integrator_create_with_settings( + enum SkalaXC_ExecutionSpace ex, skalaxc_functional_t func, + skalaxc_load_balancer_t lb, const skalaxc_integrator_settings_t* settings, + skalaxc_xc_integrator_t* out) { + if (out) *out = nullptr; + if (!func || !lb || !out) { + set_error("null argument"); + return SKALAXC_INVALID_ARGUMENT; + } + return translate_exceptions([&] { + skalaxc_integrator_settings_t resolved_settings; + skalaxc_integrator_settings_default(&resolved_settings); + if (settings) resolved_settings = *settings; + auto core = SkalaXC::detail::make_integrator_core( + to_exec(ex), func->func, lb->lb, + to_timing_settings(&resolved_settings.timing), + to_domain_batch_mode(resolved_settings.domain_batch_mode)); + auto handle = std::make_unique(); + handle->core = std::move(core); + *out = handle.release(); + return SKALAXC_SUCCESS; + }); +} + +int64_t skalaxc_xc_integrator_nbf(skalaxc_xc_integrator_t xc) { + if (!xc || !xc->core) { + set_error("null argument"); + return -1; + } + return translate_query_exceptions([&] { return xc->core->nbf(); }, + int64_t{-1}); +} + +int64_t skalaxc_xc_integrator_natoms(skalaxc_xc_integrator_t xc) { + if (!xc || !xc->core) { + set_error("null argument"); + return -1; + } + return translate_query_exceptions([&] { return xc->core->natoms(); }, + int64_t{-1}); +} + +skalaxc_status_t skalaxc_xc_integrator_eval_exc_vxc_uks( + skalaxc_xc_integrator_t xc, const double* Ps, const double* Pz, + double* VXCs, double* VXCz, double* exc_out) { + if (!xc || !xc->core || !Ps || !Pz || !VXCs || !VXCz || !exc_out) { + set_error("null argument"); + return SKALAXC_INVALID_ARGUMENT; + } + return translate_exceptions([&] { + *exc_out = xc->core->eval_exc_vxc(Ps, Pz, VXCs, VXCz); + return SKALAXC_SUCCESS; + }); +} + +skalaxc_status_t skalaxc_xc_integrator_eval_exc_grad_uks( + skalaxc_xc_integrator_t xc, const double* Ps, const double* Pz, + double* gradient_out) { + if (!xc || !xc->core || !Ps || !Pz || !gradient_out) { + set_error("null argument"); + return SKALAXC_INVALID_ARGUMENT; + } + return translate_exceptions([&] { + xc->core->eval_exc_grad(Ps, Pz, gradient_out); + return SKALAXC_SUCCESS; + }); +} + +skalaxc_status_t skalaxc_xc_integrator_get_diagnostics( + skalaxc_xc_integrator_t xc, skalaxc_diagnostics_snapshot_t* out) { + if (!xc || !xc->core || !out) { + set_error("null argument"); + return SKALAXC_INVALID_ARGUMENT; + } + return translate_exceptions([&] { + copy_diagnostics(xc->core->diagnostics(), *out); + return SKALAXC_SUCCESS; + }); +} + +skalaxc_status_t skalaxc_xc_integrator_reset_diagnostics( + skalaxc_xc_integrator_t xc) { + if (!xc || !xc->core) { + set_error("null argument"); + return SKALAXC_INVALID_ARGUMENT; + } + return translate_exceptions([&] { + xc->core->reset_diagnostics(); + return SKALAXC_SUCCESS; + }); +} + +void skalaxc_xc_integrator_destroy(skalaxc_xc_integrator_t xc) { delete xc; } + +// --------------------------------------------------------------------------- +// Grid settings + error reporting +// --------------------------------------------------------------------------- + +void skalaxc_grid_settings_default(skalaxc_grid_settings_t* settings) { + if (!settings) return; + settings->pruning = SkalaXC_PruningScheme_Unpruned; + settings->batch_size = 512; + settings->radial_quad = SkalaXC_RadialQuad_MuraKnowles; + settings->atomic_grid = SkalaXC_AtomicGridSizeDefault_UltraFineGrid; +} + +const char* skalaxc_last_error_message(void) { return g_last_error.data(); } + +} // extern "C" From f77abee85cfbb791316716aae304273d94f19dd8 Mon Sep 17 00:00:00 2001 From: jenswehner Date: Fri, 4 Sep 2026 11:36:33 +0200 Subject: [PATCH 08/33] Add Fortran API --- SkalaXC/src/fortran/CMakeLists.txt | 37 + SkalaXC/src/fortran/skalaxc.F90 | 1532 ++++++++++++++++++++++++++++ 2 files changed, 1569 insertions(+) create mode 100644 SkalaXC/src/fortran/CMakeLists.txt create mode 100644 SkalaXC/src/fortran/skalaxc.F90 diff --git a/SkalaXC/src/fortran/CMakeLists.txt b/SkalaXC/src/fortran/CMakeLists.txt new file mode 100644 index 00000000..567c874e --- /dev/null +++ b/SkalaXC/src/fortran/CMakeLists.txt @@ -0,0 +1,37 @@ +# SkalaXC Fortran API. +# +# A thin iso_c_binding wrapper over the SkalaXC C API. It links ONLY the public +# `skalaxc` shared library -- never GauXC or LibTorch -- so a Fortran consumer's +# ABI surface is limited to the SkalaXC symbols exported by libskalaxc. + +set(SKALAXC_Fortran_MODULE_DIR ${CMAKE_CURRENT_BINARY_DIR}/mod) + +add_library(skalaxc_fortran STATIC skalaxc.F90) +add_library(SkalaXC::skalaxc_fortran ALIAS skalaxc_fortran) + +# The Fortran source is preprocessed so it can guard the MPI-communicator +# plumbing behind SKALAXC_HAS_MPI, exactly as the C/C++ headers do. When MPI is +# OFF the guarded blocks disappear and the Fortran API is byte-for-byte the +# serial one; when ON, the create procedures take an integer MPI communicator +# handle that the C layer converts via MPI_Comm_f2c. +set_source_files_properties(skalaxc.F90 PROPERTIES Fortran_PREPROCESS ON) +if(SKALAXC_ENABLE_MPI) + target_compile_definitions(skalaxc_fortran PRIVATE SKALAXC_HAS_MPI) +endif() +if(SKALAXC_HAS_HDF5) + target_compile_definitions(skalaxc_fortran PRIVATE SKALAXC_HAS_HDF5) +endif() + +# Public C API only. `skalaxc` propagates just its public include dir (no GauXC). +target_link_libraries(skalaxc_fortran PUBLIC skalaxc) + +set_target_properties(skalaxc_fortran PROPERTIES + Fortran_MODULE_DIRECTORY ${SKALAXC_Fortran_MODULE_DIR} + POSITION_INDEPENDENT_CODE ON +) + +# Expose the generated `.mod` to consumers. +target_include_directories(skalaxc_fortran PUBLIC + $ + $ +) diff --git a/SkalaXC/src/fortran/skalaxc.F90 b/SkalaXC/src/fortran/skalaxc.F90 new file mode 100644 index 00000000..1a497ea5 --- /dev/null +++ b/SkalaXC/src/fortran/skalaxc.F90 @@ -0,0 +1,1532 @@ +!> @brief SkalaXC public Fortran API. +!> +!> ABI isolation contract: this module binds, via iso_c_binding, ONLY to the +!> SkalaXC C API (opaque handles + status codes + raw arrays). No GauXC or +!> LibTorch type is ever referenced. A Fortran consumer needs only this module +!> and libskalaxc -- never GauXC. +!> +!> The module mirrors the SkalaXC C++ / C pipeline with one opaque derived type +!> per stage: runtime environment -> molecule / basis set -> molecular grid -> +!> load balancer -> molecular weights -> functional -> XC integrator. +module skalaxc + use, intrinsic :: iso_c_binding + use, intrinsic :: iso_fortran_env, only: error_unit + implicit none + private + + ! Public API --------------------------------------------------------------- + public :: skalaxc_runtime_environment_t + public :: skalaxc_molecule_t + public :: skalaxc_basisset_t + public :: skalaxc_molgrid_t + public :: skalaxc_load_balancer_t + public :: skalaxc_molecular_weights_t + public :: skalaxc_functional_t + public :: skalaxc_xc_integrator_t + public :: SKALAXC_SUCCESS, SKALAXC_ERROR, SKALAXC_INVALID_ARGUMENT + public :: skalaxc_version + public :: skalaxc_last_error + public :: skalaxc_grid_settings_t, skalaxc_grid_settings_default + public :: skalaxc_device_runtime_settings_t, & + & skalaxc_device_runtime_settings_default + public :: skalaxc_timing_settings_t, skalaxc_timing_settings_default + public :: skalaxc_integrator_settings_t, skalaxc_integrator_settings_default + public :: skalaxc_timing_value_t, skalaxc_diagnostics_snapshot_t + public :: skalaxc_runtime_environment_create + + integer(c_int), parameter :: SKALAXC_SUCCESS = 0 + integer(c_int), parameter :: SKALAXC_ERROR = 1 + integer(c_int), parameter :: SKALAXC_INVALID_ARGUMENT = 2 + + ! Enumerations ------------------------------------------------------------- + public :: skalaxc_radialquad_becke, skalaxc_radialquad_mura_knowles, & + & skalaxc_radialquad_murray_handy_laming, skalaxc_radialquad_treutler_ahlrichs + enum, bind(c) + !> @brief Becke radial quadrature + enumerator :: skalaxc_radialquad_becke + !> @brief Mura-Knowles radial quadrature (default) + enumerator :: skalaxc_radialquad_mura_knowles + !> @brief Murray-Handy-Laming radial quadrature + enumerator :: skalaxc_radialquad_murray_handy_laming + !> @brief Treutler-Ahlrichs radial quadrature + enumerator :: skalaxc_radialquad_treutler_ahlrichs + end enum + + !> @brief Named-constant bundle (e.g. skalaxc_radialquad%mura_knowles). + type :: skalaxc_radialquad_enum + integer(c_int) :: becke = skalaxc_radialquad_becke + integer(c_int) :: mura_knowles = skalaxc_radialquad_mura_knowles + integer(c_int) :: murray_handy_laming = skalaxc_radialquad_murray_handy_laming + integer(c_int) :: treutler_ahlrichs = skalaxc_radialquad_treutler_ahlrichs + end type skalaxc_radialquad_enum + type(skalaxc_radialquad_enum), parameter, public :: & + & skalaxc_radialquad = skalaxc_radialquad_enum() + + public :: skalaxc_atomicgridsize_finegrid, skalaxc_atomicgridsize_ultrafinegrid, & + & skalaxc_atomicgridsize_superfinegrid, skalaxc_atomicgridsize_gm3, & + & skalaxc_atomicgridsize_gm5 + enum, bind(c) + !> @brief Fine grid (least accurate) + enumerator :: skalaxc_atomicgridsize_finegrid + !> @brief Ultrafine grid (default) + enumerator :: skalaxc_atomicgridsize_ultrafinegrid + !> @brief Superfine grid (most accurate) + enumerator :: skalaxc_atomicgridsize_superfinegrid + !> @brief Treutler-Ahlrichs GM3 grid + enumerator :: skalaxc_atomicgridsize_gm3 + !> @brief Treutler-Ahlrichs GM5 grid + enumerator :: skalaxc_atomicgridsize_gm5 + end enum + + !> @brief Named-constant bundle (e.g. skalaxc_atomicgridsize%ultrafinegrid). + type :: skalaxc_atomicgridsize_enum + integer(c_int) :: finegrid = skalaxc_atomicgridsize_finegrid + integer(c_int) :: ultrafinegrid = skalaxc_atomicgridsize_ultrafinegrid + integer(c_int) :: superfinegrid = skalaxc_atomicgridsize_superfinegrid + integer(c_int) :: gm3 = skalaxc_atomicgridsize_gm3 + integer(c_int) :: gm5 = skalaxc_atomicgridsize_gm5 + end type skalaxc_atomicgridsize_enum + type(skalaxc_atomicgridsize_enum), parameter, public :: & + & skalaxc_atomicgridsize = skalaxc_atomicgridsize_enum() + + public :: skalaxc_pruningscheme_unpruned, skalaxc_pruningscheme_robust, & + & skalaxc_pruningscheme_treutler + enum, bind(c) + !> @brief Unpruned atomic quadrature (default) + enumerator :: skalaxc_pruningscheme_unpruned + !> @brief The "Robust" scheme of Psi4 + enumerator :: skalaxc_pruningscheme_robust + !> @brief The Treutler-Ahlrichs scheme + enumerator :: skalaxc_pruningscheme_treutler + end enum + + !> @brief Named-constant bundle (e.g. skalaxc_pruningscheme%unpruned). + type :: skalaxc_pruningscheme_enum + integer(c_int) :: unpruned = skalaxc_pruningscheme_unpruned + integer(c_int) :: robust = skalaxc_pruningscheme_robust + integer(c_int) :: treutler = skalaxc_pruningscheme_treutler + end type skalaxc_pruningscheme_enum + type(skalaxc_pruningscheme_enum), parameter, public :: & + & skalaxc_pruningscheme = skalaxc_pruningscheme_enum() + + public :: skalaxc_executionspace_host, skalaxc_executionspace_device + enum, bind(c) + !> @brief Host (CPU) evaluation (supported) + enumerator :: skalaxc_executionspace_host + !> @brief CUDA device evaluation + enumerator :: skalaxc_executionspace_device + end enum + + !> @brief Named-constant bundle (e.g. skalaxc_executionspace%host). + type :: skalaxc_executionspace_enum + integer(c_int) :: host = skalaxc_executionspace_host + integer(c_int) :: device = skalaxc_executionspace_device + end type skalaxc_executionspace_enum + type(skalaxc_executionspace_enum), parameter, public :: & + & skalaxc_executionspace = skalaxc_executionspace_enum() + + public :: skalaxc_domainbatchmode_conservative, & + & skalaxc_domainbatchmode_aggressive + enum, bind(c) + !> @brief Evaluate one complete atomic domain per model call. + enumerator :: skalaxc_domainbatchmode_conservative + !> @brief Batch all local domains having the same exact grid size. + enumerator :: skalaxc_domainbatchmode_aggressive + end enum + + !> @brief Named-constant bundle for complete-domain model batching. + type :: skalaxc_domainbatchmode_enum + integer(c_int) :: conservative = skalaxc_domainbatchmode_conservative + integer(c_int) :: aggressive = skalaxc_domainbatchmode_aggressive + end type skalaxc_domainbatchmode_enum + type(skalaxc_domainbatchmode_enum), parameter, public :: & + & skalaxc_domainbatchmode = skalaxc_domainbatchmode_enum() + + public :: skalaxc_xcweightalg_notpartitioned, skalaxc_xcweightalg_becke, & + & skalaxc_xcweightalg_ssf, skalaxc_xcweightalg_lko + enum, bind(c) + !> @brief Weights are not partitioned + enumerator :: skalaxc_xcweightalg_notpartitioned + !> @brief Becke partitioning + enumerator :: skalaxc_xcweightalg_becke + !> @brief Stratmann-Scuseria-Frisch (default) + enumerator :: skalaxc_xcweightalg_ssf + !> @brief Laqua-Kussmann-Ochsenfeld + enumerator :: skalaxc_xcweightalg_lko + end enum + + !> @brief Named-constant bundle (e.g. skalaxc_xcweightalg%ssf). + type :: skalaxc_xcweightalg_enum + integer(c_int) :: notpartitioned = skalaxc_xcweightalg_notpartitioned + integer(c_int) :: becke = skalaxc_xcweightalg_becke + integer(c_int) :: ssf = skalaxc_xcweightalg_ssf + integer(c_int) :: lko = skalaxc_xcweightalg_lko + end type skalaxc_xcweightalg_enum + type(skalaxc_xcweightalg_enum), parameter, public :: & + & skalaxc_xcweightalg = skalaxc_xcweightalg_enum() + + integer(c_int32_t), parameter, public :: & + & skalaxc_timingstatus_unavailable = 0 + integer(c_int32_t), parameter, public :: skalaxc_timingstatus_pending = 1 + integer(c_int32_t), parameter, public :: skalaxc_timingstatus_complete = 2 + + ! One-based indices into skalaxc_diagnostics_snapshot_t%timings. + integer(c_int), parameter, public :: skalaxc_timing_metric_count = 11 + integer(c_int), parameter, public :: skalaxc_timing_model_load = 1 + integer(c_int), parameter, public :: skalaxc_timing_feature_construction = 2 + integer(c_int), parameter, public :: skalaxc_timing_model_batch_packing = 3 + integer(c_int), parameter, public :: skalaxc_timing_model_forward = 4 + integer(c_int), parameter, public :: skalaxc_timing_model_backward = 5 + integer(c_int), parameter, public :: skalaxc_timing_potential_mapping = 6 + integer(c_int), parameter, public :: skalaxc_timing_ao_assembly = 7 + integer(c_int), parameter, public :: skalaxc_timing_gradient_assembly = 8 + integer(c_int), parameter, public :: skalaxc_timing_mpi_reduction = 9 + integer(c_int), parameter, public :: skalaxc_timing_total_exc_vxc = 10 + integer(c_int), parameter, public :: skalaxc_timing_total_exc_gradient = 11 + + !> @brief Molecular integration-grid parameters. Interoperable (bind(C)) with + !> the C skalaxc_grid_settings_t. Obtain the built-in preset from + !> skalaxc_grid_settings_default(), then override individual components. + type, bind(C) :: skalaxc_grid_settings_t + !> @brief Pruning scheme (a skalaxc_pruningscheme_* value). + integer(c_int) :: pruning + !> @brief Grid-point batch size (> 0). + integer(c_int64_t) :: batch_size + !> @brief Radial quadrature (a skalaxc_radialquad_* value). + integer(c_int) :: radial_quad + !> @brief Atomic grid size preset (a skalaxc_atomicgridsize_* value). + integer(c_int) :: atomic_grid + end type skalaxc_grid_settings_t + + !> @brief CUDA device selection and GauXC memory-pool settings. + type, bind(C) :: skalaxc_device_runtime_settings_t + integer(c_int32_t) :: device_id + real(c_double) :: memory_fraction + end type skalaxc_device_runtime_settings_t + + !> @brief Lightweight, rank-local integrator diagnostics settings. + type, bind(C) :: skalaxc_timing_settings_t + !> Nonzero requests complete CUDA event timings when diagnostics are read. + integer(c_int32_t) :: verbose + !> Nonzero emits rank-local diagnostics to stderr. + integer(c_int32_t) :: debug_logging + end type skalaxc_timing_settings_t + + !> @brief XC-integrator construction settings. + type, bind(C) :: skalaxc_integrator_settings_t + type(skalaxc_timing_settings_t) :: timing + integer(c_int) :: domain_batch_mode + end type skalaxc_integrator_settings_t + + !> @brief Last and cumulative values for one timing phase. + type, bind(C) :: skalaxc_timing_value_t + integer(c_int64_t) :: last_nanoseconds + integer(c_int64_t) :: total_nanoseconds + integer(c_int64_t) :: call_count + integer(c_int32_t) :: status + end type skalaxc_timing_value_t + + !> @brief Rank-local diagnostics returned by an XC integrator. + type, bind(C) :: skalaxc_diagnostics_snapshot_t + integer(c_int32_t) :: backend + integer(c_int32_t) :: rank + integer(c_int32_t) :: communicator_size + integer(c_int32_t) :: device_id + integer(c_int32_t) :: openmp_threads + real(c_double) :: device_memory_fraction + integer(c_int32_t) :: domain_batch_mode + type(skalaxc_timing_value_t) :: timings(skalaxc_timing_metric_count) + integer(c_int64_t) :: exc_vxc_calls + integer(c_int64_t) :: exc_gradient_calls + integer(c_int64_t) :: model_batches + integer(c_int64_t) :: domains + integer(c_int64_t) :: tasks + integer(c_int64_t) :: points + integer(c_int64_t) :: local_atoms + integer(c_int64_t) :: configured_model_batches + integer(c_int64_t) :: task_points_min + integer(c_int64_t) :: task_points_max + integer(c_int64_t) :: task_basis_min + integer(c_int64_t) :: task_basis_max + integer(c_int64_t) :: model_batch_points_min + integer(c_int64_t) :: model_batch_points_max + integer(c_int64_t) :: max_domains_per_model_batch + end type skalaxc_diagnostics_snapshot_t + + ! --------------------------------------------------------------------------- + ! Pipeline handle types (each uniquely owns an opaque C handle). + ! Assignment is forbidden because copying would duplicate ownership. Use + ! destination%move_from(source) to transfer ownership and invalidate source. + ! --------------------------------------------------------------------------- + + !> @brief Runtime environment handle (mirrors SkalaXC::RuntimeEnvironment). + type :: skalaxc_runtime_environment_t + private + type(c_ptr) :: handle = c_null_ptr + contains + procedure :: comm_rank => rt_comm_rank + procedure :: comm_size => rt_comm_size + procedure :: is_valid => rt_is_valid + procedure :: move_from => rt_move_from + procedure, private :: rt_assign + generic, public :: assignment(=) => rt_assign + final :: rt_destroy + end type skalaxc_runtime_environment_t + + !> @brief Molecule handle (mirrors SkalaXC::Molecule). + type :: skalaxc_molecule_t + private + type(c_ptr) :: handle = c_null_ptr + contains + procedure :: create => mol_create + procedure :: add_atom => mol_add_atom + procedure :: from_arrays => mol_from_arrays +#ifdef SKALAXC_HAS_HDF5 + procedure :: from_hdf5 => mol_from_hdf5 +#endif + procedure :: natoms => mol_natoms + procedure :: is_valid => mol_is_valid + procedure :: move_from => mol_move_from + procedure, private :: mol_assign + generic, public :: assignment(=) => mol_assign + final :: mol_destroy + end type skalaxc_molecule_t + + !> @brief Basis-set handle (mirrors SkalaXC::BasisSet). + type :: skalaxc_basisset_t + private + type(c_ptr) :: handle = c_null_ptr + contains + procedure :: create => bas_create + procedure :: add_shell => bas_add_shell + procedure :: from_arrays => bas_from_arrays +#ifdef SKALAXC_HAS_HDF5 + procedure :: from_hdf5 => bas_from_hdf5 +#endif + procedure :: nbf => bas_nbf + procedure :: is_valid => bas_is_valid + procedure :: move_from => bas_move_from + procedure, private :: bas_assign + generic, public :: assignment(=) => bas_assign + final :: bas_destroy + end type skalaxc_basisset_t + + !> @brief Molecular-grid handle (mirrors SkalaXC::MolGrid). + type :: skalaxc_molgrid_t + private + type(c_ptr) :: handle = c_null_ptr + contains + procedure :: create_default => mg_create_default + procedure :: is_valid => mg_is_valid + procedure :: move_from => mg_move_from + procedure, private :: mg_assign + generic, public :: assignment(=) => mg_assign + final :: mg_destroy + end type skalaxc_molgrid_t + + !> @brief Load-balancer handle (mirrors SkalaXC::LoadBalancer). + type :: skalaxc_load_balancer_t + private + type(c_ptr) :: handle = c_null_ptr + contains + procedure :: create => lb_create + procedure :: is_valid => lb_is_valid + procedure :: move_from => lb_move_from + procedure, private :: lb_assign + generic, public :: assignment(=) => lb_assign + final :: lb_destroy + end type skalaxc_load_balancer_t + + !> @brief Molecular-weights handle (mirrors SkalaXC::MolecularWeights). + type :: skalaxc_molecular_weights_t + private + type(c_ptr) :: handle = c_null_ptr + contains + procedure :: create => mw_create + procedure :: modify_weights => mw_modify_weights + procedure :: is_valid => mw_is_valid + procedure :: move_from => mw_move_from + procedure, private :: mw_assign + generic, public :: assignment(=) => mw_assign + final :: mw_destroy + end type skalaxc_molecular_weights_t + + !> @brief Functional handle (mirrors SkalaXC::functional_type). + type :: skalaxc_functional_t + private + type(c_ptr) :: handle = c_null_ptr + contains + procedure :: create => func_create + procedure :: is_valid => func_is_valid + procedure :: move_from => func_move_from + procedure, private :: func_assign + generic, public :: assignment(=) => func_assign + final :: func_destroy + end type skalaxc_functional_t + + !> @brief XC-integrator handle (mirrors SkalaXC::XCIntegrator). + !> + !> One instance must not be used concurrently from multiple threads. + !> Serialize access or use a separate integrator per calling thread. + type :: skalaxc_xc_integrator_t + private + type(c_ptr) :: handle = c_null_ptr + contains + procedure :: create => xc_create + procedure :: nbf => xc_nbf + procedure :: natoms => xc_natoms + procedure :: eval_exc_vxc_uks => xc_eval_exc_vxc_uks + procedure :: eval_exc_grad_uks => xc_eval_exc_grad_uks + procedure :: diagnostics => xc_diagnostics + procedure :: reset_diagnostics => xc_reset_diagnostics + procedure :: is_valid => xc_is_valid + procedure :: move_from => xc_move_from + procedure, private :: xc_assign + generic, public :: assignment(=) => xc_assign + final :: xc_destroy + end type skalaxc_xc_integrator_t + + ! --------------------------------------------------------------------------- + ! Raw C bindings (private). + ! --------------------------------------------------------------------------- + interface + ! -- Runtime environment ------------------------------------------------ +#ifdef SKALAXC_HAS_MPI + function c_runtime_create_f(comm, out) & + bind(C, name="skalaxc_runtime_environment_create_f") result(status) + import :: c_int, c_ptr + integer(c_int), value :: comm + type(c_ptr), intent(inout) :: out + integer(c_int) :: status + end function c_runtime_create_f + + function c_device_runtime_create_f(comm, settings, out) & + bind(C, name="skalaxc_device_runtime_environment_create_f") result(status) + import :: c_int, c_ptr, skalaxc_device_runtime_settings_t + integer(c_int), value :: comm + type(skalaxc_device_runtime_settings_t), intent(in) :: settings + type(c_ptr), intent(inout) :: out + integer(c_int) :: status + end function c_device_runtime_create_f +#else + function c_runtime_create(out) & + bind(C, name="skalaxc_runtime_environment_create") result(status) + import :: c_int, c_ptr + type(c_ptr), intent(inout) :: out + integer(c_int) :: status + end function c_runtime_create + + function c_device_runtime_create(settings, out) & + bind(C, name="skalaxc_device_runtime_environment_create") result(status) + import :: c_int, c_ptr, skalaxc_device_runtime_settings_t + type(skalaxc_device_runtime_settings_t), intent(in) :: settings + type(c_ptr), intent(inout) :: out + integer(c_int) :: status + end function c_device_runtime_create +#endif + + function c_runtime_comm_rank(rt) & + bind(C, name="skalaxc_runtime_environment_comm_rank") result(r) + import :: c_ptr, c_int + type(c_ptr), value :: rt + integer(c_int) :: r + end function c_runtime_comm_rank + + function c_runtime_comm_size(rt) & + bind(C, name="skalaxc_runtime_environment_comm_size") result(s) + import :: c_ptr, c_int + type(c_ptr), value :: rt + integer(c_int) :: s + end function c_runtime_comm_size + + subroutine c_runtime_destroy(rt) & + bind(C, name="skalaxc_runtime_environment_destroy") + import :: c_ptr + type(c_ptr), value :: rt + end subroutine c_runtime_destroy + + ! -- Molecule ----------------------------------------------------------- + function c_molecule_create(out) & + bind(C, name="skalaxc_molecule_create") result(status) + import :: c_ptr, c_int + type(c_ptr), intent(inout) :: out + integer(c_int) :: status + end function c_molecule_create + + function c_molecule_add_atom(mol, atnum, x, y, z) & + bind(C, name="skalaxc_molecule_add_atom") result(status) + import :: c_ptr, c_int, c_int64_t, c_double + type(c_ptr), value :: mol + integer(c_int64_t), value :: atnum + real(c_double), value :: x, y, z + integer(c_int) :: status + end function c_molecule_add_atom + + function c_molecule_from_arrays(natoms, Z, atom_xyz, out) & + bind(C, name="skalaxc_molecule_from_arrays") result(status) + import :: c_ptr, c_int, c_int64_t, c_double + integer(c_int64_t), value :: natoms + integer(c_int64_t), intent(in) :: Z(*) + real(c_double), intent(in) :: atom_xyz(*) + type(c_ptr), intent(inout) :: out + integer(c_int) :: status + end function c_molecule_from_arrays + +#ifdef SKALAXC_HAS_HDF5 + function c_molecule_from_hdf5(path, dset, out) & + bind(C, name="skalaxc_molecule_from_hdf5") result(status) + import :: c_ptr, c_int, c_char + character(kind=c_char), intent(in) :: path(*) + character(kind=c_char), intent(in) :: dset(*) + type(c_ptr), intent(inout) :: out + integer(c_int) :: status + end function c_molecule_from_hdf5 +#endif + + function c_molecule_natoms(mol) & + bind(C, name="skalaxc_molecule_natoms") result(n) + import :: c_ptr, c_int64_t + type(c_ptr), value :: mol + integer(c_int64_t) :: n + end function c_molecule_natoms + + subroutine c_molecule_destroy(mol) bind(C, name="skalaxc_molecule_destroy") + import :: c_ptr + type(c_ptr), value :: mol + end subroutine c_molecule_destroy + + ! -- Basis set ---------------------------------------------------------- + function c_basisset_create(out) & + bind(C, name="skalaxc_basisset_create") result(status) + import :: c_ptr, c_int + type(c_ptr), intent(inout) :: out + integer(c_int) :: status + end function c_basisset_create + + function c_basisset_add_shell(basis, l, pure, center_xyz, nprim, & + exponents, coefficients, normalize) & + bind(C, name="skalaxc_basisset_add_shell") result(status) + import :: c_ptr, c_int, c_int32_t, c_double + type(c_ptr), value :: basis + integer(c_int32_t), value :: l, pure, nprim, normalize + real(c_double), intent(in) :: center_xyz(*) + real(c_double), intent(in) :: exponents(*) + real(c_double), intent(in) :: coefficients(*) + integer(c_int) :: status + end function c_basisset_add_shell + + function c_basisset_from_arrays(nshells, shell_l, shell_pure, shell_xyz, & + shell_nprim, prim_exp, prim_coeff, out) & + bind(C, name="skalaxc_basisset_from_arrays") result(status) + import :: c_ptr, c_int, c_int32_t, c_int64_t, c_double + integer(c_int64_t), value :: nshells + integer(c_int32_t), intent(in) :: shell_l(*) + integer(c_int32_t), intent(in) :: shell_pure(*) + real(c_double), intent(in) :: shell_xyz(*) + integer(c_int32_t), intent(in) :: shell_nprim(*) + real(c_double), intent(in) :: prim_exp(*) + real(c_double), intent(in) :: prim_coeff(*) + type(c_ptr), intent(inout) :: out + integer(c_int) :: status + end function c_basisset_from_arrays + +#ifdef SKALAXC_HAS_HDF5 + function c_basisset_from_hdf5(path, dset, out) & + bind(C, name="skalaxc_basisset_from_hdf5") result(status) + import :: c_ptr, c_int, c_char + character(kind=c_char), intent(in) :: path(*) + character(kind=c_char), intent(in) :: dset(*) + type(c_ptr), intent(inout) :: out + integer(c_int) :: status + end function c_basisset_from_hdf5 +#endif + + function c_basisset_nbf(basis) & + bind(C, name="skalaxc_basisset_nbf") result(n) + import :: c_ptr, c_int64_t + type(c_ptr), value :: basis + integer(c_int64_t) :: n + end function c_basisset_nbf + + subroutine c_basisset_destroy(basis) bind(C, name="skalaxc_basisset_destroy") + import :: c_ptr + type(c_ptr), value :: basis + end subroutine c_basisset_destroy + + ! -- Molecular grid ----------------------------------------------------- + function c_molgrid_create_default(mol, grid, out) & + bind(C, name="skalaxc_molgrid_create_default") result(status) + import :: c_ptr, c_int + type(c_ptr), value :: mol + type(c_ptr), value :: grid + type(c_ptr), intent(inout) :: out + integer(c_int) :: status + end function c_molgrid_create_default + + subroutine c_molgrid_destroy(mg) bind(C, name="skalaxc_molgrid_destroy") + import :: c_ptr + type(c_ptr), value :: mg + end subroutine c_molgrid_destroy + + ! -- Load balancer ------------------------------------------------------ + function c_load_balancer_create(ex, rt, mol, mg, basis, out) & + bind(C, name="skalaxc_load_balancer_create") result(status) + import :: c_ptr, c_int + integer(c_int), value :: ex + type(c_ptr), value :: rt, mol, mg, basis + type(c_ptr), intent(inout) :: out + integer(c_int) :: status + end function c_load_balancer_create + + subroutine c_load_balancer_destroy(lb) & + bind(C, name="skalaxc_load_balancer_destroy") + import :: c_ptr + type(c_ptr), value :: lb + end subroutine c_load_balancer_destroy + + ! -- Molecular weights -------------------------------------------------- + function c_molecular_weights_create(ex, weight_alg, out) & + bind(C, name="skalaxc_molecular_weights_create") result(status) + import :: c_ptr, c_int + integer(c_int), value :: ex, weight_alg + type(c_ptr), intent(inout) :: out + integer(c_int) :: status + end function c_molecular_weights_create + + function c_molecular_weights_modify_weights(mw, lb) & + bind(C, name="skalaxc_molecular_weights_modify_weights") result(status) + import :: c_ptr, c_int + type(c_ptr), value :: mw, lb + integer(c_int) :: status + end function c_molecular_weights_modify_weights + + subroutine c_molecular_weights_destroy(mw) & + bind(C, name="skalaxc_molecular_weights_destroy") + import :: c_ptr + type(c_ptr), value :: mw + end subroutine c_molecular_weights_destroy + + ! -- Functional --------------------------------------------------------- + function c_functional_create(model, out) & + bind(C, name="skalaxc_functional_create") result(status) + import :: c_ptr, c_int, c_char + character(kind=c_char), intent(in) :: model(*) + type(c_ptr), intent(inout) :: out + integer(c_int) :: status + end function c_functional_create + + subroutine c_functional_destroy(func) & + bind(C, name="skalaxc_functional_destroy") + import :: c_ptr + type(c_ptr), value :: func + end subroutine c_functional_destroy + + ! -- XC integrator ------------------------------------------------------ + function c_integrator_create(ex, func, lb, out) & + bind(C, name="skalaxc_xc_integrator_create") result(status) + import :: c_ptr, c_int + integer(c_int), value :: ex + type(c_ptr), value :: func, lb + type(c_ptr), intent(inout) :: out + integer(c_int) :: status + end function c_integrator_create + + function c_integrator_create_with_timing(ex, func, lb, settings, out) & + bind(C, name="skalaxc_xc_integrator_create_with_timing") result(status) + import :: c_ptr, c_int, skalaxc_timing_settings_t + integer(c_int), value :: ex + type(c_ptr), value :: func, lb + type(skalaxc_timing_settings_t), intent(in) :: settings + type(c_ptr), intent(inout) :: out + integer(c_int) :: status + end function c_integrator_create_with_timing + + function c_integrator_create_with_settings(ex, func, lb, settings, out) & + bind(C, name="skalaxc_xc_integrator_create_with_settings") result(status) + import :: c_ptr, c_int, skalaxc_integrator_settings_t + integer(c_int), value :: ex + type(c_ptr), value :: func, lb + type(skalaxc_integrator_settings_t), intent(in) :: settings + type(c_ptr), intent(inout) :: out + integer(c_int) :: status + end function c_integrator_create_with_settings + + function c_integrator_nbf(xc) & + bind(C, name="skalaxc_xc_integrator_nbf") result(n) + import :: c_ptr, c_int64_t + type(c_ptr), value :: xc + integer(c_int64_t) :: n + end function c_integrator_nbf + + function c_integrator_natoms(xc) & + bind(C, name="skalaxc_xc_integrator_natoms") result(n) + import :: c_ptr, c_int64_t + type(c_ptr), value :: xc + integer(c_int64_t) :: n + end function c_integrator_natoms + + function c_integrator_eval(xc, Ps, Pz, VXCs, VXCz, exc_out) & + bind(C, name="skalaxc_xc_integrator_eval_exc_vxc_uks") result(status) + import :: c_ptr, c_double, c_int + type(c_ptr), value :: xc + real(c_double), intent(in) :: Ps(*) + real(c_double), intent(in) :: Pz(*) + real(c_double), intent(out) :: VXCs(*) + real(c_double), intent(out) :: VXCz(*) + real(c_double), intent(out) :: exc_out + integer(c_int) :: status + end function c_integrator_eval + + function c_integrator_eval_grad(xc, Ps, Pz, gradient_out) & + bind(C, name="skalaxc_xc_integrator_eval_exc_grad_uks") result(status) + import :: c_ptr, c_double, c_int + type(c_ptr), value :: xc + real(c_double), intent(in) :: Ps(*) + real(c_double), intent(in) :: Pz(*) + real(c_double), intent(out) :: gradient_out(*) + integer(c_int) :: status + end function c_integrator_eval_grad + + function c_integrator_diagnostics(xc, snapshot) & + bind(C, name="skalaxc_xc_integrator_get_diagnostics") result(status) + import :: c_ptr, c_int, skalaxc_diagnostics_snapshot_t + type(c_ptr), value :: xc + type(skalaxc_diagnostics_snapshot_t), intent(out) :: snapshot + integer(c_int) :: status + end function c_integrator_diagnostics + + function c_integrator_reset_diagnostics(xc) & + bind(C, name="skalaxc_xc_integrator_reset_diagnostics") result(status) + import :: c_ptr, c_int + type(c_ptr), value :: xc + integer(c_int) :: status + end function c_integrator_reset_diagnostics + + subroutine c_integrator_destroy(xc) & + bind(C, name="skalaxc_xc_integrator_destroy") + import :: c_ptr + type(c_ptr), value :: xc + end subroutine c_integrator_destroy + + ! -- Utilities ---------------------------------------------------------- + subroutine c_grid_defaults(settings) & + bind(C, name="skalaxc_grid_settings_default") + import :: skalaxc_grid_settings_t + type(skalaxc_grid_settings_t), intent(out) :: settings + end subroutine c_grid_defaults + + subroutine c_device_runtime_defaults(settings) & + bind(C, name="skalaxc_device_runtime_settings_default") + import :: skalaxc_device_runtime_settings_t + type(skalaxc_device_runtime_settings_t), intent(out) :: settings + end subroutine c_device_runtime_defaults + + subroutine c_timing_defaults(settings) & + bind(C, name="skalaxc_timing_settings_default") + import :: skalaxc_timing_settings_t + type(skalaxc_timing_settings_t), intent(out) :: settings + end subroutine c_timing_defaults + + subroutine c_integrator_defaults(settings) & + bind(C, name="skalaxc_integrator_settings_default") + import :: skalaxc_integrator_settings_t + type(skalaxc_integrator_settings_t), intent(out) :: settings + end subroutine c_integrator_defaults + + function c_version() bind(C, name="skalaxc_version") result(version) + import :: c_ptr + type(c_ptr) :: version + end function c_version + + function c_last_error() bind(C, name="skalaxc_last_error_message") result(msg) + import :: c_ptr + type(c_ptr) :: msg + end function c_last_error + end interface + +contains + + subroutine reject_handle_assignment(destination_valid, source_valid) + logical, intent(in) :: destination_valid, source_valid + write (error_unit, '(A,L1,A,L1,A)') & + 'SkalaXC handle assignment rejected (destination valid=', & + destination_valid, ', source valid=', source_valid, ')' + error stop "SkalaXC handles are non-copyable; use move_from" + end subroutine reject_handle_assignment + + ! ========================================================================== + ! Runtime environment + ! ========================================================================== + + !> @brief Create the runtime environment. + !> @param rt Runtime-environment handle to initialize. + !> @param comm MPI communicator handle (MPI builds only). + !> @return SKALAXC_SUCCESS on success, or an error status. +#ifdef SKALAXC_HAS_MPI + function skalaxc_runtime_environment_create(rt, comm, device_settings) result(status) + type(skalaxc_runtime_environment_t), intent(inout) :: rt + integer, intent(in) :: comm + type(skalaxc_device_runtime_settings_t), intent(in), optional :: device_settings + integer(c_int) :: status + type(c_ptr) :: new_handle + new_handle = c_null_ptr + if (present(device_settings)) then + status = c_device_runtime_create_f(int(comm, c_int), & + & device_settings, new_handle) + else + status = c_runtime_create_f(int(comm, c_int), new_handle) + end if + if (status == SKALAXC_SUCCESS) then + call rt_destroy(rt) + rt%handle = new_handle + end if + end function skalaxc_runtime_environment_create +#else + function skalaxc_runtime_environment_create(rt, device_settings) result(status) + type(skalaxc_runtime_environment_t), intent(inout) :: rt + type(skalaxc_device_runtime_settings_t), intent(in), optional :: device_settings + integer(c_int) :: status + type(c_ptr) :: new_handle + new_handle = c_null_ptr + if (present(device_settings)) then + status = c_device_runtime_create(device_settings, new_handle) + else + status = c_runtime_create(new_handle) + end if + if (status == SKALAXC_SUCCESS) then + call rt_destroy(rt) + rt%handle = new_handle + end if + end function skalaxc_runtime_environment_create +#endif + + !> @brief Calling rank within the environment (0 in serial builds). + function rt_comm_rank(this) result(r) + class(skalaxc_runtime_environment_t), intent(in) :: this + integer(c_int) :: r + r = c_runtime_comm_rank(this%handle) + end function rt_comm_rank + + !> @brief Number of cooperating ranks (1 in serial builds). + function rt_comm_size(this) result(s) + class(skalaxc_runtime_environment_t), intent(in) :: this + integer(c_int) :: s + s = c_runtime_comm_size(this%handle) + end function rt_comm_size + + !> @brief Finalize the handle (idempotent). + subroutine rt_destroy(this) + type(skalaxc_runtime_environment_t), intent(inout) :: this + if (c_associated(this%handle)) then + call c_runtime_destroy(this%handle) + this%handle = c_null_ptr + end if + end subroutine rt_destroy + + subroutine rt_assign(lhs, rhs) + class(skalaxc_runtime_environment_t), intent(inout) :: lhs + class(skalaxc_runtime_environment_t), intent(in) :: rhs + call reject_handle_assignment(lhs%is_valid(), rhs%is_valid()) + end subroutine rt_assign + + subroutine rt_move_from(this, source) + class(skalaxc_runtime_environment_t), intent(inout) :: this + class(skalaxc_runtime_environment_t), intent(inout) :: source + call rt_destroy(this) + this%handle = source%handle + source%handle = c_null_ptr + end subroutine rt_move_from + + !> @brief True if the handle is initialized. + logical function rt_is_valid(this) + class(skalaxc_runtime_environment_t), intent(in) :: this + rt_is_valid = c_associated(this%handle) + end function rt_is_valid + + ! ========================================================================== + ! Molecule + ! ========================================================================== + + !> @brief Create an empty molecule. + function mol_create(this) result(status) + class(skalaxc_molecule_t), intent(inout) :: this + integer(c_int) :: status + type(c_ptr) :: new_handle + new_handle = c_null_ptr + status = c_molecule_create(new_handle) + if (status == SKALAXC_SUCCESS) then + call mol_destroy(this) + this%handle = new_handle + end if + end function mol_create + + !> @brief Append an atom. + !> @param atnum Atomic number (named atnum to avoid clashing with z). + function mol_add_atom(this, atnum, x, y, z) result(status) + class(skalaxc_molecule_t), intent(inout) :: this + integer(c_int64_t), intent(in) :: atnum + real(c_double), intent(in) :: x, y, z + integer(c_int) :: status + status = c_molecule_add_atom(this%handle, atnum, x, y, z) + end function mol_add_atom + + !> @brief Create a molecule from native arrays. + function mol_from_arrays(this, Z, atom_xyz) result(status) + class(skalaxc_molecule_t), intent(inout) :: this + integer(c_int64_t), intent(in) :: Z(:) + real(c_double), intent(in) :: atom_xyz(:) + integer(c_int) :: status + type(c_ptr) :: new_handle + if (.not. is_contiguous(Z) .or. .not. is_contiguous(atom_xyz) .or. & + size(Z, kind=c_int64_t) > & + (huge(0_c_int64_t) - modulo(huge(0_c_int64_t), 3_c_int64_t))/3_c_int64_t .or. & + size(atom_xyz, kind=c_int64_t) /= 3_c_int64_t*size(Z, kind=c_int64_t)) then + status = SKALAXC_INVALID_ARGUMENT + return + end if + new_handle = c_null_ptr + status = c_molecule_from_arrays(int(size(Z), c_int64_t), Z, atom_xyz, new_handle) + if (status == SKALAXC_SUCCESS) then + call mol_destroy(this) + this%handle = new_handle + end if + end function mol_from_arrays + +#ifdef SKALAXC_HAS_HDF5 + !> @brief Create a molecule from an HDF5 record. + function mol_from_hdf5(this, path, dset) result(status) + class(skalaxc_molecule_t), intent(inout) :: this + character(len=*), intent(in) :: path + character(len=*), intent(in) :: dset + integer(c_int) :: status + type(c_ptr) :: new_handle + new_handle = c_null_ptr + status = c_molecule_from_hdf5(trim(path)//c_null_char, & + trim(dset)//c_null_char, new_handle) + if (status == SKALAXC_SUCCESS) then + call mol_destroy(this) + this%handle = new_handle + end if + end function mol_from_hdf5 +#endif + + !> @brief Number of atoms (-1 if the handle is null). + function mol_natoms(this) result(n) + class(skalaxc_molecule_t), intent(in) :: this + integer(c_int64_t) :: n + n = c_molecule_natoms(this%handle) + end function mol_natoms + + !> @brief Destroy the handle (idempotent). + subroutine mol_destroy(this) + type(skalaxc_molecule_t), intent(inout) :: this + if (c_associated(this%handle)) then + call c_molecule_destroy(this%handle) + this%handle = c_null_ptr + end if + end subroutine mol_destroy + + subroutine mol_assign(lhs, rhs) + class(skalaxc_molecule_t), intent(inout) :: lhs + class(skalaxc_molecule_t), intent(in) :: rhs + call reject_handle_assignment(lhs%is_valid(), rhs%is_valid()) + end subroutine mol_assign + + subroutine mol_move_from(this, source) + class(skalaxc_molecule_t), intent(inout) :: this + class(skalaxc_molecule_t), intent(inout) :: source + call mol_destroy(this) + this%handle = source%handle + source%handle = c_null_ptr + end subroutine mol_move_from + + !> @brief True if the handle is initialized. + logical function mol_is_valid(this) + class(skalaxc_molecule_t), intent(in) :: this + mol_is_valid = c_associated(this%handle) + end function mol_is_valid + + ! ========================================================================== + ! Basis set + ! ========================================================================== + + !> @brief Create an empty basis set. + function bas_create(this) result(status) + class(skalaxc_basisset_t), intent(inout) :: this + integer(c_int) :: status + type(c_ptr) :: new_handle + new_handle = c_null_ptr + status = c_basisset_create(new_handle) + if (status == SKALAXC_SUCCESS) then + call bas_destroy(this) + this%handle = new_handle + end if + end function bas_create + + !> @brief Append a contracted Gaussian shell. + !> @param normalize Optional; nonzero (default) normalizes the shell. + function bas_add_shell(this, l, pure, center_xyz, exponents, coefficients, & + normalize) result(status) + class(skalaxc_basisset_t), intent(inout) :: this + integer(c_int32_t), intent(in) :: l, pure + real(c_double), intent(in) :: center_xyz(:) + real(c_double), intent(in) :: exponents(:) + real(c_double), intent(in) :: coefficients(:) + integer(c_int32_t), intent(in), optional :: normalize + integer(c_int) :: status + integer(c_int32_t) :: norm + if (.not. is_contiguous(center_xyz) .or. & + .not. is_contiguous(exponents) .or. & + .not. is_contiguous(coefficients) .or. & + size(center_xyz, kind=c_int64_t) /= 3_c_int64_t .or. & + size(exponents, kind=c_int64_t) /= size(coefficients, kind=c_int64_t) .or. & + size(exponents, kind=c_int64_t) > int(huge(0_c_int32_t), c_int64_t)) then + status = SKALAXC_INVALID_ARGUMENT + return + end if + norm = 1 + if (present(normalize)) norm = normalize + status = c_basisset_add_shell(this%handle, l, pure, center_xyz, & + int(size(exponents), c_int32_t), & + exponents, coefficients, norm) + end function bas_add_shell + + !> @brief Create a basis set from native arrays. + function bas_from_arrays(this, shell_l, shell_pure, shell_xyz, shell_nprim, & + prim_exp, prim_coeff) result(status) + class(skalaxc_basisset_t), intent(inout) :: this + integer(c_int32_t), intent(in) :: shell_l(:) + integer(c_int32_t), intent(in) :: shell_pure(:) + real(c_double), intent(in) :: shell_xyz(:) + integer(c_int32_t), intent(in) :: shell_nprim(:) + real(c_double), intent(in) :: prim_exp(:) + real(c_double), intent(in) :: prim_coeff(:) + integer(c_int) :: status + type(c_ptr) :: new_handle + integer(c_int64_t) :: primitive_count + integer :: shell + if (.not. is_contiguous(shell_l) .or. & + .not. is_contiguous(shell_pure) .or. & + .not. is_contiguous(shell_xyz) .or. & + .not. is_contiguous(shell_nprim) .or. & + .not. is_contiguous(prim_exp) .or. & + .not. is_contiguous(prim_coeff) .or. & + size(shell_pure, kind=c_int64_t) /= size(shell_l, kind=c_int64_t) .or. & + size(shell_nprim, kind=c_int64_t) /= size(shell_l, kind=c_int64_t) .or. & + size(shell_l, kind=c_int64_t) > & + (huge(0_c_int64_t) - modulo(huge(0_c_int64_t), 3_c_int64_t))/3_c_int64_t .or. & + size(shell_xyz, kind=c_int64_t) /= 3_c_int64_t*size(shell_l, kind=c_int64_t) .or. & + size(prim_exp, kind=c_int64_t) /= size(prim_coeff, kind=c_int64_t)) then + status = SKALAXC_INVALID_ARGUMENT + return + end if + primitive_count = 0_c_int64_t + do shell = 1, size(shell_nprim) + if (shell_nprim(shell) < 0_c_int32_t .or. & + primitive_count > huge(primitive_count) - int(shell_nprim(shell), c_int64_t)) then + status = SKALAXC_INVALID_ARGUMENT + return + end if + primitive_count = primitive_count + int(shell_nprim(shell), c_int64_t) + end do + if (primitive_count /= size(prim_exp, kind=c_int64_t)) then + status = SKALAXC_INVALID_ARGUMENT + return + end if + new_handle = c_null_ptr + status = c_basisset_from_arrays(int(size(shell_l), c_int64_t), shell_l, & + shell_pure, shell_xyz, shell_nprim, & + prim_exp, prim_coeff, new_handle) + if (status == SKALAXC_SUCCESS) then + call bas_destroy(this) + this%handle = new_handle + end if + end function bas_from_arrays + +#ifdef SKALAXC_HAS_HDF5 + !> @brief Create a basis set from an HDF5 record. + function bas_from_hdf5(this, path, dset) result(status) + class(skalaxc_basisset_t), intent(inout) :: this + character(len=*), intent(in) :: path + character(len=*), intent(in) :: dset + integer(c_int) :: status + type(c_ptr) :: new_handle + new_handle = c_null_ptr + status = c_basisset_from_hdf5(trim(path)//c_null_char, & + trim(dset)//c_null_char, new_handle) + if (status == SKALAXC_SUCCESS) then + call bas_destroy(this) + this%handle = new_handle + end if + end function bas_from_hdf5 +#endif + + !> @brief Number of basis functions (-1 if the handle is null). + function bas_nbf(this) result(n) + class(skalaxc_basisset_t), intent(in) :: this + integer(c_int64_t) :: n + n = c_basisset_nbf(this%handle) + end function bas_nbf + + !> @brief Destroy the handle (idempotent). + subroutine bas_destroy(this) + type(skalaxc_basisset_t), intent(inout) :: this + if (c_associated(this%handle)) then + call c_basisset_destroy(this%handle) + this%handle = c_null_ptr + end if + end subroutine bas_destroy + + subroutine bas_assign(lhs, rhs) + class(skalaxc_basisset_t), intent(inout) :: lhs + class(skalaxc_basisset_t), intent(in) :: rhs + call reject_handle_assignment(lhs%is_valid(), rhs%is_valid()) + end subroutine bas_assign + + subroutine bas_move_from(this, source) + class(skalaxc_basisset_t), intent(inout) :: this + class(skalaxc_basisset_t), intent(inout) :: source + call bas_destroy(this) + this%handle = source%handle + source%handle = c_null_ptr + end subroutine bas_move_from + + !> @brief True if the handle is initialized. + logical function bas_is_valid(this) + class(skalaxc_basisset_t), intent(in) :: this + bas_is_valid = c_associated(this%handle) + end function bas_is_valid + + ! ========================================================================== + ! Molecular grid + ! ========================================================================== + + !> @brief Create a default molecular grid for a molecule. + !> @param grid Optional grid settings (default: built-in preset). + function mg_create_default(this, mol, grid) result(status) + class(skalaxc_molgrid_t), intent(inout) :: this + type(skalaxc_molecule_t), intent(in) :: mol + type(skalaxc_grid_settings_t), intent(in), optional :: grid + integer(c_int) :: status + type(skalaxc_grid_settings_t), target :: grid_local + type(c_ptr) :: grid_ptr, new_handle + grid_ptr = c_null_ptr + new_handle = c_null_ptr + if (present(grid)) then + grid_local = grid + grid_ptr = c_loc(grid_local) + end if + status = c_molgrid_create_default(mol%handle, grid_ptr, new_handle) + if (status == SKALAXC_SUCCESS) then + call mg_destroy(this) + this%handle = new_handle + end if + end function mg_create_default + + !> @brief Destroy the handle (idempotent). + subroutine mg_destroy(this) + type(skalaxc_molgrid_t), intent(inout) :: this + if (c_associated(this%handle)) then + call c_molgrid_destroy(this%handle) + this%handle = c_null_ptr + end if + end subroutine mg_destroy + + subroutine mg_assign(lhs, rhs) + class(skalaxc_molgrid_t), intent(inout) :: lhs + class(skalaxc_molgrid_t), intent(in) :: rhs + call reject_handle_assignment(lhs%is_valid(), rhs%is_valid()) + end subroutine mg_assign + + subroutine mg_move_from(this, source) + class(skalaxc_molgrid_t), intent(inout) :: this + class(skalaxc_molgrid_t), intent(inout) :: source + call mg_destroy(this) + this%handle = source%handle + source%handle = c_null_ptr + end subroutine mg_move_from + + !> @brief True if the handle is initialized. + logical function mg_is_valid(this) + class(skalaxc_molgrid_t), intent(in) :: this + mg_is_valid = c_associated(this%handle) + end function mg_is_valid + + ! ========================================================================== + ! Load balancer + ! ========================================================================== + + !> @brief Create a load balancer for the given system. + function lb_create(this, ex, rt, mol, mg, basis) result(status) + class(skalaxc_load_balancer_t), intent(inout) :: this + integer(c_int), intent(in) :: ex + type(skalaxc_runtime_environment_t), intent(in) :: rt + type(skalaxc_molecule_t), intent(in) :: mol + type(skalaxc_molgrid_t), intent(in) :: mg + type(skalaxc_basisset_t), intent(in) :: basis + integer(c_int) :: status + type(c_ptr) :: new_handle + new_handle = c_null_ptr + status = c_load_balancer_create(ex, rt%handle, mol%handle, mg%handle, & + basis%handle, new_handle) + if (status == SKALAXC_SUCCESS) then + call lb_destroy(this) + this%handle = new_handle + end if + end function lb_create + + !> @brief Destroy the handle (idempotent). + subroutine lb_destroy(this) + type(skalaxc_load_balancer_t), intent(inout) :: this + if (c_associated(this%handle)) then + call c_load_balancer_destroy(this%handle) + this%handle = c_null_ptr + end if + end subroutine lb_destroy + + subroutine lb_assign(lhs, rhs) + class(skalaxc_load_balancer_t), intent(inout) :: lhs + class(skalaxc_load_balancer_t), intent(in) :: rhs + call reject_handle_assignment(lhs%is_valid(), rhs%is_valid()) + end subroutine lb_assign + + subroutine lb_move_from(this, source) + class(skalaxc_load_balancer_t), intent(inout) :: this + class(skalaxc_load_balancer_t), intent(inout) :: source + call lb_destroy(this) + this%handle = source%handle + source%handle = c_null_ptr + end subroutine lb_move_from + + !> @brief True if the handle is initialized. + logical function lb_is_valid(this) + class(skalaxc_load_balancer_t), intent(in) :: this + lb_is_valid = c_associated(this%handle) + end function lb_is_valid + + ! ========================================================================== + ! Molecular weights + ! ========================================================================== + + !> @brief Create a molecular-weights partitioner. + function mw_create(this, ex, weight_alg) result(status) + class(skalaxc_molecular_weights_t), intent(inout) :: this + integer(c_int), intent(in) :: ex + integer(c_int), intent(in) :: weight_alg + integer(c_int) :: status + type(c_ptr) :: new_handle + new_handle = c_null_ptr + status = c_molecular_weights_create(ex, weight_alg, new_handle) + if (status == SKALAXC_SUCCESS) then + call mw_destroy(this) + this%handle = new_handle + end if + end function mw_create + + !> @brief Partition the quadrature weights stored on a load balancer. + function mw_modify_weights(this, lb) result(status) + class(skalaxc_molecular_weights_t), intent(in) :: this + type(skalaxc_load_balancer_t), intent(in) :: lb + integer(c_int) :: status + status = c_molecular_weights_modify_weights(this%handle, lb%handle) + end function mw_modify_weights + + !> @brief Destroy the handle (idempotent). + subroutine mw_destroy(this) + type(skalaxc_molecular_weights_t), intent(inout) :: this + if (c_associated(this%handle)) then + call c_molecular_weights_destroy(this%handle) + this%handle = c_null_ptr + end if + end subroutine mw_destroy + + subroutine mw_assign(lhs, rhs) + class(skalaxc_molecular_weights_t), intent(inout) :: lhs + class(skalaxc_molecular_weights_t), intent(in) :: rhs + call reject_handle_assignment(lhs%is_valid(), rhs%is_valid()) + end subroutine mw_assign + + subroutine mw_move_from(this, source) + class(skalaxc_molecular_weights_t), intent(inout) :: this + class(skalaxc_molecular_weights_t), intent(inout) :: source + call mw_destroy(this) + this%handle = source%handle + source%handle = c_null_ptr + end subroutine mw_move_from + + !> @brief True if the handle is initialized. + logical function mw_is_valid(this) + class(skalaxc_molecular_weights_t), intent(in) :: this + mw_is_valid = c_associated(this%handle) + end function mw_is_valid + + ! ========================================================================== + ! Functional + ! ========================================================================== + + !> @brief Create a functional from a Skala model selector. + function func_create(this, model) result(status) + class(skalaxc_functional_t), intent(inout) :: this + character(len=*), intent(in) :: model + integer(c_int) :: status + type(c_ptr) :: new_handle + new_handle = c_null_ptr + status = c_functional_create(trim(model)//c_null_char, new_handle) + if (status == SKALAXC_SUCCESS) then + call func_destroy(this) + this%handle = new_handle + end if + end function func_create + + !> @brief Destroy the handle (idempotent). + subroutine func_destroy(this) + type(skalaxc_functional_t), intent(inout) :: this + if (c_associated(this%handle)) then + call c_functional_destroy(this%handle) + this%handle = c_null_ptr + end if + end subroutine func_destroy + + subroutine func_assign(lhs, rhs) + class(skalaxc_functional_t), intent(inout) :: lhs + class(skalaxc_functional_t), intent(in) :: rhs + call reject_handle_assignment(lhs%is_valid(), rhs%is_valid()) + end subroutine func_assign + + subroutine func_move_from(this, source) + class(skalaxc_functional_t), intent(inout) :: this + class(skalaxc_functional_t), intent(inout) :: source + call func_destroy(this) + this%handle = source%handle + source%handle = c_null_ptr + end subroutine func_move_from + + !> @brief True if the handle is initialized. + logical function func_is_valid(this) + class(skalaxc_functional_t), intent(in) :: this + func_is_valid = c_associated(this%handle) + end function func_is_valid + + ! ========================================================================== + ! XC integrator + ! ========================================================================== + + !> @brief Create an XC integrator from a functional and weighted balancer. + function xc_create(this, ex, func, lb, timing_settings, & + domain_batch_mode) result(status) + class(skalaxc_xc_integrator_t), intent(inout) :: this + integer(c_int), intent(in) :: ex + type(skalaxc_functional_t), intent(in) :: func + type(skalaxc_load_balancer_t), intent(in) :: lb + type(skalaxc_timing_settings_t), intent(in), optional :: timing_settings + integer(c_int), intent(in), optional :: domain_batch_mode + integer(c_int) :: status + type(skalaxc_integrator_settings_t) :: integrator_settings + type(c_ptr) :: new_handle + new_handle = c_null_ptr + if (present(timing_settings) .or. present(domain_batch_mode)) then + integrator_settings = skalaxc_integrator_settings_default() + if (present(timing_settings)) & + & integrator_settings%timing = timing_settings + if (present(domain_batch_mode)) & + & integrator_settings%domain_batch_mode = domain_batch_mode + status = c_integrator_create_with_settings(ex, func%handle, & + & lb%handle, integrator_settings, new_handle) + else + status = c_integrator_create(ex, func%handle, lb%handle, new_handle) + end if + if (status == SKALAXC_SUCCESS) then + call xc_destroy(this) + this%handle = new_handle + end if + end function xc_create + + !> @brief Number of basis functions (-1 if the handle is null). + function xc_nbf(this) result(n) + class(skalaxc_xc_integrator_t), intent(in) :: this + integer(c_int64_t) :: n + n = c_integrator_nbf(this%handle) + end function xc_nbf + + !> @brief Number of atoms (-1 if the handle is null). + function xc_natoms(this) result(n) + class(skalaxc_xc_integrator_t), intent(in) :: this + integer(c_int64_t) :: n + n = c_integrator_natoms(this%handle) + end function xc_natoms + + !> @brief Evaluate the UKS ML exchange-correlation energy and potential. + !> @param Ps Scalar spin-density matrix, length nbf*nbf, column-major. + !> @param Pz Z spin-density matrix, length nbf*nbf, column-major. + !> @param VXCs [out] Scalar XC potential, length nbf*nbf, column-major. + !> @param VXCz [out] Z XC potential, length nbf*nbf, column-major. + !> @param exc [out] Exchange-correlation energy. + function xc_eval_exc_vxc_uks(this, Ps, Pz, VXCs, VXCz, exc) result(status) + class(skalaxc_xc_integrator_t), intent(in) :: this + real(c_double), intent(in) :: Ps(:) + real(c_double), intent(in) :: Pz(:) + real(c_double), intent(out) :: VXCs(:) + real(c_double), intent(out) :: VXCz(:) + real(c_double), intent(out) :: exc + integer(c_int) :: status + integer(c_int64_t) :: nbf, matrix_size + nbf = this%nbf() + if (nbf < 0_c_int64_t .or. & + nbf > huge(0_c_int64_t)/max(1_c_int64_t, nbf)) then + status = SKALAXC_INVALID_ARGUMENT + return + end if + matrix_size = nbf*nbf + if (.not. is_contiguous(Ps) .or. .not. is_contiguous(Pz) .or. & + .not. is_contiguous(VXCs) .or. .not. is_contiguous(VXCz) .or. & + size(Ps, kind=c_int64_t) /= matrix_size .or. & + size(Pz, kind=c_int64_t) /= matrix_size .or. & + size(VXCs, kind=c_int64_t) /= matrix_size .or. & + size(VXCz, kind=c_int64_t) /= matrix_size) then + status = SKALAXC_INVALID_ARGUMENT + return + end if + status = c_integrator_eval(this%handle, Ps, Pz, VXCs, VXCz, exc) + end function xc_eval_exc_vxc_uks + + !> @brief Evaluate the UKS ML exchange-correlation energy gradient. + !> @param Ps Scalar spin-density matrix, length nbf*nbf, column-major. + !> @param Pz Z spin-density matrix, length nbf*nbf, column-major. + !> @param gradient [out] Atom-major Cartesian gradient, length 3*natoms. + function xc_eval_exc_grad_uks(this, Ps, Pz, gradient) result(status) + class(skalaxc_xc_integrator_t), intent(in) :: this + real(c_double), intent(in) :: Ps(:) + real(c_double), intent(in) :: Pz(:) + real(c_double), intent(out) :: gradient(:) + integer(c_int) :: status + integer(c_int64_t) :: nbf, natoms, matrix_size + nbf = this%nbf() + natoms = this%natoms() + if (nbf < 0_c_int64_t .or. natoms < 0_c_int64_t .or. & + nbf > huge(0_c_int64_t)/max(1_c_int64_t, nbf) .or. & + natoms > (huge(0_c_int64_t) - & + modulo(huge(0_c_int64_t), 3_c_int64_t))/3_c_int64_t) then + status = SKALAXC_INVALID_ARGUMENT + return + end if + matrix_size = nbf*nbf + if (.not. is_contiguous(Ps) .or. .not. is_contiguous(Pz) .or. & + .not. is_contiguous(gradient) .or. & + size(Ps, kind=c_int64_t) /= matrix_size .or. & + size(Pz, kind=c_int64_t) /= matrix_size .or. & + size(gradient, kind=c_int64_t) /= 3_c_int64_t*natoms) then + status = SKALAXC_INVALID_ARGUMENT + return + end if + status = c_integrator_eval_grad(this%handle, Ps, Pz, gradient) + end function xc_eval_exc_grad_uks + + !> @brief Retrieve rank-local diagnostics without an MPI collective. + function xc_diagnostics(this, snapshot) result(status) + class(skalaxc_xc_integrator_t), intent(in) :: this + type(skalaxc_diagnostics_snapshot_t), intent(out) :: snapshot + integer(c_int) :: status + status = c_integrator_diagnostics(this%handle, snapshot) + end function xc_diagnostics + + !> @brief Clear evaluation timings and counters. + function xc_reset_diagnostics(this) result(status) + class(skalaxc_xc_integrator_t), intent(in) :: this + integer(c_int) :: status + status = c_integrator_reset_diagnostics(this%handle) + end function xc_reset_diagnostics + + !> @brief Destroy the handle (idempotent). + subroutine xc_destroy(this) + type(skalaxc_xc_integrator_t), intent(inout) :: this + if (c_associated(this%handle)) then + call c_integrator_destroy(this%handle) + this%handle = c_null_ptr + end if + end subroutine xc_destroy + + subroutine xc_assign(lhs, rhs) + class(skalaxc_xc_integrator_t), intent(inout) :: lhs + class(skalaxc_xc_integrator_t), intent(in) :: rhs + call reject_handle_assignment(lhs%is_valid(), rhs%is_valid()) + end subroutine xc_assign + + subroutine xc_move_from(this, source) + class(skalaxc_xc_integrator_t), intent(inout) :: this + class(skalaxc_xc_integrator_t), intent(inout) :: source + call xc_destroy(this) + this%handle = source%handle + source%handle = c_null_ptr + end subroutine xc_move_from + + !> @brief True if the handle is initialized. + logical function xc_is_valid(this) + class(skalaxc_xc_integrator_t), intent(in) :: this + xc_is_valid = c_associated(this%handle) + end function xc_is_valid + + ! ========================================================================== + ! Utilities + ! ========================================================================== + + !> @brief Return the SkalaXC semantic version as a Fortran string. + function skalaxc_version() result(version) + character(len=:), allocatable :: version + version = fortran_string(c_version()) + end function skalaxc_version + + !> @brief Most recent error message on the calling thread (Fortran string). + function skalaxc_last_error() result(msg) + character(len=:), allocatable :: msg + msg = fortran_string(c_last_error()) + end function skalaxc_last_error + + function fortran_string(cptr) result(msg) + type(c_ptr), intent(in), value :: cptr + character(len=:), allocatable :: msg + character(kind=c_char), pointer :: cstr(:) + integer :: n + if (.not. c_associated(cptr)) then + msg = '' + return + end if + call c_f_pointer(cptr, cstr, [huge(0)]) + n = 0 + do + if (cstr(n + 1) == c_null_char) exit + n = n + 1 + end do + allocate (character(len=n) :: msg) + block + integer :: i + do i = 1, n + msg(i:i) = cstr(i) + end do + end block + end function fortran_string + + !> @brief Grid settings pre-filled with the SkalaXC built-in preset. + function skalaxc_grid_settings_default() result(grid) + type(skalaxc_grid_settings_t) :: grid + call c_grid_defaults(grid) + end function skalaxc_grid_settings_default + + !> @brief Return the built-in CUDA runtime settings. + function skalaxc_device_runtime_settings_default() result(settings) + type(skalaxc_device_runtime_settings_t) :: settings + call c_device_runtime_defaults(settings) + end function skalaxc_device_runtime_settings_default + + !> @brief Return non-synchronizing timing settings. + function skalaxc_timing_settings_default() result(settings) + type(skalaxc_timing_settings_t) :: settings + call c_timing_defaults(settings) + end function skalaxc_timing_settings_default + + !> @brief Return conservative XC-integrator construction settings. + function skalaxc_integrator_settings_default() result(settings) + type(skalaxc_integrator_settings_t) :: settings + call c_integrator_defaults(settings) + end function skalaxc_integrator_settings_default + +end module skalaxc From 1ed798e116e2de776b8207f8fe86b69dc5f97214 Mon Sep 17 00:00:00 2001 From: jenswehner Date: Fri, 4 Sep 2026 11:36:33 +0200 Subject: [PATCH 09/33] Add CUDA backend and native build --- SkalaXC/CMakeLists.txt | 316 +++++++++ .../cmake/skalaxc-check-cuda-compiler.cmake | 63 ++ SkalaXC/src/CMakeLists.txt | 186 ++++++ SkalaXC/src/device/CMakeLists.txt | 37 ++ SkalaXC/src/device/common/model_grid.hpp | 98 +++ SkalaXC/src/device/common/skala.hpp | 36 ++ SkalaXC/src/device/common/skala_exc_grad.hpp | 38 ++ SkalaXC/src/device/cuda/kernels/model_grid.cu | 274 ++++++++ SkalaXC/src/device/cuda/kernels/skala.cu | 286 ++++++++ .../src/device/cuda/kernels/skala_exc_grad.cu | 102 +++ .../src/device/cuda/kernels/spin_channels.cuh | 25 + SkalaXC/src/device/cuda_launch_check.hpp | 26 + SkalaXC/src/device/model_grid_exchange.cxx | 609 ++++++++++++++++++ SkalaXC/src/device/model_grid_exchange.hpp | 188 ++++++ SkalaXC/src/device/skala_device_driver.cxx | 548 ++++++++++++++++ SkalaXC/src/device/skala_device_driver.hpp | 84 +++ 16 files changed, 2916 insertions(+) create mode 100644 SkalaXC/CMakeLists.txt create mode 100644 SkalaXC/cmake/skalaxc-check-cuda-compiler.cmake create mode 100644 SkalaXC/src/CMakeLists.txt create mode 100644 SkalaXC/src/device/CMakeLists.txt create mode 100644 SkalaXC/src/device/common/model_grid.hpp create mode 100644 SkalaXC/src/device/common/skala.hpp create mode 100644 SkalaXC/src/device/common/skala_exc_grad.hpp create mode 100644 SkalaXC/src/device/cuda/kernels/model_grid.cu create mode 100644 SkalaXC/src/device/cuda/kernels/skala.cu create mode 100644 SkalaXC/src/device/cuda/kernels/skala_exc_grad.cu create mode 100644 SkalaXC/src/device/cuda/kernels/spin_channels.cuh create mode 100644 SkalaXC/src/device/cuda_launch_check.hpp create mode 100644 SkalaXC/src/device/model_grid_exchange.cxx create mode 100644 SkalaXC/src/device/model_grid_exchange.hpp create mode 100644 SkalaXC/src/device/skala_device_driver.cxx create mode 100644 SkalaXC/src/device/skala_device_driver.hpp diff --git a/SkalaXC/CMakeLists.txt b/SkalaXC/CMakeLists.txt new file mode 100644 index 00000000..1ed7b175 --- /dev/null +++ b/SkalaXC/CMakeLists.txt @@ -0,0 +1,316 @@ +cmake_minimum_required(VERSION 3.21 FATAL_ERROR) + +# SkalaXC: standalone ML exchange-correlation functional library. + +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the build type" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + Debug Release RelWithDebInfo MinSizeRel) +endif() + +project(SkalaXC VERSION 0.1.0 LANGUAGES C CXX) + +list(PREPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) +include(GNUInstallDirs) + +function(_skalaxc_enable_warnings target_name) + + target_compile_options(${target_name} PRIVATE + "$<$:-Wall>" + "$<$:-Wextra>" + "$<$:-Wpedantic>" + "$<$:-Xcompiler=-Wall>" + "$<$:-Xcompiler=-Wextra>" + "$<$:-Wall>" + "$<$:-Wextra>" + ) + + + target_compile_options(${target_name} PRIVATE + "$<$:-Wall>" + "$<$:-Wextra>" + "$<$:-Wpedantic>" + ) +endfunction() + +# ---------------------------------------------------------------------------- +# Options +# ---------------------------------------------------------------------------- +option(SKALAXC_ENABLE_CUDA "Enable the CUDA (GPU) backend" OFF) +option(SKALAXC_ENABLE_MPI "Enable MPI support" OFF) +option(SKALAXC_ENABLE_OPENMP "Enable OpenMP support" ON) +option(SKALAXC_ENABLE_HDF5 "Enable HDF5 molecule and basis-set I/O" ON) +option(SKALAXC_BUILD_FORTRAN "Build the SkalaXC Fortran API (iso_c_binding)" ON) +option(SKALAXC_BUILD_TESTS "Build SkalaXC tests" OFF) +option(SKALAXC_BUILD_EXAMPLES "Build the SkalaXC C/C++/Fortran example programs" OFF) +option(SKALAXC_BUILD_DOCS "Build project-wide SkalaXC Doxygen documentation" OFF) +option(SKALAXC_DOWNLOAD_MODELS "Download baseline .fun models when required and missing" ON) +option(SKALAXC_ENABLE_SANITIZERS "Enable AddressSanitizer and UndefinedBehaviorSanitizer" OFF) +set(SKALAXC_INSTALL_RPATH "" CACHE STRING + "Optional relocatable install RPATH for libskalaxc") + +if(SKALAXC_ENABLE_SANITIZERS) + if(NOT CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") + message(FATAL_ERROR + "SKALAXC_ENABLE_SANITIZERS requires a GNU or Clang toolchain") + endif() + add_compile_options( + "$<$:-fsanitize=address,undefined>" + "$<$:-fno-omit-frame-pointer>") + add_link_options(-fsanitize=address,undefined) +endif() + +set(SKALAXC_MODEL_PATH "${PROJECT_SOURCE_DIR}/data/skala_models" + CACHE PATH "Path to directory containing bundled SkalaXC .fun models") +set(SKALAXC_MODEL_DOWNLOAD_DIR "${PROJECT_BINARY_DIR}/data/skala_models" + CACHE PATH "Directory used when SKALAXC_DOWNLOAD_MODELS=ON") +set(SKALAXC_MODEL_PATH_INSTALL "${CMAKE_INSTALL_FULL_DATADIR}/skalaxc/skala_models" + CACHE PATH "Installed directory containing SkalaXC .fun models") + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +if(NOT BLAS_LIBRARIES AND DEFINED ENV{CONDA_PREFIX}) + find_library(_skalaxc_conda_blas + NAMES blas + HINTS "$ENV{CONDA_PREFIX}/lib" + NO_DEFAULT_PATH) + if(_skalaxc_conda_blas) + set(BLAS_LIBRARIES "${_skalaxc_conda_blas}" CACHE STRING + "BLAS library selected from the active Conda or Pixi environment") + endif() + unset(_skalaxc_conda_blas CACHE) +endif() + +if(SKALAXC_BUILD_DOCS) + find_package(Doxygen 1.9 REQUIRED) + set(SKALAXC_DOXYGEN_SOURCE_DIR "${PROJECT_SOURCE_DIR}") + set(SKALAXC_DOXYGEN_BINARY_DIR "${PROJECT_BINARY_DIR}") + set(SKALAXC_DOXYGEN_PROJECT_VERSION "${PROJECT_VERSION}") + include(skalaxc-doxygen) + add_custom_target(skalaxc_doxygen + COMMAND "${DOXYGEN_EXECUTABLE}" "${PROJECT_BINARY_DIR}/Doxyfile" + WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}" + COMMENT "Generating strict project-wide SkalaXC documentation" + VERBATIM + ) +endif() + +# The Fortran API binds only to the C API via iso_c_binding; enable the language +# lazily so C/C++-only consumers never need a Fortran compiler. +if(SKALAXC_BUILD_FORTRAN) + include(CheckLanguage) + check_language(Fortran) + if(NOT CMAKE_Fortran_COMPILER) + message(FATAL_ERROR + "SKALAXC_BUILD_FORTRAN=ON but no Fortran compiler was found. " + "Install a Fortran compiler (for example gfortran) or rerun with " + "-DSKALAXC_BUILD_FORTRAN=OFF.") + endif() + enable_language(Fortran) +endif() + +# The CUDA (GPU) backend is optional and OFF by default. Enable the CUDA language +# lazily and only if a CUDA compiler is actually present, so the host build is +# never affected on machines without a CUDA toolchain. If the option is ON but no +# compiler is found we downgrade to a warning rather than failing the configure. +if(SKALAXC_ENABLE_CUDA) + find_package(CUDAToolkit QUIET) + if(CUDAToolkit_FOUND) + include(skalaxc-check-cuda-compiler) + _skalaxc_check_cuda_compiler_compatibility("${CUDAToolkit_VERSION}") + endif() + + include(CheckLanguage) + check_language(CUDA) + if(CMAKE_CUDA_COMPILER) + enable_language(CUDA) + else() + message(WARNING + "SKALAXC_ENABLE_CUDA=ON but no CUDA compiler was found; " + "the SkalaXC CUDA backend will be skipped.") + set(SKALAXC_ENABLE_CUDA OFF) + endif() +endif() + +# Ensure baseline models are available when requested. Runtime users can +# override named-model lookup with the SKALAXC_MODEL_PATH environment variable. +set(_skalaxc_required_models ldax.fun pbe.fun tpss.fun skala-1.1.fun) +if(SKALAXC_ENABLE_CUDA) + list(APPEND _skalaxc_required_models skala-1.1-cuda.fun) +endif() +set(_skalaxc_models_missing FALSE) +foreach(_skalaxc_model IN LISTS _skalaxc_required_models) + if(NOT EXISTS "${SKALAXC_MODEL_PATH}/${_skalaxc_model}") + set(_skalaxc_models_missing TRUE) + endif() +endforeach() +if(SKALAXC_DOWNLOAD_MODELS AND + (SKALAXC_BUILD_TESTS OR SKALAXC_BUILD_EXAMPLES OR + _skalaxc_models_missing)) + include(skalaxc-models) + skalaxc_download_baseline_models( + "${SKALAXC_MODEL_DOWNLOAD_DIR}" + ${_skalaxc_required_models} + ) + set(SKALAXC_MODEL_PATH "${SKALAXC_MODEL_DOWNLOAD_DIR}" CACHE PATH + "Path to directory containing bundled SkalaXC .fun models" FORCE) + message(STATUS "SkalaXC: using downloaded verified models at ${SKALAXC_MODEL_PATH}") +endif() +unset(_skalaxc_model) +unset(_skalaxc_models_missing) +unset(_skalaxc_required_models) + +# ---------------------------------------------------------------------------- +# ABI isolation: hide all symbols by default. Only the SkalaXC public API +# (skalaxc_* / SkalaXC_*) is exported, enforced by the version script wired onto +# the final shared library in src/. This prevents GauXC / LibTorch symbol +# clashes with a host application that links its own GauXC. +# ---------------------------------------------------------------------------- +set(CMAKE_CXX_VISIBILITY_PRESET hidden) +set(CMAKE_C_VISIBILITY_PRESET hidden) +set(CMAKE_VISIBILITY_INLINES_HIDDEN ON) + +# ---------------------------------------------------------------------------- +# GauXC master (source-tree dependency) -> provides target `gauxc` +# ---------------------------------------------------------------------------- +include(skalaxc-gauxc) +if(SKALAXC_ENABLE_HDF5 AND NOT GAUXC_HAS_HDF5) + message(FATAL_ERROR + "SKALAXC_ENABLE_HDF5=ON, but GauXC could not enable HDF5 support. " + "Install HDF5 or configure with -DSKALAXC_ENABLE_HDF5=OFF.") +endif() +set(SKALAXC_HAS_HDF5 ${GAUXC_HAS_HDF5}) +message(STATUS "SkalaXC: HDF5 support ${SKALAXC_HAS_HDF5}") +# ML VXC/gradient CUDA kernels are defined before the core so the latter can +# link their private launchers when CUDA is enabled. +if(SKALAXC_ENABLE_CUDA) +add_subdirectory(src/device) +endif() +# ---------------------------------------------------------------------------- +# SkalaXC library: the ML exchange-correlation functional built on GauXC's +# reusable internals. Requires LibTorch + nlohmann_json. +# ---------------------------------------------------------------------------- +include(skalaxc-skala) # LibTorch + nlohmann_json +add_subdirectory(src) +if(SKALAXC_BUILD_FORTRAN) +add_subdirectory(src/fortran) +endif() +# ML VXC/gradient CUDA kernels (option-gated; see src/device/CMakeLists.txt). +# OFF by default -- never compiled on a host-only toolchain. +# Minimal C/C++/Fortran consumer examples (option-gated; see examples/). +if(SKALAXC_BUILD_EXAMPLES) +add_subdirectory(examples) +endif() + + + +# ---------------------------------------------------------------------------- +# Tests (white-box reference-integration harness; may use GauXC internals in-build). +# ---------------------------------------------------------------------------- +if(SKALAXC_BUILD_TESTS) + enable_testing() + add_subdirectory(tests) +endif() + +set(_skalaxc_owned_targets + skalaxc_cuda + skalaxc_core + skalaxc + skalaxc_fortran + skalaxc_eval_cpp + skalaxc_eval_c + skalaxc_eval_fortran + skalaxc_unit_test + skalaxc_public_api_test + skalaxc_c_api_test + skalaxc_fortran_test +) +foreach(_skalaxc_target IN LISTS _skalaxc_owned_targets) + if(TARGET ${_skalaxc_target}) + _skalaxc_enable_warnings(${_skalaxc_target}) + endif() +endforeach() + +# Catch2 v2 uses __COUNTER__ for test registration, which Clang 22 diagnoses +# as a C2y extension under -Wpedantic. +if(TARGET skalaxc_unit_test) + target_compile_options(skalaxc_unit_test PRIVATE + "$<$:-Wno-c2y-extensions>" + ) +endif() + +unset(_skalaxc_target) +unset(_skalaxc_owned_targets) + +# ---------------------------------------------------------------------------- +# Installable public package. Private GauXC, Torch, Eigen, and core targets are +# deliberately absent from this export. +# ---------------------------------------------------------------------------- +set(SKALAXC_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/SkalaXC") +set(SKALAXC_INSTALL_MODEL_DIR + "${CMAKE_INSTALL_DATADIR}/skalaxc/skala_models") + +install(TARGETS skalaxc + EXPORT SkalaXCCoreTargets + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT Core + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT Core + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT Core + INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) +if(SKALAXC_BUILD_FORTRAN) + install(TARGETS skalaxc_fortran + EXPORT SkalaXCFortranTargets + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT Fortran + INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) + get_target_property(_skalaxc_fortran_module_dir skalaxc_fortran + Fortran_MODULE_DIRECTORY) + install(DIRECTORY "${_skalaxc_fortran_module_dir}/" + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + COMPONENT Fortran + OPTIONAL + FILES_MATCHING PATTERN "*.mod") + unset(_skalaxc_fortran_module_dir) +endif() + +install(DIRECTORY "${PROJECT_SOURCE_DIR}/include/skalaxc" + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + COMPONENT Core + PATTERN "*.in" EXCLUDE) +install(FILES "${PROJECT_BINARY_DIR}/include/skalaxc/c/config.h" + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/skalaxc/c + COMPONENT Core) +install(DIRECTORY "${SKALAXC_MODEL_PATH}/" + DESTINATION ${SKALAXC_INSTALL_MODEL_DIR} + COMPONENT Core + OPTIONAL + FILES_MATCHING PATTERN "*.fun") + +include(CMakePackageConfigHelpers) +configure_package_config_file( + "${PROJECT_SOURCE_DIR}/cmake/SkalaXCConfig.cmake.in" + "${PROJECT_BINARY_DIR}/SkalaXCConfig.cmake" + INSTALL_DESTINATION "${SKALAXC_INSTALL_CMAKEDIR}" + PATH_VARS SKALAXC_INSTALL_MODEL_DIR) +write_basic_package_version_file( + "${PROJECT_BINARY_DIR}/SkalaXCConfigVersion.cmake" + VERSION ${PROJECT_VERSION} + COMPATIBILITY SameMajorVersion) + +install(EXPORT SkalaXCCoreTargets + FILE SkalaXCCoreTargets.cmake + NAMESPACE SkalaXC:: + DESTINATION "${SKALAXC_INSTALL_CMAKEDIR}" + COMPONENT Core) +if(SKALAXC_BUILD_FORTRAN) + install(EXPORT SkalaXCFortranTargets + FILE SkalaXCFortranTargets.cmake + NAMESPACE SkalaXC:: + DESTINATION "${SKALAXC_INSTALL_CMAKEDIR}" + COMPONENT Fortran) +endif() +install(FILES + "${PROJECT_BINARY_DIR}/SkalaXCConfig.cmake" + "${PROJECT_BINARY_DIR}/SkalaXCConfigVersion.cmake" + DESTINATION "${SKALAXC_INSTALL_CMAKEDIR}" + COMPONENT Core) diff --git a/SkalaXC/cmake/skalaxc-check-cuda-compiler.cmake b/SkalaXC/cmake/skalaxc-check-cuda-compiler.cmake new file mode 100644 index 00000000..48037b51 --- /dev/null +++ b/SkalaXC/cmake/skalaxc-check-cuda-compiler.cmake @@ -0,0 +1,63 @@ +# SPDX-License-Identifier: MIT + +# Match the host-compiler bounds used by torch.utils.cpp_extension: +# https://github.com/pytorch/pytorch/blob/v2.13.0/torch/utils/cpp_extension.py +# PyTorch derives these bounds from the CUDA toolkit's crt/host_config.h and +# https://gist.github.com/ax3l/9489132. Upper bounds are exclusive. CUDA 13 +# uses the conservative CUDA 13.0 Clang bound; newer toolkit headers may accept +# a newer Clang release. +function(_skalaxc_check_cuda_compiler_compatibility cuda_version) + unset(_skalaxc_min_compiler) + unset(_skalaxc_max_compiler) + + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set(_skalaxc_min_compiler "6") + if(cuda_version VERSION_GREATER_EQUAL "12.0" AND cuda_version VERSION_LESS "12.3") + set(_skalaxc_max_compiler "13") + elseif(cuda_version VERSION_GREATER_EQUAL "12.3" AND cuda_version VERSION_LESS "12.8") + set(_skalaxc_max_compiler "14") + elseif(cuda_version VERSION_GREATER_EQUAL "12.8" AND cuda_version VERSION_LESS "13.0") + set(_skalaxc_max_compiler "15") + elseif(cuda_version VERSION_GREATER_EQUAL "13.0" AND cuda_version VERSION_LESS "14.0") + set(_skalaxc_max_compiler "16") + endif() + elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + set(_skalaxc_min_compiler "7") + if(cuda_version VERSION_GREATER_EQUAL "12.0" AND cuda_version VERSION_LESS "12.2") + set(_skalaxc_max_compiler "15") + elseif(cuda_version VERSION_GREATER_EQUAL "12.2" AND cuda_version VERSION_LESS "12.4") + set(_skalaxc_max_compiler "16") + elseif(cuda_version VERSION_GREATER_EQUAL "12.4" AND cuda_version VERSION_LESS "12.5") + set(_skalaxc_max_compiler "17") + elseif(cuda_version VERSION_GREATER_EQUAL "12.5" AND cuda_version VERSION_LESS "12.7") + set(_skalaxc_max_compiler "18") + elseif(cuda_version VERSION_GREATER_EQUAL "12.7" AND cuda_version VERSION_LESS "13.0") + set(_skalaxc_max_compiler "19") + elseif(cuda_version VERSION_GREATER_EQUAL "13.0" AND cuda_version VERSION_LESS "14.0") + set(_skalaxc_max_compiler "21") + endif() + else() + return() + endif() + + if(NOT DEFINED _skalaxc_max_compiler) + message(WARNING + "No SkalaXC ${CMAKE_CXX_COMPILER_ID} host-compiler bounds are known for " + "CUDA ${cuda_version}; CUDA compiler identification will perform the " + "toolkit's native compatibility check.") + return() + endif() + + if("${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS "${_skalaxc_min_compiler}" OR + NOT "${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS "${_skalaxc_max_compiler}") + message(FATAL_ERROR + "CUDA ${cuda_version} requires ${CMAKE_CXX_COMPILER_ID} host compiler " + ">=${_skalaxc_min_compiler},<${_skalaxc_max_compiler}, but " + "${CMAKE_CXX_COMPILER} is version ${CMAKE_CXX_COMPILER_VERSION}.") + endif() + + message(STATUS + "CUDA ${cuda_version} host compiler ${CMAKE_CXX_COMPILER_ID} " + "${CMAKE_CXX_COMPILER_VERSION} satisfies " + ">=${_skalaxc_min_compiler},<${_skalaxc_max_compiler}") +endfunction() \ No newline at end of file diff --git a/SkalaXC/src/CMakeLists.txt b/SkalaXC/src/CMakeLists.txt new file mode 100644 index 00000000..d852440b --- /dev/null +++ b/SkalaXC/src/CMakeLists.txt @@ -0,0 +1,186 @@ +# SkalaXC core library. +# +# Phase 1: the ML functional core (model resolution/loading, feature dict, +# get_exc, and the MPI gather/scatter/reorder helpers), ported from +# GauXC/skala onedft_util.* with onedft -> skala. Later phases add the host and +# device orchestration and the ABI-isolated public API. + +# --- generated config header (installed model path + feature flags) -------- +if(NOT EXISTS "${SKALAXC_MODEL_PATH}") + message(WARNING + "SkalaXC model directory not found: ${SKALAXC_MODEL_PATH}. " + "Model aliases (LDA/PBE/TPSS) will fail at runtime unless models are " + "installed under SKALAXC_MODEL_PATH_INSTALL, SKALAXC_MODEL_PATH is set " + "in the runtime environment, or an explicit .fun path is provided when " + "creating the integrator.") +endif() +set(SKALAXC_HAS_SKALA ON) +if(SKALAXC_ENABLE_CUDA) + set(SKALAXC_HAS_CUDA ON) +endif() +if(SKALAXC_ENABLE_MPI) + set(SKALAXC_HAS_MPI ON) +endif() +if(SKALAXC_ENABLE_OPENMP) + set(SKALAXC_HAS_OPENMP ON) +endif() + +configure_file( + ${PROJECT_SOURCE_DIR}/include/skalaxc/skalaxc_config.hpp.in + ${PROJECT_BINARY_DIR}/include/skalaxc/skalaxc_config.hpp +) + +# Public C-compatible feature-flag header (SKALAXC_HAS_MPI etc.). Unlike the +# internal skalaxc_config.hpp above, this one is included by the public C / C++ +# headers to gate the MPI_Comm-taking constructors, so it lives under skalaxc/c/. +configure_file( + ${PROJECT_SOURCE_DIR}/include/skalaxc/c/config.h.in + ${PROJECT_BINARY_DIR}/include/skalaxc/c/config.h +) + +# --- core object library ---------------------------------------------------- +add_library(skalaxc_core STATIC + atomic_domain_assignment.cxx + debug_log.cxx + diagnostics.cxx + model_grid_layout.cxx + skala_driver.cxx + skala_model.cxx + host/mpi_wrapper.cxx + host/atomic_domain_load_balancer.cxx + host/model_grid_exchange.cxx + host/spin_gradient.cxx + host/skala_util.cxx + host/skala_host_driver.cxx +) +if(SKALAXC_ENABLE_CUDA) + target_sources(skalaxc_core PRIVATE + device/model_grid_exchange.cxx + device/skala_device_driver.cxx + ) +endif() +add_library(SkalaXC::core ALIAS skalaxc_core) + +target_include_directories(skalaxc_core + PUBLIC + $ + $ + PRIVATE + ${PROJECT_SOURCE_DIR}/src + ${PROJECT_SOURCE_DIR}/src/host +) + +# `gauxc` is PUBLIC so the core inherits GauXC's include tree (public + private +# src/ headers). Torch/nlohmann are PRIVATE implementation details -- they must +# never leak to SkalaXC's public consumers. +target_link_libraries(skalaxc_core + PUBLIC + gauxc + Eigen3::Eigen + PRIVATE + ${TORCH_LIBRARIES} + nlohmann_json::nlohmann_json +) +if(SKALAXC_ENABLE_CUDA) + find_package(CUDAToolkit REQUIRED) + target_link_libraries(skalaxc_core PRIVATE skalaxc_cuda CUDA::cudart) +endif() + +if(SKALAXC_ENABLE_OPENMP) + find_package(OpenMP REQUIRED) + target_link_libraries(skalaxc_core PRIVATE OpenMP::OpenMP_CXX) +endif() + +target_compile_features(skalaxc_core PUBLIC cxx_std_17) + +set_target_properties(skalaxc_core PROPERTIES + POSITION_INDEPENDENT_CODE ON +) + +# --- public shared library (ABI-isolated) ----------------------------------- +# The public API TUs are compiled directly into the shared object (NOT via an +# archive) so their skalaxc_* / SkalaXC::* symbols survive --exclude-libs,ALL. +# skalaxc_core (and, transitively, GauXC) is linked PRIVATE so neither GauXC nor +# its include tree ever reaches a SkalaXC consumer. +add_library(skalaxc SHARED + skalaxc_api.cxx +) +add_library(SkalaXC::skalaxc ALIAS skalaxc) + +target_include_directories(skalaxc + PUBLIC + $ + $ + $ + PRIVATE + ${PROJECT_SOURCE_DIR}/src +) + +target_link_libraries(skalaxc PRIVATE skalaxc_core) + +# Recent GNU linkers do not use an input shared library's RPATH to locate its +# transitive dependencies while linking an executable. Keep the private +# dependencies off the public link line, but make their directory available to +# build-tree consumers for link-time resolution. +if(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND TARGET libtorch) + target_link_options(skalaxc INTERFACE + "$>") +endif() + +foreach(_skalaxc_interface_property + INTERFACE_INCLUDE_DIRECTORIES + INTERFACE_LINK_LIBRARIES) + get_target_property(_skalaxc_interface_value skalaxc + ${_skalaxc_interface_property}) + if(_skalaxc_interface_value MATCHES + "[Gg]au[Xx][Cc]|[Tt]orch|c10|[Ee]igen|[Ee]xch[Cc][Xx]|[Ii]ntegrator[Xx][Xx]|[Nn]lohmann") + message(FATAL_ERROR + "Private dependencies must not appear in skalaxc's ${_skalaxc_interface_property}: " + "${_skalaxc_interface_value}") + endif() +endforeach() +unset(_skalaxc_interface_property) +unset(_skalaxc_interface_value) + +target_compile_features(skalaxc PUBLIC cxx_std_17) +target_compile_definitions(skalaxc PRIVATE SKALAXC_BUILDING_LIBRARY) + +set_target_properties(skalaxc PROPERTIES + CXX_VISIBILITY_PRESET hidden + VISIBILITY_INLINES_HIDDEN ON + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} +) +if(SKALAXC_INSTALL_RPATH) + set_target_properties(skalaxc PROPERTIES + INSTALL_RPATH "${SKALAXC_INSTALL_RPATH}" + INSTALL_RPATH_USE_LINK_PATH FALSE + INSTALL_REMOVE_ENVIRONMENT_RPATH TRUE) +endif() + +# ABI isolation (link-time): export ONLY the SkalaXC public API; hide every +# statically embedded GauXC / LibTorch symbol so a host that links its own GauXC +# cannot clash with ours. +if(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND + CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") + set(_skalaxc_export_control + ${PROJECT_SOURCE_DIR}/cmake/skalaxc-exports.map) + target_link_options(skalaxc PRIVATE + "-Wl,--version-script=${_skalaxc_export_control}" + "-Wl,--exclude-libs,ALL" + ) +elseif(APPLE) + set(_skalaxc_export_control + ${PROJECT_SOURCE_DIR}/cmake/skalaxc-exports-macos.txt) + target_link_options(skalaxc PRIVATE + "-Wl,-exported_symbols_list,${_skalaxc_export_control}" + ) +endif() +if(_skalaxc_export_control) + set_target_properties(skalaxc PROPERTIES + LINK_DEPENDS ${_skalaxc_export_control}) +endif() +unset(_skalaxc_export_control) + +# Public C API sources (added to the `skalaxc` target above). +add_subdirectory(c-api) diff --git a/SkalaXC/src/device/CMakeLists.txt b/SkalaXC/src/device/CMakeLists.txt new file mode 100644 index 00000000..bbbaf767 --- /dev/null +++ b/SkalaXC/src/device/CMakeLists.txt @@ -0,0 +1,37 @@ +# SkalaXC CUDA device kernels. +# +# Built ONLY when SKALAXC_ENABLE_CUDA is ON and a CUDA compiler was found (the +# top-level CMakeLists enables the CUDA language behind that guard). These are +# faithful onedft->skala renames of the GauXC skala-branch ML device kernels. +# They compile against GauXC-master's private device headers, which the in-tree +# `gauxc` target exposes (and which must themselves be a CUDA-enabled GauXC +# build -- SKALAXC_ENABLE_CUDA propagates GAUXC_ENABLE_CUDA). +# +# NOTE: these kernels are the ML-specific VXC/gradient building blocks only. The +# full device orchestration driver (the SkalaXC-owned device-data adapter that +# feeds these kernels; see the port plan in the migration notes) is completed on +# a CUDA-capable machine, where it can be compiled and validated end-to-end. + +add_library(skalaxc_cuda STATIC + cuda/kernels/model_grid.cu + cuda/kernels/skala.cu + cuda/kernels/skala_exc_grad.cu +) +add_library(SkalaXC::cuda ALIAS skalaxc_cuda) + +# `${CMAKE_CURRENT_SOURCE_DIR}` resolves device-local headers and the source +# root exposes shared private SkalaXC headers such as exceptions.hpp. GauXC's +# private device headers and CUDA infrastructure come from the `gauxc` target. +target_include_directories(skalaxc_cuda PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${PROJECT_SOURCE_DIR}/include + ${PROJECT_BINARY_DIR}/include + ${PROJECT_SOURCE_DIR}/src +) +target_link_libraries(skalaxc_cuda PRIVATE gauxc) + +set_target_properties(skalaxc_cuda PROPERTIES + POSITION_INDEPENDENT_CODE ON + CUDA_SEPARABLE_COMPILATION ON + CUDA_RESOLVE_DEVICE_SYMBOLS ON +) diff --git a/SkalaXC/src/device/common/model_grid.hpp b/SkalaXC/src/device/common/model_grid.hpp new file mode 100644 index 00000000..34cb458f --- /dev/null +++ b/SkalaXC/src/device/common/model_grid.hpp @@ -0,0 +1,98 @@ +#pragma once +/** + * @file + * @brief CUDA entry points for GauXC task and Skala model-grid transfers. + */ + +#include "device/device_queue.hpp" +#include "device/xc_device_task.hpp" + +#include +#include + +namespace SkalaXC { + +/** + * @brief Pack post-U-variable GauXC task data into model-grid tensors. + * + * This entry point must be called after GauXC's UKS `eval_uvars_*`. At that + * point `den_s`/`den_z` and `tau_s`/`tau_z` contain alpha/beta values, while + * the directional `dden_s*`/`dden_z*` buffers remain scalar/z values. + * @param task_count Number of tasks in the active batch. + * @param max_points Maximum point count among the active tasks. + * @param tasks_device Device pointer to the active GauXC task array. + * @param point_offsets_device Device offsets from each task into model-grid + * order. + * @param total_points Number of points in each model tensor channel. + * @param density Optional device density tensor with two point channels. + * @param density_gradient Optional six-channel device density-gradient tensor. + * @param kinetic Optional two-channel device kinetic-density tensor. + * @param grid_coordinates Optional interleaved xyz device tensor. + * @param grid_weights Optional device quadrature-weight vector. + * @param queue Device execution queue on which transfer work is enqueued. + */ +void pack_post_uvars_model_grid_features( + std::size_t task_count, std::int32_t max_points, + GauXC::XCDeviceTask* tasks_device, const std::int64_t* point_offsets_device, + std::int64_t total_points, double* density, double* density_gradient, + double* kinetic, double* grid_coordinates, double* grid_weights, + GauXC::device_queue queue); + +/** + * @brief Unpack contiguous model potentials into GauXC task buffers. + * @param task_count Number of tasks in the active batch. + * @param max_points Maximum point count among the active tasks. + * @param tasks_device Device pointer to the active GauXC task array. + * @param point_offsets_device Device offsets from each task into model-grid + * order. + * @param total_points Number of points in each model tensor channel. + * @param density_potential Device density-potential tensor with two channels. + * @param density_gradient_potential Optional six-channel device gradient + * potential tensor. + * @param kinetic_potential Optional two-channel device kinetic potential. + * @param queue Device execution queue on which transfer work is enqueued. + */ +void unpack_model_grid_potentials( + std::size_t task_count, std::int32_t max_points, + GauXC::XCDeviceTask* tasks_device, const std::int64_t* point_offsets_device, + std::int64_t total_points, const double* density_potential, + const double* density_gradient_potential, const double* kinetic_potential, + GauXC::device_queue queue); + +/** + * @brief Populate task buffers for contracted molecular-weight derivatives. + * @param task_count Number of tasks in the active batch. + * @param max_points Maximum point count among the active tasks. + * @param tasks_device Device pointer to the active GauXC task array. + * @param point_offsets_device Device offsets from each task into model-grid + * order. + * @param total_points Number of entries in @p dE_dw. + * @param dE_dw Device `dE/dw` vector in model-grid order. + * @param queue Device execution queue on which transfer work is enqueued. + */ +void prepare_model_grid_weight_derivatives( + std::size_t task_count, std::int32_t max_points, + GauXC::XCDeviceTask* tasks_device, const std::int64_t* point_offsets_device, + std::int64_t total_points, const double* dE_dw, GauXC::device_queue queue); + +/** + * @brief Accumulate model point and coordinate derivatives by atom. + * @param atom_count Number of atoms in the exact-size model batch. + * @param grid_size Number of grid points belonging to each batch atom. + * @param atom_indices_device Device global-atom indices for the batch. + * @param point_gradient Optional contiguous device point derivatives shaped + * `(atom_count * grid_size, 3)`. + * @param coordinate_gradient Optional contiguous device atom-coordinate + * derivatives shaped `(atom_count, 3)`. + * @param xc_gradient Device atom-major XC gradient to update. + * @param queue Device execution queue on which the operation is enqueued. + */ +void accumulate_model_geometry_gradient(std::size_t atom_count, + std::int64_t grid_size, + const std::int64_t* atom_indices_device, + const double* point_gradient, + const double* coordinate_gradient, + double* xc_gradient, + GauXC::device_queue queue); + +} // namespace SkalaXC diff --git a/SkalaXC/src/device/common/skala.hpp b/SkalaXC/src/device/common/skala.hpp new file mode 100644 index 00000000..a262ecbf --- /dev/null +++ b/SkalaXC/src/device/common/skala.hpp @@ -0,0 +1,36 @@ +/** + * GauXC Copyright (c) 2020-2024, The Regents of the University of California, + * through Lawrence Berkeley National Laboratory (subject to receipt of + * any required approvals from the U.S. Dept. of Energy). All rights reserved. + * + * See LICENSE.txt for details + * + * --------------------------------------------------------------------------- + * SkalaXC adaptation: renamed from GauXC skala-branch + * device/common/onedft.hpp (onedft -> skala). Declares the SkalaXC ML VXC + * device kernels. Operates on GauXC-master XCDeviceTask buffers; compiled only + * when SKALAXC_ENABLE_CUDA is ON (requires a CUDA toolchain). + * --------------------------------------------------------------------------- + */ +#pragma once +#include "device/device_queue.hpp" +#include "device/xc_device_data.hpp" +#include "device/xc_device_task.hpp" + +namespace SkalaXC { + +/** + * @brief Assemble the SkalaXC Z-matrix from per-point ML XC derivatives. + * @param ntasks Number of tasks. + * @param max_nbf Maximum basis size across tasks. + * @param max_npts Maximum number of grid points across tasks. + * @param tasks_device Device pointer to task array. + * @param scheme Density approximation scheme. + * @param sel Density selector. + * @param queue Device execution queue. + */ +void zmat_skala_vxc(size_t ntasks, int32_t max_nbf, int32_t max_npts, + GauXC::XCDeviceTask* tasks_device, + GauXC::integrator_xc_approx scheme, GauXC::density_id sel, + GauXC::device_queue queue); +} // namespace SkalaXC diff --git a/SkalaXC/src/device/common/skala_exc_grad.hpp b/SkalaXC/src/device/common/skala_exc_grad.hpp new file mode 100644 index 00000000..4562a382 --- /dev/null +++ b/SkalaXC/src/device/common/skala_exc_grad.hpp @@ -0,0 +1,38 @@ +/** + * GauXC Copyright (c) 2020-2024, The Regents of the University of California, + * through Lawrence Berkeley National Laboratory (subject to receipt of + * any required approvals from the U.S. Dept. of Energy). + * + * (c) 2024-2025, Microsoft Corporation + * + * All rights reserved. + * + * See LICENSE.txt for details + * + * --------------------------------------------------------------------------- + * SkalaXC adaptation: renamed from GauXC skala-branch + * device/common/onedft_exc_grad.hpp (onedft -> skala). Compiled only when + * SKALAXC_ENABLE_CUDA is ON (requires a CUDA toolchain). + * --------------------------------------------------------------------------- + */ +#pragma once +#include "device/device_queue.hpp" +#include "device/xc_device_task.hpp" + +namespace SkalaXC { + +/** + * @brief Convert SkalaXC directional VXC buffers into inc_exc_grad format. + * @param ntasks Number of tasks. + * @param max_npts Maximum number of grid points across tasks. + * @param tasks_device Device pointer to task array. + * @param queue Device execution queue. + * + * After this call, dden_sx/sy/sz contain vds_x/y/z and + * vgamma_pp/pm/mm are set to 1/0/1. + */ +void transform_skala_vxc_for_grad(size_t ntasks, int32_t max_npts, + GauXC::XCDeviceTask* tasks_device, + GauXC::device_queue queue); + +} // namespace SkalaXC diff --git a/SkalaXC/src/device/cuda/kernels/model_grid.cu b/SkalaXC/src/device/cuda/kernels/model_grid.cu new file mode 100644 index 00000000..97a3d500 --- /dev/null +++ b/SkalaXC/src/device/cuda/kernels/model_grid.cu @@ -0,0 +1,274 @@ +/** + * @file + * @brief CUDA kernels for GauXC task and Skala model-grid data transfer. + */ +#include "common/model_grid.hpp" +#include "device/cuda_launch_check.hpp" +#include "spin_channels.cuh" + +#include "device_specific/cuda_util.hpp" + +#include + +#include + +namespace SkalaXC { + +namespace { + +__device__ cuda::AlphaBetaChannels post_uvars_density( + const GauXC::XCDeviceTask& task, std::size_t point) { + return {task.den_s[point], task.den_z[point]}; +} + +__device__ cuda::ScalarZChannels post_uvars_density_gradient( + const GauXC::XCDeviceTask& task, std::size_t point, + std::int64_t direction) { + switch (direction) { + case 0: + return {task.dden_sx[point], task.dden_zx[point]}; + case 1: + return {task.dden_sy[point], task.dden_zy[point]}; + default: + return {task.dden_sz[point], task.dden_zz[point]}; + } +} + +__device__ cuda::AlphaBetaChannels post_uvars_kinetic( + const GauXC::XCDeviceTask& task, std::size_t point) { + return {task.tau_s[point], task.tau_z[point]}; +} + +/** + * @brief Pack one post-U-variable task point into model feature tensors. + * @param task_count Number of tasks in @p tasks. + * @param tasks Device tasks indexed by the y grid dimension. + * @param point_offsets Device task-to-model-grid offsets. + * @param total_points Number of points in each tensor channel. + * @param density Optional two-channel density output. + * @param density_gradient Optional six-channel gradient output. + * @param kinetic Optional two-channel kinetic-density output. + * @param grid_coordinates Optional interleaved xyz output. + * @param grid_weights Optional quadrature-weight output. + */ +__global__ void pack_post_uvars_model_grid_features_kernel( + std::size_t task_count, const GauXC::XCDeviceTask* tasks, + const std::int64_t* point_offsets, std::int64_t total_points, + double* density, double* density_gradient, double* kinetic, + double* grid_coordinates, double* grid_weights) { + const std::size_t task_index = blockIdx.y; + if (task_index >= task_count) return; + + const auto& task = tasks[task_index]; + const std::size_t point = blockIdx.x * blockDim.x + threadIdx.x; + if (point >= task.npts) return; + + const std::int64_t destination = point_offsets[task_index] + point; + if (destination < 0 || destination >= total_points) return; + + if (density) { + const auto density_alpha_beta = post_uvars_density(task, point); + density[destination] = density_alpha_beta.alpha; + density[total_points + destination] = density_alpha_beta.beta; + } + if (density_gradient) { + for (std::int64_t direction = 0; direction < 3; ++direction) { + const auto gradient_scalar_z = + post_uvars_density_gradient(task, point, direction); + const auto gradient_alpha_beta = cuda::scalar_z_to_alpha_beta( + gradient_scalar_z.scalar, gradient_scalar_z.spin_z); + density_gradient[direction * total_points + destination] = + gradient_alpha_beta.alpha; + density_gradient[(3 + direction) * total_points + destination] = + gradient_alpha_beta.beta; + } + } + if (kinetic) { + const auto kinetic_alpha_beta = post_uvars_kinetic(task, point); + kinetic[destination] = kinetic_alpha_beta.alpha; + kinetic[total_points + destination] = kinetic_alpha_beta.beta; + } + if (grid_coordinates) { + grid_coordinates[3 * destination] = task.points_x[point]; + grid_coordinates[3 * destination + 1] = task.points_y[point]; + grid_coordinates[3 * destination + 2] = task.points_z[point]; + } + if (grid_weights) grid_weights[destination] = task.weights[point]; +} + +/** + * @brief Unpack one model-grid point's potentials into a GauXC task. + * @param task_count Number of tasks in @p tasks. + * @param tasks Device tasks indexed by the y grid dimension. + * @param point_offsets Device task-to-model-grid offsets. + * @param total_points Number of points in each tensor channel. + * @param density_potential Two-channel density-potential input. + * @param density_gradient_potential Optional six-channel gradient input. + * @param kinetic_potential Optional two-channel kinetic-potential input. + */ +__global__ void unpack_model_grid_potentials_kernel( + std::size_t task_count, GauXC::XCDeviceTask* tasks, + const std::int64_t* point_offsets, std::int64_t total_points, + const double* density_potential, const double* density_gradient_potential, + const double* kinetic_potential) { + const std::size_t task_index = blockIdx.y; + if (task_index >= task_count) return; + + auto& task = tasks[task_index]; + const std::size_t point = blockIdx.x * blockDim.x + threadIdx.x; + if (point >= task.npts) return; + + const std::int64_t source = point_offsets[task_index] + point; + if (source < 0 || source >= total_points) return; + + task.vrho_pos[point] = density_potential[source]; + task.vrho_neg[point] = density_potential[total_points + source]; + if (density_gradient_potential) { + task.gamma_pp[point] = density_gradient_potential[source]; + task.gamma_pm[point] = density_gradient_potential[total_points + source]; + task.gamma_mm[point] = + density_gradient_potential[2 * total_points + source]; + task.vgamma_pp[point] = + density_gradient_potential[3 * total_points + source]; + task.vgamma_pm[point] = + density_gradient_potential[4 * total_points + source]; + task.vgamma_mm[point] = + density_gradient_potential[5 * total_points + source]; + } + if (kinetic_potential) { + task.vtau_pos[point] = kinetic_potential[source]; + task.vtau_neg[point] = kinetic_potential[total_points + source]; + } +} + +/** + * @brief Prepare one task point for a contracted weight derivative. + * @param task_count Number of tasks in @p tasks. + * @param tasks Device tasks indexed by the y grid dimension. + * @param point_offsets Device task-to-model-grid offsets. + * @param total_points Number of entries in @p dE_dw. + * @param dE_dw Model energy derivatives with respect to grid weights. + */ +__global__ void prepare_model_grid_weight_derivatives_kernel( + std::size_t task_count, GauXC::XCDeviceTask* tasks, + const std::int64_t* point_offsets, std::int64_t total_points, + const double* dE_dw) { + const std::size_t task_index = blockIdx.y; + if (task_index >= task_count) return; + + auto& task = tasks[task_index]; + const std::size_t point = blockIdx.x * blockDim.x + threadIdx.x; + if (point >= task.npts) return; + + const std::int64_t source = point_offsets[task_index] + point; + if (source < 0 || source >= total_points) return; + + // GauXC's contracted partition derivative expects w_i * f_i. The model + // boundary cotangent is f_i = dE/dw_i. + task.eps[point] = dE_dw[source] * task.weights[point]; + task.den_s[point] = 1.0; + task.den_z[point] = 0.0; +} + +/** @brief Reduce one batch's model coordinate derivatives by atom. */ +__global__ void accumulate_model_geometry_gradient_kernel( + std::size_t atom_count, std::int64_t grid_size, + const std::int64_t* atom_indices, const double* point_gradient, + const double* coordinate_gradient, double* xc_gradient) { + const std::size_t local_atom = blockIdx.x; + const std::size_t direction = blockIdx.y; + if (local_atom >= atom_count || direction >= 3) return; + + double value = 0.0; + if (point_gradient) { + for (std::int64_t point = threadIdx.x; point < grid_size; + point += blockDim.x) { + const auto batch_point = + static_cast(local_atom) * grid_size + point; + value += point_gradient[3 * batch_point + direction]; + } + } + + __shared__ double partial_sums[256]; + partial_sums[threadIdx.x] = value; + __syncthreads(); + for (unsigned int stride = blockDim.x / 2; stride > 0; stride /= 2) { + if (threadIdx.x < stride) + partial_sums[threadIdx.x] += partial_sums[threadIdx.x + stride]; + __syncthreads(); + } + + if (threadIdx.x == 0) { + value = partial_sums[0]; + if (coordinate_gradient) + value += coordinate_gradient[3 * local_atom + direction]; + const auto atom = atom_indices[local_atom]; + atomicAdd(xc_gradient + 3 * atom + direction, value); + } +} + +} // namespace + +void pack_post_uvars_model_grid_features( + std::size_t task_count, std::int32_t max_points, + GauXC::XCDeviceTask* tasks_device, const std::int64_t* point_offsets_device, + std::int64_t total_points, double* density, double* density_gradient, + double* kinetic, double* grid_coordinates, double* grid_weights, + GauXC::device_queue queue) { + if (task_count == 0) return; + cudaStream_t stream = queue.queue_as(); + constexpr int threads = 256; + const dim3 blocks(GauXC::util::div_ceil(max_points, threads), task_count); + pack_post_uvars_model_grid_features_kernel<<>>( + task_count, tasks_device, point_offsets_device, total_points, density, + density_gradient, kinetic, grid_coordinates, grid_weights); + cuda::check_launch("Failed to launch model feature packing"); +} + +void unpack_model_grid_potentials( + std::size_t task_count, std::int32_t max_points, + GauXC::XCDeviceTask* tasks_device, const std::int64_t* point_offsets_device, + std::int64_t total_points, const double* density_potential, + const double* density_gradient_potential, const double* kinetic_potential, + GauXC::device_queue queue) { + if (task_count == 0) return; + cudaStream_t stream = queue.queue_as(); + constexpr int threads = 256; + const dim3 blocks(GauXC::util::div_ceil(max_points, threads), task_count); + unpack_model_grid_potentials_kernel<<>>( + task_count, tasks_device, point_offsets_device, total_points, + density_potential, density_gradient_potential, kinetic_potential); + cuda::check_launch("Failed to launch model potential unpacking"); +} + +void prepare_model_grid_weight_derivatives( + std::size_t task_count, std::int32_t max_points, + GauXC::XCDeviceTask* tasks_device, const std::int64_t* point_offsets_device, + std::int64_t total_points, const double* dE_dw, GauXC::device_queue queue) { + if (task_count == 0) return; + cudaStream_t stream = queue.queue_as(); + constexpr int threads = 256; + const dim3 blocks(GauXC::util::div_ceil(max_points, threads), task_count); + prepare_model_grid_weight_derivatives_kernel<<>>( + task_count, tasks_device, point_offsets_device, total_points, dE_dw); + cuda::check_launch("Failed to launch model weight derivatives"); +} + +void accumulate_model_geometry_gradient(std::size_t atom_count, + std::int64_t grid_size, + const std::int64_t* atom_indices_device, + const double* point_gradient, + const double* coordinate_gradient, + double* xc_gradient, + GauXC::device_queue queue) { + if (atom_count == 0 || (!point_gradient && !coordinate_gradient)) return; + cudaStream_t stream = queue.queue_as(); + constexpr unsigned int threads = 256; + const dim3 blocks(atom_count, 3); + accumulate_model_geometry_gradient_kernel<<>>( + atom_count, grid_size, atom_indices_device, point_gradient, + coordinate_gradient, xc_gradient); + cuda::check_launch("Failed to launch model geometry-gradient accumulation"); +} + +} // namespace SkalaXC diff --git a/SkalaXC/src/device/cuda/kernels/skala.cu b/SkalaXC/src/device/cuda/kernels/skala.cu new file mode 100644 index 00000000..7f07a86a --- /dev/null +++ b/SkalaXC/src/device/cuda/kernels/skala.cu @@ -0,0 +1,286 @@ +/** + * GauXC Copyright (c) 2020-2024, The Regents of the University of California, + * through Lawrence Berkeley National Laboratory (subject to receipt of + * any required approvals from the U.S. Dept. of Energy). All rights reserved. + * + * See LICENSE.txt for details + * + * --------------------------------------------------------------------------- + * SkalaXC adaptation: renamed from GauXC skala-branch + * cuda/kernels/onedft.cu (onedft -> skala). SkalaXC ML VXC device kernels. + * Compiled only when SKALAXC_ENABLE_CUDA is ON (requires a CUDA toolchain). + * GauXC device headers/utilities are supplied by the in-tree `gauxc` target. + * --------------------------------------------------------------------------- + */ +#include "common/skala.hpp" +#include "device/cuda_launch_check.hpp" +#include "device_specific/cuda_device_constants.hpp" +#include "device_specific/cuda_util.hpp" +#include "exceptions.hpp" +#include "spin_channels.cuh" +#include + +namespace SkalaXC { + +using GauXC::DEN_S; +using GauXC::DEN_Z; +using GauXC::density_id; +using GauXC::device_queue; +using GauXC::GGA; +using GauXC::integrator_xc_approx; +using GauXC::LDA; +using GauXC::MGGA_TAU; +using GauXC::XCDeviceTask; + +/** + * @brief Assemble one LDA Z-matrix element per CUDA thread. + * @tparam den_selector Scalar or z-spin density channel. + * @param ntasks Number of tasks in @p tasks_device. + * @param tasks_device Tasks indexed by the z grid dimension. + */ +template +__global__ void zmat_lda_vxc_skala_kernel(size_t ntasks, + XCDeviceTask* tasks_device) { + + const int batch_idx = blockIdx.z; + if (batch_idx >= ntasks) return; + + auto& task = tasks_device[batch_idx]; + const auto npts = task.npts; + const auto nbf = task.bfn_screening.nbe; + const auto* basis_eval_device = task.bf; + + auto* z_matrix_device = task.zmat; + + const int tid_x = blockIdx.x * blockDim.x + threadIdx.x; + const int tid_y = blockIdx.y * blockDim.y + threadIdx.y; + + if (tid_x < npts and tid_y < nbf) { + + const size_t ibfoff = tid_y * npts + tid_x; + const auto density_scalar_z = cuda::alpha_beta_to_scalar_z( + task.vrho_pos[tid_x], task.vrho_neg[tid_x]); + double density_potential = density_scalar_z.scalar; + if constexpr (den_selector == DEN_Z) + density_potential = density_scalar_z.spin_z; + + z_matrix_device[ibfoff] = + 0.5 * density_potential * basis_eval_device[ibfoff]; + } +} + +/** + * @brief Assemble one GGA Z-matrix element per CUDA thread. + * @tparam den_selector Scalar or z-spin density channel. + * @param ntasks Number of tasks in @p tasks_device. + * @param tasks_device Tasks indexed by the z grid dimension. + */ +template +__global__ void zmat_gga_vxc_skala_kernel(size_t ntasks, + XCDeviceTask* tasks_device) { + + const int batch_idx = blockIdx.z; + if (batch_idx >= ntasks) return; + + auto& task = tasks_device[batch_idx]; + const auto npts = task.npts; + const auto nbf = task.bfn_screening.nbe; + + const double* dden_x_grad_a = task.gamma_pp; + const double* dden_x_grad_b = task.vgamma_pp; + const double* dden_y_grad_a = task.gamma_pm; + const double* dden_y_grad_b = task.vgamma_pm; + const double* dden_z_grad_a = task.gamma_mm; + const double* dden_z_grad_b = task.vgamma_mm; + + const auto* basis_eval_device = task.bf; + const auto* dbasis_x_eval_device = task.dbfx; + const auto* dbasis_y_eval_device = task.dbfy; + const auto* dbasis_z_eval_device = task.dbfz; + + auto* z_matrix_device = task.zmat; + + const int tid_x = blockIdx.x * blockDim.x + threadIdx.x; + const int tid_y = blockIdx.y * blockDim.y + threadIdx.y; + + if (tid_x < npts and tid_y < nbf) { + + const size_t ibfoff = tid_y * npts + tid_x; + + const auto density_scalar_z = cuda::alpha_beta_to_scalar_z( + task.vrho_pos[tid_x], task.vrho_neg[tid_x]); + const auto x_scalar_z = cuda::alpha_beta_to_scalar_z(dden_x_grad_a[tid_x], + dden_x_grad_b[tid_x]); + const auto y_scalar_z = cuda::alpha_beta_to_scalar_z(dden_y_grad_a[tid_x], + dden_y_grad_b[tid_x]); + const auto z_scalar_z = cuda::alpha_beta_to_scalar_z(dden_z_grad_a[tid_x], + dden_z_grad_b[tid_x]); + + double density_potential = density_scalar_z.scalar; + double x_fact = x_scalar_z.scalar; + double y_fact = y_scalar_z.scalar; + double z_fact = z_scalar_z.scalar; + + if constexpr (den_selector == DEN_Z) { + density_potential = density_scalar_z.spin_z; + x_fact = x_scalar_z.spin_z; + y_fact = y_scalar_z.spin_z; + z_fact = z_scalar_z.spin_z; + } + + z_matrix_device[ibfoff] = + x_fact * dbasis_x_eval_device[ibfoff] + + y_fact * dbasis_y_eval_device[ibfoff] + + z_fact * dbasis_z_eval_device[ibfoff] + + 0.5 * density_potential * basis_eval_device[ibfoff]; + } +} + +/** + * @brief Assemble one meta-GGA Z-matrix element per CUDA thread. + * @tparam need_lapl Whether to include Laplacian contributions. + * @tparam den_selector Scalar or z-spin density channel. + * @param ntasks Number of tasks in @p tasks_device. + * @param tasks_device Tasks indexed by the z grid dimension. + */ +template +__global__ void zmat_mgga_vxc_skala_kernel(size_t ntasks, + XCDeviceTask* tasks_device) { + + const int batch_idx = blockIdx.z; + if (batch_idx >= ntasks) return; + + auto& task = tasks_device[batch_idx]; + const auto npts = task.npts; + const auto nbf = task.bfn_screening.nbe; + + const double* vlapl_pos_device = task.vlapl_pos; + const double* vlapl_neg_device = task.vlapl_neg; + + const double* dden_x_grad_a = task.gamma_pp; + const double* dden_x_grad_b = task.vgamma_pp; + const double* dden_y_grad_a = task.gamma_pm; + const double* dden_y_grad_b = task.vgamma_pm; + const double* dden_z_grad_a = task.gamma_mm; + const double* dden_z_grad_b = task.vgamma_mm; + + const auto* basis_eval_device = task.bf; + const auto* dbasis_x_eval_device = task.dbfx; + const auto* dbasis_y_eval_device = task.dbfy; + const auto* dbasis_z_eval_device = task.dbfz; + const auto* d2basis_lapl_eval_device = task.d2bflapl; + + auto* z_matrix_device = task.zmat; + + const int tid_x = blockIdx.x * blockDim.x + threadIdx.x; + const int tid_y = blockIdx.y * blockDim.y + threadIdx.y; + + if (tid_x < npts and tid_y < nbf) { + + const size_t ibfoff = tid_y * npts + tid_x; + + const auto density_scalar_z = cuda::alpha_beta_to_scalar_z( + task.vrho_pos[tid_x], task.vrho_neg[tid_x]); + const auto x_scalar_z = cuda::alpha_beta_to_scalar_z(dden_x_grad_a[tid_x], + dden_x_grad_b[tid_x]); + const auto y_scalar_z = cuda::alpha_beta_to_scalar_z(dden_y_grad_a[tid_x], + dden_y_grad_b[tid_x]); + const auto z_scalar_z = cuda::alpha_beta_to_scalar_z(dden_z_grad_a[tid_x], + dden_z_grad_b[tid_x]); + + double density_potential = density_scalar_z.scalar; + double x_fact = x_scalar_z.scalar; + double y_fact = y_scalar_z.scalar; + double z_fact = z_scalar_z.scalar; + + if constexpr (den_selector == DEN_Z) { + density_potential = density_scalar_z.spin_z; + x_fact = x_scalar_z.spin_z; + y_fact = y_scalar_z.spin_z; + z_fact = z_scalar_z.spin_z; + } + + auto val = x_fact * dbasis_x_eval_device[ibfoff] + + y_fact * dbasis_y_eval_device[ibfoff] + + z_fact * dbasis_z_eval_device[ibfoff] + + 0.5 * density_potential * basis_eval_device[ibfoff]; + + if constexpr (need_lapl) { + const auto laplacian_scalar_z = cuda::alpha_beta_to_scalar_z( + vlapl_pos_device[tid_x], vlapl_neg_device[tid_x]); + double laplacian_potential = laplacian_scalar_z.scalar; + if constexpr (den_selector == DEN_Z) + laplacian_potential = laplacian_scalar_z.spin_z; + val += laplacian_potential * d2basis_lapl_eval_device[ibfoff]; + } + + z_matrix_device[ibfoff] = val; + } +} + +/** + * @brief Launch Z-matrix assembly for one density channel. + * @param ntasks Number of active tasks. + * @param max_nbf Maximum screened basis size among tasks. + * @param max_npts Maximum point count among tasks. + * @param tasks_device Device pointer to active tasks. + * @param scheme Density approximation controlling kernel selection. + * @param sel Scalar or z-spin density channel. + * @param queue Queue on which assembly is enqueued. + */ +void zmat_skala_vxc(size_t ntasks, int32_t max_nbf, int32_t max_npts, + XCDeviceTask* tasks_device, integrator_xc_approx scheme, + density_id sel, device_queue queue) { + + cudaStream_t stream = queue.queue_as(); + + dim3 threads(GauXC::cuda::warp_size, GauXC::cuda::max_warps_per_thread_block, + 1); + dim3 blocks(GauXC::util::div_ceil(max_npts, threads.x), + GauXC::util::div_ceil(max_nbf, threads.y), ntasks); + if (scheme == LDA) { + switch (sel) { + case DEN_S: + zmat_lda_vxc_skala_kernel + <<>>(ntasks, tasks_device); + break; + case DEN_Z: + zmat_lda_vxc_skala_kernel + <<>>(ntasks, tasks_device); + break; + default: + SKALAXC_EXCEPTION("Skala VXC requires scalar or z-spin density"); + } + } else if (scheme == GGA) { + switch (sel) { + case DEN_S: + zmat_gga_vxc_skala_kernel + <<>>(ntasks, tasks_device); + break; + case DEN_Z: + zmat_gga_vxc_skala_kernel + <<>>(ntasks, tasks_device); + break; + default: + SKALAXC_EXCEPTION("Skala VXC requires scalar or z-spin density"); + } + } else if (scheme == MGGA_TAU) { + switch (sel) { + case DEN_S: + zmat_mgga_vxc_skala_kernel + <<>>(ntasks, tasks_device); + break; + case DEN_Z: + zmat_mgga_vxc_skala_kernel + <<>>(ntasks, tasks_device); + break; + default: + SKALAXC_EXCEPTION("Skala VXC requires scalar or z-spin density"); + } + } else { + SKALAXC_EXCEPTION("SKALA NYI for this scheme"); + } + cuda::check_launch("Failed to launch Skala VXC assembly"); +} + +} // namespace SkalaXC diff --git a/SkalaXC/src/device/cuda/kernels/skala_exc_grad.cu b/SkalaXC/src/device/cuda/kernels/skala_exc_grad.cu new file mode 100644 index 00000000..3f682670 --- /dev/null +++ b/SkalaXC/src/device/cuda/kernels/skala_exc_grad.cu @@ -0,0 +1,102 @@ +/** + * GauXC Copyright (c) 2020-2024, The Regents of the University of California, + * through Lawrence Berkeley National Laboratory (subject to receipt of + * any required approvals from the U.S. Dept. of Energy). + * + * (c) 2024-2025, Microsoft Corporation + * + * All rights reserved. + * + * See LICENSE.txt for details + * + * --------------------------------------------------------------------------- + * SkalaXC adaptation: renamed from GauXC skala-branch + * cuda/kernels/onedft_exc_grad.cu (onedft -> skala). Compiled only when + * SKALAXC_ENABLE_CUDA is ON (requires a CUDA toolchain). + * --------------------------------------------------------------------------- + */ +/** + * @file + * @brief CUDA adaptation of Skala derivatives for GauXC gradient kernels. + */ +#include "common/skala_exc_grad.hpp" +#include "device/cuda_launch_check.hpp" +#include "device_specific/cuda_device_constants.hpp" +#include "device_specific/cuda_util.hpp" +#include "spin_channels.cuh" +#include + +namespace SkalaXC { + +using GauXC::device_queue; +using GauXC::XCDeviceTask; + +/** + * @brief Convert per-component Skala VXC values to GauXC gradient inputs. + * @param ntasks Number of tasks in @p tasks_device. + * @param tasks_device Tasks indexed by the z grid dimension. + * + * Alpha directional derivatives occupy the `gamma` buffers and beta + * derivatives occupy the corresponding `vgamma` buffers. The kernel writes + * scalar/z derivatives to `dden` and sets GauXC's coupling coefficients so its + * standard GGA and meta-GGA gradient kernels reproduce the Skala expression. + */ +__global__ void transform_skala_vxc_for_grad_kernel( + uint32_t ntasks, XCDeviceTask* __restrict__ tasks_device) { + + const int batch_idx = blockIdx.z; + if (batch_idx >= ntasks) return; + + auto& task = tasks_device[batch_idx]; + const auto npts = task.npts; + + const int tid = blockIdx.x * blockDim.x + threadIdx.x; + if (tid >= npts) return; + + // Read per-direction SkalaXC derivatives (alpha/beta) + const double dx_a = task.gamma_pp[tid]; + const double dx_b = task.vgamma_pp[tid]; + const double dy_a = task.gamma_pm[tid]; + const double dy_b = task.vgamma_pm[tid]; + const double dz_a = task.gamma_mm[tid]; + const double dz_b = task.vgamma_mm[tid]; + + const auto dx_scalar_z = cuda::alpha_beta_to_scalar_z(dx_a, dx_b); + const auto dy_scalar_z = cuda::alpha_beta_to_scalar_z(dy_a, dy_b); + const auto dz_scalar_z = cuda::alpha_beta_to_scalar_z(dz_a, dz_b); + task.dden_sx[tid] = dx_scalar_z.scalar; + task.dden_sy[tid] = dy_scalar_z.scalar; + task.dden_sz[tid] = dz_scalar_z.scalar; + task.dden_zx[tid] = dx_scalar_z.spin_z; + task.dden_zy[tid] = dy_scalar_z.spin_z; + task.dden_zz[tid] = dz_scalar_z.spin_z; + + // Set vgamma coefficients so the standard kernel reproduces the SkalaXC + // formula + task.vgamma_pp[tid] = 1.0; + task.vgamma_pm[tid] = 0.0; + task.vgamma_mm[tid] = 1.0; +} + +/** + * @brief Launch conversion of Skala VXC buffers to GauXC gradient inputs. + * @param ntasks Number of active tasks. + * @param max_npts Maximum point count among tasks. + * @param tasks_device Device pointer to active tasks. + * @param queue Queue on which conversion is enqueued. + */ +void transform_skala_vxc_for_grad(size_t ntasks, int32_t max_npts, + XCDeviceTask* tasks_device, + device_queue queue) { + + cudaStream_t stream = queue.queue_as(); + + dim3 threads(256); + dim3 blocks(GauXC::util::div_ceil((uint32_t)max_npts, threads.x), 1, ntasks); + + transform_skala_vxc_for_grad_kernel<<>>( + ntasks, tasks_device); + cuda::check_launch("Failed to launch Skala gradient-potential transform"); +} + +} // namespace SkalaXC diff --git a/SkalaXC/src/device/cuda/kernels/spin_channels.cuh b/SkalaXC/src/device/cuda/kernels/spin_channels.cuh new file mode 100644 index 00000000..872179c4 --- /dev/null +++ b/SkalaXC/src/device/cuda/kernels/spin_channels.cuh @@ -0,0 +1,25 @@ +#pragma once + +namespace SkalaXC::cuda { + +struct AlphaBetaChannels { + double alpha; + double beta; +}; + +struct ScalarZChannels { + double scalar; + double spin_z; +}; + +__device__ __forceinline__ AlphaBetaChannels + scalar_z_to_alpha_beta(double scalar, double spin_z) { + return {0.5 * (scalar + spin_z), 0.5 * (scalar - spin_z)}; +} + +__device__ __forceinline__ ScalarZChannels alpha_beta_to_scalar_z(double alpha, + double beta) { + return {0.5 * (alpha + beta), 0.5 * (alpha - beta)}; +} + +} // namespace SkalaXC::cuda \ No newline at end of file diff --git a/SkalaXC/src/device/cuda_launch_check.hpp b/SkalaXC/src/device/cuda_launch_check.hpp new file mode 100644 index 00000000..a7b4cc7f --- /dev/null +++ b/SkalaXC/src/device/cuda_launch_check.hpp @@ -0,0 +1,26 @@ +/** + * @file + * @brief Non-synchronizing validation for SkalaXC-owned CUDA kernel launches. + */ +#pragma once + +#include "exceptions.hpp" + +#include + +#include + +namespace SkalaXC::cuda { + +/** + * @brief Throw with operation context if the preceding kernel launch failed. + * @param operation Description of the kernel operation. + */ +inline void check_launch(const char* operation) { + const cudaError_t status = cudaGetLastError(); + if (status != cudaSuccess) + SKALAXC_EXCEPTION(std::string(operation) + ": " + + cudaGetErrorString(status)); +} + +} // namespace SkalaXC::cuda diff --git a/SkalaXC/src/device/model_grid_exchange.cxx b/SkalaXC/src/device/model_grid_exchange.cxx new file mode 100644 index 00000000..65a5211f --- /dev/null +++ b/SkalaXC/src/device/model_grid_exchange.cxx @@ -0,0 +1,609 @@ +/** + * @file + * @brief Implementation of rank-local CUDA task and model tensor exchange. + */ +#include "device/model_grid_exchange.hpp" + +#include "device/common/model_grid.hpp" +#include "device/xc_device_aos_data.hpp" +#include "exceptions.hpp" +#include "host/skala_util.hpp" + +#include + +#include + +#include +#include +#include +#include +#include + +namespace SkalaXC { + +namespace { + +/** + * @brief Test whether a dictionary contains a known model feature. + * @param features Feature dictionary to inspect. + * @param feature Feature identifier to find. + * @return `true` when the mapped feature key is present. + */ +bool has_feature(const FeatureDict& features, SKALA_FEATURE feature) { + return features.find(feat_map().at(feature)) != features.end(); +} + +/** + * @brief Access mutable storage for an optional feature tensor. + * @param features Feature dictionary containing device tensors. + * @param feature Feature identifier to access. + * @return Tensor data pointer, or `nullptr` when absent. + */ +double* feature_data(const FeatureDict& features, SKALA_FEATURE feature, + const c10::Device& device, std::int64_t point_count) { + if (!has_feature(features, feature)) return nullptr; + const auto& tensor = features.at(feat_map().at(feature)); + std::vector sizes; + switch (feature) { + case SKALA_FEATURE::DEN: + case SKALA_FEATURE::TAU: + sizes = {spin_dimension, point_count}; + break; + case SKALA_FEATURE::DDEN: + sizes = {spin_dimension, direction_dimension, point_count}; + break; + case SKALA_FEATURE::POINTS: + sizes = {point_count, direction_dimension}; + break; + case SKALA_FEATURE::WEIGHTS: + sizes = {point_count}; + break; + default: + SKALAXC_EXCEPTION("Unsupported CUDA model feature storage"); + } + validate_model_tensor(tensor, + "CUDA model feature '" + feat_map().at(feature) + "'", + device, torch::kFloat64, sizes, true); + return tensor.data_ptr(); +} + +/** + * @brief Validate and access a model potential tensor. + * @param features Potential dictionary containing device tensors. + * @param feature Feature derivative to access. + * @return Contiguous tensor data, or `nullptr` when absent. + */ +const double* potential_data(const FeatureDict& features, SKALA_FEATURE feature, + const c10::Device& device, + std::int64_t point_count) { + if (!has_feature(features, feature)) return nullptr; + const auto& potential = features.at(feat_map().at(feature)); + const auto sizes = + feature == SKALA_FEATURE::DDEN + ? std::vector{spin_dimension, direction_dimension, + point_count} + : std::vector{spin_dimension, point_count}; + validate_model_tensor(potential, + "CUDA model potential '" + feat_map().at(feature) + "'", + device, torch::kFloat64, sizes, true); + return potential.data_ptr(); +} + +/** + * @brief Return the scalar width of one point record. + * @param feature Feature whose point layout is queried. + * @return Record width, or zero for a non-point-indexed feature. + */ +int point_components(SKALA_FEATURE feature) { + switch (feature) { + case SKALA_FEATURE::DEN: + case SKALA_FEATURE::TAU: + return spin_dimension; + case SKALA_FEATURE::DDEN: + return spin_dimension * direction_dimension; + case SKALA_FEATURE::POINTS: + return direction_dimension; + case SKALA_FEATURE::WEIGHTS: + case SKALA_FEATURE::ATOMIC_GRID_WEIGHTS: + return 1; + default: + return 0; + } +} + +/** @brief Return the point-indexed dimension for a model-facing feature. */ +int point_dimension(SKALA_FEATURE feature) { + switch (feature) { + case SKALA_FEATURE::DEN: + case SKALA_FEATURE::TAU: + return 1; + case SKALA_FEATURE::DDEN: + return 2; + case SKALA_FEATURE::POINTS: + case SKALA_FEATURE::WEIGHTS: + case SKALA_FEATURE::ATOMIC_GRID_WEIGHTS: + return 0; + default: + SKALAXC_EXCEPTION("Feature is not point-indexed"); + } +} + +/** @brief Copy a point interval between tensors in model-facing layout. */ +void copy_point_interval(const at::Tensor& source, std::int64_t source_offset, + const at::Tensor& destination, + std::int64_t destination_offset, + std::int64_t point_count, SKALA_FEATURE feature) { + const int dimension = point_dimension(feature); + destination.narrow(dimension, destination_offset, point_count) + .copy_(source.narrow(dimension, source_offset, point_count)); +} + +/** @brief Persistent CUDA allocation with value-count-based access. */ +template +class CudaBuffer { + public: + /** + * @brief Allocate persistent storage on the current CUDA device. + * @param size Number of values to allocate. + * @param host_values Optional host values copied into the allocation. + * @param device_id Required current CUDA device ordinal. + */ + CudaBuffer(std::size_t size, const T* host_values, int device_id) + : device_id_(device_id) { + int current_device = -1; + auto status = cudaGetDevice(¤t_device); + if (status != cudaSuccess) + SKALAXC_EXCEPTION(std::string("Failed to query the CUDA device: ") + + cudaGetErrorString(status)); + if (current_device != device_id_) + SKALAXC_EXCEPTION( + "CUDA exchange metadata device does not match the active device"); + if (size == 0) return; + + status = cudaMalloc(reinterpret_cast(&data_), size * sizeof(T)); + if (status != cudaSuccess) + SKALAXC_EXCEPTION( + std::string("Failed to allocate CUDA exchange storage: ") + + cudaGetErrorString(status)); + if (!host_values) return; + + status = cudaMemcpy(data_, host_values, size * sizeof(T), + cudaMemcpyHostToDevice); + if (status != cudaSuccess) { + cudaFree(data_); + data_ = nullptr; + SKALAXC_EXCEPTION( + std::string("Failed to initialize CUDA exchange storage: ") + + cudaGetErrorString(status)); + } + } + + /** @brief Release the allocation on its owning CUDA device. */ + ~CudaBuffer() noexcept { + if (!data_) return; + int previous_device = device_id_; + const bool restore_device = + cudaGetDevice(&previous_device) == cudaSuccess && + previous_device != device_id_; + if (restore_device) cudaSetDevice(device_id_); + cudaFree(data_); + if (restore_device) cudaSetDevice(previous_device); + } + + /** @brief CUDA allocations cannot be copied. */ + CudaBuffer(const CudaBuffer&) = delete; + /** @brief CUDA allocations cannot be copy-assigned. */ + CudaBuffer& operator=(const CudaBuffer&) = delete; + + /** @return Mutable device pointer, or null for an empty allocation. */ + T* data() noexcept { return data_; } + /** @return Read-only device pointer, or null for an empty allocation. */ + const T* data() const noexcept { return data_; } + /** @return CUDA device ordinal that owns the allocation. */ + int device_id() const noexcept { return device_id_; } + + private: + T* data_ = nullptr; + int device_id_ = 0; +}; + +} // namespace + +/** @brief Persistent non-Torch CUDA metadata used by model-grid exchange. */ +struct DeviceModelGridExchange::DeviceStorage { + DeviceStorage(const std::vector& point_offsets, + const std::vector& batch_atom_indices, + types::DeviceId device_id) + : point_offsets(point_offsets.size(), point_offsets.data(), + device_id.raw()), + batch_atom_indices(batch_atom_indices.size(), batch_atom_indices.data(), + device_id.raw()) {} + + CudaBuffer point_offsets; + CudaBuffer batch_atom_indices; +}; + +DeviceModelGridExchange::DeviceModelGridExchange( + const std::vector& tasks, types::AtomCount atom_count, + const GauXC::RuntimeEnvironment& rt, + const std::vector>& raw_weights, + types::DeviceId device_id, DomainBatchMode batch_mode) + : layout_(tasks, atom_count, rt, false), + local_batches_(layout_.make_local_batches(batch_mode)), + point_offset_by_task_(tasks.size(), types::GridPointOffset{-1}) { + if (raw_weights.size() != tasks.size()) + SKALAXC_EXCEPTION("Raw grid weights do not match CUDA tasks"); + + std::vector point_offsets(tasks.size(), -1); + atom_ordered_raw_weights_.resize( + static_cast(layout_.local_point_count().raw())); + for (const auto& block : layout_.task_blocks()) { + const auto task_index = block.task_index.raw(); + const auto point_offset = block.point_offset.raw(); + const auto point_count = block.point_count.raw(); + point_offset_by_task_[task_index] = block.point_offset; + point_offsets[task_index] = point_offset; + if (raw_weights[task_index].size() != static_cast(point_count)) + SKALAXC_EXCEPTION("Invalid CUDA raw grid-weight dimensions"); + std::copy(raw_weights[task_index].begin(), raw_weights[task_index].end(), + atom_ordered_raw_weights_.begin() + point_offset); + } + + std::vector local_batch_atom_indices; + local_batch_atom_offsets_.reserve(local_batches_.size() + 1); + for (const auto& batch : local_batches_) { + local_batch_atom_offsets_.push_back(local_batch_atom_indices.size()); + for (const auto atom : batch.atoms) + local_batch_atom_indices.push_back(static_cast(atom.raw())); + } + local_batch_atom_offsets_.push_back(local_batch_atom_indices.size()); + + device_storage_ = std::make_unique( + point_offsets, local_batch_atom_indices, device_id); +} + +DeviceModelGridExchange::~DeviceModelGridExchange() noexcept = default; + +FeatureDict DeviceModelGridExchange::prepare_features( + const std::vector& feature_keys, + const c10::Device& device) const { + const std::int64_t point_count = layout_.local_point_count().raw(); + const auto options = + torch::TensorOptions().dtype(torch::kFloat64).device(device); + FeatureDict features; + + for (const auto& key : feature_keys) { + at::Tensor tensor; + switch (reverse_feat_map().at(key)) { + case SKALA_FEATURE::DEN: + tensor = torch::full({2, point_count}, + std::numeric_limits::quiet_NaN(), options) + .contiguous(); + break; + case SKALA_FEATURE::DDEN: + tensor = torch::full({2, 3, point_count}, + std::numeric_limits::quiet_NaN(), options) + .contiguous(); + break; + case SKALA_FEATURE::TAU: + tensor = torch::full({2, point_count}, + std::numeric_limits::quiet_NaN(), options) + .contiguous(); + break; + case SKALA_FEATURE::POINTS: + tensor = torch::full({point_count, 3}, + std::numeric_limits::quiet_NaN(), options); + break; + case SKALA_FEATURE::WEIGHTS: + tensor = torch::full({point_count}, + std::numeric_limits::quiet_NaN(), options); + break; + case SKALA_FEATURE::COORDS: + case SKALA_FEATURE::ATOMIC_GRID_SIZES: + case SKALA_FEATURE::ATOMIC_GRID_SIZE_BOUND_SHAPE: + continue; + case SKALA_FEATURE::ATOMIC_GRID_WEIGHTS: + tensor = + torch::from_blob( + const_cast(atom_ordered_raw_weights_.data()), + {point_count}, torch::TensorOptions().dtype(torch::kFloat64)) + .clone() + .to(device); + break; + default: + SKALAXC_EXCEPTION("Feature Key Not Implemented: " + key); + } + features.insert(key, tensor); + } + return features; +} + +FeatureDict DeviceModelGridExchange::prepare_local_batch_features( + const ModelDomainBatch& batch, const FeatureDict& local_features, + const GauXC::Molecule& molecule, + const std::vector& feature_keys, const c10::Device& device, + bool geometry_gradients) const { + FeatureDict batch_features; + for (const auto& key : feature_keys) { + const auto feature = reverse_feat_map().at(key); + if (point_components(feature) != 0) { + const auto local = local_features.find(key); + if (local == local_features.end()) + SKALAXC_EXCEPTION("Missing local CUDA feature: " + key); + std::vector task_tensors; + task_tensors.reserve(batch.task_blocks.size()); + const int dimension = point_dimension(feature); + for (const auto& block : batch.task_blocks) { + const auto offset = point_offset_by_task_[block.task_index.raw()].raw(); + task_tensors.push_back( + local->value().narrow(dimension, offset, block.point_count.raw())); + } + auto tensor = task_tensors.size() == 1 + ? task_tensors.front().clone() + : torch::cat(task_tensors, dimension); + const bool requires_gradient = + feature == SKALA_FEATURE::DEN || feature == SKALA_FEATURE::DDEN || + feature == SKALA_FEATURE::TAU || + (geometry_gradients && (feature == SKALA_FEATURE::POINTS || + feature == SKALA_FEATURE::WEIGHTS)); + if (requires_gradient) tensor.requires_grad_(true); + batch_features.insert(key, tensor); + continue; + } + + at::Tensor tensor; + switch (feature) { + case SKALA_FEATURE::COORDS: { + std::vector coordinates(direction_dimension * + batch.atoms.size()); + for (std::size_t local_atom = 0; local_atom < batch.atoms.size(); + ++local_atom) { + const auto atom = batch.atoms[local_atom].raw(); + coordinates[direction_dimension * local_atom] = molecule[atom].x; + coordinates[direction_dimension * local_atom + 1] = molecule[atom].y; + coordinates[direction_dimension * local_atom + 2] = molecule[atom].z; + } + tensor = + torch::from_blob(coordinates.data(), + {static_cast(batch.atoms.size()), + direction_dimension}, + torch::TensorOptions().dtype(torch::kFloat64)) + .clone() + .to(device); + if (geometry_gradients) tensor.requires_grad_(true); + break; + } + case SKALA_FEATURE::ATOMIC_GRID_SIZES: { + std::vector grid_sizes(batch.atoms.size(), + batch.grid_size.raw()); + tensor = + torch::from_blob(grid_sizes.data(), + {static_cast(grid_sizes.size())}, + torch::TensorOptions().dtype(torch::kInt64)) + .clone() + .to(device); + break; + } + case SKALA_FEATURE::ATOMIC_GRID_SIZE_BOUND_SHAPE: + tensor = torch::zeros( + {batch.grid_size.raw(), 0}, + torch::TensorOptions().dtype(torch::kInt64).device(device)); + break; + default: + SKALAXC_EXCEPTION("Feature Key Not Implemented: " + key); + } + batch_features.insert(key, tensor); + } + return batch_features; +} + +FeatureDict DeviceModelGridExchange::prepare_local_potentials( + bool has_density_gradient, bool has_kinetic, + const c10::Device& device) const { + const auto options = + torch::TensorOptions().dtype(torch::kFloat64).device(device); + const auto point_count = layout_.local_point_count().raw(); + FeatureDict potentials; + potentials.insert(feat_map().at(SKALA_FEATURE::DEN), + torch::zeros({spin_dimension, point_count}, options)); + if (has_density_gradient) + potentials.insert( + feat_map().at(SKALA_FEATURE::DDEN), + torch::zeros({spin_dimension, direction_dimension, point_count}, + options)); + if (has_kinetic) + potentials.insert(feat_map().at(SKALA_FEATURE::TAU), + torch::zeros({spin_dimension, point_count}, options)); + return potentials; +} + +void DeviceModelGridExchange::store_local_batch_potentials( + const ModelDomainBatch& batch, bool has_density_gradient, bool has_kinetic, + const FeatureDict& batch_features, + const FeatureDict& local_potentials) const { + const std::vector potential_features{ + SKALA_FEATURE::DEN, SKALA_FEATURE::DDEN, SKALA_FEATURE::TAU}; + at::NoGradGuard no_grad; + for (const auto feature : potential_features) { + if ((feature == SKALA_FEATURE::DDEN && !has_density_gradient) || + (feature == SKALA_FEATURE::TAU && !has_kinetic)) + continue; + const auto& key = feat_map().at(feature); + const auto gradient = validated_model_gradient( + batch_features.at(key), "CUDA model potential '" + key + "'"); + const auto& destination = local_potentials.at(key); + validate_model_tensor(destination, "CUDA full-grid potential '" + key + "'", + gradient.device(), gradient.scalar_type(), + destination.sizes(), true); + for (const auto& block : batch.task_blocks) + copy_point_interval(gradient, block.point_offset.raw(), destination, + point_offset_by_task_[block.task_index.raw()].raw(), + block.point_count.raw(), feature); + } +} + +at::Tensor DeviceModelGridExchange::prepare_local_dE_dw( + const c10::Device& device) const { + return torch::zeros( + {layout_.local_point_count().raw()}, + torch::TensorOptions().dtype(torch::kFloat64).device(device)); +} + +void DeviceModelGridExchange::store_local_batch_dE_dw( + const ModelDomainBatch& batch, const at::Tensor& batch_dE_dw, + const at::Tensor& local_dE_dw) const { + const auto device = c10::Device(c10::DeviceType::CUDA, + device_storage_->point_offsets.device_id()); + validate_model_tensor(batch_dE_dw, "local CUDA model dE/dw", device, + torch::kFloat64, {batch.point_count.raw()}); + validate_model_tensor(local_dE_dw, "full-grid CUDA model dE/dw", device, + torch::kFloat64, {layout_.local_point_count().raw()}, + true); + + const auto contiguous_dE_dw = batch_dE_dw.contiguous(); + at::NoGradGuard no_grad; + for (const auto& block : batch.task_blocks) + copy_point_interval(contiguous_dE_dw, block.point_offset.raw(), local_dE_dw, + point_offset_by_task_[block.task_index.raw()].raw(), + block.point_count.raw(), SKALA_FEATURE::WEIGHTS); +} + +void DeviceModelGridExchange::accumulate_local_geometry_gradients( + std::size_t batch_index, const FeatureDict& batch_features, + GauXC::XCDeviceAoSData& device_data) const { + const auto& batch = local_batches_.at(batch_index); + const double* point_gradient_data = nullptr; + const double* coordinate_gradient_data = nullptr; + at::Tensor point_gradient; + at::Tensor coordinate_gradient; + + const auto points = batch_features.find(feat_map().at(SKALA_FEATURE::POINTS)); + if (points != batch_features.end() && points->value().grad().defined()) { + point_gradient = validated_model_gradient( + points->value(), "local CUDA model point gradient"); + validate_model_tensor( + point_gradient, "local CUDA model point gradient", + c10::Device(c10::DeviceType::CUDA, + device_storage_->point_offsets.device_id()), + torch::kFloat64, {batch.point_count.raw(), direction_dimension}, true); + point_gradient_data = point_gradient.data_ptr(); + } + + const auto coordinates = + batch_features.find(feat_map().at(SKALA_FEATURE::COORDS)); + if (coordinates != batch_features.end() && + coordinates->value().grad().defined()) { + coordinate_gradient = validated_model_gradient( + coordinates->value(), "local CUDA model coordinate gradient"); + validate_model_tensor( + coordinate_gradient, "local CUDA model coordinate gradient", + c10::Device(c10::DeviceType::CUDA, + device_storage_->point_offsets.device_id()), + torch::kFloat64, + {static_cast(batch.atoms.size()), direction_dimension}, + true); + coordinate_gradient_data = coordinate_gradient.data_ptr(); + } + + if (!device_data.static_stack.exc_grad_device) + SKALAXC_EXCEPTION("Missing GauXC CUDA XC-gradient storage"); + const auto atom_offset = local_batch_atom_offsets_.at(batch_index); + accumulate_model_geometry_gradient( + batch.atoms.size(), batch.grid_size.raw(), + device_storage_->batch_atom_indices.data() + atom_offset, + point_gradient_data, coordinate_gradient_data, + device_data.static_stack.exc_grad_device, device_data.queue()); +} + +void DeviceModelGridExchange::pack_post_uvars_features( + GauXC::XCDeviceAoSData& device_data, types::TaskIndex first_task, + const FeatureDict& feature_dict) const { + const std::size_t task_count = device_data.host_device_tasks.size(); + const auto first_task_value = first_task.raw(); + if (first_task_value + task_count > point_offset_by_task_.size()) + SKALAXC_EXCEPTION("CUDA task batch exceeds model-grid layout"); + const auto device = c10::Device(c10::DeviceType::CUDA, + device_storage_->point_offsets.device_id()); + std::int32_t max_points = 0; + for (std::size_t task = 0; task < task_count; ++task) { + if (device_data.host_device_tasks[task].npts > + static_cast(std::numeric_limits::max())) + SKALAXC_EXCEPTION("CUDA task point count exceeds supported size"); + max_points = std::max( + max_points, + static_cast(device_data.host_device_tasks[task].npts)); + } + + pack_post_uvars_model_grid_features( + task_count, max_points, device_data.aos_stack.device_tasks, + device_storage_->point_offsets.data() + first_task_value, + layout_.local_point_count().raw(), + feature_data(feature_dict, SKALA_FEATURE::DEN, device, + layout_.local_point_count().raw()), + feature_data(feature_dict, SKALA_FEATURE::DDEN, device, + layout_.local_point_count().raw()), + feature_data(feature_dict, SKALA_FEATURE::TAU, device, + layout_.local_point_count().raw()), + feature_data(feature_dict, SKALA_FEATURE::POINTS, device, + layout_.local_point_count().raw()), + feature_data(feature_dict, SKALA_FEATURE::WEIGHTS, device, + layout_.local_point_count().raw()), + device_data.queue()); +} + +void DeviceModelGridExchange::unpack_potentials( + GauXC::XCDeviceAoSData& device_data, types::TaskIndex first_task, + const FeatureDict& feature_dict) const { + const std::size_t task_count = device_data.host_device_tasks.size(); + const auto first_task_value = first_task.raw(); + if (first_task_value + task_count > point_offset_by_task_.size()) + SKALAXC_EXCEPTION("CUDA task batch exceeds model-grid layout"); + const auto device = c10::Device(c10::DeviceType::CUDA, + device_storage_->point_offsets.device_id()); + std::int32_t max_points = 0; + for (std::size_t task = 0; task < task_count; ++task) { + max_points = std::max( + max_points, + static_cast(device_data.host_device_tasks[task].npts)); + } + + unpack_model_grid_potentials( + task_count, max_points, device_data.aos_stack.device_tasks, + device_storage_->point_offsets.data() + first_task_value, + layout_.local_point_count().raw(), + potential_data(feature_dict, SKALA_FEATURE::DEN, device, + layout_.local_point_count().raw()), + potential_data(feature_dict, SKALA_FEATURE::DDEN, device, + layout_.local_point_count().raw()), + potential_data(feature_dict, SKALA_FEATURE::TAU, device, + layout_.local_point_count().raw()), + device_data.queue()); +} + +void DeviceModelGridExchange::prepare_weight_derivatives( + GauXC::XCDeviceAoSData& device_data, types::TaskIndex first_task, + const at::Tensor& dE_dw) const { + const std::size_t task_count = device_data.host_device_tasks.size(); + const auto first_task_value = first_task.raw(); + if (first_task_value + task_count > point_offset_by_task_.size()) + SKALAXC_EXCEPTION("CUDA task batch exceeds model-grid layout"); + validate_model_tensor(dE_dw, "CUDA model dE/dw tensor", + c10::Device(c10::DeviceType::CUDA, + device_storage_->point_offsets.device_id()), + torch::kFloat64, {layout_.local_point_count().raw()}, + true); + + std::int32_t max_points = 0; + for (std::size_t task = 0; task < task_count; ++task) { + max_points = std::max( + max_points, + static_cast(device_data.host_device_tasks[task].npts)); + } + prepare_model_grid_weight_derivatives( + task_count, max_points, device_data.aos_stack.device_tasks, + device_storage_->point_offsets.data() + first_task_value, + layout_.local_point_count().raw(), dE_dw.data_ptr(), + device_data.queue()); +} + +} // namespace SkalaXC diff --git a/SkalaXC/src/device/model_grid_exchange.hpp b/SkalaXC/src/device/model_grid_exchange.hpp new file mode 100644 index 00000000..959f71ab --- /dev/null +++ b/SkalaXC/src/device/model_grid_exchange.hpp @@ -0,0 +1,188 @@ +#pragma once +/** + * @file + * @brief Exchange data between GauXC CUDA tasks and Skala model tensors. + */ + +#include "host/skala_util.hpp" +#include "model_grid_layout.hpp" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace at { +class Tensor; +} + +namespace GauXC { +struct XCDeviceAoSData; +} + +namespace SkalaXC { + +/** + * @brief Translate task-ordered device data to atom-ordered model tensors. + * + * Complete atomic domains are packed into exact-size rank-local model batches. + */ +class DeviceModelGridExchange { + public: + /** + * @brief Build fixed task, point, atom, and MPI exchange metadata. + * @param tasks Sorted local integration tasks. + * @param atom_count Number of atoms in the molecular system. + * @param rt Runtime environment whose communicator defines rank layout. + * @param raw_weights Per-task quadrature weights before partitioning. + * @param device_id CUDA device that owns persistent exchange metadata. + * @param batch_mode Exact-size complete-domain batching policy. + */ + DeviceModelGridExchange(const std::vector& tasks, + types::AtomCount atom_count, + const GauXC::RuntimeEnvironment& rt, + const std::vector>& raw_weights, + types::DeviceId device_id, + DomainBatchMode batch_mode); + + /** @brief Release persistent SkalaXC-owned CUDA exchange storage. */ + ~DeviceModelGridExchange() noexcept; + + /** + * @brief Allocate rank-local model feature tensors on a device. + * @param feature_keys Model input keys to allocate. + * @param device LibTorch device on which tensors are allocated. + * @return Feature dictionary sized for the local grid. + */ + FeatureDict prepare_features(const std::vector& feature_keys, + const c10::Device& device) const; + + /** @return Exact-size batches of complete locally owned domains. */ + const std::vector& local_batches() const noexcept { + return local_batches_; + } + + /** + * @brief Slice one exact-size local domain batch into model inputs. + * @param batch Batch metadata. + * @param local_features Full rank-local feature tensors. + * @param molecule Molecular coordinates. + * @param feature_keys Requested model feature keys. + * @param device LibTorch device owning the tensors. + * @param geometry_gradients Whether coordinate inputs require gradients. + * @return Batch feature dictionary. + */ + FeatureDict prepare_local_batch_features( + const ModelDomainBatch& batch, const FeatureDict& local_features, + const GauXC::Molecule& molecule, + const std::vector& feature_keys, const c10::Device& device, + bool geometry_gradients) const; + + /** + * @brief Allocate full-grid rank-local derivative tensors. + * @param has_density_gradient Whether to allocate density-gradient storage. + * @param has_kinetic Whether to allocate kinetic-density storage. + * @param device LibTorch device owning the tensors. + * @return Rank-local potential dictionary. + */ + FeatureDict prepare_local_potentials(bool has_density_gradient, + bool has_kinetic, + const c10::Device& device) const; + + /** + * @brief Copy one local batch's autograd derivatives into full-grid tensors. + * @param batch Batch metadata. + * @param has_density_gradient Whether density-gradient derivatives exist. + * @param has_kinetic Whether kinetic-density derivatives exist. + * @param batch_features Batch tensors carrying autograd derivatives. + * @param local_potentials Destination full-grid tensors. + */ + void store_local_batch_potentials(const ModelDomainBatch& batch, + bool has_density_gradient, bool has_kinetic, + const FeatureDict& batch_features, + const FeatureDict& local_potentials) const; + + /** + * @brief Allocate a full-grid rank-local `dE/dw` tensor. + * @param device Owning LibTorch device. + * @return Allocated tensor. + */ + at::Tensor prepare_local_dE_dw(const c10::Device& device) const; + + /** + * @brief Copy one batch's `dE/dw` values into the full local grid. + * @param batch Batch metadata. + * @param batch_dE_dw Source batch tensor. + * @param local_dE_dw Destination full-grid tensor. + */ + void store_local_batch_dE_dw(const ModelDomainBatch& batch, + const at::Tensor& batch_dE_dw, + const at::Tensor& local_dE_dw) const; + + /** + * @brief Add one local batch's point and coordinate derivatives on device. + * @param batch_index Index into the vector returned by @c local_batches(). + * @param batch_features Model inputs containing autograd derivatives. + * @param device_data GauXC device data whose queue orders the operation. + */ + void accumulate_local_geometry_gradients( + std::size_t batch_index, const FeatureDict& batch_features, + GauXC::XCDeviceAoSData& device_data) const; + + /** + * @brief Pack one post-U-variable task batch into local model tensors. + * + * GauXC's UKS `eval_uvars_*` must have completed for the active batch. + * @param device_data Device data containing the active task batch. + * @param first_task Batch's first index in the load balancer task list. + * @param feature_dict Destination rank-local device tensors. + */ + void pack_post_uvars_features(GauXC::XCDeviceAoSData& device_data, + types::TaskIndex first_task, + const FeatureDict& feature_dict) const; + + /** + * @brief Unpack rank-local model potentials into one GauXC task batch. + * @param device_data Device data containing the active task batch. + * @param first_task Batch's first index in the load balancer task list. + * @param feature_dict Source rank-local potential tensors. + */ + void unpack_potentials(GauXC::XCDeviceAoSData& device_data, + types::TaskIndex first_task, + const FeatureDict& feature_dict) const; + + /** + * @brief Prepare a task batch for GauXC molecular-weight derivatives. + * @param device_data Device data containing the active task batch. + * @param first_task Batch's first index in the load balancer task list. + * @param dE_dw Rank-local contiguous CUDA `dE/dw` values. + */ + void prepare_weight_derivatives(GauXC::XCDeviceAoSData& device_data, + types::TaskIndex first_task, + const at::Tensor& dE_dw) const; + + private: + /** @brief Opaque owner of persistent CUDA transport metadata. */ + struct DeviceStorage; + + /** @brief Fixed local task, point, and atom ordering. */ + ModelGridLayout layout_; + /** @brief Exact-size batches of complete domains owned by this rank. */ + std::vector local_batches_; + /** @brief Model-grid point offset for each load-balancer task. */ + std::vector point_offset_by_task_; + /** @brief Start offset of each batch in persistent device atom indices. */ + std::vector local_batch_atom_offsets_; + /** @brief Local raw weights arranged in atom-major model-grid order. */ + std::vector atom_ordered_raw_weights_; + /** @brief Persistent non-Torch CUDA metadata used by exchange kernels. */ + std::unique_ptr device_storage_; +}; + +} // namespace SkalaXC diff --git a/SkalaXC/src/device/skala_device_driver.cxx b/SkalaXC/src/device/skala_device_driver.cxx new file mode 100644 index 00000000..093e393f --- /dev/null +++ b/SkalaXC/src/device/skala_device_driver.cxx @@ -0,0 +1,548 @@ +/** + * @file + * @brief Implementation of CUDA SkalaXC energy, potential, and gradient work. + */ +#include "device/skala_device_driver.hpp" + +#include "device/common/skala.hpp" +#include "device/common/skala_exc_grad.hpp" +#include "device/model_grid_exchange.hpp" +#include "device/xc_device_aos_data.hpp" +#include "exceptions.hpp" +#include "host/mpi_wrapper.hpp" +#include "host/skala_util.hpp" +#include "skala_model.hpp" + +#include "device/local_device_work_driver.hpp" +#include "runtime_environment/device/device_backend.hpp" +#include "runtime_environment/device_specific/cuda_util.hpp" + +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace SkalaXC { + +namespace { + +/** + * @brief Select a CUDA device for the calling host thread. + * @param device_id CUDA device ordinal to activate. + */ +void activate_cuda_device(types::DeviceId device_id) { + const auto status = cudaSetDevice(device_id.raw()); + if (status != cudaSuccess) + SKALAXC_EXCEPTION(std::string("Failed to select CUDA device: ") + + cudaGetErrorString(status)); +} + +/** @brief Wrap GauXC's master stream as a non-owning LibTorch stream. */ +c10::cuda::CUDAStream torch_stream_for_runtime( + const GauXC::DeviceRuntimeEnvironment& runtime, types::DeviceId device_id) { + auto* backend = runtime.device_backend(); + if (!backend) SKALAXC_EXCEPTION("Missing GauXC CUDA device backend"); + auto queue = backend->queue(); + auto* stream = queue.queue_as_ptr(); + if (!stream) SKALAXC_EXCEPTION("GauXC master queue is not a CUDA stream"); + return c10::cuda::getStreamFromExternal(static_cast(*stream), + device_id.raw()); +} + +/** + * @brief Map model features to GauXC's XC approximation level. + * @param model Loaded Skala model to inspect. + * @return LDA, GGA, or kinetic-density meta-GGA approximation. + */ +GauXC::integrator_xc_approx model_approximation(const SkalaModel& model) { + if (model.is_mgga()) return GauXC::MGGA_TAU; + if (model.is_gga()) return GauXC::GGA; + return GauXC::LDA; +} + +/** + * @brief Check that an Eigen view is a dense column-major AO matrix. + * @tparam Matrix Eigen matrix or map type. + * @param matrix Matrix view to validate. + * @param basis_size Required row and column count. + * @return `true` when dimensions and strides satisfy the device contract. + */ +template +bool valid_ao_matrix(const Matrix& matrix, Eigen::Index basis_size) { + return matrix.rows() == basis_size && matrix.cols() == basis_size && + matrix.innerStride() == 1 && matrix.outerStride() == basis_size; +} + +/** @brief Deferred device validity check and its diagnostic label. */ +struct DeviceFiniteCheck { + std::string label; + at::Tensor result; +}; + +/** @brief Combine deferred validity checks without reading device scalars. */ +at::Tensor aggregate_finite_checks( + const std::vector& checks) { + if (checks.empty()) return {}; + std::vector results; + results.reserve(checks.size()); + for (const auto& check : checks) results.push_back(check.result); + return torch::stack(results).all(); +} + +/** @brief Report a failed validity check after the device stream is fenced. */ +void validate_finite_checks(const std::vector& checks, + const at::Tensor& aggregate) { + if (!aggregate.defined() || aggregate.item()) return; + for (const auto& check : checks) + if (!check.result.item()) + SKALAXC_EXCEPTION("Non-finite CUDA " + check.label); + SKALAXC_EXCEPTION("Non-finite CUDA model value"); +} + +/** @brief Evaluate and validate one CUDA model batch's integrated energy. */ +at::Tensor evaluate_cuda_model_energy(const SkalaModel& model, + const FeatureDict& features, + types::DeviceId device_id, + std::size_t batch_index) { + const std::string batch = + "model output in batch " + std::to_string(batch_index); + return SkalaXC::evaluate_model_energy( + model, features, c10::Device(c10::DeviceType::CUDA, device_id.raw())); +} + +/** @brief Return one batch's validated contiguous `dE/dw` values. */ +at::Tensor model_dE_dw(const FeatureDict& features, types::DeviceId device_id, + std::int64_t point_count, std::size_t batch_index) { + const auto& weights = features.at(feat_map().at(SKALA_FEATURE::WEIGHTS)); + auto dE_dw = validated_model_gradient( + weights, "CUDA model dE/dw in batch " + std::to_string(batch_index)); + validate_model_tensor( + dE_dw, "CUDA model dE/dw in batch " + std::to_string(batch_index), + c10::Device(c10::DeviceType::CUDA, device_id.raw()), torch::kFloat64, + {point_count}, true); + return dE_dw; +} + +} // namespace + +SkalaDeviceDriver::SkalaDeviceDriver( + const GauXC::LoadBalancer& weighted_lb, + const std::vector>& raw_weights, + const std::string& model, types::DeviceId device_id, + double device_memory_fraction, TimingSettings timing_settings, + DomainBatchMode batch_mode) + : SkalaDriver(timing_settings, ExecutionSpace::Device, + types::CommunicatorRank{weighted_lb.runtime().comm_rank()}, + types::CommunicatorSize{weighted_lb.runtime().comm_size()}), + device_id_(device_id), + lb_(weighted_lb), + lwd_(GauXC::LocalWorkDriverFactory::make_local_work_driver( + GauXC::ExecutionSpace::Device, "Default")) { + activate_cuda_device(device_id_); + const auto runtime = GauXC::detail::as_device_runtime(lb_.runtime()); + const c10::cuda::CUDAStreamGuard stream_guard( + torch_stream_for_runtime(runtime, device_id_)); + if (!lb_.state().modified_weights_are_stored) + SKALAXC_EXCEPTION("SkalaDeviceDriver requires weight-partitioned tasks"); + + const auto model_device = + c10::Device(c10::DeviceType::CUDA, device_id_.raw()); + { + detail::HostTimingScope timer(diagnostics_, TimingMetric::ModelLoad); + model_ = std::make_unique(model, lb_.runtime(), model_device); + } + auto& tasks = lb_.get_tasks(); + model_grid_exchange_ = std::make_unique( + tasks, + types::AtomCount{static_cast(lb_.molecule().natoms())}, + lb_.runtime(), raw_weights, device_id_, batch_mode); + const auto& local_batches = model_grid_exchange_->local_batches(); + set_setup_diagnostics(types::CommunicatorSize{lb_.runtime().comm_size()}, + device_id_, device_memory_fraction, batch_mode, tasks, + local_batches); + log_setup(model, model_->feature_keys(), model_->is_gga(), model_->is_mgga(), + local_batches); +} + +SkalaDeviceDriver::~SkalaDeviceDriver() noexcept = default; + +double SkalaDeviceDriver::eval_exc_vxc_uks( + ConstColMajorMatrixMap scalar_density, ConstColMajorMatrixMap spin_density, + ColMajorMatrixMap scalar_potential, ColMajorMatrixMap spin_potential) { + activate_cuda_device(device_id_); + auto runtime = GauXC::detail::as_device_runtime(lb_.runtime()); + const c10::cuda::CUDAStreamGuard stream_guard( + torch_stream_for_runtime(runtime, device_id_)); + diagnostics_.increment_exc_vxc_calls(); + const auto& basis = lb_.basis(); + const Eigen::Index basis_size = basis.nbf(); + if (!valid_ao_matrix(scalar_density, basis_size) || + !valid_ao_matrix(spin_density, basis_size) || + !valid_ao_matrix(scalar_potential, basis_size) || + !valid_ao_matrix(spin_potential, basis_size)) + SKALAXC_EXCEPTION( + "UKS density and potential matrices must be dense nbf x nbf " + "column-major views"); + log_evaluation_start("exc_vxc", scalar_density, spin_density); + + auto* device_lwd = dynamic_cast(lwd_.get()); + if (!device_lwd) SKALAXC_EXCEPTION("Expected a LocalDeviceWorkDriver"); + auto device_data = device_lwd->create_device_data(runtime); + auto* aos_data = dynamic_cast(device_data.get()); + if (!aos_data) SKALAXC_EXCEPTION("Expected Scheme1 CUDA device data"); + + GauXC::integrator_term_tracker terms; + terms.exc_vxc = true; + terms.ks_scheme = GauXC::UKS; + terms.xc_approx = model_approximation(*model_); + const bool is_mgga = model_->is_mgga(); + const bool needs_gradient = model_->is_gga() || is_mgga; + + auto& tasks = lb_.get_tasks(); + GauXC::BasisSetMap basis_map(basis, lb_.molecule()); + device_data->populate_submat_maps(basis.nbf(), tasks.begin(), tasks.end(), + basis_map); + device_data->reset_allocations(); + device_data->allocate_static_data_exc_vxc(basis.nbf(), basis.nshells(), terms, + true); + device_data->send_static_data_density_basis( + scalar_density.data(), basis.nbf(), spin_density.data(), basis.nbf(), + nullptr, 0, nullptr, 0, basis); + device_data->zero_exc_vxc_integrands(terms); + + const auto model_device = + c10::Device(c10::DeviceType::CUDA, device_id_.raw()); + FeatureDict local_features = model_grid_exchange_->prepare_features( + model_->feature_keys(), model_device); + + auto task_it = tasks.begin(); + while (task_it != tasks.end()) { + const auto batch_begin = task_it; + task_it = + device_data->generate_buffers(terms, basis_map, task_it, tasks.end()); + if (needs_gradient) + device_lwd->eval_collocation_gradient(device_data.get()); + else + device_lwd->eval_collocation(device_data.get()); + + const bool need_xmat_gradient = is_mgga; + for (const auto density : {GauXC::DEN_S, GauXC::DEN_Z}) { + device_lwd->eval_xmat(1.0, device_data.get(), need_xmat_gradient, + density); + if (is_mgga) + device_lwd->eval_vvars_mgga(device_data.get(), density, false); + else if (model_->is_gga()) + device_lwd->eval_vvars_gga(device_data.get(), density); + else + device_lwd->eval_vvars_lda(device_data.get(), density); + } + if (is_mgga) + device_lwd->eval_uvars_mgga(device_data.get(), GauXC::UKS, false); + else if (model_->is_gga()) + device_lwd->eval_uvars_gga(device_data.get(), GauXC::UKS); + else + device_lwd->eval_uvars_lda(device_data.get(), GauXC::UKS); + + model_grid_exchange_->pack_post_uvars_features( + *aos_data, + types::TaskIndex{static_cast( + std::distance(tasks.begin(), batch_begin))}, + local_features); + } + + FeatureDict local_potentials = model_grid_exchange_->prepare_local_potentials( + needs_gradient, is_mgga, model_device); + at::Tensor exc_value_device = torch::zeros( + {1}, torch::TensorOptions().dtype(torch::kFloat64).device(model_device)); + std::vector finite_checks; + std::size_t batch_index = 0; + for (const auto& batch : model_grid_exchange_->local_batches()) { + FeatureDict features = model_grid_exchange_->prepare_local_batch_features( + batch, local_features, lb_.molecule(), model_->feature_keys(), + model_device, false); + for (const auto& item : features) { + const auto& tensor = item.value(); + if (tensor.is_floating_point()) + finite_checks.push_back({"model feature '" + item.key() + + "' in batch " + + std::to_string(batch_index), + model_tensor_finite_check(tensor)}); + } + auto exc = + evaluate_cuda_model_energy(*model_, features, device_id_, batch_index); + finite_checks.push_back( + {"model energy in batch " + std::to_string(batch_index), + model_tensor_finite_check(exc)}); + exc.backward(); + for (const auto& item : features) { + const auto gradient = item.value().grad(); + if (gradient.defined()) + finite_checks.push_back({"model gradient for feature '" + item.key() + + "' in batch " + + std::to_string(batch_index), + model_tensor_finite_check(gradient)}); + } + { + at::NoGradGuard no_grad; + exc_value_device.add_(exc.detach()); + } + model_grid_exchange_->store_local_batch_potentials( + batch, needs_gradient, is_mgga, features, local_potentials); + diagnostics_.record_model_batch(types::DomainCount{batch.atoms.size()}); + ++batch_index; + } + const at::Tensor all_model_values_finite = + aggregate_finite_checks(finite_checks); + + task_it = tasks.begin(); + while (task_it != tasks.end()) { + const auto batch_begin = task_it; + task_it = + device_data->generate_buffers(terms, basis_map, task_it, tasks.end()); + model_grid_exchange_->unpack_potentials( + *aos_data, + types::TaskIndex{static_cast( + std::distance(tasks.begin(), batch_begin))}, + local_potentials); + if (needs_gradient) + device_lwd->eval_collocation_gradient(device_data.get()); + else + device_lwd->eval_collocation(device_data.get()); + + std::int32_t max_points = 0; + std::int32_t max_basis = 0; + for (const auto& task : aos_data->host_device_tasks) { + max_points = std::max(max_points, static_cast(task.npts)); + max_basis = std::max(max_basis, + static_cast(task.bfn_screening.nbe)); + } + for (const auto density : {GauXC::DEN_S, GauXC::DEN_Z}) { + zmat_skala_vxc(aos_data->host_device_tasks.size(), max_basis, max_points, + aos_data->aos_stack.device_tasks, terms.xc_approx, density, + device_data->queue()); + if (is_mgga) + device_lwd->eval_mmat_mgga_vxc(device_data.get(), GauXC::UKS, false, + density); + device_lwd->inc_vxc(device_data.get(), density, is_mgga); + } + } + + device_lwd->symmetrize_vxc(device_data.get(), GauXC::DEN_S); + device_lwd->symmetrize_vxc(device_data.get(), GauXC::DEN_Z); + + double device_exc = 0.0; + double electron_count = 0.0; + device_data->retrieve_exc_vxc_integrands( + &device_exc, &electron_count, scalar_potential.data(), basis.nbf(), + spin_potential.data(), basis.nbf(), nullptr, 0, nullptr, 0); + runtime.device_backend()->master_queue_synchronize(); + validate_finite_checks(finite_checks, all_model_values_finite); + double exc_value = exc_value_device.item(); +#ifdef GAUXC_HAS_MPI + if (lb_.runtime().comm_size() > 1) { + mpi::allreduce_sum(scalar_potential, lb_.runtime()); + mpi::allreduce_sum(spin_potential, lb_.runtime()); + std::vector exc_values{exc_value}; + mpi::allreduce_sum(exc_values, lb_.runtime()); + exc_value = exc_values.front(); + } +#endif + log_exc_vxc_result("exc_vxc", exc_value, scalar_potential, spin_potential); + log_device_timing_unavailable("exc_vxc"); + return exc_value; +} + +void SkalaDeviceDriver::eval_exc_grad_uks(ConstColMajorMatrixMap scalar_density, + ConstColMajorMatrixMap spin_density, + RowMajorMatrixMap gradient) { + activate_cuda_device(device_id_); + auto runtime = GauXC::detail::as_device_runtime(lb_.runtime()); + const c10::cuda::CUDAStreamGuard stream_guard( + torch_stream_for_runtime(runtime, device_id_)); + diagnostics_.increment_exc_gradient_calls(); + const auto& basis = lb_.basis(); + const Eigen::Index basis_size = basis.nbf(); + if (!valid_ao_matrix(scalar_density, basis_size) || + !valid_ao_matrix(spin_density, basis_size) || + gradient.rows() != static_cast(lb_.molecule().size()) || + gradient.cols() != direction_dimension || gradient.innerStride() != 1 || + gradient.outerStride() != direction_dimension) + SKALAXC_EXCEPTION("Invalid density matrix or atom-major gradient view"); + log_evaluation_start("exc_gradient", scalar_density, spin_density); + + auto* device_lwd = dynamic_cast(lwd_.get()); + if (!device_lwd) SKALAXC_EXCEPTION("Expected a LocalDeviceWorkDriver"); + auto device_data = device_lwd->create_device_data(runtime); + auto* aos_data = dynamic_cast(device_data.get()); + if (!aos_data) SKALAXC_EXCEPTION("Expected Scheme1 CUDA device data"); + + GauXC::integrator_term_tracker terms; + terms.exc_grad = true; + terms.weights = true; + terms.ks_scheme = GauXC::UKS; + terms.xc_approx = model_approximation(*model_); + const bool is_mgga = model_->is_mgga(); + const bool needs_gradient = model_->is_gga() || is_mgga; + + auto& tasks = lb_.get_tasks(); + GauXC::BasisSetMap basis_map(basis, lb_.molecule()); + device_data->populate_submat_maps(basis.nbf(), tasks.begin(), tasks.end(), + basis_map); + device_data->reset_allocations(); + device_data->allocate_static_data_exc_grad(basis.nbf(), basis.nshells(), + lb_.molecule().size(), terms); + device_data->send_static_data_density_basis( + scalar_density.data(), basis.nbf(), spin_density.data(), basis.nbf(), + nullptr, 0, nullptr, 0, basis); + device_data->allocate_static_data_weights(lb_.molecule().size()); + device_data->send_static_data_weights(lb_.molecule(), lb_.molmeta()); + device_data->zero_exc_grad_integrands(); + + const auto model_device = + c10::Device(c10::DeviceType::CUDA, device_id_.raw()); + FeatureDict local_features = model_grid_exchange_->prepare_features( + model_->feature_keys(), model_device); + auto task_it = tasks.begin(); + while (task_it != tasks.end()) { + const auto batch_begin = task_it; + task_it = + device_data->generate_buffers(terms, basis_map, task_it, tasks.end()); + if (needs_gradient) + device_lwd->eval_collocation_hessian(device_data.get()); + else + device_lwd->eval_collocation_gradient(device_data.get()); + + const bool need_xmat_gradient = needs_gradient; + for (const auto density : {GauXC::DEN_S, GauXC::DEN_Z}) { + device_lwd->eval_xmat(1.0, device_data.get(), need_xmat_gradient, + density); + if (is_mgga) + device_lwd->eval_vvars_mgga(device_data.get(), density, false); + else if (model_->is_gga()) + device_lwd->eval_vvars_gga(device_data.get(), density); + else + device_lwd->eval_vvars_lda(device_data.get(), density); + } + if (is_mgga) + device_lwd->eval_uvars_mgga(device_data.get(), GauXC::UKS, false); + else if (model_->is_gga()) + device_lwd->eval_uvars_gga(device_data.get(), GauXC::UKS); + else + device_lwd->eval_uvars_lda(device_data.get(), GauXC::UKS); + model_grid_exchange_->pack_post_uvars_features( + *aos_data, + types::TaskIndex{static_cast( + std::distance(tasks.begin(), batch_begin))}, + local_features); + } + + FeatureDict local_potentials = model_grid_exchange_->prepare_local_potentials( + needs_gradient, is_mgga, model_device); + at::Tensor local_dE_dw = + model_grid_exchange_->prepare_local_dE_dw(model_device); + std::vector finite_checks; + const auto& local_batches = model_grid_exchange_->local_batches(); + for (std::size_t batch_index = 0; batch_index < local_batches.size(); + ++batch_index) { + const auto& batch = local_batches[batch_index]; + FeatureDict features = model_grid_exchange_->prepare_local_batch_features( + batch, local_features, lb_.molecule(), model_->feature_keys(), + model_device, true); + auto energy = + evaluate_cuda_model_energy(*model_, features, device_id_, batch_index); + finite_checks.push_back( + {"model energy in batch " + std::to_string(batch_index), + model_tensor_finite_check(energy)}); + energy.backward(); + for (const auto& item : features) { + const auto& tensor = item.value(); + if (tensor.is_floating_point()) + finite_checks.push_back({"model feature '" + item.key() + + "' in batch " + + std::to_string(batch_index), + model_tensor_finite_check(tensor)}); + const auto gradient = tensor.grad(); + if (gradient.defined()) + finite_checks.push_back({"model gradient for feature '" + item.key() + + "' in batch " + + std::to_string(batch_index), + model_tensor_finite_check(gradient)}); + } + auto dE_dw = + model_dE_dw(features, device_id_, batch.point_count.raw(), batch_index); + finite_checks.push_back( + {"model dE/dw in batch " + std::to_string(batch_index), + model_tensor_finite_check(dE_dw)}); + model_grid_exchange_->store_local_batch_potentials( + batch, needs_gradient, is_mgga, features, local_potentials); + model_grid_exchange_->store_local_batch_dE_dw(batch, dE_dw, local_dE_dw); + model_grid_exchange_->accumulate_local_geometry_gradients( + batch_index, features, *aos_data); + diagnostics_.record_model_batch(types::DomainCount{batch.atoms.size()}); + } + const at::Tensor all_model_values_finite = + aggregate_finite_checks(finite_checks); + + task_it = tasks.begin(); + while (task_it != tasks.end()) { + const auto batch_begin = task_it; + task_it = + device_data->generate_buffers(terms, basis_map, task_it, tasks.end()); + const types::TaskIndex first_task{ + static_cast(std::distance(tasks.begin(), batch_begin))}; + model_grid_exchange_->unpack_potentials(*aos_data, first_task, + local_potentials); + if (needs_gradient) + device_lwd->eval_collocation_hessian(device_data.get()); + else + device_lwd->eval_collocation_gradient(device_data.get()); + + for (const auto density : {GauXC::DEN_S, GauXC::DEN_Z}) { + device_lwd->eval_xmat(1.0, device_data.get(), needs_gradient, density); + device_lwd->save_xmat(device_data.get(), needs_gradient, density); + } + + std::int32_t max_points = 0; + for (const auto& task : aos_data->host_device_tasks) + max_points = std::max(max_points, static_cast(task.npts)); + if (needs_gradient) + transform_skala_vxc_for_grad(aos_data->host_device_tasks.size(), + max_points, aos_data->aos_stack.device_tasks, + device_data->queue()); + + if (is_mgga) + device_lwd->inc_exc_grad_mgga(device_data.get(), GauXC::UKS, false, true); + else if (model_->is_gga()) + device_lwd->inc_exc_grad_gga(device_data.get(), GauXC::UKS, true); + else + device_lwd->inc_exc_grad_lda(device_data.get(), GauXC::UKS, true); + + model_grid_exchange_->prepare_weight_derivatives(*aos_data, first_task, + local_dE_dw); + device_lwd->eval_weight_1st_deriv_contracted(device_data.get(), + lb_.state().weight_alg); + } + + gradient.setZero(); + double electron_count = 0.0; + device_data->retrieve_exc_grad_integrands(gradient.data(), &electron_count); + runtime.device_backend()->master_queue_synchronize(); + validate_finite_checks(finite_checks, all_model_values_finite); +#ifdef GAUXC_HAS_MPI + if (lb_.runtime().comm_size() > 1) + mpi::allreduce_sum(gradient, lb_.runtime()); +#endif + log_gradient_result("exc_gradient", gradient); + log_device_timing_unavailable("exc_gradient"); +} + +} // namespace SkalaXC diff --git a/SkalaXC/src/device/skala_device_driver.hpp b/SkalaXC/src/device/skala_device_driver.hpp new file mode 100644 index 00000000..f1c84e60 --- /dev/null +++ b/SkalaXC/src/device/skala_device_driver.hpp @@ -0,0 +1,84 @@ +#pragma once +/** + * @file + * @brief CUDA orchestration backend for SkalaXC ML functionals. + */ + +#include "skala_driver.hpp" + +#include +#include + +#include +#include +#include + +namespace SkalaXC { + +class DeviceModelGridExchange; +class SkalaModel; + +/** @brief Evaluate SkalaXC ML functionals with GauXC's CUDA local work API. */ +class SkalaDeviceDriver final : public SkalaDriver { + public: + /** + * @brief Construct a driver from weight-partitioned integration tasks. + * @param weighted_lb Load balancer containing sorted, partitioned tasks. + * @param raw_weights Per-task quadrature weights before partitioning. + * @param model Bundled model selector or TorchScript `.fun` path. + * @param device_id CUDA device ordinal used for evaluation. + * @param device_memory_fraction GauXC CUDA arena memory fraction. + * @param timing_settings Rank-local diagnostics configuration. + * @param batch_mode Exact-size complete-domain batching policy. + */ + SkalaDeviceDriver(const GauXC::LoadBalancer& weighted_lb, + const std::vector>& raw_weights, + const std::string& model, types::DeviceId device_id, + double device_memory_fraction, + TimingSettings timing_settings = {}, + DomainBatchMode batch_mode = DomainBatchMode::Conservative); + /** @brief Destroy the owned CUDA model and work state. */ + ~SkalaDeviceDriver() noexcept override; + + /** @brief Device drivers cannot be copied. */ + SkalaDeviceDriver(const SkalaDeviceDriver&) = delete; + /** @brief Device drivers cannot be copy-assigned. */ + SkalaDeviceDriver& operator=(const SkalaDeviceDriver&) = delete; + + /** + * @brief Evaluate UKS ML exchange-correlation energy and potential. + * @param scalar_density Scalar-spin column-major density matrix. + * @param spin_density Z-spin column-major density matrix. + * @param scalar_potential Output scalar XC potential matrix. + * @param spin_potential Output z-spin XC potential matrix. + * @return Global exchange-correlation energy. + */ + double eval_exc_vxc_uks(ConstColMajorMatrixMap scalar_density, + ConstColMajorMatrixMap spin_density, + ColMajorMatrixMap scalar_potential, + ColMajorMatrixMap spin_potential) override; + + /** + * @brief Evaluate the UKS ML exchange-correlation nuclear gradient. + * @param scalar_density Scalar-spin column-major density matrix. + * @param spin_density Z-spin column-major density matrix. + * @param gradient Output atom-major matrix with xyz columns. + */ + void eval_exc_grad_uks(ConstColMajorMatrixMap scalar_density, + ConstColMajorMatrixMap spin_density, + RowMajorMatrixMap gradient) override; + + private: + /** @brief CUDA device ordinal selected for every operation. */ + types::DeviceId device_id_; + /** @brief Weight-partitioned GauXC task owner. */ + GauXC::LoadBalancer lb_; + /** @brief CUDA local work driver. */ + std::unique_ptr lwd_; + /** @brief Model resident on the selected CUDA device. */ + std::unique_ptr model_; + /** @brief Exchange between GauXC task buffers and model tensors. */ + std::unique_ptr model_grid_exchange_; +}; + +} // namespace SkalaXC \ No newline at end of file From 334b76272df9a8530dd4bee287c39f98306961b4 Mon Sep 17 00:00:00 2001 From: jenswehner Date: Fri, 4 Sep 2026 11:36:39 +0200 Subject: [PATCH 10/33] Add native integration and ABI tests --- SkalaXC/tests/CMakeLists.txt | 397 +++++++++ SkalaXC/tests/README.md | 182 ++++ .../atomic_domain_assignment_unit_test.cxx | 94 ++ .../atomic_domain_load_balancer_unit_test.cxx | 67 ++ .../tests/check_c_consumer_dependencies.cmake | 41 + SkalaXC/tests/check_expected_failure.cmake | 23 + SkalaXC/tests/check_exported_symbols.cmake | 70 ++ SkalaXC/tests/check_hdf5_feature.cmake | 49 + .../tests/check_library_dependencies.cmake | 36 + SkalaXC/tests/diagnostics_unit_test.cxx | 158 ++++ SkalaXC/tests/installed/CMakeLists.txt | 53 ++ SkalaXC/tests/installed/consumer.F90 | 87 ++ SkalaXC/tests/installed/consumer.c | 95 ++ SkalaXC/tests/installed/consumer.cpp | 101 +++ .../ref_data/skala_he_def2qzvp_lda_uks.hdf5 | Bin 0 -> 41304 bytes .../ref_data/skala_he_def2qzvp_pbe_uks.hdf5 | Bin 0 -> 41304 bytes .../ref_data/skala_he_def2qzvp_tpss_uks.hdf5 | Bin 0 -> 41304 bytes SkalaXC/tests/skala_device_test.cxx | 466 ++++++++++ SkalaXC/tests/skala_host_mpi_test.cxx | 111 +++ SkalaXC/tests/skala_host_test.cxx | 478 ++++++++++ SkalaXC/tests/skala_model_unit_test.cxx | 373 ++++++++ SkalaXC/tests/skala_mpi_subcomm_unit_test.cxx | 227 +++++ SkalaXC/tests/skala_openmp_test.cxx | 103 +++ SkalaXC/tests/skala_reorder_unit_test.cxx | 268 ++++++ SkalaXC/tests/skala_stress_test.cxx | 78 ++ .../skala_traditional_integration_test.cxx | 487 ++++++++++ SkalaXC/tests/skala_unit_main.cxx | 49 + SkalaXC/tests/skala_util_unit_test.cxx | 31 + SkalaXC/tests/skalaxc_c_api_test.c | 838 ++++++++++++++++++ .../tests/skalaxc_fortran_assignment_test.F90 | 40 + SkalaXC/tests/skalaxc_fortran_test.F90 | 668 ++++++++++++++ SkalaXC/tests/skalaxc_public_api_test.cxx | 540 +++++++++++ SkalaXC/tests/spin_gradient_unit_test.cxx | 197 ++++ SkalaXC/tests/test_utils.cxx | 94 ++ SkalaXC/tests/test_utils.hpp | 42 + 35 files changed, 6543 insertions(+) create mode 100644 SkalaXC/tests/CMakeLists.txt create mode 100644 SkalaXC/tests/README.md create mode 100644 SkalaXC/tests/atomic_domain_assignment_unit_test.cxx create mode 100644 SkalaXC/tests/atomic_domain_load_balancer_unit_test.cxx create mode 100644 SkalaXC/tests/check_c_consumer_dependencies.cmake create mode 100644 SkalaXC/tests/check_expected_failure.cmake create mode 100644 SkalaXC/tests/check_exported_symbols.cmake create mode 100644 SkalaXC/tests/check_hdf5_feature.cmake create mode 100644 SkalaXC/tests/check_library_dependencies.cmake create mode 100644 SkalaXC/tests/diagnostics_unit_test.cxx create mode 100644 SkalaXC/tests/installed/CMakeLists.txt create mode 100644 SkalaXC/tests/installed/consumer.F90 create mode 100644 SkalaXC/tests/installed/consumer.c create mode 100644 SkalaXC/tests/installed/consumer.cpp create mode 100644 SkalaXC/tests/ref_data/skala_he_def2qzvp_lda_uks.hdf5 create mode 100644 SkalaXC/tests/ref_data/skala_he_def2qzvp_pbe_uks.hdf5 create mode 100644 SkalaXC/tests/ref_data/skala_he_def2qzvp_tpss_uks.hdf5 create mode 100644 SkalaXC/tests/skala_device_test.cxx create mode 100644 SkalaXC/tests/skala_host_mpi_test.cxx create mode 100644 SkalaXC/tests/skala_host_test.cxx create mode 100644 SkalaXC/tests/skala_model_unit_test.cxx create mode 100644 SkalaXC/tests/skala_mpi_subcomm_unit_test.cxx create mode 100644 SkalaXC/tests/skala_openmp_test.cxx create mode 100644 SkalaXC/tests/skala_reorder_unit_test.cxx create mode 100644 SkalaXC/tests/skala_stress_test.cxx create mode 100644 SkalaXC/tests/skala_traditional_integration_test.cxx create mode 100644 SkalaXC/tests/skala_unit_main.cxx create mode 100644 SkalaXC/tests/skala_util_unit_test.cxx create mode 100644 SkalaXC/tests/skalaxc_c_api_test.c create mode 100644 SkalaXC/tests/skalaxc_fortran_assignment_test.F90 create mode 100644 SkalaXC/tests/skalaxc_fortran_test.F90 create mode 100644 SkalaXC/tests/skalaxc_public_api_test.cxx create mode 100644 SkalaXC/tests/spin_gradient_unit_test.cxx create mode 100644 SkalaXC/tests/test_utils.cxx create mode 100644 SkalaXC/tests/test_utils.hpp diff --git a/SkalaXC/tests/CMakeLists.txt b/SkalaXC/tests/CMakeLists.txt new file mode 100644 index 00000000..af561812 --- /dev/null +++ b/SkalaXC/tests/CMakeLists.txt @@ -0,0 +1,397 @@ +# SkalaXC tests. White-box reference-integration harness: links skalaxc_core +# (which brings GauXC in-build) to validate the host ML port against the HDF5 +# reference fixtures. + +include(FetchContent) + +if(NOT EXISTS "${SKALAXC_MODEL_PATH}") + message(FATAL_ERROR + "SKALAXC_BUILD_TESTS=ON requires model files, but SKALAXC_MODEL_PATH does " + "not exist: ${SKALAXC_MODEL_PATH}. Set -DSKALAXC_MODEL_PATH=/path/to/models " + "containing ldax.fun, pbe.fun, tpss.fun, and skala-1.1.fun.") +endif() + +set(_skalaxc_required_model_files ldax.fun pbe.fun tpss.fun skala-1.1.fun) +if(SKALAXC_ENABLE_CUDA) + list(APPEND _skalaxc_required_model_files skala-1.1-cuda.fun) +endif() +set(_skalaxc_missing_model_files) +foreach(_skalaxc_model_file IN LISTS _skalaxc_required_model_files) + if(NOT EXISTS "${SKALAXC_MODEL_PATH}/${_skalaxc_model_file}") + list(APPEND _skalaxc_missing_model_files + "${SKALAXC_MODEL_PATH}/${_skalaxc_model_file}") + endif() +endforeach() + +if(_skalaxc_missing_model_files) + string(JOIN "\n " _skalaxc_missing_lines ${_skalaxc_missing_model_files}) + message(FATAL_ERROR + "SKALAXC_BUILD_TESTS=ON requires bundled model files. Missing:\n " + "${_skalaxc_missing_lines}\n" + "Set -DSKALAXC_MODEL_PATH=/path/to/models containing ldax.fun, pbe.fun, " + "tpss.fun, and skala-1.1.fun.") +endif() + +find_package(Catch2 CONFIG QUIET) +if(Catch2_FOUND AND Catch2_VERSION VERSION_GREATER_EQUAL 3) + message(FATAL_ERROR + "Catch2 v${Catch2_VERSION} found, but SkalaXC unit tests require Catch2 v2 " + "(catch2/catch.hpp). Please install v2 or let FetchContent provide it.") +endif() + +if(NOT Catch2_FOUND) + FetchContent_Declare( + catch2 + GIT_REPOSITORY https://github.com/catchorg/Catch2.git + GIT_TAG v2.13.10 + ) + + set(CATCH_BUILD_TESTING OFF CACHE BOOL "Build Catch2 self tests" FORCE) + set(CATCH_INSTALL_DOCS OFF CACHE BOOL "Install Catch2 docs" FORCE) + set(CATCH_INSTALL_HELPERS OFF CACHE BOOL "Install Catch2 helpers" FORCE) + + if(DEFINED CACHE{CMAKE_WARN_DEPRECATED}) + set(_skalaxc_catch2_warn_deprecated_defined TRUE) + get_property(_skalaxc_catch2_warn_deprecated + CACHE CMAKE_WARN_DEPRECATED PROPERTY VALUE) + else() + set(_skalaxc_catch2_warn_deprecated_defined FALSE) + endif() + set(CMAKE_WARN_DEPRECATED OFF CACHE BOOL + "Suppress deprecation warnings while configuring Catch2" FORCE) + + FetchContent_MakeAvailable(catch2) + + if(_skalaxc_catch2_warn_deprecated_defined) + set(CMAKE_WARN_DEPRECATED "${_skalaxc_catch2_warn_deprecated}" + CACHE BOOL "Whether to issue warnings for deprecated functionality" FORCE) + else() + set(CMAKE_WARN_DEPRECATED ON CACHE BOOL + "Whether to issue warnings for deprecated functionality" FORCE) + unset(CMAKE_WARN_DEPRECATED CACHE) + endif() + unset(_skalaxc_catch2_warn_deprecated) + unset(_skalaxc_catch2_warn_deprecated_defined) +endif() + +# Make Catch2's `catch_discover_tests` helper available. An installed Catch2 +# exposes the module through its package; a FetchContent build ships it under +# the source tree's contrib/ directory. +if(NOT Catch2_FOUND) + list(APPEND CMAKE_MODULE_PATH "${catch2_SOURCE_DIR}/contrib") +endif() +include(Catch) + +# --- Shared test setup ------------------------------------------------------- +add_library(skalaxc_test_utils STATIC test_utils.cxx) +target_include_directories(skalaxc_test_utils PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}) +target_link_libraries(skalaxc_test_utils PUBLIC + skalaxc + Eigen3::Eigen) +if(SKALAXC_HAS_HDF5) + target_link_libraries(skalaxc_test_utils PUBLIC HighFive) +endif() +if(SKALAXC_ENABLE_MPI) + find_package(MPI REQUIRED COMPONENTS CXX) + target_link_libraries(skalaxc_test_utils PUBLIC MPI::MPI_CXX) +endif() +target_compile_features(skalaxc_test_utils PUBLIC cxx_std_17) + +add_test(NAME skalaxc_config.hdf5_feature + COMMAND ${CMAKE_COMMAND} + -DEXPECT_HDF5=${SKALAXC_HAS_HDF5} + -DPUBLIC_CONFIG_HEADER=${PROJECT_BINARY_DIR}/include/skalaxc/c/config.h + -DINTERNAL_CONFIG_HEADER=${PROJECT_BINARY_DIR}/include/skalaxc/skalaxc_config.hpp + -DPACKAGE_CONFIG=${PROJECT_BINARY_DIR}/SkalaXCConfig.cmake + -P ${CMAKE_CURRENT_SOURCE_DIR}/check_hdf5_feature.cmake) + +# --- C++ unit tests (Catch2) ------------------------------------------------- +# This target is for focused white-box regression/unit coverage (e.g. MPI +# subgroup and reorder-helper tests). It coexists with existing executable +# black-box tests below. +add_executable(skalaxc_unit_test + atomic_domain_assignment_unit_test.cxx + diagnostics_unit_test.cxx + skala_unit_main.cxx + skala_util_unit_test.cxx + skala_model_unit_test.cxx + skala_stress_test.cxx + spin_gradient_unit_test.cxx + skala_host_mpi_test.cxx + skala_reorder_unit_test.cxx + skala_mpi_subcomm_unit_test.cxx + skala_traditional_integration_test.cxx + # GauXC's Gaussian-94 basis parser lives in its test tree and is not part of + # the `gauxc` library target. SKALAXC_GAUXC_SOURCE_DIR expands to the vendored + # GauXC source tree, so listing this file here compiles the parser directly + # into the integration-test executable without modifying the submodule. + ${SKALAXC_GAUXC_SOURCE_DIR}/tests/basis/parse_basis.cxx +) +if(SKALAXC_HAS_HDF5) + target_sources(skalaxc_unit_test PRIVATE + atomic_domain_load_balancer_unit_test.cxx + skala_host_test.cxx + skala_openmp_test.cxx) +endif() +if(MSVC) + set_source_files_properties( + ${SKALAXC_GAUXC_SOURCE_DIR}/tests/basis/parse_basis.cxx + PROPERTIES COMPILE_OPTIONS /w) +else() + set_source_files_properties( + ${SKALAXC_GAUXC_SOURCE_DIR}/tests/basis/parse_basis.cxx + PROPERTIES COMPILE_OPTIONS -w) +endif() +if(SKALAXC_ENABLE_CUDA) + if(SKALAXC_HAS_HDF5) + target_sources(skalaxc_unit_test PRIVATE skala_device_test.cxx) + endif() + target_link_libraries(skalaxc_unit_test PRIVATE CUDA::cudart) +endif() +target_include_directories(skalaxc_unit_test PRIVATE + ${PROJECT_SOURCE_DIR}/src + ${PROJECT_SOURCE_DIR}/src/host + ${SKALAXC_GAUXC_SOURCE_DIR}/tests/basis +) +target_link_libraries(skalaxc_unit_test PRIVATE + skalaxc_test_utils + skalaxc_core + skalaxc + Catch2::Catch2 + ${TORCH_LIBRARIES} +) +target_compile_features(skalaxc_unit_test PRIVATE cxx_std_17) +target_compile_definitions(skalaxc_unit_test PRIVATE + SKALAXC_TEST_REF_DATA_PATH="${CMAKE_CURRENT_SOURCE_DIR}/ref_data" + SKALAXC_GAUXC_REF_DATA_PATH="${SKALAXC_GAUXC_REF_DATA_DIR}" + SKALAXC_TEST_BASIS_PATH="${SKALAXC_GAUXC_SOURCE_DIR}/tests/basis/old" + SKALAXC_MODEL_PATH="${SKALAXC_MODEL_PATH}" +) +# Register every Catch2 TEST_CASE as its own CTest test (prefixed with +# "skalaxc_unit.") so results and failures are reported per case instead of as a +# single aggregate run. Individual tags can still be run directly, e.g. +# `skalaxc_unit_test "[skala][gradient-numerical]"`. +catch_discover_tests(skalaxc_unit_test + TEST_PREFIX "skalaxc_unit." + TEST_SPEC "~[mpi-only]" + PROPERTIES ENVIRONMENT "SKALAXC_MODEL_PATH=${SKALAXC_MODEL_PATH}") + +# The traditional-integration test is written to validate the replicated MPI path +# as well as the serial one. Register an explicit multi-rank CTest for it when MPI +# is enabled. Three ranks each pinned to a single OpenMP thread fit comfortably +# on a four-slot CI runner without oversubscription. +if(SKALAXC_ENABLE_MPI) + find_package(MPI REQUIRED COMPONENTS CXX) + add_test(NAME skalaxc_unit_mpi.subcommunicator + COMMAND ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} 3 + ${MPIEXEC_PREFLAGS} $ + "[skala][mpi][subcomm]" ${MPIEXEC_POSTFLAGS}) + set_tests_properties(skalaxc_unit_mpi.subcommunicator PROPERTIES + ENVIRONMENT + "OMP_NUM_THREADS=1;SKALAXC_MODEL_PATH=${SKALAXC_MODEL_PATH}") + add_test(NAME skalaxc_unit_mpi.host_subcommunicator + COMMAND ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} 4 + ${MPIEXEC_PREFLAGS} $ + "[host-subcomm]" ${MPIEXEC_POSTFLAGS}) + set_tests_properties(skalaxc_unit_mpi.host_subcommunicator PROPERTIES + ENVIRONMENT + "OMP_NUM_THREADS=1;SKALAXC_MODEL_PATH=${SKALAXC_MODEL_PATH}") + add_test(NAME skalaxc_unit_mpi.atomic_domain_ownership + COMMAND ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} 3 + ${MPIEXEC_PREFLAGS} $ + "[atomic-domain-ownership]" ${MPIEXEC_POSTFLAGS}) + set_tests_properties(skalaxc_unit_mpi.atomic_domain_ownership PROPERTIES + ENVIRONMENT + "OMP_NUM_THREADS=1;SKALAXC_MODEL_PATH=${SKALAXC_MODEL_PATH}") + add_test(NAME skalaxc_unit_mpi.model_broadcast + COMMAND ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} 3 + ${MPIEXEC_PREFLAGS} $ + "[model-broadcast]" ${MPIEXEC_POSTFLAGS}) + set_tests_properties(skalaxc_unit_mpi.model_broadcast PROPERTIES + ENVIRONMENT + "OMP_NUM_THREADS=1;SKALAXC_MODEL_PATH=${SKALAXC_MODEL_PATH}") + add_test(NAME skalaxc_unit_mpi.traditional_integration + COMMAND ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} 3 + ${MPIEXEC_PREFLAGS} $ + "[skala][traditional-integration]" ${MPIEXEC_POSTFLAGS}) + set_tests_properties(skalaxc_unit_mpi.traditional_integration PROPERTIES + ENVIRONMENT + "OMP_NUM_THREADS=1;SKALAXC_MODEL_PATH=${SKALAXC_MODEL_PATH}") + if(SKALAXC_ENABLE_CUDA) + add_test(NAME skalaxc_unit_mpi.cuda_idle_rank + COMMAND ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} 3 + ${MPIEXEC_PREFLAGS} $ + "[device-idle-rank]" ${MPIEXEC_POSTFLAGS}) + set_tests_properties(skalaxc_unit_mpi.cuda_idle_rank PROPERTIES + ENVIRONMENT + "OMP_NUM_THREADS=1;SKALAXC_MODEL_PATH=${SKALAXC_MODEL_PATH}") + add_test(NAME skalaxc_unit_mpi.cuda_subcommunicator + COMMAND ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} 4 + ${MPIEXEC_PREFLAGS} $ + "[device-subcomm]" ${MPIEXEC_POSTFLAGS}) + set_tests_properties(skalaxc_unit_mpi.cuda_subcommunicator PROPERTIES + ENVIRONMENT + "OMP_NUM_THREADS=1;SKALAXC_MODEL_PATH=${SKALAXC_MODEL_PATH}") + endif() +endif() + +# --- black-box public-API test ---------------------------------------------- +# A pure consumer: it and skalaxc_test_utils include only +# from SkalaXC and link the public `skalaxc` shared +# library. Eigen owns matrices, and HighFive loads fixture input. Neither target +# receives GauXC include dirs or links skalaxc_core/gauxc, so a successful +# compile+link proves the public API remains ABI-isolated. +if(SKALAXC_HAS_HDF5) + add_executable(skalaxc_public_api_test skalaxc_public_api_test.cxx) + target_link_libraries(skalaxc_public_api_test PRIVATE + skalaxc_test_utils + skalaxc + HighFive + Eigen3::Eigen + ) + target_compile_features(skalaxc_public_api_test PRIVATE cxx_std_17) + if(SKALAXC_ENABLE_MPI) + find_package(MPI REQUIRED COMPONENTS CXX) + target_link_libraries(skalaxc_public_api_test PRIVATE MPI::MPI_CXX) + endif() + target_compile_definitions(skalaxc_public_api_test PRIVATE + SKALAXC_EXPECTED_VERSION="${PROJECT_VERSION}" + SKALAXC_TEST_REF_DATA_PATH="${CMAKE_CURRENT_SOURCE_DIR}/ref_data" + SKALAXC_GAUXC_REF_DATA_PATH="${SKALAXC_GAUXC_REF_DATA_DIR}" + ) + add_test(NAME skalaxc_public_api COMMAND skalaxc_public_api_test) + set_tests_properties(skalaxc_public_api PROPERTIES + ENVIRONMENT "SKALAXC_MODEL_PATH=${SKALAXC_MODEL_PATH}") +else() + message(STATUS "SkalaXC: HDF5 support disabled; skipping fixture-driven C++ API test") +endif() + +# --- black-box C public-API test -------------------------------------------- +# A pure C consumer: includes ONLY , compiled as C, linking +# ONLY libskalaxc (+ the C HDF5 lib to load its own density input). Proves the C +# API is usable and ABI-isolated without any C++/GauXC/torch symbols. +if(SKALAXC_HAS_HDF5) + find_package(HDF5 QUIET COMPONENTS C) +endif() +if(SKALAXC_HAS_HDF5 AND HDF5_FOUND AND HDF5_C_LIBRARIES) + add_executable(skalaxc_c_api_test skalaxc_c_api_test.c) + target_link_libraries(skalaxc_c_api_test PRIVATE skalaxc ${HDF5_C_LIBRARIES}) + target_include_directories(skalaxc_c_api_test PRIVATE ${HDF5_INCLUDE_DIRS}) + if(SKALAXC_ENABLE_MPI) + find_package(MPI REQUIRED COMPONENTS C) + target_link_libraries(skalaxc_c_api_test PRIVATE MPI::MPI_C) + endif() + target_compile_definitions(skalaxc_c_api_test PRIVATE + SKALAXC_EXPECTED_VERSION="${PROJECT_VERSION}" + SKALAXC_TEST_REF_DATA_PATH="${CMAKE_CURRENT_SOURCE_DIR}/ref_data" + SKALAXC_GAUXC_REF_DATA_PATH="${SKALAXC_GAUXC_REF_DATA_DIR}") + add_test(NAME skalaxc_c_api COMMAND skalaxc_c_api_test) + set_tests_properties(skalaxc_c_api PROPERTIES + ENVIRONMENT "SKALAXC_MODEL_PATH=${SKALAXC_MODEL_PATH}") + + if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + find_program(SKALAXC_READELF_EXECUTABLE NAMES readelf llvm-readelf REQUIRED) + add_test(NAME skalaxc_abi.c_consumer_dependencies + COMMAND ${CMAKE_COMMAND} + -DREADELF_EXECUTABLE=${SKALAXC_READELF_EXECUTABLE} + -DCONSUMER_PATH=$ + -P ${CMAKE_CURRENT_SOURCE_DIR}/check_c_consumer_dependencies.cmake) + elseif(APPLE) + find_program(SKALAXC_OTOOL_EXECUTABLE NAMES otool REQUIRED) + add_test(NAME skalaxc_abi.c_consumer_dependencies + COMMAND ${CMAKE_COMMAND} + -DOTOOL_EXECUTABLE=${SKALAXC_OTOOL_EXECUTABLE} + -DCONSUMER_PATH=$ + -P ${CMAKE_CURRENT_SOURCE_DIR}/check_c_consumer_dependencies.cmake) + endif() +else() + message(STATUS "SkalaXC: HDF5 support or its C component unavailable; skipping C API test") +endif() + +if(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR APPLE) + add_test(NAME skalaxc_abi.exported_symbols + COMMAND ${CMAKE_COMMAND} + -DNM_EXECUTABLE=${CMAKE_NM} + -DNM_MODE=$,MACHO,ELF> + -DLIBRARY_PATH=$ + -P ${CMAKE_CURRENT_SOURCE_DIR}/check_exported_symbols.cmake) + + if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + find_program(SKALAXC_READELF_EXECUTABLE NAMES readelf llvm-readelf REQUIRED) + add_test(NAME skalaxc_abi.library_dependencies + COMMAND ${CMAKE_COMMAND} + -DREADELF_EXECUTABLE=${SKALAXC_READELF_EXECUTABLE} + -DLIBRARY_PATH=$ + -P ${CMAKE_CURRENT_SOURCE_DIR}/check_library_dependencies.cmake) + else() + find_program(SKALAXC_OTOOL_EXECUTABLE NAMES otool REQUIRED) + add_test(NAME skalaxc_abi.library_dependencies + COMMAND ${CMAKE_COMMAND} + -DOTOOL_EXECUTABLE=${SKALAXC_OTOOL_EXECUTABLE} + -DLIBRARY_PATH=$ + -P ${CMAKE_CURRENT_SOURCE_DIR}/check_library_dependencies.cmake) + endif() +endif() + +# --- black-box Fortran public-API test -------------------------------------- +# A pure Fortran consumer: `use`s ONLY the `skalaxc` module and links ONLY +# libskalaxc (via skalaxc_fortran). HDF5-Fortran is linked solely so the test +# can load its own density input (unrelated to the SkalaXC ABI). +if(SKALAXC_BUILD_FORTRAN AND SKALAXC_HAS_HDF5) + find_package(HDF5 QUIET COMPONENTS Fortran) + if(HDF5_FOUND AND HDF5_Fortran_FOUND) + add_executable(skalaxc_fortran_test skalaxc_fortran_test.F90) + set_source_files_properties(skalaxc_fortran_test.F90 PROPERTIES + Fortran_PREPROCESS ON) + if(SKALAXC_ENABLE_MPI) + find_package(MPI REQUIRED COMPONENTS Fortran) + target_compile_definitions(skalaxc_fortran_test PRIVATE SKALAXC_HAS_MPI) + target_link_libraries(skalaxc_fortran_test PRIVATE MPI::MPI_Fortran) + endif() + if(SKALAXC_ENABLE_CUDA) + target_compile_definitions(skalaxc_fortran_test PRIVATE SKALAXC_HAS_CUDA) + endif() + target_compile_definitions(skalaxc_fortran_test PRIVATE + SKALAXC_EXPECTED_VERSION="${PROJECT_VERSION}") + target_link_libraries(skalaxc_fortran_test PRIVATE + skalaxc_fortran ${HDF5_Fortran_LIBRARIES}) + target_include_directories(skalaxc_fortran_test PRIVATE ${HDF5_Fortran_INCLUDE_DIRS}) + add_test(NAME skalaxc_fortran + COMMAND skalaxc_fortran_test ${CMAKE_CURRENT_SOURCE_DIR}/ref_data + ${SKALAXC_GAUXC_REF_DATA_DIR}) + set_tests_properties(skalaxc_fortran PROPERTIES + ENVIRONMENT "SKALAXC_MODEL_PATH=${SKALAXC_MODEL_PATH}") + + if(SKALAXC_ENABLE_MPI) + add_test(NAME skalaxc_fortran_mpi + COMMAND ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} 2 + ${MPIEXEC_PREFLAGS} $ + ${CMAKE_CURRENT_SOURCE_DIR}/ref_data ${SKALAXC_GAUXC_REF_DATA_DIR} + ${MPIEXEC_POSTFLAGS}) + set_tests_properties(skalaxc_fortran_mpi PROPERTIES + ENVIRONMENT + "OMP_NUM_THREADS=1;SKALAXC_MODEL_PATH=${SKALAXC_MODEL_PATH}") + endif() + else() + message(STATUS "SkalaXC: HDF5 Fortran component not found; skipping Fortran test") + endif() +endif() + +if(SKALAXC_BUILD_FORTRAN) + add_executable(skalaxc_fortran_assignment_test + skalaxc_fortran_assignment_test.F90) + target_link_libraries(skalaxc_fortran_assignment_test PRIVATE + skalaxc_fortran) + foreach(_skalaxc_handle_type IN ITEMS + runtime molecule basis grid load-balancer molecular-weights functional + integrator) + add_test(NAME skalaxc_fortran_assignment.${_skalaxc_handle_type} + COMMAND ${CMAKE_COMMAND} + -DEXECUTABLE=$ + -DHANDLE_TYPE=${_skalaxc_handle_type} + "-DEXPECTED_MESSAGE=SkalaXC handles are non-copyable; use move_from" + -P ${CMAKE_CURRENT_SOURCE_DIR}/check_expected_failure.cmake) + endforeach() + unset(_skalaxc_handle_type) +endif() diff --git a/SkalaXC/tests/README.md b/SkalaXC/tests/README.md new file mode 100644 index 00000000..da395307 --- /dev/null +++ b/SkalaXC/tests/README.md @@ -0,0 +1,182 @@ +# SkalaXC test suite + +This directory contains the first-party tests for the standalone SkalaXC +library. The suite deliberately repeats some numerical behavior across private +drivers and the public C++, C, and Fortran APIs: those checks protect different +linkage, ownership, layout, and exception/status-code boundaries. They should +not be merged merely because they evaluate the same model and fixture. + +## Assurance layers + +| Layer | Primary tests | Contract protected | +| --- | --- | --- | +| Private units | `*_unit_test.cxx`, tags such as `[reorder]`, `[array-view]`, `[diagnostics]` | Reordering, semantic array views, atomic-domain assignment, model metadata, diagnostics, and MPI wrappers. | +| Build features | CTest `skalaxc_config.hdf5_feature` | Generated public/internal headers and installed-package metadata agree for HDF5-enabled and HDF5-disabled builds. | +| Host numerical integration | `skala_host_test.cxx`, `skala_openmp_test.cxx`, `skala_stress_test.cxx` | LDA/PBE/TPSS EXC, scalar/z VXC, gradients, batching, OpenMP consistency, numerical derivatives, repeated evaluation, and bounded memory growth. | +| Traditional-functional parity | `skala_traditional_integration_test.cxx` | Public SkalaXC results against GauXC/ExchCXX for six molecules, three models, random UKS densities, and serial/MPI execution. | +| CUDA parity | `skala_device_test.cxx` and `test_pyscf_skalaxc_gpu_parity.py` | Native LDA/PBE host-device gradient parity, TPSS EXC/VXC, lightweight batching/stream/MPI infrastructure checks, and dedicated GPU4PySCF–SkalaXC neural-gradient parity. TPSS CUDA-gradient coverage is deferred until its TensorExpr trace is retraced for lower sm_120 register pressure. | +| Public C++ consumer | CTest `skalaxc_public_api` | Installed-style header use, PIMPL isolation, owning outputs, state/error contracts, gradients, settings, batching, and diagnostics. | +| Public C consumer | CTest `skalaxc_c_api` | Opaque handles, status codes, column-major caller-owned buffers, validation, gradients, and diagnostics. | +| Public Fortran consumer | CTest `skalaxc_fortran` and `skalaxc_fortran_assignment.*` | `iso_c_binding`, move-only handle ownership, caller-owned arrays, diagnostics, and gradients. | +| Binary boundary | CTest `skalaxc_abi.exported_symbols` and `skalaxc_abi.c_consumer_dependencies` | Export allowlist and absence of private GauXC/LibTorch dependencies from a C consumer. | + +The C and Fortran suites validate the conservative batching mode through their +public bindings. Positive aggressive-batching equivalence is covered at the +private host/device and public C++ layers; it is not repeated in each language +binding. + +HDF5 support is enabled by default. With `SKALAXC_ENABLE_HDF5=OFF`, fixture- +driven host/device tests and the C, C++, and Fortran numerical consumer tests +are not built. Constructed-system units, traditional-functional parity, the +Fortran ownership tests, and the exported-symbol ABI check remain available. + +## Shared C++ setup + +`test_utils.hpp` and `test_utils.cxx` build as the private +`skalaxc_test_utils` static library. They own setup that is data construction +rather than behavior under test: H2/STO-3G systems, public SkalaXC molecule and +basis loading, scalar/z density loading, standard molecular-grid construction, +and normalized matrix errors. The utility target depends only on public +SkalaXC, Eigen, optional HighFive, and MPI interfaces, so the black-box C++ consumer can +reuse it without gaining access to `skalaxc_core`, GauXC, or LibTorch. + +Runtime selection, load balancing, molecular-weight modification, and +integrator construction remain in each test. Their settings and stage ordering +are part of the contracts those tests exercise. White-box tests that directly +use GauXC types also keep their fixture setup separate from the public-type +helpers. + +## Running focused tests + +Build and run from the repository root. Set `SKALAXC_MODEL_PATH` when invoking +the Catch executable directly; CTest registrations set it automatically. +The commands below use the locked host environment and the default Pixi build +tree created by `skalaxc-configure-host`. + +```bash +pixi run -e skalaxc-host skalaxc-configure-host +pixi run -e skalaxc-host cmake --build SkalaXC/build-pixi-host \ + --target skalaxc_unit_test --parallel 2 + +OMP_NUM_THREADS=4 pixi run -e skalaxc-host \ + SkalaXC/build-pixi-host/tests/skalaxc_unit_test "[host-reference-integration]" +OMP_NUM_THREADS=4 pixi run -e skalaxc-host \ + SkalaXC/build-pixi-host/tests/skalaxc_unit_test "[host-gradient]" +OMP_NUM_THREADS=4 pixi run -e skalaxc-host \ + SkalaXC/build-pixi-host/tests/skalaxc_unit_test "[gradient-numerical]" +OMP_NUM_THREADS=4 pixi run -e skalaxc-host \ + SkalaXC/build-pixi-host/tests/skalaxc_unit_test "[openmp]" +OMP_NUM_THREADS=4 pixi run -e skalaxc-host \ + SkalaXC/build-pixi-host/tests/skalaxc_unit_test "[traditional-integration]" + +OMP_NUM_THREADS=4 pixi run -e skalaxc-host ctest \ + --test-dir SkalaXC/build-pixi-host -R '^skalaxc_public_api$' --output-on-failure +OMP_NUM_THREADS=4 pixi run -e skalaxc-host ctest \ + --test-dir SkalaXC/build-pixi-host -R '^skalaxc_(c_api|fortran)$' --output-on-failure +OMP_NUM_THREADS=4 pixi run -e skalaxc-host ctest \ + --test-dir SkalaXC/build-pixi-host --output-on-failure +``` + +Run CUDA-tagged tests with the matching `skalaxc-cuda12` or +`skalaxc-cuda13` environment and custom platform. The focused `[stream]` case +checks that SkalaXC always uses GauXC's master CUDA stream internally and +restores a non-default caller Torch stream after successful and failed +evaluations. + +`[gradient-numerical]` is tagged `[.slow]`, so it runs only when selected +explicitly. Cases tagged `[mpi-only]` are excluded from single-process Catch +discovery and are available through these MPI-enabled CTest registrations: + +| CTest name | Ranks | Coverage | +| --- | ---: | --- | +| `skalaxc_unit_mpi.subcommunicator` | 3 | MPI wrapper and model-grid subcommunicator units. | +| `skalaxc_unit_mpi.host_subcommunicator` | 4 | Full host TPSS EXC/VXC/gradient isolation between two communicators. | +| `skalaxc_unit_mpi.atomic_domain_ownership` | 3 | Exactly one owner per complete atomic domain. | +| `skalaxc_unit_mpi.model_broadcast` | 3 | Runtime-rank-zero model loading, broadcast, and error propagation. | +| `skalaxc_unit_mpi.traditional_integration` | 3 | Replicated SkalaXC/GauXC parity. | +| `skalaxc_unit_mpi.cuda_idle_rank` | 3 | CUDA evaluation when one rank owns no atomic domain. | +| `skalaxc_unit_mpi.cuda_subcommunicator` | 4 | CUDA isolation between two runtime communicators. | +| `skalaxc_fortran_mpi` | 2 | Fortran binding under MPI. | + +For example: + +```bash +OMP_NUM_THREADS=4 pixi run -e skalaxc-host ctest \ + --test-dir SkalaXC/build-pixi-host \ + -R '^skalaxc_unit_mpi\.host_subcommunicator$' --output-on-failure +``` + +Multi-rank registrations set `OMP_NUM_THREADS=1` to avoid oversubscription. +Use the project's normal OpenMP thread setting for serial tests. + +## Fixtures and provenance + +The three SkalaXC-owned HDF5 files are golden He/def2-QZVP UKS snapshots. Each +contains `/MOLECULE`, `/BASIS`, `/DENSITY_SCALAR`, `/DENSITY_Z`, `/EXC`, +`/VXC_SCALAR`, and `/VXC_Z`; the density and potential matrices are `30 x 30`. +They were moved from the former GauXC/OneDFT fixture paths in commit `a841c9f`. +The files contain no embedded generator version or provenance attributes, so +their checked-in hashes are the artifact identities: + +| Fixture | Bytes | SHA-256 | +| --- | ---: | --- | +| `ref_data/skala_he_def2qzvp_lda_uks.hdf5` | 41,304 | `bce8289eac18173575cf867178f8c6751e5095b65dc6fd975497fb9a05b6b76a` | +| `ref_data/skala_he_def2qzvp_pbe_uks.hdf5` | 41,304 | `e1af1d35c5686d6ae448408315b0ebc93f27e96cf74bb297640617bf5eab9ca2` | +| `ref_data/skala_he_def2qzvp_tpss_uks.hdf5` | 41,304 | `1c5742160700ab7f899f7ba60d399b34530c5144ddeacaec19a82c5ef40e349a` | + +Gradient, batching, OpenMP, binding, and load-balancer tests also use +`external/GauXC/tests/ref_data/h2o2_def2-tzvp.hdf5`. It is owned by the pinned +GauXC submodule; at GauXC revision +`554bef7495b2a93f16a2fdedabf4e1cdcb3a1faf`, its SHA-256 is +`3d0eb1e98d02b7fe8892f1bde4fbdccd7c0686cbdc17746ebe8fa25cc8ff8302`. +Small H2 gradient and communicator tests construct their geometry, STO-3G +basis, and density directly in the test source. + +If a golden fixture is regenerated, record the generator, dependency versions, +and command in this file; update the checksum and the numerical expectation in +the same change. A checksum-only replacement is not sufficient provenance. + +## Numerical tolerances + +Tolerance families reflect the comparison being made: + +| Comparison | Current thresholds | Rationale | +| --- | --- | --- | +| Golden host snapshots | EXC relative `1e-5`; scalar VXC norm/nbf `1e-7`; z VXC norm/nbf `1e-10` | Mirrors the historical GauXC/Skala reference checks while retaining a tighter spin-potential discriminator. | +| Traditional functionals | EXC relative `1e-5`; each VXC relative `2e-5`; gradient relative `1e-4` | The neural baselines reproduce conventional functionals to about `1e-6` in measured worst cases; random densities and gradient accumulation require headroom. | +| CUDA versus host | EXC `1e-10`; scalar VXC norm/nbf `1e-7`; z VXC norm/nbf `1e-10`; maximum gradient component `1e-6` | Covers different reduction order and GPU kernel/autograd implementations without relaxing functional-level regressions. | +| OpenMP thread counts | EXC and VXC normalized errors `1e-12`; gradient RMS/component count `1e-10` | Both runs use the same host implementation; only work partition and reduction order change. | +| Host batching | EXC `1e-12`; VXC `1e-11`; gradient `1e-10` | Conservative and aggressive modes differ only in model batching. | +| Numerical gradient | Ridders estimate error below `1e-7`; analytic directional derivative within absolute `1e-6` | Separately constrains finite-difference convergence and the implemented analytic gradient. | + +The constants in the test source are authoritative. Update this table whenever +a threshold changes, and document measured evidence rather than widening a +tolerance solely to make one platform pass. + +## Randomized parity controls + +`skala_traditional_integration_test.cxx` chooses a random density seed on +runtime rank zero and broadcasts it. CI fixes the seed. These variables support +local diagnosis and exact replay: + +| Variable | Effect | +| --- | --- | +| `SKALAXC_TEST_SEED=` | Generate the same random UKS densities. | +| `SKALAXC_TEST_DENSITY_DIR=` | Replay `density__{scalar,z}.mtx` files emitted after a mismatch. | +| `SKALAXC_TEST_VERBOSE=1` | Print per-molecule/model numerical errors on rank zero. | + +On failure, preserve the printed seed in the issue or pull request. Store a +replay density only when it adds a stable regression case that a seed cannot +reproduce. + +## Adding or merging tests + +- Prefer a focused unit test for private transformations and an integration + test only where ownership, communication, numerical assembly, or ABI behavior + crosses a boundary. +- Keep public C++, C, and Fortran checks separate when compilation, linking, + storage ownership, or error translation differs. +- Tag a Catch case `[mpi-only]` when it requires multiple ranks, then add one + explicit CTest registration with the required rank count. +- Do not add aggregate CTests that rerun already discovered Catch cases. Use a + direct Catch tag expression in focused CI jobs instead. diff --git a/SkalaXC/tests/atomic_domain_assignment_unit_test.cxx b/SkalaXC/tests/atomic_domain_assignment_unit_test.cxx new file mode 100644 index 00000000..292810fa --- /dev/null +++ b/SkalaXC/tests/atomic_domain_assignment_unit_test.cxx @@ -0,0 +1,94 @@ +#include "atomic_domain_assignment.hpp" +#include "saturating_math.hpp" + +#include + +#include +#include +#include + +namespace { + +std::vector work_estimates( + std::initializer_list values) { + std::vector result; + result.reserve(values.size()); + for (const auto value : values) + result.push_back(SkalaXC::types::WorkEstimate{value}); + return result; +} + +std::vector communicator_ranks( + std::initializer_list values) { + std::vector result; + result.reserve(values.size()); + for (const auto value : values) + result.push_back(SkalaXC::types::CommunicatorRank{value}); + return result; +} + +} // namespace + +TEST_CASE("unsigned arithmetic saturates instead of wrapping", + "[saturating-math]") { + const auto maximum = std::numeric_limits::max(); + + CHECK(SkalaXC::detail::saturating_add(3, 4) == 7); + CHECK(SkalaXC::detail::saturating_add(maximum, 1) == maximum); + CHECK(SkalaXC::detail::saturating_multiply(3, 4) == 12); + CHECK(SkalaXC::detail::saturating_multiply(maximum, 0) == 0); + CHECK(SkalaXC::detail::saturating_multiply(maximum, 2) == maximum); +} + +TEST_CASE("atomic domains use deterministic least-loaded ownership", + "[atomic-domain-assignment]") { + const auto assignment = SkalaXC::detail::assign_atomic_domains( + work_estimates({8, 7, 6, 5}), SkalaXC::types::CommunicatorSize{2}); + + CHECK(assignment.owner_by_atom == communicator_ranks({0, 1, 1, 0})); + CHECK(assignment.rank_costs == work_estimates({13, 13})); +} + +TEST_CASE("atomic domain assignment has stable tie breaking", + "[atomic-domain-assignment]") { + SECTION("equal atom costs retain atom index order") { + const auto assignment = SkalaXC::detail::assign_atomic_domains( + work_estimates({4, 4, 4, 4, 4}), SkalaXC::types::CommunicatorSize{3}); + + CHECK(assignment.owner_by_atom == communicator_ranks({0, 1, 2, 0, 1})); + CHECK(assignment.rank_costs == work_estimates({8, 8, 4})); + } + + SECTION("lowest rank wins equal load") { + const auto assignment = SkalaXC::detail::assign_atomic_domains( + work_estimates({0, 0, 0}), SkalaXC::types::CommunicatorSize{2}); + + CHECK(assignment.owner_by_atom == communicator_ranks({0, 0, 0})); + } + + SECTION("excess ranks and empty inputs are supported") { + const auto one_atom = SkalaXC::detail::assign_atomic_domains( + work_estimates({9}), SkalaXC::types::CommunicatorSize{3}); + const auto no_atoms = SkalaXC::detail::assign_atomic_domains( + work_estimates({}), SkalaXC::types::CommunicatorSize{2}); + + CHECK(one_atom.owner_by_atom == communicator_ranks({0})); + CHECK(one_atom.rank_costs == work_estimates({9, 0, 0})); + CHECK(no_atoms.owner_by_atom.empty()); + CHECK(no_atoms.rank_costs == work_estimates({0, 0})); + } + + SECTION("rank costs saturate instead of wrapping") { + const auto maximum = std::numeric_limits::max(); + const auto assignment = SkalaXC::detail::assign_atomic_domains( + work_estimates({maximum, maximum, 1}), + SkalaXC::types::CommunicatorSize{2}); + + CHECK(assignment.owner_by_atom == communicator_ranks({0, 1, 0})); + CHECK(assignment.rank_costs == work_estimates({maximum, maximum})); + } + + CHECK_THROWS_AS(SkalaXC::detail::assign_atomic_domains( + work_estimates({1}), SkalaXC::types::CommunicatorSize{0}), + std::invalid_argument); +} \ No newline at end of file diff --git a/SkalaXC/tests/atomic_domain_load_balancer_unit_test.cxx b/SkalaXC/tests/atomic_domain_load_balancer_unit_test.cxx new file mode 100644 index 00000000..c9751edf --- /dev/null +++ b/SkalaXC/tests/atomic_domain_load_balancer_unit_test.cxx @@ -0,0 +1,67 @@ +#include "atomic_domain_load_balancer.hpp" + +#include + +#include +#include +#include + +#include +#include +#include +#include + +#ifdef GAUXC_HAS_MPI +#include +#endif + +TEST_CASE("atomic domains belong to one runtime rank", + "[skala][mpi][atomic-domain-ownership][mpi-only]") { +#ifdef GAUXC_HAS_MPI + int world_rank = 0; + MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); + MPI_Comm runtime_communicator = MPI_COMM_NULL; + MPI_Comm_split(MPI_COMM_WORLD, world_rank % 2, world_rank, + &runtime_communicator); + GauXC::RuntimeEnvironment runtime(runtime_communicator); +#else + GauXC::RuntimeEnvironment runtime; +#endif + + const std::string fixture = + std::string(SKALAXC_GAUXC_REF_DATA_PATH) + "/h2o2_def2-tzvp.hdf5"; + GauXC::Molecule molecule; + GauXC::BasisSet basis; + GauXC::read_hdf5_record(molecule, fixture, "/MOLECULE"); + GauXC::read_hdf5_record(basis, fixture, "/BASIS"); + REQUIRE(molecule.natoms() == 4); + auto grid = GauXC::MolGridFactory::create_default_molgrid( + molecule, GauXC::PruningScheme::Unpruned, GauXC::BatchSize(512), + GauXC::RadialQuad::MuraKnowles, GauXC::AtomicGridSizeDefault::FineGrid); + auto load_balancer = SkalaXC::detail::make_atomic_domain_load_balancer( + runtime, molecule, grid, basis, "Default"); + + std::array local_owners{}; + for (const auto& task : load_balancer.get_tasks()) { + if (task.iParent < 0 || + static_cast(task.iParent) >= molecule.natoms()) { + FAIL("load-balancer task has an invalid parent atom"); + continue; + } + local_owners[static_cast(task.iParent)] = 1; + } + + std::array owner_counts{}; +#ifdef GAUXC_HAS_MPI + MPI_Allreduce(local_owners.data(), owner_counts.data(), + static_cast(local_owners.size()), MPI_INT, MPI_SUM, + runtime_communicator); +#else + owner_counts = local_owners; +#endif + for (const auto owners : owner_counts) CHECK(owners == 1); + +#ifdef GAUXC_HAS_MPI + MPI_Comm_free(&runtime_communicator); +#endif +} \ No newline at end of file diff --git a/SkalaXC/tests/check_c_consumer_dependencies.cmake b/SkalaXC/tests/check_c_consumer_dependencies.cmake new file mode 100644 index 00000000..eab82100 --- /dev/null +++ b/SkalaXC/tests/check_c_consumer_dependencies.cmake @@ -0,0 +1,41 @@ +if(NOT CONSUMER_PATH OR (NOT READELF_EXECUTABLE AND NOT OTOOL_EXECUTABLE)) + message(FATAL_ERROR + "CONSUMER_PATH and either READELF_EXECUTABLE or OTOOL_EXECUTABLE are required") +endif() + +if(OTOOL_EXECUTABLE) + execute_process( + COMMAND "${OTOOL_EXECUTABLE}" -L "${CONSUMER_PATH}" + RESULT_VARIABLE inspector_result + OUTPUT_VARIABLE inspector_output + ERROR_VARIABLE inspector_error) + set(required_dependency "libskalaxc[^\n]*[.]dylib") + set(private_dependencies "gauxc|torch|c10|libc[+][+]") + set(inspector_name "otool") +else() + execute_process( + COMMAND "${READELF_EXECUTABLE}" -d "${CONSUMER_PATH}" + RESULT_VARIABLE inspector_result + OUTPUT_VARIABLE inspector_output + ERROR_VARIABLE inspector_error) + set(required_dependency "\\(needed\\)[^\n]*\\[libskalaxc[^]]*\\]") + set(private_dependencies + "\\(needed\\)[^\n]*\\[[^]]*(gauxc|torch|c10|stdc[+][+])[^]]*\\]") + set(inspector_name "readelf") +endif() +if(NOT inspector_result EQUAL 0) + message(FATAL_ERROR + "${inspector_name} failed for ${CONSUMER_PATH}: ${inspector_error}") +endif() + +string(TOLOWER "${inspector_output}" dependencies) +if(NOT dependencies MATCHES "${required_dependency}") + message(FATAL_ERROR "${CONSUMER_PATH} does not directly depend on libskalaxc") +endif() +if(dependencies MATCHES "${private_dependencies}") + message(FATAL_ERROR + "${CONSUMER_PATH} directly exposes a private C++ dependency:\n" + "${inspector_output}") +endif() + +message(STATUS "Verified pure-C consumer dynamic dependency isolation") diff --git a/SkalaXC/tests/check_expected_failure.cmake b/SkalaXC/tests/check_expected_failure.cmake new file mode 100644 index 00000000..6dec79ec --- /dev/null +++ b/SkalaXC/tests/check_expected_failure.cmake @@ -0,0 +1,23 @@ +if(NOT DEFINED EXECUTABLE OR NOT DEFINED HANDLE_TYPE OR + NOT DEFINED EXPECTED_MESSAGE) + message(FATAL_ERROR + "EXECUTABLE, HANDLE_TYPE, and EXPECTED_MESSAGE are required") +endif() + +execute_process( + COMMAND "${EXECUTABLE}" "${HANDLE_TYPE}" + RESULT_VARIABLE result + OUTPUT_VARIABLE standard_output + ERROR_VARIABLE standard_error) + +if(result EQUAL 0) + message(FATAL_ERROR + "${HANDLE_TYPE} assignment unexpectedly succeeded") +endif() + +set(output "${standard_output}\n${standard_error}") +string(FIND "${output}" "${EXPECTED_MESSAGE}" message_position) +if(message_position EQUAL -1) + message(FATAL_ERROR + "${HANDLE_TYPE} assignment failed without the expected diagnostic:\n${output}") +endif() diff --git a/SkalaXC/tests/check_exported_symbols.cmake b/SkalaXC/tests/check_exported_symbols.cmake new file mode 100644 index 00000000..cadf8a75 --- /dev/null +++ b/SkalaXC/tests/check_exported_symbols.cmake @@ -0,0 +1,70 @@ +# Verify that the built shared library exposes only SkalaXC's public C and C++ +# ABI. The CTest registration supplies the platform's nm executable, the +# library path, and either MACHO or ELF mode. This script normalizes the two nm +# output conventions, rejects leaked dependency/private symbols, and confirms +# that both the C and C++ API surfaces have at least one exported symbol. + +if(NOT NM_EXECUTABLE OR NOT LIBRARY_PATH) + message(FATAL_ERROR "NM_EXECUTABLE and LIBRARY_PATH are required") +endif() + +if(NM_MODE STREQUAL "MACHO") + set(nm_arguments -gU -P) + # Depending on whether CMAKE_NM resolves to Apple nm or llvm-nm, and whether + # POSIX output mode canonicalizes Mach-O names, an Itanium C++ symbol can be + # reported as __ZN..., _ZN..., or ZN.... Match those equivalent spellings + # directly rather than stripping an underscore that may already be absent. + set(c_symbol_pattern "^_*(skalaxc_|SkalaXC_)") + set(cxx_symbol_pattern + "^_*Z(N7SkalaXC|NK7SkalaXC|TIN7SkalaXC|TSN7SkalaXC|TVN7SkalaXC)") +else() + set(nm_arguments -D --defined-only --format=posix) + set(c_symbol_pattern "^(__skalaxc_|skalaxc_|SkalaXC_)") + set(cxx_symbol_pattern + "^(_ZN7SkalaXC|_ZNK7SkalaXC|_ZTIN7SkalaXC|_ZTSN7SkalaXC|_ZTVN7SkalaXC)") +endif() + +execute_process( + COMMAND "${NM_EXECUTABLE}" ${nm_arguments} "${LIBRARY_PATH}" + RESULT_VARIABLE nm_result + OUTPUT_VARIABLE nm_output + ERROR_VARIABLE nm_error) +if(NOT nm_result EQUAL 0) + message(FATAL_ERROR "nm failed for ${LIBRARY_PATH}: ${nm_error}") +endif() + +string(REPLACE "\n" ";" symbol_lines "${nm_output}") +set(c_symbol_count 0) +set(cxx_symbol_count 0) +set(unexpected_symbols) +foreach(symbol_line IN LISTS symbol_lines) + string(STRIP "${symbol_line}" symbol_line) + if(symbol_line STREQUAL "") + continue() + endif() + + string(REGEX MATCH "^([^ \t]+)[ \t]" symbol_match "${symbol_line}") + set(symbol "${CMAKE_MATCH_1}") + if(symbol MATCHES "${c_symbol_pattern}") + math(EXPR c_symbol_count "${c_symbol_count} + 1") + elseif(symbol MATCHES "${cxx_symbol_pattern}") + math(EXPR cxx_symbol_count "${cxx_symbol_count} + 1") + else() + list(APPEND unexpected_symbols "${symbol}") + endif() +endforeach() + +if(unexpected_symbols) + list(JOIN unexpected_symbols "\n " unexpected_lines) + message(FATAL_ERROR + "${LIBRARY_PATH} exports symbols outside the SkalaXC ABI:\n " + "${unexpected_lines}") +endif() +if(c_symbol_count EQUAL 0 OR cxx_symbol_count EQUAL 0) + message(FATAL_ERROR + "Expected both C and C++ SkalaXC exports, found ${c_symbol_count} C and " + "${cxx_symbol_count} C++ symbols") +endif() + +message(STATUS + "Verified ${c_symbol_count} C and ${cxx_symbol_count} C++ SkalaXC exports") diff --git a/SkalaXC/tests/check_hdf5_feature.cmake b/SkalaXC/tests/check_hdf5_feature.cmake new file mode 100644 index 00000000..904ad66c --- /dev/null +++ b/SkalaXC/tests/check_hdf5_feature.cmake @@ -0,0 +1,49 @@ +if(NOT DEFINED EXPECT_HDF5 OR + NOT DEFINED PUBLIC_CONFIG_HEADER OR + NOT DEFINED INTERNAL_CONFIG_HEADER OR + NOT DEFINED PACKAGE_CONFIG) + message(FATAL_ERROR + "EXPECT_HDF5, PUBLIC_CONFIG_HEADER, INTERNAL_CONFIG_HEADER, and " + "PACKAGE_CONFIG are required") +endif() + +foreach(_skalaxc_file IN ITEMS + "${PUBLIC_CONFIG_HEADER}" + "${INTERNAL_CONFIG_HEADER}" + "${PACKAGE_CONFIG}") + if(NOT EXISTS "${_skalaxc_file}") + message(FATAL_ERROR "Expected generated file does not exist: ${_skalaxc_file}") + endif() +endforeach() + +file(READ "${PUBLIC_CONFIG_HEADER}" _skalaxc_public_config) +file(READ "${INTERNAL_CONFIG_HEADER}" _skalaxc_internal_config) +file(READ "${PACKAGE_CONFIG}" _skalaxc_package_config) + +if(EXPECT_HDF5) + set(_skalaxc_expected_header + "#[ \t]*define[ \t]+SKALAXC_HAS_HDF5([ \t]+1)?") + set(_skalaxc_expected_package + "set\\(SkalaXC_HDF5_ENABLED[ \t]+(1|ON|TRUE)\\)") +else() + set(_skalaxc_expected_header + "#[ \t]*undef[ \t]+SKALAXC_HAS_HDF5") + set(_skalaxc_expected_package + "set\\(SkalaXC_HDF5_ENABLED[ \t]+(0|OFF|FALSE)\\)") +endif() + +foreach(_skalaxc_header IN ITEMS + _skalaxc_public_config + _skalaxc_internal_config) + if(NOT "${${_skalaxc_header}}" MATCHES "${_skalaxc_expected_header}") + message(FATAL_ERROR + "${_skalaxc_header} does not report the expected HDF5 feature state") + endif() +endforeach() + +if(NOT _skalaxc_package_config MATCHES "${_skalaxc_expected_package}") + message(FATAL_ERROR + "SkalaXCConfig.cmake does not report the expected HDF5 feature state") +endif() + +message(STATUS "Verified generated HDF5 feature state: ${EXPECT_HDF5}") \ No newline at end of file diff --git a/SkalaXC/tests/check_library_dependencies.cmake b/SkalaXC/tests/check_library_dependencies.cmake new file mode 100644 index 00000000..28455588 --- /dev/null +++ b/SkalaXC/tests/check_library_dependencies.cmake @@ -0,0 +1,36 @@ +if(NOT LIBRARY_PATH OR (NOT READELF_EXECUTABLE AND NOT OTOOL_EXECUTABLE)) + message(FATAL_ERROR + "LIBRARY_PATH and either READELF_EXECUTABLE or OTOOL_EXECUTABLE are required") +endif() + +if(OTOOL_EXECUTABLE) + execute_process( + COMMAND "${OTOOL_EXECUTABLE}" -L "${LIBRARY_PATH}" + RESULT_VARIABLE inspector_result + OUTPUT_VARIABLE inspector_output + ERROR_VARIABLE inspector_error) + set(private_dependencies "gauxc|exchcxx|integratorxx|eigen|nlohmann") + set(inspector_name "otool") +else() + execute_process( + COMMAND "${READELF_EXECUTABLE}" -d "${LIBRARY_PATH}" + RESULT_VARIABLE inspector_result + OUTPUT_VARIABLE inspector_output + ERROR_VARIABLE inspector_error) + set(private_dependencies + "\\(needed\\)[^\n]*\\[[^]]*(gauxc|exchcxx|integratorxx|eigen|nlohmann)[^]]*\\]") + set(inspector_name "readelf") +endif() +if(NOT inspector_result EQUAL 0) + message(FATAL_ERROR + "${inspector_name} failed for ${LIBRARY_PATH}: ${inspector_error}") +endif() + +string(TOLOWER "${inspector_output}" dependencies) +if(dependencies MATCHES "${private_dependencies}") + message(FATAL_ERROR + "${LIBRARY_PATH} dynamically exposes an embedded private dependency:\n" + "${inspector_output}") +endif() + +message(STATUS "Verified libskalaxc dynamic dependency isolation") diff --git a/SkalaXC/tests/diagnostics_unit_test.cxx b/SkalaXC/tests/diagnostics_unit_test.cxx new file mode 100644 index 00000000..dbb69d2f --- /dev/null +++ b/SkalaXC/tests/diagnostics_unit_test.cxx @@ -0,0 +1,158 @@ +#include "debug_log.hpp" +#include "diagnostics.hpp" + +#include + +#include +#include +#include + +TEST_CASE("debug lines contain backend rank and phase", "[diagnostics]") { + const auto line = SkalaXC::detail::format_debug_line( + SkalaXC::ExecutionSpace::Device, SkalaXC::types::CommunicatorRank{2}, + SkalaXC::types::CommunicatorSize{4}, "setup", "tasks=7"); + CHECK(line == + "[SkalaXC][debug][backend=device][rank=2/4][phase=setup] " + "tasks=7\n"); +} + +TEST_CASE("debug lines replace embedded line breaks", "[diagnostics]") { + const auto line = SkalaXC::detail::format_debug_line( + SkalaXC::ExecutionSpace::Host, SkalaXC::types::CommunicatorRank{0}, + SkalaXC::types::CommunicatorSize{1}, "model", "selector=a\nb\r"); + CHECK(line == + "[SkalaXC][debug][backend=host][rank=0/1][phase=model] " + "selector=a b \n"); +} + +TEST_CASE("disabled debug logger does not invoke message formatting", + "[diagnostics]") { + SkalaXC::detail::DebugLogger logger( + SkalaXC::TimingSettings{}, SkalaXC::ExecutionSpace::Host, + SkalaXC::types::CommunicatorRank{0}, SkalaXC::types::CommunicatorSize{1}); + bool invoked = false; + logger.log("setup", [&](std::ostream&) { invoked = true; }); + CHECK_FALSE(invoked); +} + +TEST_CASE("enabled debug logger emits one complete line", "[diagnostics]") { + std::FILE* output = std::tmpfile(); + REQUIRE(output != nullptr); + SkalaXC::TimingSettings settings; + settings.debug_logging = true; + SkalaXC::detail::DebugLogger logger(settings, SkalaXC::ExecutionSpace::Host, + SkalaXC::types::CommunicatorRank{1}, + SkalaXC::types::CommunicatorSize{3}, + output); + logger.log("setup", [](std::ostream& message) { message << "tasks=5"; }); + std::rewind(output); + char buffer[256]{}; + const auto bytes = std::fread(buffer, 1, sizeof(buffer) - 1, output); + std::fclose(output); + const std::string line(buffer, bytes); + CHECK(line == + "[SkalaXC][debug][backend=host][rank=1/3][phase=setup] tasks=5\n"); +} + +TEST_CASE("default diagnostics record host metrics", "[diagnostics]") { + SkalaXC::detail::DiagnosticsRegistry registry( + SkalaXC::TimingSettings{}, SkalaXC::ExecutionSpace::Host, + SkalaXC::types::CommunicatorRank{3}); + + registry.record(SkalaXC::TimingMetric::ModelForward, + std::chrono::nanoseconds(17)); + registry.increment_exc_vxc_calls(); + registry.set_local_workload( + {SkalaXC::types::TaskCount{5}, SkalaXC::types::GridPointCount{100}}); + registry.record_model_batch(SkalaXC::types::DomainCount{2}); + + const auto snapshot = registry.snapshot(); + CHECK(snapshot.rank == 3); + CHECK(snapshot.timing(SkalaXC::TimingMetric::ModelForward).status == + SkalaXC::TimingStatus::Complete); + CHECK(snapshot.exc_vxc_calls == 1); + CHECK(snapshot.tasks == 5); + CHECK(snapshot.points == 100); + CHECK(snapshot.model_batches == 1); +} + +TEST_CASE("host timing scope can finish before destruction", "[diagnostics]") { + SkalaXC::detail::DiagnosticsRegistry registry( + SkalaXC::TimingSettings{}, SkalaXC::ExecutionSpace::Host, + SkalaXC::types::CommunicatorRank{0}); + { + SkalaXC::detail::HostTimingScope timer(registry, + SkalaXC::TimingMetric::TotalEXCVXC); + timer.finish(); + CHECK(registry.snapshot() + .timing(SkalaXC::TimingMetric::TotalEXCVXC) + .call_count == 1); + } + CHECK(registry.snapshot() + .timing(SkalaXC::TimingMetric::TotalEXCVXC) + .call_count == 1); +} + +TEST_CASE("host diagnostics accumulate and reset evaluation metrics", + "[diagnostics]") { + SkalaXC::TimingSettings settings; + SkalaXC::detail::DiagnosticsRegistry registry( + settings, SkalaXC::ExecutionSpace::Host, + SkalaXC::types::CommunicatorRank{1}); + + registry.record(SkalaXC::TimingMetric::ModelLoad, + std::chrono::nanoseconds(11)); + registry.record(SkalaXC::TimingMetric::ModelForward, + std::chrono::nanoseconds(13)); + registry.record(SkalaXC::TimingMetric::ModelForward, + std::chrono::nanoseconds(17)); + registry.increment_exc_vxc_calls(); + registry.set_parallel_setup({SkalaXC::types::CommunicatorSize{4}, + SkalaXC::types::DeviceId{2}, + SkalaXC::types::OpenMPThreadCount{8}, 0.75, + SkalaXC::DomainBatchMode::Aggressive}); + registry.set_local_workload( + {SkalaXC::types::TaskCount{7}, SkalaXC::types::GridPointCount{101}}); + registry.set_model_workload( + {SkalaXC::types::AtomCount{3}, + SkalaXC::types::ModelBatchCount{2}, + {SkalaXC::types::GridPointCount{5}, SkalaXC::types::GridPointCount{23}}, + {SkalaXC::types::BasisFunctionCount{2}, + SkalaXC::types::BasisFunctionCount{11}}, + {SkalaXC::types::GridPointCount{17}, SkalaXC::types::GridPointCount{51}}, + SkalaXC::types::DomainCount{3}}); + registry.record_model_batch(SkalaXC::types::DomainCount{4}); + + auto snapshot = registry.snapshot(); + const auto& model_load = snapshot.timing(SkalaXC::TimingMetric::ModelLoad); + const auto& model_forward = + snapshot.timing(SkalaXC::TimingMetric::ModelForward); + CHECK(model_load.total_nanoseconds == 11); + CHECK(model_load.call_count == 1); + CHECK(model_forward.last_nanoseconds == 17); + CHECK(model_forward.total_nanoseconds == 30); + CHECK(model_forward.call_count == 2); + CHECK(snapshot.exc_vxc_calls == 1); + CHECK(snapshot.tasks == 7); + CHECK(snapshot.points == 101); + CHECK(snapshot.model_batches == 1); + CHECK(snapshot.domains == 4); + + registry.reset_evaluation(); + snapshot = registry.snapshot(); + CHECK(snapshot.timing(SkalaXC::TimingMetric::ModelLoad).total_nanoseconds == + 11); + CHECK(snapshot.timing(SkalaXC::TimingMetric::ModelForward).status == + SkalaXC::TimingStatus::Unavailable); + CHECK(snapshot.exc_vxc_calls == 0); + CHECK(snapshot.tasks == 7); + CHECK(snapshot.points == 101); + CHECK(snapshot.model_batches == 0); + CHECK(snapshot.communicator_size == 4); + CHECK(snapshot.device_id == 2); + CHECK(snapshot.configured_model_batches == 2); + CHECK(snapshot.openmp_threads == 8); + CHECK(snapshot.domain_batch_mode == SkalaXC::DomainBatchMode::Aggressive); + CHECK(snapshot.local_atoms == 3); + CHECK(snapshot.model_batch_points_max == 51); +} \ No newline at end of file diff --git a/SkalaXC/tests/installed/CMakeLists.txt b/SkalaXC/tests/installed/CMakeLists.txt new file mode 100644 index 00000000..dfb1ca6d --- /dev/null +++ b/SkalaXC/tests/installed/CMakeLists.txt @@ -0,0 +1,53 @@ +cmake_minimum_required(VERSION 3.21 FATAL_ERROR) + +project(SkalaXCInstalledConsumers LANGUAGES C CXX) + +option(SKALAXC_TEST_FORTRAN "Build the installed Fortran consumer" ON) +option(SKALAXC_EXPECT_FORTRAN_UNAVAILABLE + "Verify that the installed package does not provide Fortran" OFF) +if(SKALAXC_TEST_FORTRAN AND SKALAXC_EXPECT_FORTRAN_UNAVAILABLE) + message(FATAL_ERROR + "SKALAXC_TEST_FORTRAN and SKALAXC_EXPECT_FORTRAN_UNAVAILABLE are mutually exclusive") +endif() + +if(SKALAXC_EXPECT_FORTRAN_UNAVAILABLE) + find_package(SkalaXC REQUIRED CONFIG COMPONENTS C CXX) + find_package(SkalaXC QUIET CONFIG COMPONENTS Fortran) + if(SkalaXC_Fortran_FOUND OR TARGET SkalaXC::skalaxc_fortran) + message(FATAL_ERROR + "The core-only SkalaXC install unexpectedly provides Fortran") + endif() +elseif(SKALAXC_TEST_FORTRAN) + enable_language(Fortran) + find_package(SkalaXC REQUIRED CONFIG COMPONENTS C CXX Fortran) +else() + find_package(SkalaXC REQUIRED CONFIG COMPONENTS C CXX) +endif() + +enable_testing() + +add_executable(installed_consumer_cpp consumer.cpp) +target_link_libraries(installed_consumer_cpp PRIVATE SkalaXC::skalaxc) +target_compile_features(installed_consumer_cpp PRIVATE cxx_std_17) +add_test(NAME installed_consumer_cpp COMMAND installed_consumer_cpp) +set_tests_properties(installed_consumer_cpp PROPERTIES + ENVIRONMENT "SKALAXC_MODEL_PATH=${SkalaXC_MODEL_DIR}") + +add_executable(installed_consumer_c consumer.c) +target_link_libraries(installed_consumer_c PRIVATE SkalaXC::skalaxc) +add_test(NAME installed_consumer_c COMMAND installed_consumer_c) +set_tests_properties(installed_consumer_c PROPERTIES + ENVIRONMENT "SKALAXC_MODEL_PATH=${SkalaXC_MODEL_DIR}") + +if(SKALAXC_TEST_FORTRAN) + add_executable(installed_consumer_fortran consumer.F90) + set_source_files_properties(consumer.F90 PROPERTIES Fortran_PREPROCESS ON) + if(SkalaXC_MPI_ENABLED) + target_compile_definitions(installed_consumer_fortran PRIVATE SKALAXC_HAS_MPI) + endif() + target_link_libraries(installed_consumer_fortran PRIVATE + SkalaXC::skalaxc_fortran) + add_test(NAME installed_consumer_fortran COMMAND installed_consumer_fortran) + set_tests_properties(installed_consumer_fortran PROPERTIES + ENVIRONMENT "SKALAXC_MODEL_PATH=${SkalaXC_MODEL_DIR}") +endif() diff --git a/SkalaXC/tests/installed/consumer.F90 b/SkalaXC/tests/installed/consumer.F90 new file mode 100644 index 00000000..244f309f --- /dev/null +++ b/SkalaXC/tests/installed/consumer.F90 @@ -0,0 +1,87 @@ +program installed_consumer_fortran + use, intrinsic :: iso_c_binding, only: c_double, c_int, c_int32_t, c_int64_t + use, intrinsic :: ieee_arithmetic, only: ieee_is_finite + use skalaxc +#ifdef SKALAXC_HAS_MPI + use mpi, only: MPI_COMM_WORLD, MPI_Finalize, MPI_Init, MPI_SUCCESS +#endif + implicit none + + type(skalaxc_runtime_environment_t) :: runtime + type(skalaxc_molecule_t) :: molecule + type(skalaxc_basisset_t) :: basis + type(skalaxc_molgrid_t) :: grid + type(skalaxc_load_balancer_t) :: load_balancer + type(skalaxc_molecular_weights_t) :: weights + type(skalaxc_functional_t) :: functional + type(skalaxc_xc_integrator_t) :: integrator + integer(c_int64_t) :: atomic_numbers(2) + integer(c_int32_t) :: shell_l(2), shell_pure(2), shell_nprim(2) + real(c_double) :: atom_xyz(6), exponents(6), coefficients(6) + real(c_double) :: scalar_density(4), spin_density(4) + real(c_double) :: scalar_potential(4), spin_potential(4), energy + integer(c_int) :: status +#ifdef SKALAXC_HAS_MPI + integer :: mpi_error +#endif + +#ifdef SKALAXC_HAS_MPI + call MPI_Init(mpi_error) + if (mpi_error /= MPI_SUCCESS) stop 1 +#endif + + block + character(len=:), allocatable :: version + version = skalaxc_version() + if (len(version) == 0) stop 1 + end block + + atomic_numbers = [1_c_int64_t, 1_c_int64_t] + shell_l = [0_c_int32_t, 0_c_int32_t] + shell_pure = [0_c_int32_t, 0_c_int32_t] + shell_nprim = [3_c_int32_t, 3_c_int32_t] + atom_xyz = [-0.7_c_double, 0.0_c_double, 0.0_c_double, & + 0.7_c_double, 0.0_c_double, 0.0_c_double] + exponents = [3.42525091_c_double, 0.62391373_c_double, 0.16885540_c_double, & + 3.42525091_c_double, 0.62391373_c_double, 0.16885540_c_double] + coefficients = [0.15432897_c_double, 0.53532814_c_double, 0.44463454_c_double, & + 0.15432897_c_double, 0.53532814_c_double, 0.44463454_c_double] + scalar_density = 0.5_c_double + spin_density = 0.0_c_double + +#ifdef SKALAXC_HAS_MPI + status = skalaxc_runtime_environment_create(runtime, MPI_COMM_WORLD) +#else + status = skalaxc_runtime_environment_create(runtime) +#endif + if (status /= SKALAXC_SUCCESS) stop 1 + status = molecule%from_arrays(atomic_numbers, atom_xyz) + if (status /= SKALAXC_SUCCESS) stop 1 + status = basis%from_arrays(shell_l, shell_pure, atom_xyz, shell_nprim, & + exponents, coefficients) + if (status /= SKALAXC_SUCCESS) stop 1 + status = grid%create_default(molecule) + if (status /= SKALAXC_SUCCESS) stop 1 + status = load_balancer%create(skalaxc_executionspace%host, runtime, & + molecule, grid, basis) + if (status /= SKALAXC_SUCCESS) stop 1 + status = weights%create(skalaxc_executionspace%host, skalaxc_xcweightalg%ssf) + if (status /= SKALAXC_SUCCESS) stop 1 + status = weights%modify_weights(load_balancer) + if (status /= SKALAXC_SUCCESS) stop 1 + status = functional%create('LDA') + if (status /= SKALAXC_SUCCESS) stop 1 + status = integrator%create(skalaxc_executionspace%host, functional, load_balancer) + if (status /= SKALAXC_SUCCESS) stop 1 + status = integrator%eval_exc_vxc_uks(scalar_density, spin_density, & + scalar_potential, spin_potential, energy) + if (status /= SKALAXC_SUCCESS) stop 1 + if (.not. ieee_is_finite(energy) .or. & + .not. all(ieee_is_finite(scalar_potential)) .or. & + .not. all(ieee_is_finite(spin_potential))) stop 1 + +#ifdef SKALAXC_HAS_MPI + call MPI_Finalize(mpi_error) + if (mpi_error /= MPI_SUCCESS) stop 1 +#endif +end program installed_consumer_fortran diff --git a/SkalaXC/tests/installed/consumer.c b/SkalaXC/tests/installed/consumer.c new file mode 100644 index 00000000..30fc650c --- /dev/null +++ b/SkalaXC/tests/installed/consumer.c @@ -0,0 +1,95 @@ +#include + +#include +#include +#include + +int main(int argc, char** argv) { + static const int64_t atomic_numbers[2] = {1, 1}; + static const double atom_xyz[6] = {-0.7, 0.0, 0.0, 0.7, 0.0, 0.0}; + static const int32_t shell_l[2] = {0, 0}; + static const int32_t shell_pure[2] = {0, 0}; + static const int32_t shell_nprim[2] = {3, 3}; + static const double exponents[6] = {3.42525091, 0.62391373, 0.16885540, + 3.42525091, 0.62391373, 0.16885540}; + static const double coefficients[6] = {0.15432897, 0.53532814, 0.44463454, + 0.15432897, 0.53532814, 0.44463454}; + skalaxc_runtime_environment_t runtime = NULL; + skalaxc_molecule_t molecule = NULL; + skalaxc_basisset_t basis = NULL; + skalaxc_molgrid_t grid = NULL; + skalaxc_load_balancer_t load_balancer = NULL; + skalaxc_molecular_weights_t weights = NULL; + skalaxc_functional_t functional = NULL; + skalaxc_xc_integrator_t integrator = NULL; + skalaxc_grid_settings_t grid_settings; + double scalar_density[4] = {0.5, 0.5, 0.5, 0.5}; + double spin_density[4] = {0.0, 0.0, 0.0, 0.0}; + double scalar_potential[4], spin_potential[4], energy; + int result = 1; + +#ifdef SKALAXC_HAS_MPI + if (MPI_Init(&argc, &argv) != MPI_SUCCESS) return 1; +#else + (void)argc; + (void)argv; +#endif + + if (skalaxc_version() == NULL || skalaxc_version()[0] == '\0') goto cleanup; + if (skalaxc_runtime_environment_create( +#ifdef SKALAXC_HAS_MPI + MPI_COMM_WORLD, +#endif + &runtime) != SKALAXC_SUCCESS) + goto cleanup; + if (skalaxc_molecule_from_arrays(2, atomic_numbers, atom_xyz, &molecule) != + SKALAXC_SUCCESS) + goto cleanup; + if (skalaxc_basisset_from_arrays(2, shell_l, shell_pure, atom_xyz, + shell_nprim, exponents, coefficients, + &basis) != SKALAXC_SUCCESS) + goto cleanup; + skalaxc_grid_settings_default(&grid_settings); + grid_settings.batch_size = 128; + if (skalaxc_molgrid_create_default(molecule, &grid_settings, &grid) != + SKALAXC_SUCCESS) + goto cleanup; + if (skalaxc_load_balancer_create(SkalaXC_ExecutionSpace_Host, runtime, + molecule, grid, basis, + &load_balancer) != SKALAXC_SUCCESS) + goto cleanup; + if (skalaxc_molecular_weights_create(SkalaXC_ExecutionSpace_Host, + SkalaXC_XCWeightAlg_SSF, + &weights) != SKALAXC_SUCCESS) + goto cleanup; + if (skalaxc_molecular_weights_modify_weights(weights, load_balancer) != + SKALAXC_SUCCESS) + goto cleanup; + if (skalaxc_functional_create("LDA", &functional) != SKALAXC_SUCCESS) + goto cleanup; + if (skalaxc_xc_integrator_create(SkalaXC_ExecutionSpace_Host, functional, + load_balancer, + &integrator) != SKALAXC_SUCCESS) + goto cleanup; + if (skalaxc_xc_integrator_eval_exc_vxc_uks( + integrator, scalar_density, spin_density, scalar_potential, + spin_potential, &energy) != SKALAXC_SUCCESS) + goto cleanup; + if (isfinite(energy) && isfinite(scalar_potential[0]) && + isfinite(spin_potential[0])) + result = 0; + +cleanup: + skalaxc_xc_integrator_destroy(integrator); + skalaxc_functional_destroy(functional); + skalaxc_molecular_weights_destroy(weights); + skalaxc_load_balancer_destroy(load_balancer); + skalaxc_molgrid_destroy(grid); + skalaxc_basisset_destroy(basis); + skalaxc_molecule_destroy(molecule); + skalaxc_runtime_environment_destroy(runtime); +#ifdef SKALAXC_HAS_MPI + if (MPI_Finalize() != MPI_SUCCESS) return 1; +#endif + return result; +} diff --git a/SkalaXC/tests/installed/consumer.cpp b/SkalaXC/tests/installed/consumer.cpp new file mode 100644 index 00000000..1a161deb --- /dev/null +++ b/SkalaXC/tests/installed/consumer.cpp @@ -0,0 +1,101 @@ +#include + +#include +#include +#include +#include + +class Matrix { + public: + using value_type = double; + + Matrix(std::int64_t rows, std::int64_t cols) + : rows_(rows), cols_(cols), values_(rows * cols) {} + + std::int64_t rows() const { return rows_; } + std::int64_t cols() const { return cols_; } + double* data() { return values_.data(); } + const double* data() const { return values_.data(); } + + private: + std::int64_t rows_; + std::int64_t cols_; + std::vector values_; +}; + +int main(int argc, char** argv) { +#ifdef SKALAXC_HAS_MPI + if (MPI_Init(&argc, &argv) != MPI_SUCCESS) return 1; +#else + (void)argc; + (void)argv; +#endif + + int result = 1; + try { + if (SkalaXC::version().empty()) + throw std::runtime_error("SkalaXC version is unavailable"); + { +#ifdef SKALAXC_HAS_MPI + SkalaXC::RuntimeEnvironment runtime(MPI_COMM_WORLD); +#else + SkalaXC::RuntimeEnvironment runtime; +#endif + SkalaXC::Molecule molecule{{SkalaXC::AtomicNumber(1), -0.7, 0.0, 0.0}, + {SkalaXC::AtomicNumber(1), 0.7, 0.0, 0.0}}; + SkalaXC::BasisSet basis; + SkalaXC::Shell::prim_array exponents{}; + SkalaXC::Shell::prim_array coefficients{}; + exponents[0] = 3.42525091; + exponents[1] = 0.62391373; + exponents[2] = 0.16885540; + coefficients[0] = 0.15432897; + coefficients[1] = 0.53532814; + coefficients[2] = 0.44463454; + for (const auto& atom : molecule) { + basis.emplace_back( + SkalaXC::PrimSize(3), SkalaXC::AngularMomentum(0), + SkalaXC::SphericalType(0), exponents, coefficients, + SkalaXC::Shell::cart_array{atom.x, atom.y, atom.z}); + } + + auto grid = SkalaXC::MolGridFactory::create_default_molgrid( + molecule, SkalaXC::PruningScheme::Unpruned, SkalaXC::BatchSize(128), + SkalaXC::RadialQuad::MuraKnowles, + SkalaXC::AtomicGridSizeDefault::FineGrid); + SkalaXC::LoadBalancerFactory load_balancer_factory( + SkalaXC::ExecutionSpace::Host); + auto load_balancer = + load_balancer_factory.get_instance(runtime, molecule, grid, basis); + SkalaXC::MolecularWeightsFactory weights_factory( + SkalaXC::ExecutionSpace::Host, "Default"); + auto weights = weights_factory.get_instance(); + weights.modify_weights(load_balancer); + + SkalaXC::XCIntegratorFactory integrator_factory( + SkalaXC::ExecutionSpace::Host); + auto integrator = integrator_factory.get_instance( + SkalaXC::functional_type("LDA"), load_balancer); + Matrix scalar_density(2, 2); + Matrix spin_density(2, 2); + for (std::size_t index = 0; index < 4; ++index) { + scalar_density.data()[index] = 0.5; + spin_density.data()[index] = 0.0; + } + auto [energy, scalar_potential, spin_potential] = + integrator.eval_exc_vxc(scalar_density, spin_density); + result = std::isfinite(energy) && + std::isfinite(scalar_potential.data()[0]) && + std::isfinite(spin_potential.data()[0]) + ? 0 + : 1; + } + } catch (...) { + result = 1; + } + +#ifdef SKALAXC_HAS_MPI + if (MPI_Finalize() != MPI_SUCCESS) return 1; +#endif + return result; +} diff --git a/SkalaXC/tests/ref_data/skala_he_def2qzvp_lda_uks.hdf5 b/SkalaXC/tests/ref_data/skala_he_def2qzvp_lda_uks.hdf5 new file mode 100644 index 0000000000000000000000000000000000000000..c9fe2c69183f1903b768362a77d3c9d28cd486ea GIT binary patch literal 41304 zcmeIb30MyQ+crM!X;UPrR4P;|Z8D?LqOv5UNE9U@X;V=tb(f+Il`Yvq2%%(|(T5gG zcG*QJB}ynlh3Ux?laeh@CF&2VvYnC-&UlJGOZ z-hGNY^CQ$J4mEdGBkMEBJJrb zgZ&nV|2MuzV&wk>yz9cC$uS@Oj&Z0PY*MMIB=d*=d{?#=km^)*ik*KJs;896)&rwW7TUL0Mws67ycK{a& zdvJ$A`%?GmGaN-QsXiRB3n>9fe_nqGt{%{)amMuh06k_s{+fBFPC8vAcA z1N^{KFx6O|A)JoD4}`=T!(b_fwF~Cp2uTdnXD&Y7)osc&?&`nKeiv>V%LRVl?mF8| zz-`z$^ZRyt7uU)5>^A0q>`37;|6^|n=Ka5#$qqA|CQf9JVGjK7o-@O3%A_gNnRA$X zXU}1yWxof;-M{)CW;es4{@why8_4d*u&hDCrSQN1IRAg&_vhz7PvFlJ`11t*Jb^z? z;Q#a!U}qnEt~N^8+;GxAuhRI%7Pi~Xp5pZ@0mE`63r<~~jWN?-_$gl~+^*{_TlS={=+JN`I#-ag?{q?kMY?QP-t75{KP+!uUbJ-2_tX5sOehwy&j`~LBG zUv7VYQ||t_IN*BYUmZ_+`Lxy6)mL~Okm+tO_Y2~=uKidhSsBCba7$C}IQJvM{jfdj z-#nju?)zUA2*2OdZ;F=*^L$yJ#&VE$#U+E->(`upE5qRv5u#+_=5d#e!v{z{rhvvuJF3kZ2sW5zUy-PLvqi;qY{3>Km7Oioot=d2CaQE z<#^qHY@IwGws@$*kEeg?C>~|Nl03#@3Zvyf3_M zYvObu>O=l>+rY{l{Lc&D+RBgH-bfX8*q%RMg~kv3W()J>KWXm3>|yJ~_f3t?^X|d_ zv2}7JCOVo%hIW7ITN{zaXznvBI1cJ2%j_fRl4SNe~gJKx9oT^t^e z{pCLvPd?W^Ssi#@^iQ4qi#lQb9l(>pXx+X$YVJ& zD}o7s0Z2snYe$$Scl^IwiZO3A*;D_YzsIaG6<%6fF6}weafu4KJE_oF7|F12J7><6Foc~`u4G# z*mZWFlc$5=2(AtLeveJC@qh52|8wNU+$-uB;T&%m1}iKlKSL_ zF=TG9!$fkHd#Q?X%S@#9;8NhJ{MqCZZKE!4m9@xg+(N(0dQPNEtoOn9%JHaMZSG*> z76T;L+p;2lyf%3?;^`sX&1$IYhtqWv9b43^d}n4|IDrfcXGedZY>r+yJl8*8XN(}u zvGtkK5nmtJ`tYsyS$w}@>wfCX$iewnZT)6OYfbe#LVCzn;l^sKQOK6iGIfb`(pB-xw4pN;*etsxg z6fU(Mc@JMXeN)mDa@!)yTYH8lp|cg9-+CvEMyswocIcn0OD=V7kC2kqMrL)DFXXRH zKsP7l+Ss19K{tZmWbE&6g_=YPj#Fah2=WPWrVYEFxyy*M)rsQy#Wqv6D(6#UOFr!+ zRZESYE1nNR{cgRIZ`dD4DxcTHYtu`S_|8SI66S@Fjy}@;jGFhNn~Az&Bd(nyi{&g$ zzNu#+6X`+E=Ej~PTVG0LB_A>*C-0R1FhtG(y{}zGO?R7y)GD276y9o)iwh^A`&H*$$hiD3i>y6kP_u<9VL6Z_AEq^Hqpk=v$F=bIQ;T89d-cuF z%d-ZN&!(<_d9pwWskSK2;~ld^rtg$omrD&6^CsydkxTc2gCFQ3s9VS<#Hrr> zc=o4*w5@vH7;??kU1TF)YG?blVDxlw$vTCEHKf@6gkNgIPNRy%HE|6Nq2&DIvpdcO z=c5Nl7F2KaEG2tV^A_FTo`uW@UDu85S4w)eNP7oIj3QIstk61n%K&M(Y>=q5n2xfI zs*zEMHaWR-*Y0-_He^j;+D^lS$!JmQ?%J#^(@3?;!RgR9GvCJ9 zyjZS>pg*B*A)gSZ+-%$Aog)&7T}NuHa^Jes*S8M!*{Zah_&Go%M#m(VK3eJVxaP7S zap?KQ_m5|$(hvKMIA<%dgZScPR-XAOjK1Jglo=4Wo!GPABXYpB{zUGJxDx9Fa&+Lz zQuk2Ij4s*ve!K2@QR4cPJ-g?8)F$xYBk4AmM$ujwlZ)#Hn-P;6PA_rJnopk^!E?;r zH;lm7=1p3%&XZ19wnfBU5u&b2D$$Y;dWKbYzQNy$_Rp($#>cCpiz^lm>Q8^KdiJ~kS0SuVjm)fAVMiNu^R7>G z?@zerm)$-)-+>Mpwp7l2c_W@QGb!M-`a}F>PqJrO(KRaI>Fp7>l`;B-=A2vOc6L!q zrPr9ZXur#r|N_&OHTDKA>tH`?$!;Cqe})~8M0!- zK0>Wo|3Jo_5<2?wfrLAL>xt6xQ;M~Fi|HoYsJY`hhSLYN&K2MydW3hs!=}2oCK0C9 z8%Q;KHQM`Zzgce!$I=#NQtmUt9f<15_II|6Os2_fi9GsrBym>CzmwmF)5~tx6g5s+ zK`6cHcxiQY5TR_4cU4V7iFP*bp4Cps63fDL_Fix{BRm3z&x#c@A_kZ4jqyRcMCO98 zB_mg85->kut^nQw4ncoH-9kPgPIHSlS1x{EMwlb(8|MZm(lL1_rayLHN4O}P?M^cs zN1(48K410Z5f09N%_7troOD{Mlr*oF@;K#nn%1akTsXFaxzu_#FFV z8?sJ`(6-w)zl{7OOVm6t^53!FoYp>*a4fT0l2~H##X;%CI668~eYTXud)(uMc{T51 z1%B=HtH8R-WFYL;rje5*3zcN=$Bb)6#h{hMv`Q%Uy2W zLSkfq*Yru{hIBuZvWZ{(7ZUaQC+B@lJ%*>9T+w}gSvOVwMf>>DHJ|a<@zWQX=4cV2 zN}D7cU#Jpe>hJD#S*}Ppt%z$-A1h7(9|E2L^AqL@;4R<~^e5CUN8>UMrRRzggU+JVCP1Za@00n|;Bxdzubydp~`Azay@M%DX(- z3~xpHev)Ks#hA&&fbXskr%wKbcUC%=@89`>x;%11&)J4|__w*IpDlBfAtFMi%oV^}z#-^Qs9VS<#F^xsXmH-An9zt_ zf8@zqJ>u4s8gPU-c(in=!dgn||~> z=W=mkizyv8=w+eDB}3Y_Yl(NqX&u@|PV`o^p#}{+zK`E>ybt&g@C2BjFjoL?0f(SJ zp>83c5a)s>x#-x$-MHU9s{xK_J1JYktQJ4x3QANr+C8H%8*ec(!>uP2<2|*ZmY1fS zr_2{ELwnwp<8B$d!+b>BsEMm%2G2Tt5|6?T?>Xz+Ox2yyQF0f{q2eWnZQEI}9=9=e zmuRzDOPR;mXszu!MD+~5H7x?|r&PN-83c5a)Z3DElM)9k}E6^^?oJFXD&7)f_Tov#5{b_kX{1`~+2axB2qq z9TdK2t%oV^}z#-^Qs9VS<#Myq}&0Le~4S45+e$~PAOR2N%3qDmugD8{h4I|}7k{3^L4SfS1HA$~9{4TrKHx*Z z6JUPATmifV9D@FYx`li~oQJfRht%q%;Ga)6yt%pR06w`sc5_VBNvd2zanX3yQv6WI zxZG8j>Zt+0Hi-Ft+K-zzhbTV3`iyeBaMxkm_7v**Q(AMy^f>(XVL5l6Y!o#jzGLCH zH9IN4GB5WhLEET){t6lkWwNNScgxr4yiB7&XM_F(T?Tpucs%f1;C;Y{fG5EGgt-EE z3pfP*33UtkggCo`4j$_rQiWsNR-HGLy-g`i-gn+5?jEjMy?JA3XD{XJD!YAuX9cb% zxAME@m@aC=oQ;t$b{(XuR-RoQ7mwsb3%WnJqwa1>2B9u&V-lY5$SfBR;l zS7%?bY&7a=uKN zzFf!~(t;@e^opSda_1=Uhrl-hKLK<$=ugmPpjUv$1HT2{2Yd*40?bdCD}c9vL(rd4 zw~$YWvq-ytc>B(A#J%$4V?yrzqU<%?BMWuL5U0kkp(K(U@QU(t;wfp5DJ*Q5%mu&u z_*c(^bLU<8iXW_^zR6$hz@?+j9$Ut=;DyiTcJ4dago6(T{t);k;3t622K@=T4D<@{ zc;L6d`+yGtPk{Lea|Q4ga0vPn>K5_|aR#Y9vG8!J!s|X;1g2VbQ{TUoDXX~braa7= zZSTA0;=4*^er`3Z9c@D^|g`V;CF@(FQD4>Vr?Dbf!_k}13m;i0p=&n6~J4-A?Q!2TgWHGxz72G z+>n)<@vu?VuS;g}sIp1Z9uFBChnvf!_k}13m;i0p=&n6~J4-A?Q!2TgWHG z>3#9-{HF^d@LHMm^L96fQURL7qvLIJsGz~pE}pF$D3^6s(>(U3P`9er?YR9pkpiC@ z{9Euf!S4ef4E!PRO~6k8oelaEbQ$Os;PJq3f%gF)0-gZ#6XpuwE#MIJC)6$E6XHyX zElB>jJP;o-@Lf)7&IbH(g{lADX{mVO`_eIzM-y@H6}P(S%WH7(hqXeI| zbjibqR>$$4EvY@z?iS#)iqG6g-I9;Pdk662!KViQ7JN0v z26_c}Jn&oKeZYr+C&2uKxdM0#I0XF(bqo1~I3LMkb!K-DK5_|aV98WGv4^;;u~A;KPrE+8He{s@O}l}JAfY#J~jBa;A?{42R<11L*Sc$ zp8z@=^e5;t&?~^>f!_k}13m;i0p=&n6~J4-A?Q!2TgWHGiQ4N7jjm?l!ncb>q;Q$f zEep717U`JbnV~0>f;LsiM9d^tklt>(fmeffA}g`SP7e;|lP8w%Tv4x>hjN#_{JQki z2~ss_1wU{~3F^s~Zd#v`h=!$Y4b(6_gjD-C^nd-cv#eN?$|n!ElxaWMB7g4w7i-h> zp(X29zbo@SN|b5quK;Jc{NRf`)PF|^fqK8~xxg9ibvm)(Y#;m~>8Kaz%BXz^| z7Lc^$qvESgy2y0R1k&-s8|&3`&Xu%jc9gZ5wNANOszB~~y;*^nFG^M%o;h&q>&MpO ziKmWe+Df3m$0=OHuv{))40Ah6w}twpp#g=rx)X0klJAb$sJCV0qyF=!Ui>tufP764 z9r-4FFPb9NdVg>7DbjkMx{~Yj)2Jk8;D^V$DQJXiUaQ8Hqp1C!Yj~JjcbQ`Nuf(t~ zAIt1gRy&_+{cf$=l7#I`{ZNMWt5r13>b0&Z?9~{qDo4t_dG1>^+yI4n86T4=v?lq| zcH^DTn<3p-Cj;-8_>mf0#H!*jeH0Mh$S1_Pi;FjtoE|awXYHq0bh&2f=4-E)kP8Z@q(2#x zgH*n3-qNYIjg(%v+Rk!%HZpB|vB!B~0r}AUa)NQ^AvAPGyA9tV3Z-5S$}(NG8`UrL zIb-wkeVM9ue5#UkLs>;0kv7Y%)mraE!;~Pq`ZDZc)4Pa!?bcbER>x+%@3np>l8`yz zxH>Y`;O+VpYC>uxjJdZfNf!-#z0=~U=q&Q-b>r3 z`J0ci@DnGm{o2;C*ssf)cR*Ho)S^4q_}9&<=2kz;gc;51%cpQXvv0la9&`6s<4{Cn zS7>?8Qu5%G4U3*v=Acw32hsPJw~>#H+f*DLWTOKYzL@>`RX}c9^=!z|g2Sk-D|S=E zwcWMnjozL$>r;jrZ2O%!WPjy-;5!y+|_al3Rzh zVs6)InOeSez>)%`mx&t4cg0rOZ*xbJUG2BD%f>Lzqt>GL zK-mlHfV%9P8G&!h3aYkWZtE2%^Os1@em%6?+E+o-^RCNX>&Y_T+SL31Due!nx`li~ zoaK<_A9a(Vyoexa{PHmk(C>1$WhtfG(XC}CU7wa_(D?BBdsl+KP=_uIxv*OD9WEknEON9-iTH5Ld7;X% zw^Y_CvGR)PzbMm~iQ4X8`V*;<3b#IOQ>CxjmKZ;NVn--EyLK_aZy?=2e1+9iwMoQd zqv@Jb+d8THuh(xtTWToZcVFhc7rTHPCT2X>d?Z3-y8F)U$?m~zW^6lg-R>ifpJ-_E zUU35l9D@FYx`li~ock*8lxUfcqLtHkrql$w5VGOAzZNPjqr-h_0~GWp6ZWQGEDjYe zqV4u5c{wi+CBBWBJTT?BDZS%!@a+e-fkc+Nj@@OK=XjO{)-OH$F(s#K*ve>ZOzJ|3JrRqKY90qsy|<=imn3w}-Qu6`tLr^Lw>LpHQ1_ zT;7|CK4&bd(%c7s`)^`ZlE>0iu2riD_AW96p{d~&)F(ZiOauYNy z_jghEy0(;^_&SKbDouK)S?CafYV$&76po-zjsCvnu#Y>D*DGUopr0zOn4}zZbe$`q zq!KpYK=m`e_iMXW`0`IwTh;XqEpOi8)AS5(;O>gViJ@YK$zC!glmZcN!77ZWi4*zK}K)FE}uxM}`Or zkPQ>L@*Y<{iCr+LeopQ7I=JPot~xz*Oi4|NuQFZ!X5xXZNQ$o6VdJ{!Z7T)y6Xpuw zE#MIJC)6$E6XGoU)cS7E`Pp>xwdYs1TdyJd-~Sm-#&4u8?_8Yoi(E`dNA{C#ypl;j z-;U<@%oU@Z%We$|x+FrV5o>iN6owOe_FAL0^}kblI$q1w@|Ed%BjZL9#={6Pt+I!8 zLx$5)V}G80=j=voF))}YzHbnHWrF+;MZ@XD%j?0~m9d?;Xtzo3rRg6jnSOfjXDoP! z=N+zWxZtlq9C{_WW#}&ukWKrsB`$(_@9}WY^{@hBQ0Zr*rrm>yorl-tw=7ep7q-ss z-v0}y-Gj~zn@!3w?~?}n)V0cj+{Ee&?0^u;d)kDIlXr=9lGg3;9WHn zV*Hjb<@UP%v|aK?$E72`Q|%GE=h*+kh`IX%O!o1+sr91|w0NlN(gt@HMjubmr2Fmb z!t}2x(`HY)brxThqk#_rPk{Lea|Q4ga0vPn>K5_|aq4Pb@e6oVLSt7aF1M6kMhsn; z)U&X+h#r`+^~xtv4LW^X!`08)D#VmE{Q|$NCJAG?yOPUkMLKCm)P7~=v!r|8eQPa3frNZ-$C$9ncIw*NNoN&`L}>Hu z=-FvSU3i|-#uM+hjwGDLyrYbk=@2vCg$>wxV=#fOb((RjScU-J2Yd*40?bdCD}c9v zL(rd4w~$YW(?oG{>RS;XqTY1LwBhT=6W%L^EXovlL&dnnMn`nC;$y!##iwY=65l(l zR=%84OCcZacprN{^&z6*q^_$t;VU6FtTIrPc3t`L!u0232)l|2hC?P5Q>L4eBCIk7 z6TX97m4h0(@sjMv-$k-&sRyTr&g5@+ikp9brqXKBinmQreUQ4CnR{CeJzfuK#^X%) z*NMfp;lOW!_W>UQo&fU`<_h2~;1KjD)Gg!_;@ogG#=v~tA=*{leWJnJ0rUyd+HkCs zEKwj`@KHL!oY11j#k|arq@Ur|Z!-e4=^IaJ|ApJmOL(wP%}F?%lmD_`AxMemB=>6ZMtLWy9@; z5d8zHup*iML{&^+d}3t}4m=+CZ6ELB_z>^}n4d6L0B-?@pg*B*A)gRu+pV1pDu+-t zpFfRSZtjTh`c>m-wLTelwR`C)Gt!UZ$-G@|JIIIfHZ!n(IBp$2vEK!W(W%?1htrSl zn8QDdcbAeKO&fMlMR!Bu2j07h@7TQ2X;DEsRp0-W<(X%raB14J_}#T>lw4$6?R>LD zyv_WCyqHN8-hQ!g=w1^)JURIK#Wh8XD9|gw%oV^}z#-^Qs9VS< z#F_8aq`mIoLcD%N_ek**%W+;>&V_4BtZ>Is;_7>~BPi^oW$m22k$C<}OAW(KNw}S7 zeS3Fl82*ZPYKrv5Y+SPYUcCF*N~)yg%&obvGjY?AVK$#KJ*WWj0~r7Ed>mU{zro@7 za;o^#BU^cT9;HancIkN2?H8#Yj)N`(y#hQQ_$}~0;6uO@V1B|}0lWnqg8qcM zg?vJs6$|W|27K5=rM?JLd@LW0W81fVX)TSWTs2hHb`d)$p6y(JtqZ4c{Xx<;hrF&+ z&i#_eeS0X}ttUM`V_ypum6UEbGx8+v+Vy!zs9rGD^i|`zkx>jTz1~SAig~|WF|E3L zrAjtc^RBKk`(P;Lc;)&Ylax(3=ugmPpjUv$1HT2{2Yd*40?bdCD}c9vL(rdnb<5=w z;;cVGrpJWOrhJc?-4EP2lZxzEV;O3?8oySj+cUm3gOa|6Ic`%vhL4VMe>^#ABb5?5 zH$P`n1-`SXew9R50#*O?e$adi9lY2|`O*{J36$p==6A6cN8%bkwG3~BFUNyis=Y7G zo{ejyr)h}3okM}n2K@=T4D<@{c;L6d`+yGtPk{Lea|Q4ga0vRduWq?~LY(?v6eh3D zPR8wCJxP7v=!UyC%)Ytj`F0AMvDRhOyimNX{8@|J@`Kc~v}5N#@*m>66H5-~Hs@2~ z3wc*%M=rxt$JPvY?FyqVuYDG!eIXHdRnjmUuN01Bc^7WnTQZ%xMeaB*{=9uBjW;w?9wPg%7VRp;iyxkIHXJ*jiocZOV@ZeMzE?Ia+HoY0 zivP58`GLjR6n^}n4d6L z0B-?@pg*B*A)gSZrC71LS6BsAkUIAL5UECd;|7`c!B*weIwQSv#?1Q?;)7Vs)5xQg zo!k|T(W4en+Kp|`qsMtsyGAA0#kC*Cc}-?-AGPG;RF&MX#F1HeaXqfpv2P^>{t);k z;3t622K@=T4D<@{c;L6d`+yGtPk{Lea|Q4ga0vPn>K5_|adsX2;%(BxrxtwrQHvdI z#*fs!ADXJAO83%@5B29f!+E=Tu_KDJsN4{RmA5DD$KU05q=nVrq^L=8E!9J+sOa0- zo=(3g9i^5cDV1E#wp8^o$#P-8NO5CPH+cbuPV)$H%QR|9tf@{?wy%j{oy5 zl(`3He{p>+Rp(#Saz^3-6}Rs7(A;jD_?83VcoQ`@jbSe+YaN@Do61gZ>0v z26_c}Jn&oKeZYr+C&2uKxdM0#I0XF(bqo1~I7du5I#%^o4sO+GI6Gn3YHIIVTN=4V z;kOLscAx#4gRk#5RfX@I#c1?T^G-iY!_6};+gv%3j)Q*-z9#s6;Ddob1ilIQ381q< ze}XOpy#hQQ_$}~0;6uO@V1B|}0lWnqg8qcMg?vJslX=>*56Y+D8YXkxrE8{BHBAqj z%@$0;vE81b;p2udzpu0+zSn9ZWx#u?>&Ek=z^4ZP7JN0v z26_c}Jn&oKeZYr+C&2uKxdM0#I0XF(bqo1~IA8Bml#Jc(imOWdR-CYzfTvDAw0p?6 zsrb>28cXN)pM`g8cH8&tUW9`m4?Z>cx8Q4n-v>Sz_(R~EfS&+58}ujWGSDl)%oV^}z#-^Qs9VS<#OcWIRlgLRO^vA1{Bh@4Dpj!1&0z)=MY%fmj=8vJ zJ`V34z>f!?8vI-EHNo!#9}N5<@J+x^0G$o`6LcBq72xr}Z-Ms#9|E4xH$S<#0(c8J z1pNth3;BdNpK2zWHp(PY*BrdhR^1Awezu$bx)-_#hxaS+-U0l0@TtMS1z!{VKJdZ7 z9|GS5`~=Y1pg%#EfnEU~5BwH*AMhdI2{1olt^nQw4ncoH-9kPg&U$xk!>;7%)Rqoj z#9(|G4)2lR{R+Hy06)IZr{?@y@HN5j10M|hA@EJWPXL__`V({+=oR4cz;A)~0UrXM z0P_>(3g9i^5cDV1E#wp8+eb~%wEH6$FRy8;rl9H^?JejmVwC#GqqE+JK#iOKWzDp9}*Gs z?;`!!erpcGx@^1n)CA^yMXa@LE2+(#?>9Z0Wd6`P7AC$3VPP1i-ERzu{p9nrGO`iY z%je%)luFw5@Sk*Ntwq=`K0j*bY6Nj^-8k|_|JBdSb1F~i%-wUpJVhaN-3-wuf_Qln zIfDDarY14p$9yJaG0O%+%sB*M$o2=Hxi4m`n6~6rc3H8(dNsRzH*oTPl3AK8zzW!P zj5m+@Ugo3yHB7LSzPC!S#9~&maq&Mn`;yG*rd2tD{gPYMy-6&Ze|Li;6BmYk&S-W- z>>to|x{-h+Fe%=**kqE&1lV83o@D<{zC%kS`H}yW&(8})ru?_R5<+yD^EzKOfAdDl zys;RW8bCrmAxqqzqMj-mc z2D;UP>|z$NX9Ah)VyonytYVMr=%|Te){AXteGF!|=U5zK>V;>VUy`&Ig<~m*6U0i;#Wx{n2ZascEb3Nw6i$)*W`yaMi@VqOmBgh(d{U&$*vt`2L z!qy0u_2*)R*U=U}$BISqNbvuMetwd0dm@ux=7ThOh$&M(KXj1bJl@JFf@MuQcU=Vw z;qhWjA26T%!6Cx+cY^&D1&$GdIc4C__Zg;M(UE|Qi zlI<%*Me2py3l<2kZ?hOJ6>*7mwz(?YKAd|Fvk2k$h;en|zglp75s@rdRt$_0?3XRc z5gsQkEm-o7&k`)%mdqpB+m!a^vFmp6=9z+Z#r|G`rCLd%VCnnKmferp-L@92Kiife zSXYnp7pzwpI|$YpOcAX2^(WLVZ*gbE3D46WM*b~sY^?A)ivyAWZ*f;l4Hj&# z|F}-Dx0!eO=7lNifW>9WIpdb)>OvenVojUuEZ7S7W1{+CFdba=ER=Dl_dLj z&&iHusDasjm+8lf?v+QA_C=FCB@DY3uYwp~u2NB6_vrN%T;0ms3AQ(> z&qJLFxA`*?*OLP|(P*kA^E?7SR}6E?Ww!JA>nC_4 z-j9`rQ%u81_OE5!w_8HiGr$+^HVg5X_ApdiNnU1-Gv4Tr{^ALkaDH-gg*i=tw}K^u zLxLsKpM7=9<&*tq(%3lr@?C+6*)3u4m4`{!uUm}zLEP*GKC}5^=I^XXl3DN??Y9co zN2dzb)yMiXbL1q(yJ?DWOb+8Yu4T4I+Ks#ufEe9}UH99-9B=CTd?>)@=Vt}HqrOsWrQp1*c|4LmU3(G}7lS+R z<|Uz2b}+NQkHmbM7pAfMi+6Mg@y2E1ToR)&&!a0?oOSg!T(ARS8d%WC^mJ0x74y|P z7)|;z4_x`&9Q2LH`I zp+6H)dx9jk`OQM+yc$yLIExcM6DB>G%f#Qx|L)JuF*U_U<)NsPkMSNmhcN4X{8qsG zfDiqRCvfwVohyBK3pm8}=Wlfj`4q%C`?q|Xj`S7qiFU;}Hg4Y0LkR*NX_1*mGG%3# zPBDGJd~ypWuuC}}Q~%mk{7pOFW+7(xuVYsjyw=9h$SQv%jkWU6{+x>>>lq#@y^c9w zj+YRzh&k_JN{~ke!>?<44_BHp=S@7mKs1=C17&QDhYPdLd^jG@^4q`hKHx(fPk{Le za|Q4ga0vPn>XywXdwDj_l^^Qx*)N)fJfz7~u-&|Ph2Z<`ItBIXd;I=9^2biGkq%bE ze#jjZ${uHjt}GQCAKtK%UA`M9GLv2A_lr&uY!^S^%PzyzB-rP|G|H|a?9#46T!54L zEidia{k&T}LfphSy#hQQWB4t59>(!LjN?NbPrzV)a&ran7H~+=pG^LsZkd0>A&&h% z3}fPq{4MU1a}4igKXzBF*+tfVT(ExYL>MWy>#w-44HZ70_?67xcVUjJ_$n&6KgDuO zc4@c$LOOe1eFL>yust>-j9tgDFB1jZLnQ=roA*&EMX(=q8LL--$Fqk6zvXyeA0Og) z0?bdCD}c8G9AfTE(4WjwP`B*$AfIfUtAC4Id~h^-Uln&Y3UC^WnKPeV=ef%L^d`Iis&igsjIb_7PZq?5ow5?*Id7e-;QZ1zLVkJX z)Ef4C>oxM$2(~-k5%dGb>TLGDSpE5%F2h*8!hS!;8ZhpdC5#sIdIK=iRdwH&I`|`=gsrbxOw`$lk2G@T4XsTR*n8Ri~o8ykK z3V!dJ31LjXX{Q=^N0SvDz2!DL8J(nu>Hlch%J?E8rV)$7NnRJfyyR{&iPiB(kC%00 z&MO}$TIquF`TWzb>+=!#Cd_q(enOwlX0~wp6LcA;SA;yCxwx77cv@}m!9E|k6G`r*6mywy9;0J@`L;4UnPm`W z>X)(sF?4JMrq9gnpM0-zQECz!D71eqs_01&IqFk@?1o|{y)zj-?aB*S zX3Y3bkFd;mtEk_6FwP(1e3PGSLvwxtr?W9me`2gI>(eV7kN=C`a=ee}X8|7qp1=ge z%}SE4y5;gIh|_|Ln|b_Q zpRxscy}7({CCTVMAMxdGj87zd@6hMR_xaS!4GR5R417&j&hKM=Fz|=!nG3VN3HS-1 zvq69UrOW#C3h;Q~w;0F!gnS5i0yjVV<_h2~heOQQ3i^|Mj>5Xd1o?zG&A7PnUVcLT zOc7FflFzKbm0M8X`xWlJ15=fpACL9<)ZpK8zNWzM10RgXz&PsKF4U9FXyQAd`_k8$bike*49 z(uw2S(3MrvW*Suyq+j{1$n4E&Bw;?k>-KU-^5=3_-^!d|F^eDr}h$ z(s9U=EbD4XQJFab{Ss3Nj+!q;nq2x|Ib2bV9P{#Rc3|UMYpk{@>#Bzex}_t!A*XFJ zGWeQM+FsaH<{GikW`58Ra!uW#Xq7EuNOt0OllMCZqFD<5+pnhfLmp_-AgxDtt&y~* z%i!!UWe}%fVzH|;KN}tD@jljdBNd&TIof)KMLIhBLC@d)+!FG1kaL35+ypXW&g$=(ZNx_MQQVbj_uS&q_KuMJn7!F#o9OeTX&&pzBH56EcVw+d zS-bV)5AM=Hvk&gQllj)1>}pY#urSagBbFTe{3Ak})Jn_E>>_Q@u!5U|%r6ck?`L^y zd=9|K4Y?ADT@MGMi`56*aT1 z^#fHmdrVM4JHKr<*g8-OohvmEA1v|MdU0-1o_$GE8RQe<9Io1SyHPQP`TLxAgY{Zg zBd;q5mdekZLv{xi99iifM)p2RIj#7@9@+T(JTQMjEE&A;Se18MBI$d6@MT%+Ftp06 z4Lcf|MP7G4B0tKLN8VOw53U#!NG`ixzx~Mhe(3B2v%uFwbjcIWeiffQmB|(StdzQ+ zGUObk>Qz&=m?0Venxbh6vgC-bQI$LH)>>EK;%`+x4M1~VUiNTarijL#8nS1>5l5sI zc*!Bx@vF7>Rr`q_KPr=ldn1BgAF8!})0K9jI7J>ke44%fy*|H8d~eR%RmFF$Cu%O` zUypxO26YShggBKumrNhAe=kzkG7^g_UrkOe*|&4QQ5yMTjg6AtAs%^rp%UHpFqph5 zw?!1wPbQt;>db0w^hDWPc>+{dVmP4I?Ly?A>(Vd=66FzF?1Todt@Fk=!L> zXGe}2F1l2_ZZuir>8(0xqytGQbj)g|HBe(jhVvUmSv1M=AKb{prf zBkvSmo;mBFDhk@G`S`TAA2Ld-+9KcRh8$OR&5j)wLbf`%&b{gxM$U^^JyH_?Sf*_9 zG_qysL}WkPWAyh_AGGb9k>2WbH&Qj-}X?89BG(W={hB(-TMCVlHHmU zd##81?`<}XG$k+ZZ&q#mphr%RDf2X$HUL4QKsLOvnRgQszo=koce_`FWcsgw3( zIv3}N7hTUZ9XF#>{dj}S_gRrIxj2PMg_4cB^B-+c zaYG+%T=w@zvFIKbzgp*-dHU7sQBkXPoQAPGX)`o%bJ98=G$KCP%zND;l*GlqvN0t7 z)BP}X_M3;w$qhqMgiXm>hbvsO|fv?lM0vt}gq$M$93MtT5KC%Fgpc zeqpBD^<3S^ho8$AzAD&Uc2P0to5%^Ke&1O6d<@h?i;dhg(|XLw=MrW_ui*eP=GZ!& zo8{)DOwn=62~fJ4xqP`8jzh*Q!*zk+vo2TB{(?moDxr)*;8 zp@45T&&tZ(RmisE8&Hjm=7^Q?qU8JLQK!_Hx^A=#it^r@K|Vi@C#$S|U#7fMas1Bu zMQD_4jJ{zw4;8%ie6-+57`b3v`~2nh>q#la+C6$`5cz5DG5n=v1X|^5WOD3Tnrywk8_9N9hi1ZMX0 zn)UVJ#Iy2P7Xx`zfIVPH9St4HM?UrE;qtMuZ z^REVF+$xLa;$JXz_UG!-u_#`B$uaX+(g=70%ukprfVY4{(4SDZkWYwHdA!G&(2Kd~ zIhW6=T%4M{8DrJ54OgIkxMN1t+S}VXf46T zm0C<{caL39?zUcb?4wo!vToS&qal<>4#)g{1Qgx1UR}E_?8-nB)Kz?K(wS02a?{CU zE&B{i$?ow*(wDPk{Lea|Q4ga0vPn z>K5_|akkPI+|8Kxmd1yombU0flOLyi9PTni8fBUc5_f(OL+&26qjDe)McJKNK zzg1d`Nbx0;%v+sATWd z`5Q%6p*Sx7mir6$gek8@PElq1_{olFE#GI^@v4#NsA_Dc_NP&(dT_tqu4WNZlZ!vY zBSP2js4glkJ*@a}j0^&P3%n2b5by+;pD45^_*Lo(41F0PAt z&9w_FVo06CnkR;sRH%`?)ii>=eSxL!C74V+4>B^z||CFGUd5pUkv zw~jy4$)e1l>8E$sT08JHzqVFsp?k%asa|_Vkh+qQ87|I)Nt?0HX5Ba;jq(&u8iiI! zpwH44v6+&J*0RP_*J6!>z`+&cji&>1ey0Wax!B@3AQyLs3&W3&d@ zB%@??XR0(Q@bQR6iOIeFtS|lD<@p#Dm=Tx6- zqN-?cy_Ea-AIZp@zgj;83c5NBel z^8EJiyU?zom&8q{k>qrRrYGTx?Z`|npPz3Ca2Ky zlPcQQN?{S2WZA)o-Reh%B6U%PM+-aGkqtLfpQ!XCqj@uzxl^J+q@ny+xz=Idt-Xt! zG+bYZ_32O0WuRAp#{<6w-UoaLcmm8%m@9y{fJ4xqP`8jzh%+`kHff;zZnP?6--L}G zmgFF=ZeMZv{LIC9&Ai|2YvVJ}nL9pR9jB$pUJ(Q3aHH?mvv;O1eu1ZudR#t_ea?Bg z+j9}>2y99qr8mtJ?CS8@UdQ>&IbJnx(xIR@Oa?2!25s?0Z)MW33CPT z7H|mq6Y3W732|PN@Z{g!v>SzS{VB=S?YpJId>-NAv?tr9&o;_HUI8=qrUQo&fU`<_h2~;1KjD)Gg!_;%t>j%&$6{jXEa#Ucx@;qV$cI4$)_OtgrRE zlYklNpk)Vx7Djlywx0ECEG7Rqi7axtHRfAO3_2dtKHkB05jvjNa#Q??AxhmV=MZpp z89K0P$4$z9 zZXur#r^p%U<3la7QP%OqyJ?Z~mgpxdTqe{)lVI&U)w0Ydy)}mFt%u#y$%9@2z(Rp6F_H!{sdhH zdIfkq@LS-0z=wb*!2E={0(c8J1pNth3;BdNJ#Whozj`$r9hQz#)06sYefPk8gUH7d z$=$Ckl->s1E*tUA`2M${!_YJ>CB^g;>&TUEvm#7_64AWW=3TCgzhW@R$g^m zv$V+kuYEok_(R~EfS&+58}ujWGSDl)%oV^}z#-^Qs9VS<#5wyx zq~bU-2L;c4n75`^5iL9E@GMwgm3(z4@bNCm6cX~ey!=_D$hauRPnh#`&IlfQLC??4 z?pZ?`f1HuD&|?S*ejoT?;17Xs0)7JMY|x*e%RsLHj|YAWybt&g@C2BjFjoL?0f(SJ zp>83c5T_Kq>+nHp=(2ymxSP8fnAzr_oE}eS_@+$+2gvhxgulYaQQckTtEr4=r(( z9W(AjG+J@na4Y^ikpy28{66r(z#jtN1pEZh*`Pl`mw{dZ9uNE$cpvZ~;0Z84VXgq) z0uDicLft|>Ax_PF@%MA=w;jGxF5B2g@t9B*^SH z-}&}CRLF}tug=;<*II*r3%(}!ec*$EKLoxB_z9r1L4SfS1HA$~9{4TrKHx*Z6JUPA zTmifV9D@FYx`li~oM$(rmxkiok>19StA-EIMB!sMALOAit_AueLe)LbGR;u@g;I@IkF@*z zc<`ygzXe|t{66r(z#jtN1pEZh*`Pl`mw{dZ9uNE$cpvZ~;0Z84VXgq)0uDicLft|> zA^}$S2Gdz+1o}=ufCy$S1@Z=l8Y^3)zm87jHbH z_GuvFo70l}dM1$Yeg)n;fFBP&HTbvSYl7bgJ{b5z;G2M-06H7=C+ITJE5PG{-vaLg zJ_I}g<|oV*z+1o}=ufCy$S1@(HN7x_c*?v7yWd)~=F$iR?~&mB3cPm!KOTH)@NdD_ z1iue_Fz|=KHvvBZbT;Tu&}E=kfX4&B1>OgI2zUa_Pnau!w}3;?pHR1uPlyxK=sd0V QdK>yU`J=q}(6;jb1v_$~ZU6uP literal 0 HcmV?d00001 diff --git a/SkalaXC/tests/ref_data/skala_he_def2qzvp_pbe_uks.hdf5 b/SkalaXC/tests/ref_data/skala_he_def2qzvp_pbe_uks.hdf5 new file mode 100644 index 0000000000000000000000000000000000000000..9f9bac02a292f567b06d91859d2aac7824a1025a GIT binary patch literal 41304 zcmeIb30O`4`aZlWLlYGtM9EZ18VqacLz_fMQijYaLxz-!GG&*dWT=pop$M6UFKg*T zgL%%BnUJAOWe(ZzT6^!iuXBFq{Qm#<{ax?%f3Nr0=Q=*Ewbx#IJ?nX%`?>FX(Kp_$ zPv3gF&2$;*rLE1>Vhoi(;tz%T<&&w}gKfO;tNuYly~e56Y)#b<8jSQmhA~m^H&UPf zpN|{rff%V;&nLDeGkujb1n9d3< zh8g)!=lI9&{;#L|SLYb@Pv<}{|JP5e_WY}J)E2Kyx<{Itn#xVcPnoM0 z^`8yYkw^#YxKvE>_88npgQ;7CBQo`;{^3KvZJ4WnF0%Y>=fC*TPQ9R-J1+b$pV z&-opH+xahkM2^hGd;j0PWa>97tpB^C7)Dw2;vonAsm}lVPyKoK&mH)42maiFKX>4N zdI!`r_TQcc{J=*!)g+#wnvUQHDq_trShbi6gUA<4@ z0>AI~9Ok9uHqxB=eSa@^Pq$vuKJow3NRf;Gmo5qO{$I^xm%*-m`%1@%2mbGVX0TWP ze*Hbf&xqG9eMX8_`W}qCfAu}$+ainlck^G?PqXAKfW;_ViVq2QuC3(H3Pq=go_CV~iQ*ih8wE zALqSO^*;6|{+s)gq5l5IS*q{1^Xos_R=mFwPm?%Eh2i8z()o*yywsA`gy!1=r8_>c zWvOyo`dNCF-BulUP0c#)3{@!K$L9k^sIGsadi@si;INcG99MH*_4_kZkKk6RzTlt! z{QXU-PVUZFe7pbN2mi5ka=+E27WIGJ`BNwVi#nO5*(=nM8TXy16|7f$nDElMUiWp+`0PsOW5)_0$ zR42aAi!AO}HTjRNlbv%TA_QtJ`%@>s0f_jcR3pFF$(td3%h=aHoc~ktq(0Md)6GY9 z{?y4omdU@VlPCYNb+XUyUaDa7;?Laq7j+_OG6_?pxzn`P@cJDcjQ(TiPDtVfzXs-A z{@}^~qE1em9|#FZ`uHDerTX}Pw`z$`G^LOJ-+zu-WT!f{x#{nh^k1K2 z2K@f^|LZ?%F#o6SM}_(k_MiJ9C0R?uaH=ZV|KGYFD8PUB_a^(edU*FAI&!?XOE33c zUJQfnQR)v4_i?FtPueAIOYgb*xG0ZMw_(lSV^i+@AN=uuuAc2;RhRw$t^EDh`|*!| z{{;6R>;H3n^UPGmkH6ul+WN2f7V$sG?w^nTxdZ>RJK&n5XJ9P#+^1t6z7sP3lCYeY|xn)8&q?3A3D&3 z$%8{1HyTbIHnw?qxQ-=x+l8e5a_LKkdLL@sv1|x!cH`u6UgL}TgfTwW+rAr1%Ezz1?poND>Q*HWiOw2Dr^(xPEd6Oi98dh{)9m2@ zqMdbD$8f_i+NPefNh6a{NBDAiyIkkUK@UY&w-t=O>)Sk|Vd(sPm&l9#7bfu*lS$lac2a0?m&iGc> zmv6A)oh`!Ue)C`O&W(@7&ChwCPD~Ej+&4TngX&y*T<^)21;qGROZM)vL$p@9|KmlY zW|BVRwRLP>Y^E2ZT5GjCcaR*=?`->}c_OvdZgg+t{DY+YQQgFt?bgICz24iV`d0My z-8sC6*C5)gz_qCUOEWSl%PnwSVh^(E>eKHY=lap33npJLJnBvsWPJ2@@|jCtIGS*s z8xnFe{)IXH7D`8WX79b@*ouysck#pY#75-az@?A&XBknGGQ&~w-JPl3E92CG&+X`` zLspaI{Vb`*$!mduH(FEFE%J#tn^zSNd%sO^Zl2bKEIhM;JX6$7uSf}`cbeoZslR9; z(Yn5>8kG(T$Lf+sFPWbEEyl}7_J=#8D@&aU)1M83zR`Cng`NF5rTZyly{i1?Ig zj|mLzKw_WIGTVR2ikiBws9oUbL6dCGQk$9P#O>3Djjuv`lA>wx>DG(fsDJs!yNPQC zk!Gg?E1EW+M^}EDrfKw=kdpfIFAPWyqg-X&eN(;_UACl><+?T|Yit+n7-7?Z_Vk<@ z9XOy1U2wkOs^b)U>S<#0qobx3{p(Bjo)4$Dq3BQ4E%J#t^@lmfq_>OWHta0wn)=dP zIKQ^V__apUxt|R*=33aM3cCu17Z;uK$#7v_Ib&z<%kZ!UgABOThYNC?w(1MhW*_nnV(f*S^w;ZJAJgQ{_usT}#5;424cxh` z=gAJj=mfU|51QC>Zch$R9*{UzIM`0!CpEJb$1YCmH+hMVuxRQU4R1q6xZvRB+-UMQ zwyS1D3(?2m*L98eow3ZkVlf_X$mN@!_q0XT&IMBO5vh_m_3 z*w|AqI&ce$6z0x({e|%_>eL+`HiJ7BGS|Snw2!dgd|OzCnLp=ueB-6Wb-{wQx#q!F zu1=iB?em&}?`H_3_pCQOo?XH}xO!pV&VmQ*lj5r37dL8f$KqU*kCxxy+YH}zJjJMz zzqq2XpI*mm_Rb_9!;yzHg?{YeYnin=agQ}z=FM^c%oopHXssP#!}UCP>1#!P9(#Oi zqcfMv&+=cK+#0RzTgaYxaAittRXIB}m+oR4>`fMU3mig! zqHd8-#5w=hjQ-#D1aVP&r$1WpVzFRRTj+6q$PBL3dsD=)hA~3DuC@0JoVJ{khdPza zdu1ZjN_*jHsJDdk7?yi|SHK7MYejMIm^tNqKvJE|n4d;Mog3d<6?}TmzSJ~G%fF{! z&qf@`pU}ua_*!`Heiqx9b2`|5dHyV!U{xhQKgipF^Ulbg?}!;R6|Vb}UnKhEy#3ev1sGhxgTouMzYy9ti=b-f3N zxNv9PdRU7~~lPF+T%=yyC+dA35hT!0&|y|C}YR zQ;ecV-Q~yZZMm^}t(GuT-~YtCJ9k;S@p>z(X7AY%y>_oiJg6Z!r>uSy_Fj)Gx?wYM z{T2to{I5m3m!GY}O?Ld~V)U@P5E0gVSl!yM+2Q*f&dN{Zv*!*!F76()gZCGvF2CgZ ziMPG=>$`L1Tb{CkPi)gl_*bNI;kFA0dGG|xPs|nIEpQ0^iMmBT5$D9jjRC_Cr*o!@ zjK=gZ+Afsd^|<2mVlsCo^H5CpDO-fEkNfuSUaz5G?Kje3LoWkv;k5m`yXQD^OE37G zyIojEC>Y^5`|u_U;pg+2;lWXMoLjkaP0#|d-Th*7IbWL`+l4_ zfh)1xKk9SbZZ>}Ztg2&EtN6T+=6k0s{J=hq^zgS!HsgYfR@LtF(1hz!a&@!&bVJT{ z)`BO^yVc^rhrkmsKQUK;x4W&Olv^z7yWcpvx>cmn1p<_ho@IE4O0 z-6EfevxR2e=)yh$oL=PguK|r?g-;i@-)%ZVLuixp`e@h(h8t3TzWhjVYtE=}Mm?v~ zpZHsDE%y%m)KDn-9$?qa$&4GBblkIQkcHrUeOV8kot|9dS7~|)V+@7s(RIr6ySQ-; zzIxsq=vK{sDj1NrCH*abs(tV8N1nW5zl=P5Z>pCr7dmrL#?5oJxy)YaJGU4z9DD6W z^W!alvf#Jiec(gj37DUlE5KXe5c(5!i+m!^=rK`N$HpJvOy@7%dHZD>?o$7v=5{wM z1p9qak++xi6>3!sSUX;`DfjsF)|V6Ax^lLP_E+l8>n(KebT(m@Wzy&4G5Uhm$T^w@waf5GT~>Zv1)8jx3uTVp2#H+qyk z{G_$u{B81>%EJ~yPkqfx5!R*xczg}NRr5aZA@BsuPs|nIEpQ0^iMmBT5$Cv4{fPNd z8(F_=T^sa?Pv@Pj6U+QM=JT4ZBfJx`lh`sFd)BG<0rvadpw1`zALAYTr_xQY@>s8g zjlttJ-|&6s&22Jt$9^`P*|F(}?+gCHUlvB*TFHE5omMI7SxecT9ldM6>A9G9nA_8A z@we^#_a>JHh0-m&$+u4nUSCS%D<;OScS&2zL$83xgWrPpfe(QvV18n*0B?aq=ugxw z@`*TK4-fCPQ?Z`yvu>$d-k1~Y_K;>S%jYNZ?|N+cdUEeRKKts6Q*P^dcGKdXZF{F3 z=R4naF1yyPoE^1sM)rm5J$$s?6W8w%rEK}v&4#C@B(v2fj@??$Si-;X`|JG8DbeiN zRd2Y*gSN5svTnX-a3&j5l^Pg>aiqbCpGR5fPv|n}74UfQTkt;cA@BsuPs|nIEpQ0^ ziMmBT5$AUE=`-(I#IhguKY4y}&Q{i~Wd7>8;rsc#+J^o;Ob)TzE4!!8Ia$Its9vGv z`+f`S@M5On{WJG?uj5x;Qr5-t_wNWTXL&4OFYnOzmg|M{?IJ5Dd|8;z`{j=IzC9y_ z*O^$~bb@XoAN*?iLW@W7JajhnCv+L~3V1yDEqEXJ5O@OSC*}(97C40dMBO5vi1XWw zZM%OpEo7OLImfK^F7rlinaA80Tw_hnu3j1R=@;+oskd&+r+l`V{_L+UyL{tUj93}= zaKkpfaQ2aT3qsS_y6u;?n}296pXhYgt6>L$@3XDerJ~fsy!XrJeeL(`TjUdQE>8|w8WVJzoqRD!Ut{6} z-a5sx&6RK3T-u7WT5+0}_?fW_%Ie?M;@&>!ZZve#0k&vE`+5u8Y~!sincbVxGm||O zaNPE4&?&Za%V4+j`|?=})7PIjy*$cJ{y1xFqp^or_$KfZptGSrq069Gz~jMh!TZ36 zz!NY(F;{@Mz#;S}>K6G#oG)g#E^p=WgdJp9f5Wn#^@X4A(J%iRe~o>pJ-F~=u(q&A zHf8O;goC_h_f~hGjo!(w8F;i#;ugI)oT2fqdH10MoU!2HBq0p0?K(4VMVYb@%wIl3{JI^g+v+s@kl)0^xg%1XQ2)+sY1n6w&Pv|n}74UfQTkt;cA@BsuPs|nI zEpQ0^iMmBT5$B9%w;hMO7P1dMI8KY}TE&0;m}}hFeIq~I{)O{(&s26;+T?2$BUbZO zoZXk@+5&&FY5N&F$zi_Svt7`9|2=&9E2G9u)3)*O`{0AYAA)ZJKLI)$`V+bgdIdZl z{1&_qd{cai&J7QQC@KKNkphv1vQPk_#b z{)8@rUIC8>zXk6D9|BLn{KQ-V-U5fvpQu~p6LBsX@La#??A2^=hqF&}hRXTeeuIje zc3Z&OmF!+;vn7qy8Z_K;!Gshx=JLl)$+eQ$fp4>X-)SeZ@NeO3!ta9*27d^?3H$`; zZ0JwuGUyfXc<@{BKJX#%1k6v&72qv!2>pq=MLrSdm=iC@-WeCl-ql??YU7I_KA>gW zh)CyTent~*cc1bVy!(=_gNAR8}mF{9E{%@cZC{!5@Ne0zUyd8~PKv z40;7T9{d)(4}1tb0rL}c1$YY_LVu!ekx#@KJ3lMt-SlZ}yN0ilZ7JfW@YWTPCHR1Qc2ZKKZ-voXFbT;%SbQ$ytcs%$mcpvx> zcmn1p<_ho@IE4O0-6EfebL8ZGcRN+)utTRzzIn6jUiSN%xbK6mX0byL{BK6G# zoVWCt2liKYu*I2q3-c8jZ08;d_E?{E7SC7k+yQ<(d}{c&@HOH0!3Tps1m6UH0(3U? zCv+L~3V1yDEqEXJ5O@OSC*}(97C40dMBO5vh;vbWX7KZgsqD(K>$mc5uV(Qa3C~yX z+yQ<(d}{c&@HOH0!3Tps1m6UH0(3U?Cv+L~3V1yDEqEXJ5O@OSC*}(97C40dMBO5v zh?7=4u(mmq$f}+$?jfo*L%n9H*F@4M!6%`OZY*7uuNyjq%pzmFT2DI@m`=ND6}#Tp zmO=JSPoGs{m_}2lKKeZ6;67p!JxejIe-8bgq+Pl+Hj1{2UpvjzZaXzGcw+GM=cn8Q zE%^+xqb%3_#+rIZuYYv1Th=0H$-Gy&zPmWvs-aa*c8>I`Y5%&UPs;w&cW<|$o{zn@ zIlSpgWRK=9Wc)kQf zpKN%#x;{5nljQFh(s1q5Vy9YB2Y0q~u1)_jPSqB}q^jd(7_TG3n;^e<+93Nps8i&k9o3<>tC$~6qBjtc(xE>{*iZ@|IwuTCaq(M)FC+gwKHuAyDxFQ=mHU#4wM z^ojoS`@V&3t!VJ*j=OcUorpqP)?>gid)oT({%Kci{fOxrt-=M2B@GBE9k8N%xs&DD zi~aPnKjkLA?PnDl+ko7ub6K;YWgQ|P-Jvje!+obZdwvy;+M=V57x_e-8`SYGCmx|q ze%^gQpPnk3vijW9$z)u1|7EwkB-6$pSFichEQM%Km?!J(kwopDJ=`>4LKeB{aB5M< zPuppW!4*9fF5xup)Qm*CIU8xogz5IkhvDZ+IVMOH3Daxwav?HEsAb-SLj*P;%#d z$MV6`no;eheE)+FA2?-Qy;!>-_eJidi4I*H{c4eO)hU&e{JuHKx9S;p@W0~3eqL?j z(Di4oDx--t`BZH$ui1WcO}zRu3ux%GZ$WvadEBx;lB-1!o7tPnFQb=*fH;r9x zB+;$MKiXGUXOUHN?ls+&wS&I-HhMm-KjUfYLSe|b%s4{ zQRU=YzopMr_p45Bx?kQjH>l1v$_s!){iT;@n~5$CzQ+O%d<=>f@-_TE|)I zsD%41Z)tGLy?sZ1Px{XG9GtT6yzCvz?t4-?X4VB3IE4O0-6EfeGqd1Ij+sLT!FXAE zY|%7#PA{Z&^#r4-Ldf{L0rf52xL$T29k*xu3$jf{qX$e6;=XioYZ$xNPFVjT@bV4k zX0cF5KAHKP+bes9kO+un^ALQeFmb4x#(>wDvUyx#I8!Qt2(&i=+k&hJnI`NC$2 z!tITgE&=Om2|I@e9*A6_$u+!uzyFpl?YQasy<2wP@{PatZB6dJ&y9pL+GI?;qXjpu z*{GR=v)c&=JAGZVW4t$)_Dk1(tB#3a7;QXb*Ah?8sB!REE0YiG=Fb&oA=BUUZwk+^ zD0}{j9n{9^0_$za?Q5ZB9Wz>&OAMKBYBE!ki)jCB^y9NXSj-jREpQ0^iMmBT5vQd$ z%kF)YDbz`w+3xC*72M#~x3=n;WeG>M7TB(Dvzv4ODsRxKuC4DwdrfSl7zhI{3RTHzPnVSmX3-)_6a2-0JLoe>E zYp%9#F0|;9QFNKnoX7mcTmjw!htQv>TjUdQ=Dsg~wdvR} zA?Dou)9aiTat7CbhLFgWLgy?gz3Z(vwD#a0oewlGnE#2@tg=l#>G6)&)oJs3@VHlO+Kz%J$0ye3wm+`3rp0b; zE^yJA&r8EJIQOimDbD?Vu;2-ppO`DaTi_7-6LpJxBFlpWkS zz4#w%7KDn=J#KC~ADqQCI`qM&bYl}PeaFI#vZ=M_|tMo!(h{D%WB{^!EwB_6Q9V)}DT^X(}x1 z{^ZOD^Tu5Ng*wwd&Ldn${i}7R3x-1U`osyNgRO<8&jxoK*ofuA<8OYQ;3X3lT{G^g zlQ5M#cKkv68Lv7E-(P(x-$SQy^?p@$2`;GM&n@nEr2ZZa!67MPSp1%EY?{%^eXrKG z=LTqv3AdSQ!3};D++gj6CLFWab?~JFx*T{P_z-vk<|pO~@D@0P{zTm(pNP}e&@Jwz z#(1v8Zt|eEOM7r*W;OL+uJN3o>pnjsw6dJ-_Qf?a)=ZE4TG@5>qyBe!I^H~Td@lw6 zHZ*I0YtLGoZ*8qs1=BPI&)M&ed))8B$?|(!H|=+Tw_6n*+BKmG=iA8Bc*c_|HYch0 zt488o{>I@JLli6Sunu4EH7<87XW#TTxe+%>oO^4nhd*ulf?Z&@<$>1xH!S!qcpvx> zcmn1p<_ho@IE4O0-6EfebH$mtRt`(H3!crr`&zwhAnYSf*43Siurkp`QA+tx%N@s+-N*M#@@>5X7?p*U!CK%JH@TzZ+h%nKSFVYtvW<1OINJt z_gtMB+3?y$cKzy=uKroe_!5K1o&UPmfz=j#4!k-yh}RE$b9bzL6#K?uUp+0`aJJ$^ zc8krner!zO`4bEG`18;!;PK$M;C0?!{dH;N)8(vP`{17Mmk;LyYHei{r^d3(ypk0zd#CdU-rsVrCye3^ zg<rEgNa~+&=m|KR_p%WNzYFukXtu z6Ee&A@aSc-Az}Mj&u<@^2DJ&~OFx_5x3QVaYA>Ok_k3ILG_4gj-3B2|>rca9TZno20?_#&`m3(Z_$c*Gw`D}V=$(-8X z7V#x_uFn|jXu%%nYJBo`>)yQ2Lh9TlJ&6gv1 z=xpdu=rZUP@ObcB@ILS%@C3|H%oX4*a0vZbQ@84TB2LSX_1zXH#jvu+x8q(v^I|=p z47<4L{yLr+yx6_Ns30~s?_QbL^lkjT_}$0eDQ>bGqjGknzR2KfO^~0_Yd@8Z>sHj( z^II@~YVo~r^W#yhr;(|B52Fy4NjrYw+GG#@5?Q~q;h`8Fegbqh^e1!~^a^-9_$_!J z_z-vk<|pO~@D@0P{zTm(pNKQtVh61~eG{K{zR}{y&Ij37O{$U_+g{~AbqVC{ga2ah zSELK~^;_ zGbWs0UcBLKuW7L?d=vNy(Am(R&}Gmo;PK$M;C43f8M|_Y?(4v=dHfQaHb*;(&r7(sT66D&?c!znr%gL`7{{AGdviac z`)Gbchefgl6+2jYsr}1aWf?4As9zn`K9N08!kSfP&gS6{!8d`Q0G$o}30(%g0v->3 z3*HAl1fGETiMay21rDJcmn1p<_ho@IE4O0-6EfebIYMu`<7)N;di)a zmFXUT&Azoc@6i8ZBLCg8tfYP5Jl^YQy?0$#&Sd8V7>(Gvemi?%5BGjJr=R>`{0AYAA)ZJKLI)$`V+bgdIdZl{1&_qdsq2NU;{{Z;!0 zzhLc=?`L+M=9jaV<~nL`<>70>?}HBpe+a$_`~>K1=uhY}=oRpI@LTXc@FDO7%umb} z;4N?n{fW9oJ`rcT{=2%FTuNrUKC>RSsMS1v^I~U#dWEx>to1h@`JBuy)fw1WF(6UY z=_m%Hu?mGbZ;vDeWh8EzqkxFd&&KH_|))k;cLS0gAWFO2)+sY1n6w&Pv|n}74UfQTkt;cA@BsuPs|nIEpQ0^ ziMmBT5$DrP!#eZVd9o(jzWMul_GaVUwr_0uWgxq2rRkKB21D7ZmQ}sJZ}ey3$HS+F ze+yp|ejj`=_(Skb;3q(5Lw`b-L9c+vgWrPpfe(QvV18n*0B?aq=ugxw@`*V6D1J3R z8JNVkD{T4W%I-KmYl4@{U_PAp?DMP3iA`f!Ja>Q}51$(TEqqP*eel8H55YHqp8%Z= z{Rv$Ly#gK&ehc0QJ_MdnGe6aH1$YY_LVu!ekx#^Vr)8AgGuPpA~l1 z*Mj_6JYT_c2l(;uso~$k*M#2(9}NBwd=vNy(Am(R&}Gmo;PK$M;Cu)h0{F+L6XcKlSi|0sqzJlit@Z)QIYPEk0UlV>Gd@%S!@J-++ zKxadLLYG0WfX9R1g7<+BfhS;oVy*yhfkWs|)GhLfI5+QoZ*9^#oW1|ru)<;Rt31!O z*IfIJd6M^F;^FYuWjFHn7w2yDUimUl`FzDFUG<#l%L>(V7CMJ8-^AZ`von!u_$m~6 zOEc&Ph4`CKyG#&|`|kVrXPkIkQKx)vvbbu@@U@B&_cM(7`Do?JY@MoHZOvDzwtGb= z*NiFs2=m7I*TorOgz;g1UR8`0_vgz)TPz`rTvH>zs0R^G6BX+@iAuj=f&c?UTM&zDcotB4vjD7{7%Hrpp!83L(#*5JrzN*szG~QG_$) zKZlYMMH6Pm*qNjX!e07UjhYZqO@-CW^nDq|eHg zgi|OMm26s18;c+F-93hgX;9=17)49Pbx_xSxtX>>s0rP*&nDn?)GBk8aGcBACo&xxt$olN}1;p zn;>Q0WtJm}bbgZ^F7$^~AXhzkw?`ox7 z*{AiDYku9K%9TNXqHfjsWW+dAs)mH0u&YqTy*)~G{Jn)VDUb7QN*2XopG1B~q<9s^hM^N^9b!;04Ol2mhjw|ZxY12)4oP1*+ z<^GAg{gkWa>M&`)+*EV0^8G~H&dPOSxQNT*>ry=t&%~Eu?iA%}m#M__u50*JMB4AO zSiE2Axl)6-H8><5Aol0)bt~ml`Wz$1IZtbTk5!@1^BD0zAYyK{oc>x`t#BUZMRV+D zxfFAE@)$eW4+CTIzS%`q1(nWFe$IWMDj%NJ^OWEJ;iVGK8Ou!zr0sm-l|V{_^=BifXeu;=B@HUxsa0u8g@7pAO`A4OVXZ^ibkfh5=bh z(oz}4ZiX_i7^*8gM-so@DV^HVifr0bLLR$3(- zQm$fuqHd8-Mkc-^#<>7-o9BJ+mM?z4T%lojWeVAcxW&VKSA;0flQB<)Z++rbI4%E6 ziA&6a6%ItMv4HW_^CGDVXSt50Ts)p1zvs4sLP&hZ4G*dj^cQqeU@dV6I z%$0w@TM>t(xTXHAsathE8Fie84{MKh`gmKy=X}|0C7#Q__nJ(kdGghLI+cD~Nru}% zY3`I{t%y;c?@jUyY0emA3i0Cg+5^usW=DcFc0nx z-9kS(Gewh%gGqk%c&4NgA)gd_@)Cc48X*3@sPl2-#PgP9R6mz^0aMl1y`i|B5z}^v zSl2bYPsNA86C^$$%}?=o@t4;RCI5i8A`YQHYwA{=Pw{AFoWkF6GX^bZkjLWboS*ks z&d<8z18KFmxo5g3k>W4194uXz{+^rh;`hmWc}GNwYerCuonn07@>`#)ULjq_kH;s) zIL!6F+}a_{myCt(bHj+I;;QqggUbGx(A{Y?(Pw@=j?bS=YBB9HWNp30;|$klhK~~K z-&Z5%MhEg6zg6-+@S)#%0_GmIcy$J9$CH!c1{HU%taMg)$k6 z@z-*_Xoceb<}tNKiTy59%>Ij`MT*DF>6_Ah%NT8QFp^|5wF>m6x`^8{L!*Kak}sZc z5$P?RSIOhW?^P&7ehc0w?FSzMPr&?S)N=)R3mlUA6LtGoJe`zJ#92tK!W6a2l{`eY zU+P1KaayUuY0q=Yd6U09cNn>#@hLjwbFuO`%YDPe>t*u$PE+x$K0Sv@pUW7LY$dI2 ztnO`--e=?;ES2lBw|>%o#%yz6Y0cG7=7&b;5^&W=>}7h^g^#C!4U+CGj`9^WW5 zkQDwMx7=#8RF@2sQ#?^xW$k*7BGR^pQ(tNI*=(I7t-&^Yg7iMK@}rxy%KJ@I@{kg} zgQKPQ^O?D-Iic2N`I24%kC#3NeyiqvHGBv>K|Mcf=8A;3z#;Ufcp7EhO6Nm9r8rOi z9k*OapDkUF`IJ{8u8Y95)mwQVuTj@6@~Moo;P1GZtRKqyWh&a)E3eD9oDiu_j;-!S zFaI5PzQx8s>3#Xw)k>b}8+mnwv@L7B%9o1ko%QZwpNsGNe+`#b&$*!)();-%eyMbY zq_d^@qtc&$>oQ5NNS{;l_!@qz=6y;&B)+fY3F4}ppW@}I=ZXq%f5RbVe~O2pZjn!A zoG1Q{TedByo$~sUJNirOx%Rb`d?ep*>(t-#{jKZLDCvDu-5#b?Tw}B{mrCo=P0N*^ zn=${GvTh>o|20qCFTZwl_}0Juguit*Bk4~meo2>!3j@6Z9?yvU7Q7F92s}XyM?F6= zS5$cWI}SYd9rqFq=2umPRHs@MVRdKIOSKtu-CJV+<}1$nzX~RdDU(|3(OSY7%FlSe z&ZNH-wSCWM%BaGOsn{`2#JSY``;kMFDdVdc-$3avsr{iE-=xM*Q0i>yI@J2JMwcn| zikioR--7qm@F6u%_@Yi)hFh^8*+95T;n6v8Ub&DtBkx`p2xJ z%!L!ZHfOCQ%qiwgqZJ`yov8gjwGRe=NV@N8-voXFbhb)=s&yIkidY6p9uIz7!~4{H zNcfpP8*aSDeefOqkJt`8B>K{Jt6=OuRt&L-0-DCrCQGMt}aT%anQrJYEb> z$#22?#M9OAAvI4>&(E5++LfQa;^B5MK#@b(h}~eG9dJ3tzLw?~~$H`(W^g;G0N(0(3U? zCv+L~3V6I+&2Poif%mETPz_JO{8Y^qHQoY;(4VMVb6x3nd+5Q0N#T z;a`SB;BYa{?+1oyOqAl!tMy&Pd67U$J~jN?8edcV0Q^4qVDN_|-^5LXZ^=)9&Sup5 z6S_?NxKgkD&EpwH&2Pc`z=yySl=BmF1$YY_s_9R4-6Efe^TgkAUrg!{AmLbWiTe`z zLZKM8Hf4;o9kM53miT-0L?S2p@$ji@{9EyY;cLS0gAXS8L-0-DCqQRIe?pguw^^xI zq|>Q+JoqhmANY`xCt!YJt^jX=L+DS`E%GVGt&Edb$E_pM;Wayl&lXP$oX7u;yUpT5KIGu6%({CIum1b_O3iZzl^-wV13oqU zTeYvL^83_2m`v>t<*R)Y@ndQ~L8Y_BvRCR)afL2Z>y;WF4}PoSec(gj37DUlE5O?t z98&cs>K6GF<5tFr{ucW^W%Mw4&2uC?U%_(+DPH*T@TuY7Dt%40-RQEpQ0^iMmBT5hw7Rh6k;l=dzCG zG%@xH?3_do&fT%AP5EMadi2R#k%yA$2-mecYCjAo7o+1NR%}QhFVZI^)~!E_I9CVl z9a|AiRt_>*Ju-O>S>o6-D@F99!k_7EyLvK;^e?Ryc%jo$ax+?+b2}ME=Zsouk>Tt@ zRt>D@wZOh1vA=kt-k?rhiR;f?&#*U6bYYXS%xPl=(#eZUqaBP`qSw$a{efv$I)7zo z^XwZRbKhI_u46vef!61?nCCq9pbdv~zV5Emk`AuW-C0|+C%Mt%^Iz-7_M%I!=zaCs z=t_4F9P#C4xQu>v+PQ0uxh+{;`>l4rzMX60oHHlEE<1b`z5T?w)2RNj)cYrQAgVf+ zHnS{wwa|SUc`>@-lYFNr5;J-8!TwDLko(5(p0+y^L%NN3J-mNHB00J_;zngtIh}W@ z*OghOD~QDf+YUb(#u1Yy9~wMAK9LT-^zGcP!%igh=#~P3)1W_#CN29sv>iFLHQVy# zT}SGxf2|}dwl5t%@$u3VFw$U{5z}bh~bl;z_r3 z<#e~-sLG9+!UzFloyflH8C8K>I9eLrvDZd(XS#p*fvMvtOP}Ar7uMIHDY2TeVEhLdY=LoUt#zHY4+WYHgYD zRs21wN#>y*vc+UsJ1^}n*Jsfya(7f8l6~V_Mbeo~=phk-g3*o;%X!Zu??x zT{EIP;xxZI7qzFyN+!OneAbsvx=$;GtLt;W%eUW)540mcyFH0{ILd~0TJT*}=wsb!@2CyxRmW_ibll8 zbYI}W6bE`T@>|<6{kl_w!zUiv?6ap`mK^)#d9WkNH;kEU+qrQ~f1+-YPsI6`Ubrm9 zIE}X2`QvK#`+?Bl(5vLxEc^1|?jn{3Dvr*Dm-BHB}ZR#q9%YA#(f zWQ^U&9nDA>)wNpK)R;aZCtA1AjVJu^echY=Y)PB<9%<9IWD;$5qJP!8y`H4q=37_y zKMy8X%1motc@RR5%%RTTmwk2m#QU%>PrA|PlWUa@5A>y9cXDrTuN^|Ze2i%FE4wWz z+(hQ&XZ7<}InWMxN1>pLV2SLUF(K=ElV2&YQue-`di3TIuHp`*oo;IHc}R z)GhLfI5&=YXkybUon9^6?bJZlnXFUCsWV}8*v$8dbo|!Yb|q|EGDaO|y}0lhOKl@) z=av`CJeJoY^$yRle48Fjnyi>_ze&U?yYd+i?T;^_2i5U+)0&ihs$~LA=&|@yz#}g* zXioC;@KJvB{ZvCCeaIBrHe40IY2Sn z=S8j6eY{f>=|putm#gC(6hh~m)r+9V)NwJ}KAi5gCrv2M zzi!?2b?GYpdsH+NkdVjp-i(){2(fqkzhBETb@c=uoM>je>WQaxXn`P8CXuzw-DYm3T zq_5UG9ZNdF%-4JQn^ok@(2qCP*t8=DcSLvfNt;Y7cYWC2$~c-%yY|+YcFdi3() ziw5!JN9zs)^v>Ip3iO^{J%f{%eh-jiaJ;v(mviVf&TkK-f_uN{m)P3mW}sUeBq0dXVB{DSw&#Xh+OaH?FHRHKGo8>O1xv z2;wiV?qcUK0 zOVXm*<)2PIR#Y#!VS^Up@5%OT{B)&bPc!l(ui$>uIiu)}P0f$!+zz471m{U}{_-aY zt~Yz$NLx&X#s_}UHf=}7-AwxuleU1C#Mp&Al=;&iBTTkTvW_Efayt!-cWFmT2X(vB zs$VZ^apI7zLHEks6PxRPXxrI>=y-T~f3DMwq>i)*4n3+x`W2ThI5okQg7<+BfhS;o zVy*yhfkWs|)GhLfIMar?&1qJ&gw~tgXhJ}=13gk$c{zE-Bx1PHyMy=1PYtZ=HMZh}Oi#^qp-s zwaXt!dsofRKHY$&@-w+b%Pu(39wWR;b)NSi&(!gs>ubD7SJZb)qQ>oTbP|0THNOS# z10MoU!2HBq0p0?K(4VMVcL8y|Xj46XK?JoQ?5Q8= z<40PZQ*5`5Z&8!iAvxPMj5{nQ52DS-{lUfCZBsPj_%$+InttsSQks2dq2G8KpX5Fapca-*7U)v3E8XG>CuP_ zw|X7_5lo)~X_i_=J!aCrJ^ym(l59f8-u^s4 zx!p<%y#gK&ehc0QJ_MeC`H8s#yaf)SKT)^HC*u5ivC?+`zV$S-BK6+J@NQ%^f9A8| zR3ox*`o^eA@$bhas^d&D*>`Z5mu_LxkyU~S)n7Y%j zNz2I3gEqVGdneF{KHK_Ex*k9ZY5%rsVvNX|=}oJu?>pA$Pv|n}74UfQTkt;cA@Bsu zPs|nIEpQ0^iMmBT5oeF-wneYIrBe%!x#eeLyU>p6x~*rU%I7GeiZlPsuJOx`$I}7H z?$fi<8`Bdxvzs>m-jx{apLy%?r8qK6ozJEt&y8O*aUykE9k6;~+g972DhZjn#K zSv+8tUHcWQsP1(4iAUPAH2p$@ep>CDQj7MVCgxstp-kO^2@_T|ryJUK3ee7oC0DZa z_kGBiOOHqAXt`aTLLZo{f0;3&2aTF{GG{qIozlsvch{`fBj;aSkS+E}pzuxLCqQRI ze?pf*uYkvc--7pn4a&%I3$<>N! zi~F{ZrO!MzrhBZntMP~6o4`+i&W8SkE`weHj|aa6?*ktKPr&@dTmjw!htQv>TjUdQ zCR7Y+HShZ>>Nj06v1w96nz!Oeqo4ac$ZX3OLwnV4N18RSzd+&NmL}c*e0YSgl(2CZ z4)-R}v_p8yosF%dNtd~^#~*mnff(qXPTl9*k-!IoKLp&6S;vQ|-NtJZT&%9@bQvp+XVbm~e3Sz76wDN9I# zI-gIzEpL%>avoiu;HrE4$s*cp)u4Xni{!*GG0&`XPg4TF4?Ya+RV#25l!6Mi3jF!)38P2eX$XG4EN zmqD+9$AjO3_kjg$o-W+^y=KVryV}DTz9kFnHqUl8$C~W;ROE{z9#%W_+apd;G4itfX;^g zgf4?#0gng21@8kN0#CsF#9RU10*BC_s9WR{aaKIGFV*y2OYeNsO@EzgPkSubuHli~ zfvy{{Z|dtXOFF(g9dz+)JL=ycIO6P}J~ciy{9E{%@cZC{!5@Ne0zUyd8~PKv40;7T z9{d)(4}1tb0rL}c1$YY_LVu!ekx#^#v+8L1-(vdwF?=Pl_&*o6k0 z_P1u~!L`%o9lO$&z>kMd4gVItCj375VDN|Fo4`+i&W8SkE`weHj|aa6?*ktKPr&@d zTmjw!htQv>TjUdQcIv5k(tY+?`rT`7ozrg`QR8(P2KxO5lhpxMFXn9NT=U!kems0? z__y#i;rGD@gFgh{1bzZ^HuNWS8T1NxJoqhmANUY>0_G>?3h)*+EgC9n8+ zJRbZOybpW`JOT3)a|L({972DhZjn#Kx%k#J9iKgG=*P`_qw?oDQ#?n)^A$XIfFBQ^ z8vZSOP56EA!QcoayV9URNJ)ceL{b{52uVnaOi3w46q1Ont+gv- zA(SB@DN+dyL^6Jx_UX9a=Y5{{d;kAE{^R?O|GB%5+uH4^eXi@e&g(qSmHXaiZ81|? za)c!D>q|m{5G7=P-^3q31z#@N{rBK|JnkvDAtX4)3yyih{WpY&U;hwWYJ`iLc~DTO@A8#i;Y)tq!++?%{E|~M5j@9~m^z4< z`cs4;T>s%c{^NB2=ePT3@8R|j?}1tV&#&&k=bycY82^*~I!D67!oN?Igy1}i2&oO~ zf0bJQLGb4g0g_)&zGdFE%yG_K3n5~_A09Ckyy`!^=r7->32s+w{N>Jna#KfeU*p7o z^59?YauM7vpZu3Q|H)0%NR5B)|En)k!Gm3z|JAby;&;>YpHlb_eg0p+>hDMYJ_CQB zfxpkd-)G=|dIkhC_FujY^nuIot@cZ2^lwM#gMML65IBkuUBCC>cyWTz;J^7Cdk34@ zf_MMx?za=%_e%@>^?rLNhu_-f*Pi+7{WI+Bt!MnYkN@wll@i1M_t!_lzW--C*?g|$ z%$dKQ!++v`_ce1JY^-eN@L$9K?7v>~3+=C;gLU`Meh&X(zKZ%+``=Xl*W(0{JhcDV z|K~sM|Gz%=_wB#Wz~5)!?=$fC8Tk7Q{GUDpzjhzK4ol=%-L%xWIPB#I6Wnj=WV7)5 z27=fvo^$rP6T#p9{aGu5uPAfCUouJwoepJMcS2buK2r8{-ICA{__1VK8YCRc`)V0F4I)wS(i_SFEQ1$ z7mE*%H#g1p+wMMZ#CX$7johE9d!;He-JJajS^xx#&Hqo{`67eqUsfquk13%w; zwVFs9?tjVTb(>tgc$wwMe=@;-`FGko*ge1c#Pe0P`qRGQ|F(T{JSsAh%W9hb-6ww` z5dO_yJ@VH+c{`6$+5G0K$-gU~3?}3=A2f*n-6#LCP5wonH2vH5NrBFjRIXyn-+Sku z^vN$z_KQ<~?Hwi21%oH+$^F~zozUc)-b2);{mm!;n?AXwRv7BH>%+e-pS*wkXpR3x z;lKOjpY+MEdL|j$qWSBk|Ie>uR_pY?wVLu@Khl4`j_LQ;hyOpnEkyjEIv-tvOW1#(k6%R= z5t3crU+n+8&IcOsU;W;sh2vZ>t~(K{U7`PuKNAw^YI^l{{-hB$N%^IW}n@UAHU()|J{G) zx5)oNb^m_p-)G=|b_OiZ43bd@xMiYhW~k7TP;Ihaag*kSsh3TR{o>uumR~lJlRF_P zE_sxGm%XrJ<>6JVP@u@F&&iwVg}yHg{DOF_`fkaq()Fw9n|ZSGlHz%+)Ed@coGnYs zR8|D1o2Rm&!=@aHtSzDUt}9Yk88Vetkoisxc&5jm-90yK*w6*6UdGsG=fpMWchl(9 zALcXZ`Hn@yCcmD?j<|ot|7?~My;M!>v-_}3>_S5?@2g`iX}h)VN8c!{XZuFD4xjvb zA}jUdb;x>-8ht&i?%0?;BiPShEpKS6o3K9=?#!zXrC7~8r^sGwJ@%RTQ;m!DlUd-L z-k2y6_VK=n$4{ed{oZRPj%Pni7@l?A#Cu+(>MZZ$^nyW`$;l(uuq*clm5dZip!F2r z3SYl;iIq&6KPP$bTH0rpkjk)c`E1qH5}ZmfUIxXI1mv}pa(uNEVo+0qg@j|a*gbYjO!nh7mN8(Pg>p_YB6=+937p$T-%C8G#h9o^#CWf5VN8Zyj9+`E zGo4l}(t0X;F@POd^<28?a5SxOQH6Y*P{fL+`#j&^wvx8+kQk`da)`aPag50L%CmH# z)Ku+HBa>NeiJ?zi*Pf-@8wMoD9n++()1}`jNlj$mJYLPrahT1HxMW#9xK)*2l4BjX zKbb>k-hJ_9PNfxlA$sY(%NOkE=&TPuMlMloi@qW?Ri36FY->?tKZmi-_Iao3^hdMq zYi_+?kvx=sGHYwY=^Qy$@wKd5%*m;&PMbpNtXDeh)uM?@VyrY+p({0kf%nI-=v&ki zI7jx?I&~i9nv6`FMz6bmkbe1dKzdh7AX_*5%$C6$*3lyOHhdp3`W#!nab0wic@Vwm zlvDSGz%2Iu@x>K8T#D!~@o7Hy_9wG?LvM@;A6P`Yyq0he44Xu6eifp6x@sb;Y?mZ< zNq-KzORIv_TB$}`_Z-Y<3p1vx{kNrSZm?#3+A|&}@10GLxEk1{G;$5QqsL!Z?hQ>h z4qkiHc6T^Sb;mzdW=69KTe?ZgU>LnuJ37}{YY1y>zdSb3b{ZRfd3vZZ zdv<(`MQZkFirkcDwRDRMcf<0%LXNTo_okkM$rNdw`?QT!Z(*>AATGvJUSch;kn zJk?%#Zk1xro)@}OT(!uql(1$oE_ev@iM~ZWfpg@_&6}^bOroNzf2x_3*>F8t#0M-0 z51=lFM#(rfTX0XS9SzS?^`X3Z8CA*qgSnb&!e`qojVPf?dj<2!$a?6$nU~4Z`a8=u_qCJr zOW1t<&9BHy6$*=n&wfUhZ6CgAANha;--3rQpXgiE6FArY2(bB_A4F|DwW1-ZWfNCj zjLW$(FMw)x%#3uBkK;-kh~>}nPo!ePj2hRpDRM>ATI^*9ZK38kmE1ew_nz$Ssx^yS z-Ol*!63>qNCdU=O|7G;0o>ye6uuNL{lb>WoWMR42P#JFTukQBv+X@8tnTm6j zVftrgnZ%aWUv)Z|&nK(%#hAwo_6qnGJcRi~-=dztsc3d>=~ekh8ubH$c8)KTdAV5v$Bs56>^(RB3uo-$8nFUUdSPZ#!~JBb9Kg4 zSy4I_N%V*rBe?Fx1LwEqP3P+C4se_sYED&H&$zQ+$eK&<5=-Nr3#W<)`1bsKOLCXr zuFijH6GF+o>TWQ&K9o|Jn09@Hm>k!3a^L(eY7n(NSp5*sR+n1fH*Wq~5iM$X(V-|0 zb_|uc_~V%gAu1I1C-w^X7CeOcMBk#Gz^SMI>RM^-7D9KfaiBzhhW3ut__uk!hp5*B!limVr*d{={AZ z--3rQpXgiE6F7a7GyE2uOQ)1K$hmXmj&YkG&$;8$vXr`>T@+`y>@c_Y`AjoIX?d=u zx2w#-88Xy5|I;T8&*)QIZ@N@Ix-8DUvjiK^=H$#^P8(2 zrM7rc6Z{s=u`1K#4%9B0`N7wVYScLG_A&k>x$SgF-^Jy9OxXvuQ_I%9Cts|eRR0Z&6R+Od4+yxz4PZb7$_q(EO@zCby}$w`Eef5;cyL zZc22IO{{aX%K^P?_ChMJ;?i*?rsCaIS&y3vOD7A;p}Wxo}0%WD>(~s$DVm}A^bf- z&1=8WUK~7zlDixrZFH@Nd1$S2YF3XtxABXg&U7PH%5@jdzHhcV*W_LTXW(&rYFJy^ zpzZFm+Qs=%pSGQo}`bP;fxuRXR`#gk|sOQ&?wE9{bP})By+!?UOjB7ZhVta_N z6}4I7_@?v|VchEVZ5a5P9E9yT!w0IA*6bY2XftP z%S5TYI^5u)4S5T$XmU+HFLm!er_ME&60VBWROUj*|IxPs-3L7coq+v`y#l@k4`Dvh zx2Pv@E^d~JT)Q!Y^sX@&VzDiqG0{wZ?LE1i5grrixIJ$d`C3btG%_nBzdR0_dd21< zqvx}n&1@?p9kyo#dkDW}X0C}EK0o&~8A0S`7JIfZ_2<>)97T3B>%~W>q~~lUjVC*b zy*1v%=tUW;Zu)$T`7*p}b{Kn@QT*H!{iZ67>GIutz&vdq1HS?t4}A;W2R#Ixfc=TR z0=@+gVLs8fs3&l~Sr9Sf_|F5R#s00LZiaHPhQkw~TR_uIBJ)eD)WN%BB+XrWpanRR0Z&6R+>^kzwRr^L0*>itjMc|?$rnqZy=hZhgOmfhWQBUjZ$(bDKbHhWM zn6aj>>z-X2OqHJ!pDv_a!|WxG$&Z~YL0!D1x{=5^N2X3XcIlhy38s>xEGz1ElynfH zW35KrAPZ-Ty?+sRl`OA4dFp#Ok1U_;DpUIH0tx>KUk1Md9S?mA-3L7coq+v`y#l@k z4`Dvhx2Pv@9#dPf^0E46^8M+iSGQIlA*~zN?um*x&6J7B`fwDB$Yb4xsjIIvGDE&6 ziFkG%CiPlY%09jRgmK{AHBZ^UnR!~rRSB6BP2SFxa*P=i!Hi$u?e%G0I^$ik(D6|~ z3Nz4mu(FqAG85dkVx4-!HU>T${u90oeg!%n`WCtmdI&lJ`xAQwdIs~QyF<6e1wA5{-U^Zu@~vky zQ}oB)`7A-DB~^&T3s*5KH%Gr7{8)r~S8pgce@P)(eQ<*Gy0J%@iB+mkmKkT0MSeW( zyFpjUsVc$NHwwy0b>%l7Gg~i^OFx7x8oH>6L~epS0X`f46TS?71v(!37P=352s#1# z6MF@G3m(FJqHj@8;A~knrhW9BCUUmy;DZUqgSp@AVq4F9)R504=3f2~EWyn;UAC`a z`&mZVaP;Gs3y+g~XI&6qpOnKKoiWSJ`%NW798z5%XM2^=Y4D0sdd)Jv3FV_EN?l-( z4{|R3PzXBZ(eGA3o} z`OeHxb_~x`pGKYKtYgIDn#l693!2plG{rI4@KKV?0o7^y^w4)62KICA?hme~fPk_&c|Aa4tUxAK?zJ>0C9)eE5 z{={AZ--3rQpXgiE6F4R0CvWYH*QMec3YrFgtR)9H6%wOEYM2vm^Iz8W-6FHDNLubr z>n2OpIt`~Jz9moDZn-c*qnWIpYg)3w?m3BE6L}wUFyuqXO^_$RXTyKOm%*<<$3x#j z_dyRqCt!bKuYhmCLzqwWE$RuJTWnuRDXrQ=22ZMZab|uDQ(`r{R%v=Psnd9Jzt-V2 zQe^f5jcBhFGVb<=%-y29$XV}lJUb+kN#wW4HIerr2SYxD+yr?7d^Y?id>Q--bUgGe zbRYB(bOQD#_6qnGJcRi~-=dzt>0a8psBUo>`B-wRTSiL|Is~i*XG1^tneqt%eU>0-9*>+F`7LryIs|=2NCtUcXP?w?6P&` zKeNcGoS)=Hi*yp#S8&|{c|3AzMDE4c1}JRUhU@>}GZ$or6k zAs<3+f;<5}8~zi%41NVV9{Lu#4|)hX0s9ks1$+x0!hE7{QBUAxyXrNyt|ycIR~Pf? z{$rNlm?JnQ(-zxZwvUzE% zAD5jipcP|7e)`*-VZZE>Xx_ScBRhKAK7VDMW2~Y~lgx{6Jtc)IOctH{x zJ{ajFj5@PrOBs%hw?Z@DO&2)Q_sueCbGc` zC!dteGopV=m~w0{>at^=pZ33_?M*B16}cQuXs~{v&9+H~?M50Ex2y)`^^_#Pvzi#T zc?ex6ep^^xL!6FTIO%fm!KX&z`9ChZ9Udsai+Td*K>^-GdQRBzZ;w0IvRA8@?WugR zlwO=?lkjNTZg$v*J$rjbq|g#xYfPuk*~RL-e3ohJl|w(!ySia=&oOq?+%Dsv<`HcC z)qrH3)fsG~m&bYIhBqaOYU|_WB$`Uf)2MCp9omh?zH71xFl{U$9yGUw)pQvps~DV| z`{svHo6v^DA*V*NI?6EzJA<@ouyYLpX)z@l~7`A&OWO* z%DH<>>{3ZfNtLhOG<|PTy7GHU_Y&{VMlnYQDNORYV?=)3qo`-_t)#!A$$#qE|9#@0 z@88z&KmGM+Htgl+pt9Y|=%Y4CK2I<0X5%f*h2LCFp=&3<9cF%i7kh;FLHGOj9D3*K zCrT%Ba@n_^*Y0fk6u}-J>~pEuC6iU0CNU@O+}n~EN^_Lh_NEfgrd<-n%5RJg>W+To z$!jc;@DWeG;?Qj*oBH{jbe{S4qen@dFD@xm?o;x_7 z7EP$Ry?h$~d_30wairv#kzf6;Tig9xOL8vnzxwuvD4n%b-08)rJ|oY;DlT{J?iyK3 zetJ7n=6ea|6Mc(%0%w_pbEW^-VD5Y84R+}s^QgBEiyqe~M{uKKvTp5?ji=r$+_=liyp0qR zoh)>sS&n*l($;I(=vF5AtVmh;obQZI)J!$U4>DAI_~5F}6h&^O$(hNuk4&k-Pby3O zyydwvp&eDo9`OT+vxCh<`-o9_*PbH63H@#~2luXtq1}22o zGE##TjxI9!#yDucjC?t#ntYYtEEmRWCp&LSOJ6zO%S7(>b#S-)Ne0HvQoX4@_tyZ*k_p4Hhp!@9|Dl4uOrXnZ2T==}=D~Y`Vz6B3qKGC349v&H_ zn!~*y60Ln;>`BV5H)izYx%QOtvB6JD7v@j{R$CleNere2T33D=zgmR5#mDoL<5(?j zoZrj3Ck;YW?d+FZiw+N`wheecUH-WScZB7ruM@d?)KWj08?#N_xFQvE)}Bb$qEa37 z`$*D@t0|guWbPM9D!^}0u+X(Pq{3-}H?iU=ldu$fm`-!=8=8u z0B-dGV|$<0b_V+sdj)(89>RR0Z&6R+Ea_}-%e?5sjjMcmZNJevO6K0TPjv6~db&8rsFO%8*LhA8P z1+LqK=tnSh0#v56#shCkZ)s*G^p!QxtHIap2`iMHC|JHy&+{^ zETNF_V+l8C=Y9XXBeW^b-VbFn#`tng<2o#sP3UF1!ZMs^d?zT^!+zS?Kl_-iQ;xh| zFmeoc;vKKZQyWyc1G7I98kGuM-A8@uORh_Cp@*Oous^X^z_;Kb%qRL5^#sl_D%ZUI z9-iS6*JrMnDzTgzqkCUe*3;_ox;l81jDB5@70D;HtPoZe^^6Plcny8ui(mZ zV-F;IEezJ=D!rULdDc*pirDs`*UQ0_yP-zGVBq%U)J0zXgn+iG+%IjP+Vfd|O8Q6l zwBSo!Oywr4;=%bsT)kb9PTTT7lWB503flHfpln6lBea&QQ*+ybhwQsKoFX<^&aEnx zq@eqthoBR%Ke1Q9x8NbnC;Ark1Ws*P>-bh752{gT>FjY^Ih1>dl24-0D<;ZrZDd$? zJ30N6<@(L4gQ(tagH;VSj~UiOZN0~gpUk_koYQ0MMJZ1)k+&EK~#=JPKU$>JxY~p7}c;{ocn|{YTfRq#=Tj`_4VqSLVX@FfResx zz>N!iH|)nNPb%m8l4NNS9j^C_m$R?c_)w=rto7>yM7V>Sx07L4dYH@<)zrI(UXyK? zUJtyrPK|23v|>=GsS+jQcbUkSl%Xz1`LEx2=?e)R4}JSb_X+e6bOQD#_6qnGJcRi~ z-=dzt`L-&Z&&n&A>i3$+*B9rR(y282AQ`=sxHn=mhLf z>=p1WcnI@}zC}HOvwX2>^N@EtnfPbHvbEBYB(Xo`LwivqW3Q|@;vjW^i7|2YRpp%} zHHJzUA6s~Xu^kvoXJ;~`!kdncm#ETI}-%rm^l`z#@Hhvd}=`%A+x6jLSOy?_wpV%wlTksI(^H1Lj>Is}0 z9|l`*+7(BdK7SPd=A{E^-{f>F^XYzun7hetl3Ng2QugGv!-}KKlWiw2cKm!mW^6o@ zo7$4ahq(6`Wi&_mD(*q_)d;9Kwz<`aF3dID#jdM+!rB9lqGF?7@Vsb|Ty z;eES?Y2RgfrUf#(!RN`RUFlr1sfAe}bohGy!923?!3A5*>5G{4S9W_$nJPQd=e zUIE{NhcKV$ThtRcr-~GgTo_!=nJPQd=eUIE{NhcKV$ThtRcKOg$ zdA$D3sCZRH?ho$E2O7>#$e4_nwc`tunbehoSKYQcOtxipZwqd`#V}UUuPc-;Gm*D< zxzw5DG69!bA6qQAKq3c2K7`x^c>;Vk{3m=F{0ekD^euEB^bm9c_9ylV_!c~b`9$BM zp1^sysI4F&ub9cT%Xuxydqcj{x}j%tE1CJC@w#zB;2Or^f^>($j+NwUKRM?k2ab_9 z^Vtu?F5_aO&EK7`x^c>;Vk{3m=F{0ekD^euEB^bm9c z_9ylV_!c~b`9$BMp1|o6J^Y4Ayc(BUss5yA*==%t^cKDM*K^6b1x3!jPxmr<3y2w| zTOTv^zWJ}ui`{3U_Z5G+e&QOFNLEGZOB`X4Ya;JM4u*UPxe4+F_-y!3_%iqv=y>Q` z=sxHn=mhLf>=p1WcnI@}zC}HObG*%o>55gmNrRV~P8&wAVGeCF;j#`9WR<2=M)Akp z z(0$ND&$@DSz`eT#Ymr*(|lp!;Puq_VcNqeS%_rn>n-i|%48lE`og3N=*X z|GrYl`X2@}nTauVV;o|<8RXQ+Z;@*v??VoTd`&|!@GW=<^NGGiJ%RH@wygNt{r04yglBnyu^Aa}eJn%i(=77D4&`O8GV{qkmA)BY zGJHtn@yMx>-y+vU-iI6v`4Dmwq(6`Wi&_mD(*q_)d;9Kwz<`aF3 zdIG1#&mSYN1ny$SUsm~g=VUyS4WMMBaxS4EYdp6XXf-+3=t6W$-J|@zA%>eb7VD z3D}?5E8tu35attoi+TcQqobPU=eRk{-tL&N;pB1>*O7321=k&r$N$Nx1^F#Kr)G_}o z(GvW+?CV7rnVfkq%BEIZiKWUvEXy1*UT5vzwldFKo0Ymp-{)Cu4gE4(Q`k7Ba&962 zSb9xVg5&E^$kTN4Su{)OIfrOK>#9 zNi&$q4jkTryUU1EH7huc>N-U^H7j^2=hVeK zcPjE?S`CTI%iVbd;gxJiuE&`p^=i?WKwI9~Rs-S7OJA|&CWDSH*PF;A zN~YY|qQoW6^Ge6!%91k4(pwM#=_X% zHuDqzSQ=1$Cpv%R2OhCAL2dK!X{ChcTK^5X!;Fc5)5_;u1{qhLvz)dmb4;o5yR#>b zb(QlPpS8B^IVW67oNMLU4R7WUb2R1UOzSuW&ovhrF74)3%4X}>x@Gf-G-coKI(s-o zhePPkWn4~U7w_xsCD|OJEzjWer%axGo97d;rCd&QZ%~=q#ZVsR6Mc(%0%vMS;hK2o zma@bRLu>AuU*Hi2qphpVYB*x{g-dP@aj}zmha``oE~EF8#h57U2(VcHqWr<@Qivs&K_y= z-?$0AjvEEec|4aR19cp}D;QU96ze_k+T7S|m1AF~=yYQu>*vV{eEc2{%M6abF*iPO z@uW*v`U_6I#omXo!bt(QwD6-x{CXxAf2{q5^CxgKb)&TTxMcTl`-QhOt3joC zkC2ryQK)No{-c8N)Ee2=4&_7+VfLJ}ijOO1?45W%-qNgbU!MgmRWK%`jufs=dBMrb zP?C5^&gT$Dg=%*UL^*`#nfe;n9UNkm5=X_dmP5pIy$XD|Ji@vxe{n)SkErySIc#w` zhaeoM#EdASu~)#i;33Q>`WE#B&iu?CkM~8*Ws79SzCTvu$Rom+?y*`K$T7ZjT~uy) zU0GJPP3VAG6M5^h539bfFyoME#i>P7qf3d#F|G#*T~5}I?+5Hkn|Z||p6UGijSJH% zx$K8-PC4b@q2P0tr=oFpJpX>q%MDu3lOC3FZfl+Mn%xk@ z@qYAmn$4I3PWhFIVn;XF^QwvpLceydRR0Z&6R+tpD)gH|`kv{nVtM6yDT2e?2j~iM%@r{kUgqUYM0{7sxZMX{ib7 z>E`e%6xNsz8f`3|yg2D)p}aBiBJ4mSAAjX_(^w@w?wgc`_59j0PUz9?^kc&gj@hZy zGeN7GIL7l9^;FD!PfIFJHYqde;6zW)PKn@ue&)wIcX2)*#a)jTTlstBhnL@kkIuQg z@`}j{F?{^1L${ims~7Nmg(FVwcp1clPQd=eUIE{NhcKUi`c_a+;H(qiHm$k%M77e4 z^H5$vFOQECxQTM%l2AS_(^tt6e7vPG>SKBQD@DeHdzP3(cQ+^4U`FN$VP_7_6me=Bdge+p`*=if?$dcI<9S4!t-rJQL4H5Ww&#W}qoIeO6Rp z=v&kiI2(Bz5v9Zl<>(&`;+$i3x7XAU zyvj?Qq%GzVMHnk~F50!hrG|5V;GUk5({J;L2fcfYoG;Nmm6J=AuI%DX|IqENH2pSb zN{7`n%gdP@(}{5_zucU|xmq}V&U=+4PT;OE(Q9>6c$sTn`fqsa&ao}55%)M7#p~Hz zzgqgFH&17+CvZkz=*LYQSa*14tP!tbfau*` zJ|6cyUK^K162@ib#TsGaA2@{DD$gc9eo^aY-(LRxs}^jPOXTBukoSRhH@M9y=Bhe4 zH1PRG=g#&hk4yAfduGaA{{3H07duDrKmSe7SlhvTJOwsmA_l5@@t)YWP722$)zAB0Jb0(gA+nr1NdHUppcP$f7aQE>t=Q4D z<=eAr&aF+E13#2!a>B(=jY>GvN|%(**i(NxgBExBTDwu*hC?_-R-EwP&B@@oNeO=o z=MnAdNj>Syctnc4g4xiuocEflkM1%KG;}=lEp#9B5Of0eCn4A?;9Kwz<`aF3dJ+Ph z>$jb(jC$Wx=5jS*>&Lz4d5Q0ndxlhJ@dA=QNA7sg$eE$oo%DX$4>o;E`w2W7KQ z?_GIDozJUfLhd%V0(lP}q}j+nKE?T2C_Zbw(IqzWs>-J;5fZ$qa)(-?M}~5&uibUz zb(nF!4I5(^Cv3uzO?Xj!z}AUJtp2uOrPvnQZTR>nPvw?#;8&pI|L9xjK7k&BPQd=e zUIE{NhcKV$ThtRcm*v~>{8;I!>?YjM2a$ot$ZQd-2vdE&>* z-?(F53p-yo=oHUSA+vFULq^TJ8o@~pYIM6BOLG4BGWZqfc!9o!?t>nJPQd=eUIE{N zhcKV$ThtRcxAdLw#~r?A#hw>=yqW$3_Fq!C$NT>DhWb2yJqgCy>=(|q+84iZ6J2HR zedSm4-ip2$r!JAjE6fe$oD#L?<0X1kMfktxYToeRb?0hcSKV~0G>c#kVH#fQHEtH4 zmp$))x{^$1c`Q>Ma7dj8{|R3PzXBZ(eGAQ-- zbUgGebRYB(bOQD#_6qnGJcRi~-=dztX`rw08~4u$?c=&TS8{6S$2zw?GT>Z1#Elk- zSi^fSq^U#uPUZ;_oU?ir+((KL!TyUPWv&H1t#E@&B9ARlfSRH1Qxu>VmTcFGiwH(YB7}?|C(+ zb&7o5NqE*wJtRk$JvKPxxvGmr4u*UPxe4+F_-y!3_%iqv=y>Q`=sxHn=mhLf>=p1W zcnI@}zC}HOlPlq(6`Wi&_mD( z*q_)d;9Kwz<`aF3dIBeK=Q%U8d<_kFozGtj-H(uCt0C9)eE5 z{={AZ--3rQpXgiE6FBAeUr0E$xuGme$4vUn?LF+^+PJdDWhHd=dfVW1ZWEpL`Yxrs z^Ew?+xU6{C(~orWkdI0#-r+3rTjZL^`;dbnA3|<|JOMr%{u90oeg!%n`WCwHj~;?f z!2T5M74R*1=+Ar#`WE#BPA36wqCD;ED)aj+QJx{ECd6fl>Ypoyw{+2j%Ok7D_AI^F zq%`Vg&PNtGHS$~Jn#lW*gCQS6Zh|}kJ{$fMz6^c^Iv)D=kM0xbA?O6`PwbUHd@JA~ z%qRL5^#smr0q&Sp755$K7MlM*U>&qy;x^6ypQ{#!_IzRs8)LUy9I0iI$0Mgkev4ca zc^`5xB44#?w?QzO4cu8F)4IT-RGvucnI_Pr*BbD0nQ&O{qs$Tu6sXx>I3$9mCm~v!zyW9U%_<; z4WMMBaxS4EYdp6XXf-+3=t6W$-J|@zA%>eb7VD3D}?5E8tu35attoi+Td* zIzhdwqk4{sZB1rz9SPT0aNPlUJaTH}x5zb-_x;Ji1o;qh6XXf-+3=t6W$-J|@zA%> zeb7VD3D}?5E8tu35attoi+Td*Z~^WPp@5{JahYuI%12Wjboa5ThVFB0hs3kJdWK?a zlC#+OuCp4ii$m#id9D)6{Pxnuq4N#mPcNkzCTVi*;dS(kRSDu#8xGJRvr-gN55=)j z$3MGKK3nPHEnc6Qfk`wi`R%nw*>ZM<=aT^ir#EuGeseYM7hzE<+=kjz+$z5MBnq0P~8>$XYubc*FY z>o3{n?8vDfBdu)hXm=yuSsgKM?6EA)+^XPVtcbr>;h|;ASgF)~WkvZE>muEv)jCd| z{kcF~IPS4JJI!r}_^s<6^x9hMtz83jXz3HJqh-b|{Zmiil$4b#)Sh;QbLhfD9c`b@ ztiG<2h7;{h_uhMBA2etqy}4dJ-+o3Qt7&_OvuSKBZ8E*Ath8Vzdu=(yJdf8QX5Op%aI0leM!or=OVgP2D%gknZr^|4lny zpKYE|v*5bhAolAz^+%nvXVBKlBieO+OxTA9?>c;>Ea>@^((sz+bJ)F+W*_@rPGA## zl(`!c+}H~?RYLO~>9fzCO{@O;N{RpXI5%!Sx?hMLwfj^M(dkH6yv@AI$s_3D1zJy= z%U%BTE$RuJqnbW`XW@t;b*^!gj^Z6S_Z=)G2E9U>2-*qOWEs^1BeVDr~?hs>Me zN2|SvZ(R1ukv_7t<9tmY$%-nAyUwkc&-(3KH8if*nEqn1_prF71--{F|B>`m9ePuB z(4_L1iR_k4A}68Jh_!7zu4;bAg^drqUD>>E4z1}fZ>SbDjdc&)VP2f=z(&?dp1AzL ziB3_E*c!2W7M&oH9lu4!^Ur*uZ&6R+RBmf@vw66W9%`Q!J7}&i`z2KD!q;t{Z0@jP zvrjg$Z12P6Mvwi?=}^_h-#kyM(++z_mc49@WFyU+t_-r8PIpuvF0(ih96vU8sMR+uS3_3yprPirxnpT1x!BvW`)AN+L$5UCOfjK{SUPVx z^vRSpoAIOKr{e-zc6iDcjlKGG>uj6J`WE#B&fzP~BR|XSr%Ogjiw^V* zq7`cUak^aCAv#wnlK=N(n?}@YEvDBBa5k?CUa@6(ID2DlQ{=L6b2@U??66m5W9ju` z54+c$OryyIt$kKz>*?_V{9BE0h0=A&w8Pe0Q=aZ#OfQJn&nnoqk}Wr^$`#k}V+pb! zf5;0Dg^@!eSnnf-_fH>Ep^s(BcPgb@(WTm>FYJ8dOrMwKdMb%~(Uk)HQU`KtuOD`x z1LSJ8+gEzB;9Kwz<`aF3dIIPAM?b_@7Nyczf_iERa6ZYjomE#5!R86-c~5||Iw;oc z{v$HQr2>`=-+ad_)gDUow+6+I{2HNFguU%Xtg=;A1ddGV97T z{Zw7{`!T&^t78o4@EIp-qi$QXPomSKI(Cj{u~)#i;33Q>`WE#BPTgH^hJW9?ofX%U zPLdnvMqiw_Rbk||1?-P|-iI%QZDL2?hWlrpZ+=I$z#J&IQPwW-&EqDm?iM~ZWfz!_BKwHARM7BbSr)w2|!;;F1a%c}(krE4#E>%<5iPBK`B~=%wp2T5v1z5lFmGk7a?4@i9RGMyK#5X5c)*Xvz^-0SJLJ+ z;|q1-Cez~{)NxW8g6W1^vo%_MmeB>3i48x$FJe39>}o${tV@5ll73@utw%!-K__5; zVy}R2!9$o&^eyTMoaA{snXQwzu+dE|Hr6Mn(Pu|7qkK+Su_iOTzASQ?Piw6`ec!Q0 zkNzwj7yjtSY<9*;X_7NGgjRVMx3@xME`2fB{nOV&YiP5?Ju0_9Ph*QkBz!zeZ0KmZ!hvo5Sbf??Wd0xB2R#Ixfc=TR0=@+gVLs8fs3&kPJKXg2=G8d1C4AxC z>3dAr6vN2LFP{d}x|JE)DP#csys@Loy4H->uMNlAi%$&%%=p1WcnI@}zC}HOvq!R9XsPoi zR$G9}!@HnXW6d&}7@h4kf5HknlecBi>9qm$c3p`S~_9vm=2yHJIYX8=fPr6dce)$W!#6;*m=vINn4L`qt{DooV#!4P21ew zF@1ZZ6I&$PpfAqVW3%_=sY<13(a`bGx6pmiL(mD>pV%wlTksI(6Mc(%0;l*L<4^m} zq|!q_-yV?dvw;3GV6vryhBZ4$VR%C6eFu845- z3csl}$ez8tW9h;i16O+19q{!bp zIhWPx7Tx0D8ct{4%O9qswvc@hRPpHR&cr`{1v(!37P=352s#1#6MF@G3m(FJqHj@8 z;Ph}*p6wmU-@9RIt8Yoh&?bh7+lF)o(fRV%9vaX~=r*H%oLcX0ZE;%V%xbGn(`eS? zH*P|KosF{vz4-AKU+YD_bm61?n+{n+=pnAM;Rjzv&>0=W^QZM@(S4;WjCSmfrfrYx zw~TF@N>@pbY0u4BL+5={^v}BF$-2cLskFA2zmc<_9^G(F^WpV-2JCi0J*Nn8UOr&E>gzUb)@?SHXO`3HnwjuD_nref>D^J&2ya-_eDQ(s#{^9=Dx6DVWd1 z)e|;M+U?IKF3GrKaKed|9VczDe-(%B-fT4M)AkJdwaMgl=gtTJ$rIqS;XmQa;8&pI zp>Lu4pogFnus^X^ut&i|m{0UA>It00M-8Lfxv}i>RSA;X(XQ;oTd#IGZFFUmTP~+x zt+1iHUK)?%R6DbE?|DToi$iGT^`FhO3pUb|dhA|i#k$ebw{r{Jw%XIPEVHSrPqgWI zD)(phxZ1P9(WKrED|;5X3GxK^Z1_+3GWZqfc<5W`KIkFf!~Vox0pEg$FrVmK)Dt+Z z#D-Rg+ihg&dnQ`hanAGwZKw72gb~|kqZF`K$B%x}>AO}r!IV9s&=RsiHio`sxx9Bl zWjy`-R>-8vgx=<%3`C8${_asVxN1K%O?KGhme~fPk_&c|Aa65<5vVa z9{Lu#4|)hX0s9ks1$+x0!hE7{QBUCP*ljgR{&@sz^?=H_%F$;>P8gXp%V;jU=uxCp z%V-z6BF?ZkZJ{Y`Rn0CNJ4uRul=IqU$g1tM`dZG(6Ei*OzGq^~S14+-U+0P6QJ!b? zCkI15gxmyq0(>_7Cwv+F3Uoa5Ep#9B5Of0eC-w^X7CeOcMBk#Gz&WpN`S;1QnJPQd=eUIE{NhcKV$ThtRcJJ0(Y z#HYuw>gR0BTay>jvjp?mVC6e}(1K~Sk9goPoYmVbMj@M$BOjD~h zwkRYQyE#kw452ngnjhP;rp;-ZI!%~Uo1J1~M=2+skvaS zW?MNc<-%?r=TG?b{=DDs=j-{o_-sgb{e8J&aQ}_6zO!Mj=fRTElDfRt*VH!c+^_mzG-6DzQEt|ntUG*#t-o(e1e=Uf68U@ z3XaFOxDOBE1pCuoF>lQw{psGSr*n4R-*~I#donz2e%J7^W=}LZ@%!Mz#Imp|mCg0c z_jTvMi}ok+;wUrtXTj?0b$L(C-}0J#9}mV4@g{tNoGpLKW%3G+$G5l-58(v+(_S%e z%_05i-m0f_79U-csJV0|Ozz!zz~d-J?DTwNY3tVkWp`*@z3 zzvVUgJ|2u8;!XGjIa~ge%j6Xtk8g1w9>NLsr@dm{nnU{2y;V==d_NZtnOt8OZo2mD z)7Sct`7&GGThb9#4p-f4EUM4HJMi&5HGj)%@_jrQKg65x339glDVNDBI3C~PK0JgI z>`!~eyfugPr+cfO&RKr3G+n;7KO8Sgo@;&-kE+TFuACY=9C=^y?!d?M)ch^4$@lSK z{19)#C&=0Ir(7nl;COtC`|uD>us`h;^VS^FpYE-CI_KzA+epFsuCVRL((&}^*2p`O z_Z9CBd^}Ih-}0J#9}mV4@g{tNoGpLKW%3G+$G5l-58(v+(_S%e%_05i-m0f_4$VyM R80kI{N +#include + +#include "test_utils.hpp" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef SKALAXC_HAS_MPI +#include +#endif + +namespace { + +using Matrix = Eigen::MatrixXd; +using Result = std::tuple; + +std::string cuda_skala_model() { + return std::string(SKALAXC_MODEL_PATH) + "/skala-1.1-cuda.fun"; +} + +Result evaluate(const SkalaXC::RuntimeEnvironment& runtime, + SkalaXC::ExecutionSpace execution_space, + const SkalaXC::Molecule& molecule, + const SkalaXC::BasisSet& basis, + const std::string& model, const Matrix& scalar_density, + const Matrix& spin_density, bool repeat, + SkalaXC::DomainBatchMode batch_mode = + SkalaXC::DomainBatchMode::Conservative, + SkalaXC::TimingSettings timing_settings = {}, + SkalaXC::DiagnosticsSnapshot* diagnostics = nullptr) { + auto grid = SkalaXC::test::make_molgrid( + molecule, SkalaXC::AtomicGridSizeDefault::UltraFineGrid); + SkalaXC::LoadBalancerFactory load_balancer_factory(execution_space, + "Default"); + auto load_balancer = + load_balancer_factory.get_instance(runtime, molecule, grid, basis); + SkalaXC::MolecularWeightsFactory weights_factory( + execution_space, "Default", SkalaXC::MolecularWeightsSettings{}); + weights_factory.get_instance().modify_weights(load_balancer); + + SkalaXC::XCIntegratorFactory integrator_factory( + execution_space, timing_settings, batch_mode); + auto integrator = integrator_factory.get_instance( + SkalaXC::functional_type(model), load_balancer); + Result result = integrator.eval_exc_vxc(scalar_density, spin_density); + if (repeat) result = integrator.eval_exc_vxc(scalar_density, spin_density); + if (diagnostics) *diagnostics = integrator.diagnostics(); + return result; +} + +std::vector evaluate_gradient( + const SkalaXC::RuntimeEnvironment& runtime, + SkalaXC::ExecutionSpace execution_space, const SkalaXC::Molecule& molecule, + const SkalaXC::BasisSet& basis, const std::string& model, + const Matrix& scalar_density, const Matrix& spin_density, bool repeat, + SkalaXC::DomainBatchMode batch_mode = + SkalaXC::DomainBatchMode::Conservative) { + auto grid = SkalaXC::test::make_molgrid( + molecule, SkalaXC::AtomicGridSizeDefault::FineGrid); + SkalaXC::LoadBalancerFactory load_balancer_factory(execution_space, + "Default"); + auto load_balancer = + load_balancer_factory.get_instance(runtime, molecule, grid, basis); + SkalaXC::MolecularWeightsFactory weights_factory( + execution_space, "Default", SkalaXC::MolecularWeightsSettings{}); + weights_factory.get_instance().modify_weights(load_balancer); + SkalaXC::XCIntegratorFactory integrator_factory( + execution_space, SkalaXC::TimingSettings{}, batch_mode); + auto integrator = integrator_factory.get_instance( + SkalaXC::functional_type(model), load_balancer); + auto result = integrator.eval_exc_grad(scalar_density, spin_density); + if (repeat) result = integrator.eval_exc_grad(scalar_density, spin_density); + return result; +} + +} // namespace + +TEST_CASE("Skala CUDA reproduces host EXC and VXC", + "[skala][cuda][device-reference-integration]") { + const std::string fixture = std::string(SKALAXC_TEST_REF_DATA_PATH) + + "/skala_he_def2qzvp_lda_uks.hdf5"; + const auto system = SkalaXC::test::load_molecular_system(fixture); + const auto density = + SkalaXC::test::load_uks_density(fixture, "/DENSITY_SCALAR", "/DENSITY_Z"); + + SkalaXC::RuntimeEnvironment host_runtime{SKALAXC_MPI_CODE(MPI_COMM_WORLD)}; + SkalaXC::DeviceRuntimeSettings device_settings; + device_settings.device_id = 0; + SkalaXC::RuntimeEnvironment device_runtime{SKALAXC_MPI_CODE(MPI_COMM_WORLD, ) + device_settings}; + + for (const std::string model : {"LDA", "PBE", "TPSS"}) { + const Result host = + evaluate(host_runtime, SkalaXC::ExecutionSpace::Host, system.molecule, + system.basis, model, density.scalar, density.spin, false); + const Result device = evaluate( + device_runtime, SkalaXC::ExecutionSpace::Device, system.molecule, + system.basis, model, density.scalar, density.spin, true); + + const double exc_error = std::abs(std::get<0>(device) - std::get<0>(host)) / + std::max(1.0, std::abs(std::get<0>(host))); + const double scalar_error = SkalaXC::test::matrix_error_per_basis( + std::get<1>(device), std::get<1>(host)); + const double spin_error = SkalaXC::test::matrix_error_per_basis( + std::get<2>(device), std::get<2>(host)); + + INFO("model=" << model); + INFO("device EXC=" << std::get<0>(device) + << " host EXC=" << std::get<0>(host)); + INFO("EXC relative error=" << exc_error); + INFO("scalar VXC norm error / nbf=" << scalar_error); + INFO("z VXC norm error / nbf=" << spin_error); + CHECK(exc_error <= 1e-10); + CHECK(scalar_error <= 1e-7); + CHECK(spin_error <= 1e-10); + } +} + +TEST_CASE("Skala CUDA reproduces host semilocal nuclear gradients", + "[skala][cuda][device-gradient]") { + const auto system = SkalaXC::test::make_rotated_h2_sto3g_system(); + Matrix scalar_density(2, 2); + scalar_density << 0.5, 0.5, 0.5, 0.5; + const Matrix spin_density = Matrix::Zero(2, 2); + + SkalaXC::RuntimeEnvironment host_runtime{SKALAXC_MPI_CODE(MPI_COMM_WORLD)}; + SkalaXC::RuntimeEnvironment device_runtime{ + SKALAXC_MPI_CODE(MPI_COMM_WORLD, ) SkalaXC::DeviceRuntimeSettings{}}; + // The current TPSS trace can exceed sm_120 launch resources in its + // TensorExpr backward kernel. Keep TPSS EXC/VXC coverage above and exercise + // the primary neural model in the isolated test below until TPSS is retraced. + for (const std::string model : {"LDA", "PBE"}) { + INFO("model=" << model); + const auto host = evaluate_gradient( + host_runtime, SkalaXC::ExecutionSpace::Host, system.molecule, + system.basis, model, scalar_density, spin_density, false); + const auto device = evaluate_gradient( + device_runtime, SkalaXC::ExecutionSpace::Device, system.molecule, + system.basis, model, scalar_density, spin_density, true); + REQUIRE(device.size() == host.size()); + double max_error = 0.0; + for (std::size_t index = 0; index < host.size(); ++index) + max_error = std::max(max_error, std::abs(device[index] - host[index])); + INFO("maximum gradient component error=" << max_error); + CHECK(max_error <= 1e-6); + } +} + +TEST_CASE("Skala CUDA evaluates neural nuclear gradients", + "[skala][cuda][device-neural-gradient]") { + const auto system = SkalaXC::test::make_rotated_h2_sto3g_system(); + Matrix scalar_density(2, 2); + scalar_density << 0.5, 0.5, 0.5, 0.5; + const Matrix spin_density = Matrix::Zero(2, 2); + SkalaXC::RuntimeEnvironment runtime{SKALAXC_MPI_CODE(MPI_COMM_WORLD, ) + SkalaXC::DeviceRuntimeSettings{}}; + + const auto gradient = evaluate_gradient( + runtime, SkalaXC::ExecutionSpace::Device, system.molecule, system.basis, + cuda_skala_model(), scalar_density, spin_density, false); + REQUIRE(gradient.size() == 3 * system.molecule.size()); + double squared_norm = 0.0; + std::array translation{}; + for (std::size_t index = 0; index < gradient.size(); ++index) { + REQUIRE(std::isfinite(gradient[index])); + squared_norm += gradient[index] * gradient[index]; + translation[index % translation.size()] += gradient[index]; + } + CHECK(squared_norm > 1e-6); + for (const double component : translation) + CHECK(std::abs(component) <= 1e-10); +} + +TEST_CASE("Skala CUDA exact-size batching modes agree", + "[skala][cuda][device-batching]") { + const auto system = SkalaXC::test::make_rotated_h2_sto3g_system(); + Matrix scalar_density(2, 2); + scalar_density << 0.5, 0.5, 0.5, 0.5; + const Matrix spin_density = Matrix::Zero(2, 2); + const std::string model = "PBE"; + SkalaXC::RuntimeEnvironment runtime{SKALAXC_MPI_CODE(MPI_COMM_WORLD, ) + SkalaXC::DeviceRuntimeSettings{}}; + + const auto conservative = + evaluate(runtime, SkalaXC::ExecutionSpace::Device, system.molecule, + system.basis, model, scalar_density, spin_density, false, + SkalaXC::DomainBatchMode::Conservative); + SkalaXC::DiagnosticsSnapshot aggressive_diagnostics; + SkalaXC::TimingSettings debug_settings; + debug_settings.debug_logging = true; + const auto aggressive = + evaluate(runtime, SkalaXC::ExecutionSpace::Device, system.molecule, + system.basis, model, scalar_density, spin_density, false, + SkalaXC::DomainBatchMode::Aggressive, debug_settings, + &aggressive_diagnostics); + CHECK(std::abs(std::get<0>(aggressive) - std::get<0>(conservative)) <= 1e-10); + CHECK(SkalaXC::test::matrix_error_per_basis( + std::get<1>(aggressive), std::get<1>(conservative)) <= 1e-7); + CHECK(SkalaXC::test::matrix_error_per_basis( + std::get<2>(aggressive), std::get<2>(conservative)) <= 1e-10); + CHECK(aggressive_diagnostics.device_id == 0); + CHECK(aggressive_diagnostics.device_memory_fraction == Approx(0.75)); + CHECK(aggressive_diagnostics.domain_batch_mode == + SkalaXC::DomainBatchMode::Aggressive); + CHECK(aggressive_diagnostics.local_atoms == system.molecule.size()); + CHECK(aggressive_diagnostics.configured_model_batches == 1); + CHECK(aggressive_diagnostics.max_domains_per_model_batch == + system.molecule.size()); + CHECK( + aggressive_diagnostics.timing(SkalaXC::TimingMetric::ModelLoad).status == + SkalaXC::TimingStatus::Complete); + + const auto conservative_gradient = evaluate_gradient( + runtime, SkalaXC::ExecutionSpace::Device, system.molecule, system.basis, + model, scalar_density, spin_density, false, + SkalaXC::DomainBatchMode::Conservative); + const auto aggressive_gradient = evaluate_gradient( + runtime, SkalaXC::ExecutionSpace::Device, system.molecule, system.basis, + model, scalar_density, spin_density, false, + SkalaXC::DomainBatchMode::Aggressive); + REQUIRE(aggressive_gradient.size() == conservative_gradient.size()); + for (std::size_t index = 0; index < aggressive_gradient.size(); ++index) + CHECK(std::abs(aggressive_gradient[index] - conservative_gradient[index]) <= + 1e-6); +} + +TEST_CASE("Skala CUDA restores a non-default caller Torch stream", + "[skala][cuda][stream]") { + const auto system = SkalaXC::test::make_rotated_h2_sto3g_system(); + Matrix scalar_density(2, 2); + scalar_density << 0.5, 0.5, 0.5, 0.5; + const Matrix spin_density = Matrix::Zero(2, 2); + + SkalaXC::DeviceRuntimeSettings device_settings; + device_settings.device_id = 0; + SkalaXC::RuntimeEnvironment runtime{SKALAXC_MPI_CODE(MPI_COMM_WORLD, ) + device_settings}; + auto grid = SkalaXC::test::make_molgrid( + system.molecule, SkalaXC::AtomicGridSizeDefault::FineGrid); + SkalaXC::LoadBalancerFactory load_balancer_factory( + SkalaXC::ExecutionSpace::Device, "Default"); + auto load_balancer = load_balancer_factory.get_instance( + runtime, system.molecule, grid, system.basis); + SkalaXC::MolecularWeightsFactory weights_factory( + SkalaXC::ExecutionSpace::Device, "Default", + SkalaXC::MolecularWeightsSettings{}); + weights_factory.get_instance().modify_weights(load_balancer); + + const auto original_stream = + c10::cuda::getCurrentCUDAStream(device_settings.device_id); + const auto caller_stream = + c10::cuda::getStreamFromPool(false, device_settings.device_id); + REQUIRE(caller_stream != + c10::cuda::getDefaultCUDAStream(device_settings.device_id)); + + { + const c10::cuda::CUDAStreamGuard caller_guard(caller_stream); + REQUIRE(c10::cuda::getCurrentCUDAStream(device_settings.device_id) == + caller_stream); + + SkalaXC::XCIntegratorFactory integrator_factory( + SkalaXC::ExecutionSpace::Device, SkalaXC::TimingSettings{}, + SkalaXC::DomainBatchMode::Aggressive); + auto integrator = integrator_factory.get_instance( + SkalaXC::functional_type("PBE"), load_balancer); + CHECK(c10::cuda::getCurrentCUDAStream(device_settings.device_id) == + caller_stream); + + const auto first = integrator.eval_exc_vxc(scalar_density, spin_density); + CHECK(c10::cuda::getCurrentCUDAStream(device_settings.device_id) == + caller_stream); + const auto second = integrator.eval_exc_vxc(scalar_density, spin_density); + CHECK(c10::cuda::getCurrentCUDAStream(device_settings.device_id) == + caller_stream); + CHECK(std::abs(std::get<0>(second) - std::get<0>(first)) <= 1e-10); + CHECK(SkalaXC::test::matrix_error_per_basis(std::get<1>(second), + std::get<1>(first)) <= 1e-7); + CHECK(SkalaXC::test::matrix_error_per_basis(std::get<2>(second), + std::get<2>(first)) <= 1e-10); + + const auto first_gradient = + integrator.eval_exc_grad(scalar_density, spin_density); + CHECK(c10::cuda::getCurrentCUDAStream(device_settings.device_id) == + caller_stream); + const auto second_gradient = + integrator.eval_exc_grad(scalar_density, spin_density); + CHECK(c10::cuda::getCurrentCUDAStream(device_settings.device_id) == + caller_stream); + REQUIRE(second_gradient.size() == first_gradient.size()); + for (std::size_t index = 0; index < first_gradient.size(); ++index) + CHECK(std::abs(second_gradient[index] - first_gradient[index]) <= 1e-6); + + Matrix invalid_density = scalar_density; + invalid_density(0, 0) = std::numeric_limits::quiet_NaN(); + CHECK_THROWS_AS(integrator.eval_exc_vxc(invalid_density, spin_density), + SkalaXC::Exception); + CHECK(c10::cuda::getCurrentCUDAStream(device_settings.device_id) == + caller_stream); + CHECK_THROWS_AS(integrator.eval_exc_grad(invalid_density, spin_density), + SkalaXC::Exception); + CHECK(c10::cuda::getCurrentCUDAStream(device_settings.device_id) == + caller_stream); + } + + CHECK(c10::cuda::getCurrentCUDAStream(device_settings.device_id) == + original_stream); +} + +TEST_CASE("Skala CUDA supports an MPI rank with no atomic domains", + "[skala][cuda][mpi][device-idle-rank][mpi-only]") { +#ifdef SKALAXC_HAS_MPI + int world_rank = 0; + int world_size = 1; + MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); + MPI_Comm_size(MPI_COMM_WORLD, &world_size); + if (world_size < 3) { + SUCCEED("Requires at least three MPI ranks"); + return; + } + + MPI_Comm subcomm = MPI_COMM_NULL; + MPI_Comm_split(MPI_COMM_WORLD, world_rank < 3 ? 0 : MPI_UNDEFINED, world_rank, + &subcomm); + if (subcomm == MPI_COMM_NULL) { + SUCCEED("Only the first three ranks participate"); + return; + } + + MPI_Comm local_comm = MPI_COMM_NULL; + REQUIRE(MPI_Comm_split_type(subcomm, MPI_COMM_TYPE_SHARED, world_rank, + MPI_INFO_NULL, &local_comm) == MPI_SUCCESS); + int local_rank = 0; + int local_size = 1; + MPI_Comm_rank(local_comm, &local_rank); + MPI_Comm_size(local_comm, &local_size); + int device_count = 0; + REQUIRE(cudaGetDeviceCount(&device_count) == cudaSuccess); + REQUIRE(device_count > 0); + const int ranks_per_device = (local_size + device_count - 1) / device_count; + SkalaXC::DeviceRuntimeSettings device_settings; + device_settings.device_id = local_rank % device_count; + device_settings.memory_fraction = 0.8 / ranks_per_device; + MPI_Comm_free(&local_comm); + + const auto system = SkalaXC::test::make_rotated_h2_sto3g_system(); + Matrix scalar_density(2, 2); + scalar_density << 0.5, 0.5, 0.5, 0.5; + const Matrix spin_density = Matrix::Zero(2, 2); + + SkalaXC::RuntimeEnvironment host_runtime{subcomm}; + SkalaXC::RuntimeEnvironment device_runtime{subcomm, device_settings}; + const auto host = + evaluate(host_runtime, SkalaXC::ExecutionSpace::Host, system.molecule, + system.basis, "PBE", scalar_density, spin_density, false); + const auto device = + evaluate(device_runtime, SkalaXC::ExecutionSpace::Device, system.molecule, + system.basis, "PBE", scalar_density, spin_density, false); + const auto host_gradient = evaluate_gradient( + host_runtime, SkalaXC::ExecutionSpace::Host, system.molecule, + system.basis, "PBE", scalar_density, spin_density, false); + const auto device_gradient = evaluate_gradient( + device_runtime, SkalaXC::ExecutionSpace::Device, system.molecule, + system.basis, "PBE", scalar_density, spin_density, false); + + CHECK(std::abs(std::get<0>(device) - std::get<0>(host)) <= 1e-10); + CHECK(SkalaXC::test::matrix_error_per_basis(std::get<1>(device), + std::get<1>(host)) <= 1e-7); + CHECK(SkalaXC::test::matrix_error_per_basis(std::get<2>(device), + std::get<2>(host)) <= 1e-10); + REQUIRE(device_gradient.size() == host_gradient.size()); + for (std::size_t index = 0; index < host_gradient.size(); ++index) + CHECK(std::abs(device_gradient[index] - host_gradient[index]) <= 1e-6); + MPI_Comm_free(&subcomm); +#else + SUCCEED("MPI disabled"); +#endif +} + +TEST_CASE("Skala CUDA uses the runtime MPI subcommunicator", + "[skala][cuda][mpi][subcomm][device-subcomm][mpi-only]") { +#ifdef SKALAXC_HAS_MPI + int world_rank = 0; + int world_size = 1; + MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); + MPI_Comm_size(MPI_COMM_WORLD, &world_size); + if (world_size < 4) { + SUCCEED("Requires at least four MPI ranks"); + return; + } + + const int color = world_rank % 2; + MPI_Comm subcomm = MPI_COMM_NULL; + MPI_Comm_split(MPI_COMM_WORLD, color, world_rank, &subcomm); + + MPI_Comm local_comm = MPI_COMM_NULL; + REQUIRE(MPI_Comm_split_type(MPI_COMM_WORLD, MPI_COMM_TYPE_SHARED, world_rank, + MPI_INFO_NULL, &local_comm) == MPI_SUCCESS); + int local_rank = 0; + int local_size = 1; + MPI_Comm_rank(local_comm, &local_rank); + MPI_Comm_size(local_comm, &local_size); + int device_count = 0; + REQUIRE(cudaGetDeviceCount(&device_count) == cudaSuccess); + REQUIRE(device_count > 0); + const int ranks_per_device = (local_size + device_count - 1) / device_count; + SkalaXC::DeviceRuntimeSettings device_settings; + device_settings.device_id = local_rank % device_count; + device_settings.memory_fraction = 0.8 / ranks_per_device; + MPI_Comm_free(&local_comm); + + const double displacement = 0.04 * color; + const auto system = SkalaXC::test::make_rotated_h2_sto3g_system(displacement); + Matrix scalar_density(2, 2); + scalar_density << 0.5 + 0.02 * color, 0.5, 0.5, 0.5 - 0.02 * color; + const Matrix spin_density = Matrix::Zero(2, 2); + + SkalaXC::RuntimeEnvironment host_runtime{subcomm}; + SkalaXC::RuntimeEnvironment device_runtime{subcomm, device_settings}; + const auto host = + evaluate(host_runtime, SkalaXC::ExecutionSpace::Host, system.molecule, + system.basis, "PBE", scalar_density, spin_density, false); + const auto device = + evaluate(device_runtime, SkalaXC::ExecutionSpace::Device, system.molecule, + system.basis, "PBE", scalar_density, spin_density, true); + const auto host_gradient = evaluate_gradient( + host_runtime, SkalaXC::ExecutionSpace::Host, system.molecule, + system.basis, "PBE", scalar_density, spin_density, false); + const auto device_gradient = evaluate_gradient( + device_runtime, SkalaXC::ExecutionSpace::Device, system.molecule, + system.basis, "PBE", scalar_density, spin_density, true); + + const double exc_error = std::abs(std::get<0>(device) - std::get<0>(host)) / + std::max(1.0, std::abs(std::get<0>(host))); + const double scalar_error = SkalaXC::test::matrix_error_per_basis( + std::get<1>(device), std::get<1>(host)); + const double spin_error = SkalaXC::test::matrix_error_per_basis( + std::get<2>(device), std::get<2>(host)); + REQUIRE(device_gradient.size() == host_gradient.size()); + double gradient_error = 0.0; + for (std::size_t index = 0; index < host_gradient.size(); ++index) + gradient_error = std::max(gradient_error, std::abs(device_gradient[index] - + host_gradient[index])); + + INFO("subcommunicator color=" << color); + INFO("CUDA device=" << device_settings.device_id); + CHECK(exc_error <= 1e-10); + CHECK(scalar_error <= 1e-7); + CHECK(spin_error <= 1e-10); + CHECK(gradient_error <= 1e-6); + MPI_Comm_free(&subcomm); +#else + SUCCEED("MPI disabled"); +#endif +} diff --git a/SkalaXC/tests/skala_host_mpi_test.cxx b/SkalaXC/tests/skala_host_mpi_test.cxx new file mode 100644 index 00000000..b9179213 --- /dev/null +++ b/SkalaXC/tests/skala_host_mpi_test.cxx @@ -0,0 +1,111 @@ +#include + +#include + +#include "test_utils.hpp" + +#include + +#include +#include +#include +#include + +#ifdef SKALAXC_HAS_MPI +#include +#endif + +namespace { + +using Matrix = Eigen::MatrixXd; + +struct HostEvaluation { + double exc; + Matrix scalar_potential; + Matrix spin_potential; + std::vector gradient; +}; + +HostEvaluation evaluate_host(const SkalaXC::RuntimeEnvironment& runtime, + const SkalaXC::Molecule& molecule, + const SkalaXC::BasisSet& basis, + const Matrix& scalar_density, + const Matrix& spin_density) { + auto grid = SkalaXC::test::make_molgrid( + molecule, SkalaXC::AtomicGridSizeDefault::FineGrid); + SkalaXC::LoadBalancerFactory load_balancer_factory( + SkalaXC::ExecutionSpace::Host); + auto load_balancer = + load_balancer_factory.get_instance(runtime, molecule, grid, basis); + SkalaXC::MolecularWeightsFactory weights_factory( + SkalaXC::ExecutionSpace::Host, "Default", + SkalaXC::MolecularWeightsSettings{}); + weights_factory.get_instance().modify_weights(load_balancer); + SkalaXC::XCIntegratorFactory integrator_factory( + SkalaXC::ExecutionSpace::Host); + auto integrator = integrator_factory.get_instance( + SkalaXC::functional_type("TPSS"), load_balancer); + auto [exc, scalar_potential, spin_potential] = + integrator.eval_exc_vxc(scalar_density, spin_density); + auto gradient = integrator.eval_exc_grad(scalar_density, spin_density); + return HostEvaluation{exc, std::move(scalar_potential), + std::move(spin_potential), std::move(gradient)}; +} + +} // namespace + +TEST_CASE("Skala host evaluation uses the runtime MPI subcommunicator", + "[skala][mpi][host-subcomm][mpi-only]") { +#ifdef SKALAXC_HAS_MPI + int world_rank = 0; + int world_size = 1; + MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); + MPI_Comm_size(MPI_COMM_WORLD, &world_size); + if (world_size < 4) { + SUCCEED("Requires at least four MPI ranks"); + return; + } + + const int color = world_rank % 2; + MPI_Comm subcomm = MPI_COMM_NULL; + REQUIRE(MPI_Comm_split(MPI_COMM_WORLD, color, world_rank, &subcomm) == + MPI_SUCCESS); + + const double displacement = 0.04 * color; + const auto system = SkalaXC::test::make_rotated_h2_sto3g_system(displacement); + Matrix scalar_density(2, 2); + scalar_density << 0.5 + 0.02 * color, 0.5, 0.5, 0.5 - 0.02 * color; + const Matrix spin_density = Matrix::Zero(2, 2); + + const SkalaXC::RuntimeEnvironment subcomm_runtime{subcomm}; + const SkalaXC::RuntimeEnvironment self_runtime{MPI_COMM_SELF}; + const auto subcomm_result = + evaluate_host(subcomm_runtime, system.molecule, system.basis, + scalar_density, spin_density); + const auto self_result = + evaluate_host(self_runtime, system.molecule, system.basis, scalar_density, + spin_density); + + const double exc_error = std::abs(subcomm_result.exc - self_result.exc) / + std::max(1.0, std::abs(self_result.exc)); + const double scalar_error = SkalaXC::test::matrix_error_per_basis( + subcomm_result.scalar_potential, self_result.scalar_potential); + const double spin_error = SkalaXC::test::matrix_error_per_basis( + subcomm_result.spin_potential, self_result.spin_potential); + REQUIRE(subcomm_result.gradient.size() == self_result.gradient.size()); + double gradient_error = 0.0; + for (std::size_t index = 0; index < self_result.gradient.size(); ++index) + gradient_error = std::max( + gradient_error, + std::abs(subcomm_result.gradient[index] - self_result.gradient[index])); + + INFO("subcommunicator color=" << color); + CHECK(exc_error <= 1e-10); + CHECK(scalar_error <= 1e-7); + CHECK(spin_error <= 1e-10); + CHECK(gradient_error <= 1e-8); + MPI_Comm_free(&subcomm); +#else + SUCCEED("MPI disabled"); +#endif +} \ No newline at end of file diff --git a/SkalaXC/tests/skala_host_test.cxx b/SkalaXC/tests/skala_host_test.cxx new file mode 100644 index 00000000..02597b29 --- /dev/null +++ b/SkalaXC/tests/skala_host_test.cxx @@ -0,0 +1,478 @@ +// SkalaXC host reference-integration harness (white-box: uses GauXC types +// in-build). +// +// Reads the HDF5 reference fixtures produced by the GauXC/skala OneDFT test +// suite (renamed skala_*), drives SkalaHostDriver::eval_exc_vxc_uks, and checks +// EXC + VXC against the stored reference values. This numerically validates the +// host ML port independently of any public SkalaXC API. + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "skala_host_driver.hpp" +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +using namespace SkalaXC; + +namespace { + +/** @brief Numerical errors produced by one host EXC/VXC reference evaluation. + */ +struct CaseResult { + double exc, exc_ref, exc_rel_err; + double vxcs_err, vxcz_err; // frobenius(diff) / nbf + int64_t nbf; +}; + +/** + * @brief Evaluate one reference fixture through the standalone host driver. + * @param fixture HDF5 file containing the system, density, and EXC/VXC values. + * @param model Skala model identifier. + * @param rt Runtime environment used by the host driver. + * @return Computed values and normalized errors against the fixture. + */ +CaseResult run_case(const std::string& fixture, const std::string& model, + const GauXC::RuntimeEnvironment& rt, + SkalaXC::TimingSettings timing_settings = {}) { + + GauXC::Molecule mol; + GauXC::BasisSet basis; + GauXC::read_hdf5_record(mol, fixture, "/MOLECULE"); + GauXC::read_hdf5_record(basis, fixture, "/BASIS"); + + HighFive::File file(fixture, HighFive::File::ReadOnly); + auto dsetP = file.getDataSet("/DENSITY_SCALAR"); + auto dims = dsetP.getDimensions(); + const int64_t nbf = static_cast(dims[0]); + const size_t n2 = dims[0] * dims[1]; + + std::vector Ps(n2), Pz(n2), VXCs_ref(n2), VXCz_ref(n2); + dsetP.read(Ps.data()); + file.getDataSet("/DENSITY_Z").read(Pz.data()); + file.getDataSet("/VXC_SCALAR").read(VXCs_ref.data()); + file.getDataSet("/VXC_Z").read(VXCz_ref.data()); + double EXC_ref = 0.0; + file.getDataSet("/EXC").read(&EXC_ref); + + auto mg = GauXC::MolGridFactory::create_default_molgrid( + mol, GauXC::PruningScheme::Unpruned, GauXC::BatchSize(512), + GauXC::RadialQuad::MuraKnowles, + GauXC::AtomicGridSizeDefault::UltraFineGrid); + + auto driver = SkalaHostDriver::from_system(rt, mol, mg, basis, model, + DomainBatchMode::Conservative, + timing_settings); + + std::vector VXCs(n2, 0.0), VXCz(n2, 0.0); + + const Eigen::Map scalar_density(Ps.data(), nbf, nbf); + const Eigen::Map spin_density(Pz.data(), nbf, nbf); + Eigen::Map scalar_potential(VXCs.data(), nbf, nbf); + Eigen::Map spin_potential(VXCz.data(), nbf, nbf); + const double EXC = driver.eval_exc_vxc_uks(scalar_density, spin_density, + scalar_potential, spin_potential); + + auto frob_diff = [nbf](const std::vector& a, + const std::vector& b) { + double s = 0.0; + for (size_t i = 0; i < a.size(); ++i) { + const double d = a[i] - b[i]; + s += d * d; + } + return std::sqrt(s) / static_cast(nbf); + }; + + CaseResult r; + r.nbf = nbf; + r.exc = EXC; + r.exc_ref = EXC_ref; + r.exc_rel_err = std::abs(EXC - EXC_ref) / std::max(1.0, std::abs(EXC_ref)); + r.vxcs_err = frob_diff(VXCs, VXCs_ref); + r.vxcz_err = frob_diff(VXCz, VXCz_ref); + return r; +} + +/** @brief Ridders derivative estimate and its local extrapolation error. */ +struct RiddersResult { + double derivative; + double error; +}; + +/** + * @brief Estimate a scalar function's derivative at zero with Ridders' method. + * + * Each row starts from a centered difference with step + * `initial_step / ratio^row`. Richardson extrapolation then cancels successive + * even powers of the step. The returned estimate is the table entry with the + * smallest change relative to its two direct predecessors. + * + * @tparam Function Callable accepting a signed displacement and returning the + * scalar function value. + * @param function Function to differentiate. + * @param initial_step Largest centered-difference displacement. + * @param levels Number of centered differences and extrapolation rows. + * @param ratio Factor by which the step decreases between rows. + * @return Best derivative and conservative local error estimate found. + */ +template +RiddersResult ridders_derivative(Function&& function, double initial_step, + int levels = 3, double ratio = 1.4) { + std::vector> table(levels, + std::vector(levels, 0.0)); + RiddersResult result{0.0, std::numeric_limits::infinity()}; + + double step = initial_step; + for (int row = 0; row < levels; ++row) { + table[row][0] = (function(step) - function(-step)) / (2.0 * step); + if (row == 0) result.derivative = table[row][0]; + + double factor = ratio * ratio; + for (int column = 1; column <= row; ++column) { + table[row][column] = + (factor * table[row][column - 1] - table[row - 1][column - 1]) / + (factor - 1.0); + const double error = + std::max(std::abs(table[row][column] - table[row][column - 1]), + std::abs(table[row][column] - table[row - 1][column - 1])); + if (error < result.error) { + result.derivative = table[row][column]; + result.error = error; + } + factor *= ratio * ratio; + } + step /= ratio; + } + return result; +} + +/** + * @brief Evaluate EXC after a collective nuclear displacement. + * + * Nuclear coordinates and their atom-centered basis shells move together so + * the finite difference contains the same basis Pulay contribution as the + * analytic gradient. The AO density coefficients are intentionally held fixed. + * A fresh molecular grid and host driver are built for every displacement. + * + * @param rt Runtime environment used by the host driver. + * @param molecule Undisplaced molecular geometry. + * @param basis Undisplaced atom-centered AO basis. + * @param shell_centers Map from each shell to its parent atom. + * @param direction Atom-major Cartesian displacement direction. + * @param displacement Signed displacement magnitude along `direction`. + * @param nbf Number of AO basis functions. + * @param Ps Fixed scalar-spin AO density matrix. + * @param Pz Fixed z-spin AO density matrix. + * @param settings Skala model settings. + * @param grid_size Atomic integration-grid preset. + * @return Exchange-correlation energy at the displaced geometry. + */ +double displaced_exc(const GauXC::RuntimeEnvironment& rt, + const GauXC::Molecule& molecule, + const GauXC::BasisSet& basis, + const std::vector& shell_centers, + const std::vector& direction, double displacement, + int64_t nbf, const std::vector& Ps, + const std::vector& Pz, const std::string& model, + GauXC::AtomicGridSizeDefault grid_size) { + GauXC::Molecule displaced_molecule = molecule; + GauXC::BasisSet displaced_basis = basis; + for (std::size_t atom = 0; atom < displaced_molecule.size(); ++atom) { + displaced_molecule[atom].x += displacement * direction[3 * atom]; + displaced_molecule[atom].y += displacement * direction[3 * atom + 1]; + displaced_molecule[atom].z += displacement * direction[3 * atom + 2]; + } + + // Moving shells with their parent nuclei is essential for the Pulay term. + for (std::size_t shell = 0; shell < displaced_basis.size(); ++shell) { + const int32_t atom = shell_centers[shell]; + if (atom < 0) throw std::runtime_error("Basis shell is not atom-centered"); + for (int xyz = 0; xyz < 3; ++xyz) + displaced_basis[shell].O()[xyz] += + displacement * direction[3 * atom + xyz]; + } + + auto grid = GauXC::MolGridFactory::create_default_molgrid( + displaced_molecule, GauXC::PruningScheme::Unpruned, GauXC::BatchSize(512), + GauXC::RadialQuad::MuraKnowles, grid_size); + auto driver = SkalaHostDriver::from_system(rt, displaced_molecule, grid, + displaced_basis, model); + std::vector VXCs(Ps.size()), VXCz(Ps.size()); + const Eigen::Map scalar_density(Ps.data(), nbf, nbf); + const Eigen::Map spin_density(Pz.data(), nbf, nbf); + Eigen::Map scalar_potential(VXCs.data(), nbf, nbf); + Eigen::Map spin_potential(VXCz.data(), nbf, nbf); + return driver.eval_exc_vxc_uks(scalar_density, spin_density, scalar_potential, + spin_potential); +} + +} // namespace + +TEST_CASE("Skala host reference integration", + "[skala][host-reference-integration]") { + GauXC::RuntimeEnvironment rt{GAUXC_MPI_CODE(MPI_COMM_WORLD)}; + + const std::string ref_dir = std::string(SKALAXC_TEST_REF_DATA_PATH); + + struct Fixture { + const char* name; + const char* file; + const char* model; + }; + const std::vector fixtures = { + {"HE / def2-qzvp / lda", "/skala_he_def2qzvp_lda_uks.hdf5", "LDA"}, + {"HE / def2-qzvp / pbe", "/skala_he_def2qzvp_pbe_uks.hdf5", "PBE"}, + {"HE / def2-qzvp / tpss", "/skala_he_def2qzvp_tpss_uks.hdf5", "TPSS"}, + }; + + // Reference thresholds (mirror the GauXC/skala reference test exactly): + // EXC == Approx(EXC_ref); |VXC_SCALAR-ref|/nbf < 1e-7; |VXC_Z-ref|/nbf < + // 1e-10. + const double exc_rel_tol = 1e-5; + const double vxcs_tol = 1e-7; + const double vxcz_tol = 1e-10; + + for (const auto& fx : fixtures) { + SECTION(fx.name) { + const CaseResult r = run_case(ref_dir + fx.file, fx.model, rt); + + INFO("nbf=" << static_cast(r.nbf)); + INFO("EXC=" << r.exc << " EXC_ref=" << r.exc_ref); + INFO("exc_rel_err=" << r.exc_rel_err); + INFO("vxcs_err=" << r.vxcs_err); + INFO("vxcz_err=" << r.vxcz_err); + + CHECK(r.exc_rel_err < exc_rel_tol); + CHECK(r.vxcs_err < vxcs_tol); + CHECK(r.vxcz_err < vxcz_tol); + } + } +} + +TEST_CASE("Debug logging preserves host results", "[skala][debug-logging]") { + GauXC::RuntimeEnvironment runtime{GAUXC_MPI_CODE(MPI_COMM_WORLD)}; + const std::string fixture = std::string(SKALAXC_TEST_REF_DATA_PATH) + + "/skala_he_def2qzvp_lda_uks.hdf5"; + const auto quiet = run_case(fixture, "LDA", runtime); + SkalaXC::TimingSettings settings; + settings.debug_logging = true; + const auto logged = run_case(fixture, "LDA", runtime, settings); + CHECK(logged.exc == Approx(quiet.exc).epsilon(1e-13)); + CHECK(logged.vxcs_err == Approx(quiet.vxcs_err).margin(1e-13)); + CHECK(logged.vxcz_err == Approx(quiet.vxcz_err).margin(1e-13)); +} + +TEST_CASE("Host domain batching modes are numerically equivalent", + "[skala][host-batching]") { + GauXC::RuntimeEnvironment rt{GAUXC_MPI_CODE(MPI_COMM_WORLD)}; + const std::string fixture = + std::string(SKALAXC_GAUXC_REF_DATA_PATH) + "/h2o2_def2-tzvp.hdf5"; + + GauXC::Molecule molecule; + GauXC::BasisSet basis; + GauXC::read_hdf5_record(molecule, fixture, "/MOLECULE"); + GauXC::read_hdf5_record(basis, fixture, "/BASIS"); + HighFive::File file(fixture, HighFive::File::ReadOnly); + auto density_data = file.getDataSet("/DENSITY"); + const auto dimensions = density_data.getDimensions(); + const Eigen::Index nbf = static_cast(dimensions[0]); + std::vector scalar_density_data(dimensions[0] * dimensions[1]); + std::vector spin_density_data(scalar_density_data.size(), 0.0); + density_data.read(scalar_density_data.data()); + + auto grid = GauXC::MolGridFactory::create_default_molgrid( + molecule, GauXC::PruningScheme::Unpruned, GauXC::BatchSize(512), + GauXC::RadialQuad::MuraKnowles, + GauXC::AtomicGridSizeDefault::UltraFineGrid); + auto conservative = SkalaHostDriver::from_system( + rt, molecule, grid, basis, "PBE", DomainBatchMode::Conservative); + auto aggressive = SkalaHostDriver::from_system( + rt, molecule, grid, basis, "PBE", DomainBatchMode::Aggressive); + + const Eigen::Map scalar_density( + scalar_density_data.data(), nbf, nbf); + const Eigen::Map spin_density(spin_density_data.data(), + nbf, nbf); + ColMajorMatrix conservative_scalar(nbf, nbf), conservative_spin(nbf, nbf); + ColMajorMatrix aggressive_scalar(nbf, nbf), aggressive_spin(nbf, nbf); + const double conservative_exc = conservative.eval_exc_vxc_uks( + scalar_density, spin_density, + ColMajorMatrixMap(conservative_scalar.data(), nbf, nbf), + ColMajorMatrixMap(conservative_spin.data(), nbf, nbf)); + const double aggressive_exc = aggressive.eval_exc_vxc_uks( + scalar_density, spin_density, + ColMajorMatrixMap(aggressive_scalar.data(), nbf, nbf), + ColMajorMatrixMap(aggressive_spin.data(), nbf, nbf)); + + RowMajorMatrix conservative_gradient(molecule.natoms(), 3); + RowMajorMatrix aggressive_gradient(molecule.natoms(), 3); + conservative.eval_exc_grad_uks( + scalar_density, spin_density, + RowMajorMatrixMap(conservative_gradient.data(), molecule.natoms(), 3)); + aggressive.eval_exc_grad_uks( + scalar_density, spin_density, + RowMajorMatrixMap(aggressive_gradient.data(), molecule.natoms(), 3)); + + CHECK(aggressive_exc == Approx(conservative_exc).epsilon(1e-12)); + CHECK(aggressive_scalar.isApprox(conservative_scalar, 1e-11)); + CHECK(aggressive_spin.isApprox(conservative_spin, 1e-11)); + CHECK(aggressive_gradient.isApprox(conservative_gradient, 1e-10)); + const auto conservative_diagnostics = conservative.diagnostics(); + const auto aggressive_diagnostics = aggressive.diagnostics(); + CHECK(conservative_diagnostics.domains == molecule.natoms() * 2); + CHECK(conservative_diagnostics.model_batches == molecule.natoms() * 2); + CHECK(aggressive_diagnostics.domains == molecule.natoms() * 2); + CHECK(aggressive_diagnostics.model_batches == 2); + CHECK(conservative_diagnostics.configured_model_batches == molecule.natoms()); + CHECK(conservative_diagnostics.max_domains_per_model_batch == 1); + CHECK(aggressive_diagnostics.configured_model_batches == 1); + CHECK(aggressive_diagnostics.max_domains_per_model_batch == + molecule.natoms()); + CHECK(conservative_diagnostics.task_points_min > 0); + CHECK(conservative_diagnostics.task_points_max >= + conservative_diagnostics.task_points_min); +} + +TEST_CASE("Skala host gradient", "[skala][host-gradient]") { + GauXC::RuntimeEnvironment rt{GAUXC_MPI_CODE(MPI_COMM_WORLD)}; + const std::string fixture = + std::string(SKALAXC_GAUXC_REF_DATA_PATH) + "/h2o2_def2-tzvp.hdf5"; + + GauXC::Molecule mol; + GauXC::BasisSet basis; + GauXC::read_hdf5_record(mol, fixture, "/MOLECULE"); + GauXC::read_hdf5_record(basis, fixture, "/BASIS"); + + HighFive::File file(fixture, HighFive::File::ReadOnly); + auto density = file.getDataSet("/DENSITY"); + auto dims = density.getDimensions(); + const int64_t nbf = static_cast(dims[0]); + std::vector Ps(dims[0] * dims[1]); + std::vector Pz(Ps.size(), 0.0); + density.read(Ps.data()); + + auto mg = GauXC::MolGridFactory::create_default_molgrid( + mol, GauXC::PruningScheme::Unpruned, GauXC::BatchSize(512), + GauXC::RadialQuad::MuraKnowles, + GauXC::AtomicGridSizeDefault::UltraFineGrid); + auto driver = SkalaHostDriver::from_system(rt, mol, mg, basis, "TPSS"); + + std::vector gradient(3 * mol.size()); + const Eigen::Map scalar_density(Ps.data(), nbf, nbf); + const Eigen::Map spin_density(Pz.data(), nbf, nbf); + Eigen::Map gradient_matrix(gradient.data(), mol.size(), 3); + driver.eval_exc_grad_uks(scalar_density, spin_density, gradient_matrix); + + double squared_norm = 0.0; + double translation[3] = {0.0, 0.0, 0.0}; + for (std::size_t i = 0; i < gradient.size(); ++i) { + const double value = gradient[i]; + INFO("gradient component=" << value); + CHECK(std::isfinite(value)); + squared_norm += value * value; + translation[i % 3] += value; + } + CHECK(std::sqrt(squared_norm) > 1e-3); + CHECK(std::abs(translation[0]) < 1e-10); + CHECK(std::abs(translation[1]) < 1e-10); + CHECK(std::abs(translation[2]) < 1e-10); +} + +TEST_CASE("Skala host gradient matches a Ridders derivative", + "[skala][gradient-numerical][.slow]") { + GauXC::RuntimeEnvironment rt{GAUXC_MPI_CODE(MPI_COMM_WORLD)}; + + // Rotate a 1.4-bohr H2 bond off-axis so x, y, and z gradient components are + // all exercised by the bond-stretch derivative. + GauXC::Molecule molecule; + molecule.push_back(GauXC::Atom{GauXC::AtomicNumber(1), -0.252, 0.336, -0.56}); + molecule.push_back(GauXC::Atom{GauXC::AtomicNumber(1), 0.252, -0.336, 0.56}); + + // Build one normalized STO-3G 1s shell on each hydrogen in memory. This + // keeps the repeated displaced evaluations practical for routine CI. + GauXC::Shell::prim_array exponents{}; + GauXC::Shell::prim_array coefficients{}; + exponents[0] = 3.42525091; + exponents[1] = 0.62391373; + exponents[2] = 0.16885540; + coefficients[0] = 0.15432897; + coefficients[1] = 0.53532814; + coefficients[2] = 0.44463454; + GauXC::BasisSet basis; + for (const auto& atom : molecule) + basis.emplace_back( + GauXC::PrimSize(3), GauXC::AngularMomentum(0), + GauXC::SphericalType(false), exponents, coefficients, + GauXC::Shell::cart_array{atom.x, atom.y, atom.z}); + GauXC::BasisSetMap basis_map(basis, molecule); + + // Ridders differentiates with fixed AO density coefficients, matching the + // contract of eval_exc_grad_uks. TPSS exercises rho, grad-rho, and tau terms. + const int64_t nbf = basis.nbf(); + std::vector Ps = {0.5, 0.5, 0.5, 0.5}; + std::vector Pz(Ps.size(), 0.0); + + const std::string model = "TPSS"; + const auto grid_size = GauXC::AtomicGridSizeDefault::FineGrid; + auto grid = GauXC::MolGridFactory::create_default_molgrid( + molecule, GauXC::PruningScheme::Unpruned, GauXC::BatchSize(512), + GauXC::RadialQuad::MuraKnowles, grid_size); + auto driver = SkalaHostDriver::from_system(rt, molecule, grid, basis, model); + std::vector gradient(3 * molecule.size()); + const Eigen::Map scalar_density(Ps.data(), nbf, nbf); + const Eigen::Map spin_density(Pz.data(), nbf, nbf); + Eigen::Map gradient_matrix(gradient.data(), molecule.size(), + 3); + driver.eval_exc_grad_uks(scalar_density, spin_density, gradient_matrix); + + // Construct the bond stretch from the atomic positions. Moving the atoms + // equally in opposite directions changes the bond length without translating + // the molecule. Normalization then gives dE/ds = gradient dot direction. + REQUIRE(molecule.size() == 2); + const double dx = molecule[1].x - molecule[0].x; + const double dy = molecule[1].y - molecule[0].y; + const double dz = molecule[1].z - molecule[0].z; + std::vector direction = {-dx, -dy, -dz, dx, dy, dz}; + REQUIRE(direction.size() == gradient.size()); + double direction_norm = 0.0; + for (double value : direction) direction_norm += value * value; + direction_norm = std::sqrt(direction_norm); + REQUIRE(direction_norm > 0.0); + for (double& value : direction) value /= direction_norm; + + double analytic_derivative = 0.0; + for (std::size_t i = 0; i < gradient.size(); ++i) + analytic_derivative += gradient[i] * direction[i]; + + // Numerically differentiate the EXC energy along the bond + // stretch using Ridders' method. + const auto numerical = ridders_derivative( + [&](double displacement) { + return displaced_exc(rt, molecule, basis, basis_map.shell_to_center(), + direction, displacement, nbf, Ps, Pz, model, + grid_size); + }, + 1e-2); + + INFO("analytic directional derivative=" << analytic_derivative); + INFO("Ridders directional derivative=" << numerical.derivative); + INFO("Ridders error estimate=" << numerical.error); + CHECK(std::abs(analytic_derivative) > 1e-3); + CHECK(numerical.error < 1e-7); + CHECK(numerical.derivative == Approx(analytic_derivative).margin(1e-6)); +} diff --git a/SkalaXC/tests/skala_model_unit_test.cxx b/SkalaXC/tests/skala_model_unit_test.cxx new file mode 100644 index 00000000..da7f9305 --- /dev/null +++ b/SkalaXC/tests/skala_model_unit_test.cxx @@ -0,0 +1,373 @@ +#include + +#include "host/skala_util.hpp" +#include "skala_model.hpp" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + +class TempModelDirectory { + public: + TempModelDirectory() { + std::mt19937_64 random(std::random_device{}()); + do { + path_ = std::filesystem::temp_directory_path() / + ("skalaxc-model-test-" + std::to_string(random())); + } while (!std::filesystem::create_directory(path_)); + } + + ~TempModelDirectory() { + std::error_code error; + std::filesystem::remove_all(path_, error); + } + + const std::filesystem::path& path() const noexcept { return path_; } + + private: + std::filesystem::path path_; +}; + +void save_with_metadata(const torch::jit::script::Module& module, + const std::filesystem::path& path, + const std::string& protocol_version, + const std::string& features) { + const torch::jit::ExtraFilesMap extra_files{ + {"protocol_version", protocol_version}, {"features", features}}; + module.save(path.string(), extra_files); +} + +void create_file(const std::filesystem::path& path) { + std::ofstream output(path); + output << "test"; +} + +FeatureDict make_model_features(const std::vector& feature_keys, + const c10::Device& device) { + constexpr std::int64_t atom_count = 2; + constexpr std::int64_t grid_size = 4; + constexpr std::int64_t point_count = atom_count * grid_size; + const auto double_options = + torch::TensorOptions().dtype(torch::kFloat64).device(device); + const auto integer_options = + torch::TensorOptions().dtype(torch::kInt64).device(device); + FeatureDict features; + + for (const auto& key : feature_keys) { + at::Tensor tensor; + switch (SkalaXC::reverse_feat_map().at(key)) { + case SkalaXC::SKALA_FEATURE::DEN: + tensor = torch::full({2, point_count}, 0.4, double_options); + break; + case SkalaXC::SKALA_FEATURE::DDEN: + tensor = torch::full({2, 3, point_count}, 0.05, double_options); + break; + case SkalaXC::SKALA_FEATURE::TAU: + tensor = torch::full({2, point_count}, 0.2, double_options); + break; + case SkalaXC::SKALA_FEATURE::POINTS: + tensor = torch::arange(point_count * 3, double_options) + .reshape({point_count, 3}) + .mul(0.01) + .add(0.2); + break; + case SkalaXC::SKALA_FEATURE::WEIGHTS: + tensor = torch::linspace(0.1, 0.8, point_count, double_options); + tensor.requires_grad_(true); + break; + case SkalaXC::SKALA_FEATURE::COORDS: + tensor = torch::zeros({atom_count, 3}, double_options); + break; + case SkalaXC::SKALA_FEATURE::ATOMIC_GRID_WEIGHTS: + tensor = torch::full({point_count}, 0.25, double_options); + break; + case SkalaXC::SKALA_FEATURE::ATOMIC_GRID_SIZES: + tensor = torch::full({atom_count}, grid_size, integer_options); + break; + case SkalaXC::SKALA_FEATURE::ATOMIC_GRID_SIZE_BOUND_SHAPE: + tensor = torch::zeros({grid_size, 0}, integer_options); + break; + default: + FAIL("Unexpected bundled model feature " << key); + } + features.insert(key, std::move(tensor)); + } + return features; +} + +void check_integrated_energy(const std::filesystem::path& path, + const c10::Device& device) { + SkalaXC::SkalaModel model(path.string(), device); + auto features = make_model_features(model.feature_keys(), device); + const auto weights = + features.at(SkalaXC::feat_map().at(SkalaXC::SKALA_FEATURE::WEIGHTS)); + auto energy = SkalaXC::evaluate_model_energy(model, features, device); + + REQUIRE(energy.defined()); + REQUIRE(energy.numel() == 1); + REQUIRE(energy.scalar_type() == torch::kFloat64); + CHECK(std::isfinite(energy.item())); + + energy.backward(); + const auto dE_dw = weights.grad(); + REQUIRE(dE_dw.defined()); + REQUIRE(dE_dw.sizes() == weights.sizes()); + CHECK(dE_dw.isfinite().all().item()); +} + +} // namespace + +TEST_CASE("Model tensor validation rejects malformed boundary values", + "[skala][model-validation]") { + const c10::Device cpu(c10::DeviceType::CPU); + const auto doubles = torch::TensorOptions().dtype(torch::kFloat64); + + CHECK_THROWS_WITH(SkalaXC::validate_model_tensor({}, "test tensor", cpu, + torch::kFloat64, {2}), + Catch::Contains("Undefined test tensor")); + + const auto wrong_type = torch::zeros({2}, torch::kFloat32); + CHECK_THROWS_WITH(SkalaXC::validate_model_tensor(wrong_type, "test tensor", + cpu, torch::kFloat64, {2}), + Catch::Contains("wrong dtype")); + + const auto wrong_shape = torch::zeros({3}, doubles); + CHECK_THROWS_WITH(SkalaXC::validate_model_tensor(wrong_shape, "test tensor", + cpu, torch::kFloat64, {2}), + Catch::Contains("invalid dimensions")); + + const auto nonscalar_energy = torch::zeros({1}, doubles).requires_grad_(true); + CHECK_THROWS_WITH(SkalaXC::validate_model_tensor( + nonscalar_energy, "integrated model energy", cpu, + torch::kFloat64, {}, false, true), + Catch::Contains("invalid dimensions")); + + const auto noncontiguous = torch::zeros({2, 3}, doubles).transpose(0, 1); + CHECK_THROWS_WITH(SkalaXC::validate_model_tensor(noncontiguous, "test tensor", + cpu, torch::kFloat64, + noncontiguous.sizes(), true), + Catch::Contains("must be contiguous")); + + const auto detached = torch::zeros({}, doubles); + CHECK_THROWS_WITH( + SkalaXC::validate_model_tensor(detached, "integrated model energy", cpu, + torch::kFloat64, {}, false, true), + Catch::Contains("not connected to autograd")); + + CHECK_THROWS_WITH( + SkalaXC::validate_model_tensor_finite( + torch::full({1}, std::numeric_limits::quiet_NaN(), doubles), + "test tensor"), + Catch::Contains("Non-finite test tensor")); + CHECK_THROWS_WITH( + SkalaXC::validate_model_tensor_finite( + torch::full({1}, std::numeric_limits::infinity(), doubles), + "test tensor"), + Catch::Contains("Non-finite test tensor")); + +#ifdef SKALAXC_HAS_CUDA + if (torch::cuda::is_available()) { + const c10::Device cuda(c10::DeviceType::CUDA, 0); + const auto device_tensor = torch::ones({2}, doubles.device(cuda)); + CHECK_THROWS_WITH( + SkalaXC::validate_model_tensor(device_tensor, "test tensor", cpu, + torch::kFloat64, {2}), + Catch::Contains("wrong device")); + + const auto deferred = SkalaXC::model_tensor_finite_check(device_tensor); + CHECK(deferred.device() == cuda); + CHECK(deferred.scalar_type() == torch::kBool); + CHECK(deferred.numel() == 1); + } +#endif +} + +TEST_CASE("Model gradient validation preserves the feature contract", + "[skala][model-validation]") { + auto feature = torch::ones({2, 3}, torch::kFloat64).requires_grad_(true); + CHECK_THROWS_WITH(SkalaXC::validated_model_gradient(feature, "test gradient"), + Catch::Contains("Undefined test gradient")); + + feature.square().sum().backward(); + const auto gradient = + SkalaXC::validated_model_gradient(feature, "test gradient"); + CHECK(gradient.sizes() == feature.sizes()); + CHECK(gradient.scalar_type() == feature.scalar_type()); + CHECK(gradient.device() == feature.device()); + CHECK(gradient.is_contiguous()); + CHECK(SkalaXC::model_tensor_finite_check(gradient).item()); +} + +TEST_CASE("Model return values must be tensors", "[skala][model-validation]") { + torch::jit::script::Module module("NonTensorEnergy"); + module.define(R"JIT( +def forward(self, mol: Dict[str, Tensor]) -> int: + return 1 +)JIT"); + FeatureDict features; + CHECK_THROWS_WITH(SkalaXC::get_exc(module.get_method("forward"), features), + Catch::Contains("must be a tensor")); +} + +TEST_CASE("Model resolution uses explicit and configured paths", + "[skala][model-path]") { + TempModelDirectory temporary; + const auto installed = temporary.path() / "installed"; + std::filesystem::create_directory(installed); + + const auto explicit_path = temporary.path() / "explicit.fun"; + create_file(explicit_path); + REQUIRE(SkalaXC::detail::resolve_model_path( + explicit_path.string(), installed) == explicit_path.string()); + + create_file(installed / "pbe.fun"); + REQUIRE(SkalaXC::detail::resolve_model_path("PBE", installed) == + (installed / "pbe.fun").string()); + + create_file(installed / "custom.fun"); + REQUIRE(SkalaXC::detail::resolve_model_path("custom.fun", installed) == + (installed / "custom.fun").string()); + + try { + (void)SkalaXC::detail::resolve_model_path("missing.fun", installed); + FAIL("missing model resolution succeeded"); + } catch (const std::exception& error) { + const std::string message = error.what(); + REQUIRE(message.find((installed / "missing.fun").string()) != + std::string::npos); + } + + CHECK_THROWS_WITH(SkalaXC::detail::resolve_model_path("SKALA", installed), + Catch::Contains("specify a local checkpoint path")); +} + +TEST_CASE("Skala model loading validates paths and metadata", + "[skala][model-loading]") { + const std::filesystem::path valid_path = + std::filesystem::path(SKALAXC_MODEL_PATH) / "pbe.fun"; + SkalaXC::SkalaModel valid_model(valid_path.string()); + CHECK(valid_model.is_gga()); + CHECK_FALSE(valid_model.is_mgga()); + CHECK_FALSE(valid_model.feature_keys().empty()); + CHECK_NOTHROW(valid_model.energy_function()); + + const std::filesystem::path skala_path = + std::filesystem::path(SKALAXC_MODEL_PATH) / "skala-1.1.fun"; + SkalaXC::SkalaModel skala_model(skala_path.string()); + CHECK_FALSE(skala_model.is_gga()); + CHECK(skala_model.is_mgga()); + CHECK_FALSE(skala_model.feature_keys().empty()); + CHECK_NOTHROW(skala_model.energy_function()); + + TempModelDirectory temporary; + CHECK_THROWS( + SkalaXC::SkalaModel((temporary.path() / "missing.fun").string())); + + const auto corrupt_path = temporary.path() / "corrupt.fun"; + { + std::ofstream corrupt(corrupt_path); + corrupt << "not a TorchScript archive"; + } + CHECK_THROWS(SkalaXC::SkalaModel(corrupt_path.string())); + + torch::jit::ExtraFilesMap source_metadata{{"protocol_version", ""}, + {"features", ""}}; + const auto module = + torch::jit::load(valid_path.string(), torch::kCPU, source_metadata); + + const auto unsupported_protocol = temporary.path() / "protocol.fun"; + save_with_metadata(module, unsupported_protocol, "1", + source_metadata.at("features")); + CHECK_THROWS(SkalaXC::SkalaModel(unsupported_protocol.string())); + + const auto malformed_features = temporary.path() / "malformed-features.fun"; + save_with_metadata(module, malformed_features, "2", "{}"); + CHECK_THROWS(SkalaXC::SkalaModel(malformed_features.string())); + + const auto unsupported_features = + temporary.path() / "unsupported-features.fun"; + save_with_metadata(module, unsupported_features, "2", + R"(["unsupported_feature"])"); + CHECK_THROWS(SkalaXC::SkalaModel(unsupported_features.string())); +} + +TEST_CASE("Bundled models expose integrated energy and dE/dw", + "[skala][model-integrated-energy]") { + const auto model_directory = std::filesystem::path(SKALAXC_MODEL_PATH); + std::vector filenames{"ldax.fun", "pbe.fun", "tpss.fun", + "skala-1.1.fun"}; +#ifdef SKALAXC_HAS_CUDA + filenames.emplace_back("skala-1.1-cuda.fun"); +#endif + for (const auto& filename : filenames) { + DYNAMIC_SECTION(filename) { + const c10::Device device = filename == "skala-1.1-cuda.fun" + ? c10::Device(c10::DeviceType::CUDA, 0) + : c10::Device(c10::DeviceType::CPU); + check_integrated_energy(model_directory / filename, device); + } + } +} + +TEST_CASE("Protocol-v2 models require integrated energy", + "[skala][model-integrated-energy]") { + TempModelDirectory temporary; + torch::jit::script::Module module("MissingIntegratedEnergyFunctional"); + module.define(R"JIT( +def forward(self, mol: Dict[str, Tensor]) -> Tensor: + return mol["density"].sum(0) +)JIT"); + const auto path = temporary.path() / "missing-integrated-energy.fun"; + save_with_metadata(module, path, "2", R"(["density", "grid_weights"])"); + + CHECK_THROWS(SkalaXC::SkalaModel(path.string())); +} + +TEST_CASE("Runtime rank zero broadcasts the model archive", + "[skala][mpi][model-broadcast][mpi-only]") { +#ifdef GAUXC_HAS_MPI + int world_rank = 0; + MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); + MPI_Comm runtime_communicator = MPI_COMM_NULL; + MPI_Comm_split(MPI_COMM_WORLD, world_rank % 2, world_rank, + &runtime_communicator); + GauXC::RuntimeEnvironment runtime(runtime_communicator); + const std::filesystem::path valid_path = + std::filesystem::path(SKALAXC_MODEL_PATH) / "pbe.fun"; + + SECTION("non-root selectors are not resolved") { + const std::string selector = runtime.comm_rank() == 0 + ? valid_path.string() + : "/non-root-must-not-read.fun"; + const SkalaXC::SkalaModel model(selector, runtime); + CHECK(model.is_gga()); + CHECK_FALSE(model.feature_keys().empty()); + } + + SECTION("rank-zero read errors reach every rank") { + const std::string selector = runtime.comm_rank() == 0 + ? "/rank-zero-missing-model.fun" + : valid_path.string(); + CHECK_THROWS(SkalaXC::SkalaModel(selector, runtime)); + } + + MPI_Comm_free(&runtime_communicator); +#else + SUCCEED("MPI disabled"); +#endif +} diff --git a/SkalaXC/tests/skala_mpi_subcomm_unit_test.cxx b/SkalaXC/tests/skala_mpi_subcomm_unit_test.cxx new file mode 100644 index 00000000..1a33dd61 --- /dev/null +++ b/SkalaXC/tests/skala_mpi_subcomm_unit_test.cxx @@ -0,0 +1,227 @@ +#include + +#include "model_grid_exchange.hpp" +#include "mpi_wrapper.hpp" +#include "skala_util.hpp" +#include "spin_gradient.hpp" + +#include +#include +#include + +#include +#include + +TEST_CASE("Eigen MPI collectives use runtime communicator", + "[skala][mpi][subcomm][mpi-wrapper][mpi-only]") { +#ifdef GAUXC_HAS_MPI + int world_rank = 0; + int world_size = 1; + MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); + MPI_Comm_size(MPI_COMM_WORLD, &world_size); + if (world_size < 3) { + SUCCEED("Requires at least 3 MPI ranks"); + return; + } + + MPI_Comm subcomm = MPI_COMM_NULL; + MPI_Comm_split(MPI_COMM_WORLD, world_rank % 2, world_rank, &subcomm); + GauXC::RuntimeEnvironment rt(GAUXC_MPI_CODE(subcomm)); + const int rank = rt.comm_rank(); + const int size = rt.comm_size(); + + std::vector counts; + int total_count = 0; + if (rank == 0) { + counts.resize(size); + for (int source_rank = 0; source_rank < size; ++source_rank) { + counts[source_rank] = source_rank + 1; + total_count += counts[source_rank]; + } + } + const SkalaXC::mpi::CollectiveLayout layout(std::move(counts)); + + std::vector local(rank + 1, static_cast(rank)); + std::vector gathered(rank == 0 ? total_count : 0); + SkalaXC::mpi::gatherv(local, gathered, layout, rt); + if (rank == 0) + for (int source_rank = 0; source_rank < size; ++source_rank) + for (int index = 0; index < layout.counts()[source_rank]; ++index) + CHECK(gathered[layout.displacements()[source_rank] + index] == + source_rank); + + std::vector scattered(rank + 1); + SkalaXC::mpi::scatterv(gathered, layout, scattered, rt); + CHECK(scattered == local); + + SkalaXC::RowMajorMatrix reduced = + SkalaXC::RowMajorMatrix::Constant(2, 2, rank + 1.0); + SkalaXC::mpi::allreduce_sum(reduced, rt); + const double expected_sum = 0.5 * size * (size + 1); + CHECK( + reduced.isApprox(SkalaXC::RowMajorMatrix::Constant(2, 2, expected_sum))); + + std::string payload; + if (rank == 0) payload = std::string("model\0archive", 13); + SkalaXC::mpi::broadcast_string(payload, rt); + CHECK(payload == std::string("model\0archive", 13)); + + MPI_Comm_free(&subcomm); +#else + SUCCEED("MPI disabled"); +#endif +} + +TEST_CASE("MPI gradient wrapper transports semantic point records", + "[skala][mpi][subcomm][gradient-wrapper][mpi-only]") { +#ifdef GAUXC_HAS_MPI + int world_rank = 0; + int world_size = 1; + MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); + MPI_Comm_size(MPI_COMM_WORLD, &world_size); + if (world_size < 3) { + SUCCEED("Requires at least 3 MPI ranks"); + return; + } + + MPI_Comm subcomm = MPI_COMM_NULL; + MPI_Comm_split(MPI_COMM_WORLD, world_rank % 2, world_rank, &subcomm); + GauXC::RuntimeEnvironment rt(GAUXC_MPI_CODE(subcomm)); + const int rank = rt.comm_rank(); + const int size = rt.comm_size(); + const int local_points = rank; + const int source_offset = rank * (rank - 1) / 2; + + SkalaXC::SpinGradient local(local_points); + for (int point = 0; point < local_points; ++point) + for (int spin = 0; spin < SkalaXC::spin_dimension; ++spin) + for (int direction = 0; direction < SkalaXC::direction_dimension; + ++direction) + local(static_cast(direction), point, + static_cast(spin)) = + 1000.0 * direction + 100.0 * spin + source_offset + point; + + std::vector counts; + std::vector reverse_permutation; + int global_points = 0; + if (rank == 0) { + counts.resize(size); + for (int source_rank = 0; source_rank < size; ++source_rank) { + counts[source_rank] = source_rank; + global_points += counts[source_rank]; + } + reverse_permutation.resize(global_points); + for (int source = 0; source < global_points; ++source) + reverse_permutation[source] = + SkalaXC::types::PermutationIndex{global_points - source - 1}; + } + const SkalaXC::mpi::CollectiveLayout point_layout(std::move(counts)); + + at::Tensor gathered = SkalaXC::mpi::gather_torch_gradient( + local, point_layout, reverse_permutation, rt); + if (rank == 0) { + REQUIRE(gathered.sizes() == + at::IntArrayRef({SkalaXC::spin_dimension, + SkalaXC::direction_dimension, global_points})); + for (int source = 0; source < global_points; ++source) + for (int spin = 0; spin < SkalaXC::spin_dimension; ++spin) + for (int direction = 0; direction < SkalaXC::direction_dimension; + ++direction) + CHECK(gathered.index({spin, direction, global_points - source - 1}) + .item() == + 1000.0 * direction + 100.0 * spin + source); + } + + at::Tensor root_gradient; + if (rank == 0) root_gradient = gathered.detach() + 5.0; + SkalaXC::SpinGradient restored = SkalaXC::mpi::scatter_torch_gradient( + root_gradient, local_points, point_layout, reverse_permutation, rt); + for (int point = 0; point < local_points; ++point) + for (int spin = 0; spin < SkalaXC::spin_dimension; ++spin) + for (int direction = 0; direction < SkalaXC::direction_dimension; + ++direction) + CHECK(restored(static_cast(direction), point, + static_cast(spin)) == + local(static_cast(direction), point, + static_cast(spin)) + + 5.0); + + MPI_Comm_free(&subcomm); +#else + SUCCEED("MPI disabled"); +#endif +} + +TEST_CASE("Model grid layout caches subcommunicator ordering metadata", + "[skala][mpi][subcomm][model-grid][mpi-only]") { +#ifdef GAUXC_HAS_MPI + int world_rank = 0; + int world_size = 1; + MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); + MPI_Comm_size(MPI_COMM_WORLD, &world_size); + if (world_size < 3) { + SUCCEED("Requires at least 3 MPI ranks"); + return; + } + + MPI_Comm subcomm = MPI_COMM_NULL; + MPI_Comm_split(MPI_COMM_WORLD, world_rank % 2, world_rank, &subcomm); + GauXC::RuntimeEnvironment rt(GAUXC_MPI_CODE(subcomm)); + const int rank = rt.comm_rank(); + const int size = rt.comm_size(); + std::vector tasks(2); + tasks[0].iParent = 1; + tasks[0].points.resize(rank + 1); + tasks[1].iParent = 0; + tasks[1].points.resize(1); + + const SkalaXC::ModelGridLayout layout(tasks, SkalaXC::types::AtomCount{2}, + rt); + const auto& blocks = layout.task_blocks(); + REQUIRE(blocks.size() == 2); + CHECK(blocks[0].task_index == SkalaXC::types::TaskIndex{1}); + CHECK(blocks[0].point_offset == SkalaXC::types::GridPointOffset{0}); + CHECK(blocks[0].point_count == SkalaXC::types::GridPointCount{1}); + CHECK(blocks[1].task_index == SkalaXC::types::TaskIndex{0}); + CHECK(blocks[1].point_offset == SkalaXC::types::GridPointOffset{1}); + CHECK(blocks[1].point_count == SkalaXC::types::GridPointCount{rank + 1}); + CHECK(layout.local_point_count() == SkalaXC::types::GridPointCount{rank + 2}); + + if (rank == 0) { + const int expected_points = size * (size + 3) / 2; + CHECK(layout.global_point_count() == + SkalaXC::types::GridPointCount{expected_points}); + CHECK(layout.point_layout().extent() == expected_points); + REQUIRE(layout.point_layout().counts().size() == + static_cast(size)); + for (int source_rank = 0; source_rank < size; ++source_rank) + CHECK(layout.point_layout().counts()[source_rank] == source_rank + 2); + const std::vector + expected_atom_point_counts{ + SkalaXC::types::GridPointCount{size}, + SkalaXC::types::GridPointCount{size * (size + 1) / 2}}; + CHECK(layout.global_atom_point_counts() == expected_atom_point_counts); + if (size == 1) { + CHECK(layout.rank_to_atom_points().empty()); + CHECK(layout.atom_to_rank_points().empty()); + } else { + REQUIRE(layout.rank_to_atom_points().size() == + static_cast(expected_points)); + REQUIRE(layout.atom_to_rank_points().size() == + static_cast(expected_points)); + for (int rank_point = 0; rank_point < expected_points; ++rank_point) + CHECK(layout.atom_to_rank_points()[static_cast( + layout.rank_to_atom_points()[rank_point].raw())] == + SkalaXC::types::PermutationIndex{rank_point}); + } + } else { + CHECK(layout.global_atom_point_counts().empty()); + CHECK(layout.rank_to_atom_points().empty()); + CHECK(layout.atom_to_rank_points().empty()); + } + + MPI_Comm_free(&subcomm); +#else + SUCCEED("MPI disabled"); +#endif +} diff --git a/SkalaXC/tests/skala_openmp_test.cxx b/SkalaXC/tests/skala_openmp_test.cxx new file mode 100644 index 00000000..b38f4a24 --- /dev/null +++ b/SkalaXC/tests/skala_openmp_test.cxx @@ -0,0 +1,103 @@ +#include + +#include +#include + +#include "test_utils.hpp" + +#include + +#include +#include +#include +#include +#include + +#ifdef SKALAXC_HAS_OPENMP +#include + +namespace { + +class OpenMPSettingsGuard { + public: + OpenMPSettingsGuard() + : dynamic_(omp_get_dynamic()), max_threads_(omp_get_max_threads()) { + omp_set_dynamic(0); + } + + ~OpenMPSettingsGuard() { + omp_set_num_threads(max_threads_); + omp_set_dynamic(dynamic_); + } + + OpenMPSettingsGuard(const OpenMPSettingsGuard&) = delete; + OpenMPSettingsGuard& operator=(const OpenMPSettingsGuard&) = delete; + + private: + int dynamic_; + int max_threads_; +}; + +} // namespace +#endif + +TEST_CASE("OpenMP thread counts preserve host EXC, VXC, and gradients", + "[skala][openmp]") { +#ifdef SKALAXC_HAS_OPENMP + using Matrix = Eigen::MatrixXd; + const std::string fixture = + std::string(SKALAXC_GAUXC_REF_DATA_PATH) + "/h2o2_def2-tzvp.hdf5"; + const auto system = SkalaXC::test::load_molecular_system(fixture); + const auto density = SkalaXC::test::load_uks_density(fixture, "/DENSITY", ""); + auto grid = SkalaXC::test::make_molgrid( + system.molecule, SkalaXC::AtomicGridSizeDefault::FineGrid); + SkalaXC::RuntimeEnvironment runtime{SKALAXC_MPI_CODE(MPI_COMM_WORLD)}; + SkalaXC::LoadBalancerFactory load_balancer_factory( + SkalaXC::ExecutionSpace::Host); + auto load_balancer = load_balancer_factory.get_instance( + runtime, system.molecule, grid, system.basis); + SkalaXC::MolecularWeightsFactory weights_factory( + SkalaXC::ExecutionSpace::Host, "Default", + SkalaXC::MolecularWeightsSettings{}); + weights_factory.get_instance().modify_weights(load_balancer); + SkalaXC::XCIntegratorFactory integrator_factory( + SkalaXC::ExecutionSpace::Host); + auto integrator = integrator_factory.get_instance( + SkalaXC::functional_type("TPSS"), load_balancer); + + OpenMPSettingsGuard restore_openmp_settings; + omp_set_num_threads(1); + const auto single_thread = + integrator.eval_exc_vxc(density.scalar, density.spin); + const auto single_thread_gradient = + integrator.eval_exc_grad(density.scalar, density.spin); + omp_set_num_threads(2); + const auto two_threads = + integrator.eval_exc_vxc(density.scalar, density.spin); + const auto two_thread_gradient = + integrator.eval_exc_grad(density.scalar, density.spin); + + const double exc_error = + std::abs(std::get<0>(single_thread) - std::get<0>(two_threads)) / + std::max(1.0, std::abs(std::get<0>(single_thread))); + const double scalar_error = SkalaXC::test::matrix_error_per_basis( + std::get<1>(single_thread), std::get<1>(two_threads)); + const double spin_error = SkalaXC::test::matrix_error_per_basis( + std::get<2>(single_thread), std::get<2>(two_threads)); + REQUIRE(single_thread_gradient.size() == two_thread_gradient.size()); + double gradient_error = 0.0; + for (std::size_t i = 0; i < single_thread_gradient.size(); ++i) { + const double difference = + single_thread_gradient[i] - two_thread_gradient[i]; + gradient_error += difference * difference; + } + gradient_error = std::sqrt(gradient_error) / + static_cast(single_thread_gradient.size()); + CHECK(exc_error <= 1e-12); + CHECK(scalar_error <= 1e-12); + CHECK(spin_error <= 1e-12); + CHECK(gradient_error <= 1e-10); +#else + SUCCEED("OpenMP disabled"); +#endif +} diff --git a/SkalaXC/tests/skala_reorder_unit_test.cxx b/SkalaXC/tests/skala_reorder_unit_test.cxx new file mode 100644 index 00000000..b0ba46e0 --- /dev/null +++ b/SkalaXC/tests/skala_reorder_unit_test.cxx @@ -0,0 +1,268 @@ +#include + +#include "model_grid_exchange.hpp" +#include "skala_util.hpp" + +#include + +#include +#include +#include +#include +#include +#include + +namespace { + +template +struct IsAddable : std::false_type {}; + +template +struct IsAddable< + Left, Right, + std::void_t() + std::declval())>> + : std::true_type {}; + +static_assert(SkalaXC::types::GridPointCount::is_additive); +static_assert(!SkalaXC::types::AtomIndex::is_additive); +static_assert( + std::is_same_v< + decltype(std::declval().raw()), + std::int64_t>); +static_assert( + !std::is_constructible_v); +static_assert( + !std::is_convertible_v); +static_assert(IsAddable::value); +static_assert(IsAddable::value); +static_assert(!IsAddable::value); +static_assert( + !IsAddable::value); +static_assert(!IsAddable::value); +static_assert(!IsAddable::value); + +std::vector permutation( + std::initializer_list values) { + std::vector result; + result.reserve(values.size()); + for (const auto value : values) + result.push_back(SkalaXC::types::PermutationIndex{value}); + return result; +} + +std::vector point_counts( + std::initializer_list values) { + std::vector result; + result.reserve(values.size()); + for (const auto value : values) + result.push_back(SkalaXC::types::GridPointCount{value}); + return result; +} + +} // namespace + +TEST_CASE("Collective layout keeps MPI metadata consistent", + "[skala][mpi][layout]") { + const std::vector counts = {2, 3}; + const std::vector mismatched_displacements = {0}; + CHECK_THROWS_AS( + SkalaXC::mpi::CollectiveLayout(counts, mismatched_displacements), + std::invalid_argument); + + const SkalaXC::mpi::CollectiveLayout large_layout( + {std::numeric_limits::max()}); + CHECK_THROWS_AS(large_layout.scaled(2), std::invalid_argument); +} + +TEST_CASE("Model grid layout caches stable atom-ordered task blocks", + "[skala][model-grid][layout]") { + std::vector tasks(3); + tasks[0].iParent = 1; + tasks[0].points.resize(2); + tasks[1].iParent = 0; + tasks[1].points.resize(1); + tasks[2].iParent = 1; + tasks[2].points.resize(3); + GauXC::RuntimeEnvironment rt{GAUXC_MPI_CODE(MPI_COMM_SELF)}; + + const SkalaXC::ModelGridLayout layout(tasks, SkalaXC::types::AtomCount{2}, + rt); + const auto& blocks = layout.task_blocks(); + + STATIC_REQUIRE_FALSE(std::is_convertible_v); + STATIC_REQUIRE_FALSE(std::is_convertible_v); + REQUIRE(blocks.size() == 3); + CHECK(blocks[0].task_index == SkalaXC::types::TaskIndex{1}); + CHECK(blocks[0].point_offset == SkalaXC::types::GridPointOffset{0}); + CHECK(blocks[0].point_count == SkalaXC::types::GridPointCount{1}); + CHECK(blocks[1].task_index == SkalaXC::types::TaskIndex{0}); + CHECK(blocks[1].point_offset == SkalaXC::types::GridPointOffset{1}); + CHECK(blocks[1].point_count == SkalaXC::types::GridPointCount{2}); + CHECK(blocks[2].task_index == SkalaXC::types::TaskIndex{2}); + CHECK(blocks[2].point_offset == SkalaXC::types::GridPointOffset{3}); + CHECK(blocks[2].point_count == SkalaXC::types::GridPointCount{3}); + CHECK(layout.local_point_count() == SkalaXC::types::GridPointCount{6}); + CHECK(layout.global_point_count() == SkalaXC::types::GridPointCount{6}); + CHECK(layout.point_layout().counts() == std::vector{6}); + const std::vector expected_atom_point_counts{ + SkalaXC::types::GridPointCount{1}, SkalaXC::types::GridPointCount{5}}; + CHECK(layout.global_atom_point_counts() == expected_atom_point_counts); + CHECK(layout.rank_to_atom_points().empty()); + CHECK(layout.atom_to_rank_points().empty()); +} + +TEST_CASE("Model domain batches preserve exact atomic grid sizes", + "[skala][model-grid][batching]") { + std::vector tasks(4); + tasks[0].iParent = 1; + tasks[0].points.resize(5); + tasks[1].iParent = 0; + tasks[1].points.resize(2); + tasks[2].iParent = 2; + tasks[2].points.resize(3); + tasks[3].iParent = 0; + tasks[3].points.resize(3); + GauXC::RuntimeEnvironment rt{GAUXC_MPI_CODE(MPI_COMM_SELF)}; + + const SkalaXC::ModelGridExchange conservative( + tasks, SkalaXC::types::AtomCount{3}, rt, + SkalaXC::DomainBatchMode::Conservative); + const auto& conservative_batches = conservative.local_batches(); + REQUIRE(conservative_batches.size() == 3); + CHECK(conservative_batches[0].atoms == + std::vector{SkalaXC::types::AtomIndex{0}}); + CHECK(conservative_batches[0].grid_size == SkalaXC::types::GridPointCount{5}); + CHECK(conservative_batches[0].point_count == + SkalaXC::types::GridPointCount{5}); + CHECK(conservative_batches[1].atoms == + std::vector{SkalaXC::types::AtomIndex{1}}); + CHECK(conservative_batches[1].grid_size == SkalaXC::types::GridPointCount{5}); + CHECK(conservative_batches[2].atoms == + std::vector{SkalaXC::types::AtomIndex{2}}); + CHECK(conservative_batches[2].grid_size == SkalaXC::types::GridPointCount{3}); + + const SkalaXC::ModelGridExchange aggressive( + tasks, SkalaXC::types::AtomCount{3}, rt, + SkalaXC::DomainBatchMode::Aggressive); + const auto& aggressive_batches = aggressive.local_batches(); + REQUIRE(aggressive_batches.size() == 2); + CHECK(aggressive_batches[0].atoms == + std::vector{SkalaXC::types::AtomIndex{2}}); + CHECK(aggressive_batches[0].grid_size == SkalaXC::types::GridPointCount{3}); + CHECK(aggressive_batches[0].point_count == SkalaXC::types::GridPointCount{3}); + CHECK((aggressive_batches[1].atoms == + std::vector{SkalaXC::types::AtomIndex{0}, + SkalaXC::types::AtomIndex{1}})); + CHECK(aggressive_batches[1].grid_size == SkalaXC::types::GridPointCount{5}); + CHECK(aggressive_batches[1].point_count == + SkalaXC::types::GridPointCount{10}); + REQUIRE(aggressive_batches[1].task_blocks.size() == 3); + CHECK(aggressive_batches[1].task_blocks[0].point_offset == + SkalaXC::types::GridPointOffset{0}); + CHECK(aggressive_batches[1].task_blocks[1].point_offset == + SkalaXC::types::GridPointOffset{2}); + CHECK(aggressive_batches[1].task_blocks[2].point_offset == + SkalaXC::types::GridPointOffset{5}); +} + +TEST_CASE("Model grid layout throws the SkalaXC exception type", + "[skala][model-grid][exceptions]") { + std::vector tasks(1); + tasks.front().iParent = 0; + GauXC::RuntimeEnvironment rt{GAUXC_MPI_CODE(MPI_COMM_SELF)}; + try { + SkalaXC::ModelGridLayout layout(tasks, SkalaXC::types::AtomCount{0}, rt); + FAIL("Expected an invalid parent atom to throw"); + } catch (const SkalaXC::Exception& error) { + const std::string message = error.what(); + REQUIRE(message.find("SkalaXC Exception (Invalid task parent atom)") != + std::string::npos); + REQUIRE(message.find("model_grid_layout.cxx") != std::string::npos); + REQUIRE(message.find(" Function ") != std::string::npos); + REQUIRE(message.find(" Line ") != std::string::npos); + } +} + +TEST_CASE("Point reorder validates dimensions at its boundary", + "[skala][reorder]") { + SkalaXC::Vector weights(2); + SkalaXC::AlphaBetaMatrix density(3, 2); + SkalaXC::CartesianMatrix coordinates(2, 3); + SkalaXC::AlphaBetaMatrix kinetic; + const auto point_permutation = permutation({0, 1}); + CHECK_THROWS(SkalaXC::reorder_to_atom_order( + weights, density, coordinates, kinetic, point_permutation, + SkalaXC::types::GridPointCount{2})); + + density.resize(2, 2); + const auto short_permutation = permutation({0}); + CHECK_THROWS(SkalaXC::reorder_to_rank_order( + density, kinetic, short_permutation, SkalaXC::types::GridPointCount{2})); +} + +TEST_CASE("Atom reorder uses shaped point records", "[skala][reorder]") { + const SkalaXC::types::AtomCount atom_count{3}; + const SkalaXC::types::CommunicatorSize communicator_size{2}; + const auto all_rank_atom_sizes = point_counts({2, 3, 1, 1, 0, 2}); + const SkalaXC::mpi::CollectiveLayout point_layout({6, 3}); + const std::vector expected_displacements = {0, 6}; + const std::vector expected_scaled_counts = {12, 6}; + + CHECK(point_layout.displacements() == expected_displacements); + CHECK(point_layout.extent() == 9); + CHECK(point_layout.scaled(2).counts() == expected_scaled_counts); + + auto [permutation, inverse] = SkalaXC::build_atom_reorder_perm( + all_rank_atom_sizes, point_layout, atom_count, communicator_size); + + REQUIRE(permutation.size() == 9); + REQUIRE(inverse.size() == 9); + for (std::int64_t point = 0; point < 9; ++point) + CHECK(inverse[static_cast(permutation[point].raw())] == + SkalaXC::types::PermutationIndex{point}); + + SkalaXC::Vector weights(9); + SkalaXC::AlphaBetaMatrix density(9, 2); + SkalaXC::CartesianMatrix coordinates(9, 3); + SkalaXC::AlphaBetaMatrix kinetic(9, 2); + for (Eigen::Index point = 0; point < 9; ++point) { + weights(point) = 10.0 + point; + for (Eigen::Index spin = 0; spin < 2; ++spin) { + density(point, spin) = 100.0 * spin + point; + kinetic(point, spin) = 200.0 * spin + point; + } + for (Eigen::Index direction = 0; direction < 3; ++direction) + coordinates(point, direction) = 300.0 * direction + point; + } + + const SkalaXC::Vector original_weights = weights; + const SkalaXC::AlphaBetaMatrix original_density = density; + const SkalaXC::CartesianMatrix original_coordinates = coordinates; + const SkalaXC::AlphaBetaMatrix original_kinetic = kinetic; + + SkalaXC::reorder_to_atom_order(weights, density, coordinates, kinetic, + permutation, + SkalaXC::types::GridPointCount{9}); + SkalaXC::reorder_to_rank_order(density, kinetic, inverse, + SkalaXC::types::GridPointCount{9}); + + SkalaXC::Vector restored_weights(9); + SkalaXC::CartesianMatrix restored_coordinates(9, 3); + for (Eigen::Index atom_point = 0; atom_point < 9; ++atom_point) { + const auto rank_point = inverse[atom_point].raw(); + restored_weights(rank_point) = weights(atom_point); + restored_coordinates.row(rank_point) = coordinates.row(atom_point); + } + + CHECK(density.isApprox(original_density)); + CHECK(kinetic.isApprox(original_kinetic)); + CHECK(restored_weights.isApprox(original_weights)); + CHECK(restored_coordinates.isApprox(original_coordinates)); +} diff --git a/SkalaXC/tests/skala_stress_test.cxx b/SkalaXC/tests/skala_stress_test.cxx new file mode 100644 index 00000000..d7508ca1 --- /dev/null +++ b/SkalaXC/tests/skala_stress_test.cxx @@ -0,0 +1,78 @@ +#include + +#include + +#include "test_utils.hpp" + +#include + +#include +#include +#include +#include + +#ifdef __linux__ +#include +#endif + +namespace { + +using Matrix = Eigen::MatrixXd; + +std::size_t resident_bytes() { +#ifdef __linux__ + std::ifstream statm("/proc/self/statm"); + std::size_t total_pages = 0; + std::size_t resident_pages = 0; + if (!(statm >> total_pages >> resident_pages)) return 0; + const long page_size = sysconf(_SC_PAGESIZE); + if (page_size <= 0) return 0; + return resident_pages * static_cast(page_size); +#else + return 0; +#endif +} + +} // namespace + +TEST_CASE("Repeated host evaluations remain stable and bounded", + "[skala][stress]") { + SkalaXC::Molecule molecule{{SkalaXC::AtomicNumber(1), -0.7, 0.0, 0.0}, + {SkalaXC::AtomicNumber(1), 0.7, 0.0, 0.0}}; + auto basis = SkalaXC::test::make_sto3g_hydrogen_basis(molecule); + auto grid = SkalaXC::test::make_molgrid( + molecule, SkalaXC::AtomicGridSizeDefault::FineGrid, 128); + SkalaXC::RuntimeEnvironment runtime{SKALAXC_MPI_CODE(MPI_COMM_WORLD)}; + SkalaXC::LoadBalancerFactory load_balancer_factory( + SkalaXC::ExecutionSpace::Host); + auto load_balancer = + load_balancer_factory.get_instance(runtime, molecule, grid, basis); + SkalaXC::MolecularWeightsFactory weights_factory( + SkalaXC::ExecutionSpace::Host, "Default"); + weights_factory.get_instance().modify_weights(load_balancer); + SkalaXC::XCIntegratorFactory integrator_factory( + SkalaXC::ExecutionSpace::Host); + auto integrator = integrator_factory.get_instance( + SkalaXC::functional_type("LDA"), load_balancer); + + Matrix scalar_density = Matrix::Constant(2, 2, 0.5); + Matrix spin_density = Matrix::Zero(2, 2); + const auto reference = integrator.eval_exc_vxc(scalar_density, spin_density); + for (int iteration = 0; iteration < 10; ++iteration) + (void)integrator.eval_exc_vxc(scalar_density, spin_density); + const std::size_t warmed_resident_bytes = resident_bytes(); + + for (int iteration = 0; iteration < 100; ++iteration) { + const auto result = integrator.eval_exc_vxc(scalar_density, spin_density); + REQUIRE(std::get<0>(result) == + Approx(std::get<0>(reference)).margin(1e-13)); + REQUIRE((std::get<1>(result) - std::get<1>(reference)).norm() <= 1e-13); + REQUIRE((std::get<2>(result) - std::get<2>(reference)).norm() <= 1e-13); + } + + const std::size_t final_resident_bytes = resident_bytes(); + if (warmed_resident_bytes != 0 && final_resident_bytes != 0) { + constexpr std::size_t max_growth_bytes = 64ULL * 1024ULL * 1024ULL; + REQUIRE(final_resident_bytes <= warmed_resident_bytes + max_growth_bytes); + } +} diff --git a/SkalaXC/tests/skala_traditional_integration_test.cxx b/SkalaXC/tests/skala_traditional_integration_test.cxx new file mode 100644 index 00000000..ebf04c43 --- /dev/null +++ b/SkalaXC/tests/skala_traditional_integration_test.cxx @@ -0,0 +1,487 @@ +// SkalaXC traditional-functional integration test. +// +// The Skala side is driven entirely through the PUBLIC SkalaXC API (the same +// RuntimeEnvironment -> Molecule/BasisSet -> MolGrid -> LoadBalancer -> +// MolecularWeights -> functional_type -> XCIntegrator pipeline a consumer would +// use); the shared geometry/basis are bridged into SkalaXC's own value types. +// The reference side still uses GauXC + ExchCXX directly as the comparison +// baseline, so this remains a white-box test that pulls GauXC in-build. +// +// SkalaXC ships neural `.fun` reproductions of three traditional +// exchange-correlation functionals: LDA exchange (ldax.fun), PBE (pbe.fun), and +// TPSS (tpss.fun). This test drives each of those bundled baselines through +// the public SkalaXC::XCIntegrator and, on the very same molecular grid, +// evaluates the corresponding ExchCXX functional through GauXC's own reference +// XCIntegrator. +// For several small molecules and random spin-resolved AO densities it checks +// that the two implementations agree on: +// * the exchange-correlation energy EXC, +// * the scalar and z exchange-correlation potentials VXC, and +// * the exchange-correlation energy gradient. +// +// The test is designed to run identically in a serial build and under MPI with +// three or more ranks: every rank builds byte-identical densities (the RNG seed +// is chosen on rank 0 and broadcast), so the replicated GauXC/SkalaXC +// reductions return the same fully-reduced result on every rank. +// +// Reproducibility: by default the density seed comes from std::random_device. +// Set SKALAXC_TEST_SEED= to force a specific seed. On a mismatch rank +// 0 prints the seed and writes the offending densities as MatrixMarket files; +// set SKALAXC_TEST_DENSITY_DIR= to replay from previously emitted +// density__{scalar,z}.mtx files instead of generating new ones. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "parse_basis.hpp" + +#include +#include + +#include "test_utils.hpp" + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace SkalaXC; + +namespace { + +/** @brief One atom of a hard-coded molecule, coordinates in angstrom. */ +struct AtomSpec { + int Z; + double x, y, z; +}; + +/** @brief A named molecule together with the SkalaXC/ExchCXX selectors. */ +struct MoleculeCase { + const char* name; + std::vector atoms; +}; + +/** + * @brief Build a GauXC molecule (atomic units) from an angstrom specification. + */ +GauXC::Molecule make_molecule(const std::vector& atoms) { + constexpr double angstrom_to_bohr = 1.8897259886; + GauXC::Molecule mol; + for (const auto& a : atoms) + mol.emplace_back(GauXC::AtomicNumber(a.Z), a.x * angstrom_to_bohr, + a.y * angstrom_to_bohr, a.z * angstrom_to_bohr); + return mol; +} + +/** + * @brief Bridge a GauXC molecule into the public SkalaXC::Molecule value type. + * + * The reference path is expressed in GauXC types; the Skala side is a pure + * public-API consumer, so the shared geometry is copied into SkalaXC's own + * type (coordinates already in bohr). + */ +SkalaXC::Molecule to_skala_molecule(const GauXC::Molecule& mol) { + SkalaXC::Molecule out; + out.reserve(mol.size()); + for (const auto& a : mol) + out.emplace_back(SkalaXC::AtomicNumber(a.Z.get()), a.x, a.y, a.z); + return out; +} + +/** + * @brief Bridge a parsed GauXC basis into the public SkalaXC::BasisSet type. + * + * parse_basis already normalizes the primitive contraction coefficients, so the + * shells are copied verbatim with normalize=false; the library's internal + * SkalaXC -> GauXC round-trip then reproduces byte-identical GauXC shells. + */ +SkalaXC::BasisSet to_skala_basis(const GauXC::BasisSet& basis) { + SkalaXC::BasisSet out; + out.reserve(basis.size()); + for (const auto& s : basis) { + const std::int32_t nprim = s.nprim(); + SkalaXC::Shell::prim_array alpha{}; + SkalaXC::Shell::prim_array coeff{}; + for (std::int32_t i = 0; i < nprim; ++i) { + alpha[i] = s.alpha_data()[i]; + coeff[i] = s.coeff_data()[i]; + } + const SkalaXC::Shell::cart_array O{s.O_data()[0], s.O_data()[1], + s.O_data()[2]}; + out.emplace_back(SkalaXC::PrimSize(nprim), SkalaXC::AngularMomentum(s.l()), + SkalaXC::SphericalType(s.pure()), alpha, coeff, O, + /*normalize=*/false); + } + return out; +} + +/** @brief Traditional functional selector shared by SkalaXC and ExchCXX. */ +struct FunctionalCase { + const char* skala_model; // SkalaXC .fun selector + ExchCXX::Functional exchcxx_id; // matching ExchCXX builtin functional +}; + +/** + * @brief Random symmetric, strictly diagonally dominant (hence SPD) matrix. + * + * A symmetric AO density matrix that is positive semidefinite guarantees a + * nonnegative on-grid density everywhere, which keeps the traditional exchange + * kernels well defined. Strict diagonal dominance with a positive diagonal is a + * cheap Gershgorin guarantee of positive definiteness; the caller additionally + * verifies it with a Cholesky factorization. + */ +Eigen::MatrixXd random_spd(int n, std::mt19937_64& rng) { + std::uniform_real_distribution dist(-0.5, 0.5); + Eigen::MatrixXd M(n, n); + for (int i = 0; i < n; ++i) + for (int j = i; j < n; ++j) { + const double v = dist(rng); + M(i, j) = v; + M(j, i) = v; + } + for (int i = 0; i < n; ++i) { + double off = 0.0; + for (int j = 0; j < n; ++j) + if (j != i) off += std::abs(M(i, j)); + M(i, i) = off + 0.5; // strictly diagonally dominant, positive diagonal + } + // Keep the on-grid density in a physically reasonable magnitude range. + M *= 1.0 / static_cast(n); + return M; +} + +/** + * @brief Random symmetric spin density scaled small relative to the scalar one. + * + * The z (spin) density is left indefinite but scaled so that + * max|Pz| * 10 < max|Ps|, keeping |rho_z(r)| well below rho_s(r) so the + * per-spin densities stay nonnegative. + */ +Eigen::MatrixXd random_small_symmetric(const Eigen::MatrixXd& Ps, int n, + std::mt19937_64& rng) { + std::uniform_real_distribution dist(-0.5, 0.5); + Eigen::MatrixXd M(n, n); + for (int i = 0; i < n; ++i) + for (int j = i; j < n; ++j) { + const double v = dist(rng); + M(i, j) = v; + M(j, i) = v; + } + const double max_s = Ps.cwiseAbs().maxCoeff(); + const double max_z = M.cwiseAbs().maxCoeff(); + if (max_z > 0.0) M *= 0.09 * max_s / max_z; // => max|Pz| * 10 < max|Ps| + return M; +} + +/** @brief A scalar/z AO density pair for one molecule. */ +struct DensityPair { + Eigen::MatrixXd Ps, Pz; +}; + +/** + * @brief Generate (or replay from disk) the density pair for one molecule. + * @param name Molecule label used for replay/dump file names. + * @param nbf Number of AO basis functions. + * @param rng Seeded generator (advanced only when generating). + * @param replay_dir If non-null, load densities from this directory instead. + */ +DensityPair make_density(const std::string& name, int nbf, std::mt19937_64& rng, + const char* replay_dir) { + DensityPair d; + if (replay_dir) { + const std::string base = std::string(replay_dir) + "/density_" + name; + if (!Eigen::loadMarketDense(d.Ps, base + "_scalar.mtx") || + !Eigen::loadMarketDense(d.Pz, base + "_z.mtx")) + throw std::runtime_error("Failed to load replay densities from " + base + + "_{scalar,z}.mtx"); + return d; + } + d.Ps = random_spd(nbf, rng); + d.Pz = random_small_symmetric(d.Ps, nbf, rng); + return d; +} + +/** @brief Relative error of two scalars, floored so tiny values stay stable. */ +double rel_err(double a, double b) { + return std::abs(a - b) / std::max(1.0, std::abs(b)); +} + +/** @brief Max-norm relative error of two matrices. */ +double matrix_rel_err(const Eigen::MatrixXd& a, const Eigen::MatrixXd& b) { + const double denom = std::max(1.0, b.cwiseAbs().maxCoeff()); + return (a - b).cwiseAbs().maxCoeff() / denom; +} + +/** + * @brief Evaluate one traditional functional through GauXC's reference path. + * + * Mirrors the public Skala path's grid/load-balancer/molecular-weight setup so + * the quadrature is identical, then integrates the requested ExchCXX builtin + * functional. Returns the polarized EXC, scalar/z potentials, and the + * weight-derivative-inclusive XC gradient. + */ +struct ReferenceResult { + double exc; + Eigen::MatrixXd vxc_scalar, vxc_z; + std::vector gradient; // 3 * natoms, atom-major xyz +}; + +ReferenceResult evaluate_reference(const GauXC::RuntimeEnvironment& rt, + const GauXC::Molecule& mol, + const GauXC::MolGrid& mg, + const GauXC::BasisSet& basis, + ExchCXX::Functional functional_id, + const Eigen::MatrixXd& Ps, + const Eigen::MatrixXd& Pz) { + using matrix_type = Eigen::MatrixXd; + + GauXC::LoadBalancerFactory lb_factory(GauXC::ExecutionSpace::Host, "Default"); + auto lb = lb_factory.get_instance(rt, mol, mg, basis); + + GauXC::MolecularWeightsFactory mw_factory(GauXC::ExecutionSpace::Host, + "Default", + GauXC::MolecularWeightsSettings{}); + auto mw = mw_factory.get_instance(); + mw.modify_weights(lb); + + GauXC::functional_type func(ExchCXX::Backend::builtin, functional_id, + ExchCXX::Spin::Polarized); + + GauXC::XCIntegratorFactory integrator_factory( + GauXC::ExecutionSpace::Host, "Replicated", "Default", "Default", + "Default"); + auto integrator = integrator_factory.get_instance(func, lb); + + ReferenceResult r; + auto exc_vxc = integrator.eval_exc_vxc(Ps, Pz); + r.exc = std::get<0>(exc_vxc); + r.vxc_scalar = std::get<1>(exc_vxc); + r.vxc_z = std::get<2>(exc_vxc); + + GauXC::IntegratorSettingsEXC_GRAD exc_grad_settings; + exc_grad_settings.include_weight_derivatives = true; + r.gradient = integrator.eval_exc_grad(Ps, Pz, exc_grad_settings); + return r; +} + +/** @brief SkalaXC baseline EXC/VXC/gradient for one .fun model. */ +struct SkalaResult { + double exc; + Eigen::MatrixXd vxc_scalar, vxc_z; + std::vector gradient; // 3 * natoms, atom-major xyz +}; + +SkalaResult evaluate_skala(const SkalaXC::RuntimeEnvironment& rt, + const GauXC::Molecule& mol, + const GauXC::BasisSet& basis, + const std::string& model, const Eigen::MatrixXd& Ps, + const Eigen::MatrixXd& Pz) { + const SkalaXC::Molecule skala_mol = to_skala_molecule(mol); + const SkalaXC::BasisSet skala_basis = to_skala_basis(basis); + + // Mirror evaluate_reference's grid preset exactly so both paths integrate on + // an identical quadrature. + auto mg = SkalaXC::test::make_molgrid( + skala_mol, SkalaXC::AtomicGridSizeDefault::FineGrid); + + SkalaXC::LoadBalancerFactory lb_factory(SkalaXC::ExecutionSpace::Host, + "Default"); + auto lb = lb_factory.get_instance(rt, skala_mol, mg, skala_basis); + + SkalaXC::MolecularWeightsFactory mw_factory( + SkalaXC::ExecutionSpace::Host, "Default", + SkalaXC::MolecularWeightsSettings{}); + auto mw = mw_factory.get_instance(); + mw.modify_weights(lb); + + SkalaXC::functional_type func(model); + SkalaXC::XCIntegratorFactory integrator_factory( + SkalaXC::ExecutionSpace::Host); + auto integrator = integrator_factory.get_instance(func, lb); + + SkalaResult r; + auto exc_vxc = integrator.eval_exc_vxc(Ps, Pz); + r.exc = std::get<0>(exc_vxc); + r.vxc_scalar = std::get<1>(exc_vxc); + r.vxc_z = std::get<2>(exc_vxc); + + // include_weight_derivatives defaults to true (the only mode SkalaXC + // supports), matching evaluate_reference's gradient settings. + r.gradient = integrator.eval_exc_grad(Ps, Pz); + return r; +} + +/** @brief Pick the density RNG seed on rank 0 and broadcast it to all ranks. */ +std::uint64_t choose_seed(const GauXC::RuntimeEnvironment& rt) { + std::uint64_t seed = 0; + if (rt.comm_rank() == 0) { + if (const char* env = std::getenv("SKALAXC_TEST_SEED")) + seed = std::strtoull(env, nullptr, 10); + else + seed = std::random_device{}(); + } +#ifdef GAUXC_HAS_MPI + MPI_Bcast(&seed, 1, MPI_UINT64_T, 0, MPI_COMM_WORLD); +#endif + return seed; +} + +} // namespace + +TEST_CASE("SkalaXC baselines reproduce GauXC traditional functionals", + "[skala][traditional-integration]") { + // The reference path uses GauXC's runtime; the Skala path uses SkalaXC's own + // (public) runtime. Both wrap the same MPI communicator. + GauXC::RuntimeEnvironment rt{GAUXC_MPI_CODE(MPI_COMM_WORLD)}; + SkalaXC::RuntimeEnvironment skala_rt{SKALAXC_MPI_CODE(MPI_COMM_WORLD)}; + const bool is_root = rt.comm_rank() == 0; + + const std::uint64_t seed = choose_seed(rt); + std::mt19937_64 rng(seed); + const char* replay_dir = std::getenv("SKALAXC_TEST_DENSITY_DIR"); + const bool verbose = std::getenv("SKALAXC_TEST_VERBOSE") != nullptr; + + const std::string basis_path = + std::string(SKALAXC_TEST_BASIS_PATH) + "/cc-pvdz.g94"; + + // Six small (3-4 atom) molecules; every element appears in cc-pVDZ. + const std::vector molecules = { + {"h2o", + {{8, 0.0000, 0.0000, 0.1173}, + {1, 0.0000, 0.7572, -0.4692}, + {1, 0.0000, -0.7572, -0.4692}}}, + {"nh3", + {{7, 0.0000, 0.0000, 0.1128}, + {1, 0.0000, 0.9377, -0.2633}, + {1, 0.8121, -0.4689, -0.2633}, + {1, -0.8121, -0.4689, -0.2633}}}, + {"hcn", + {{1, 0.0000, 0.0000, -1.0640}, + {6, 0.0000, 0.0000, 0.0000}, + {7, 0.0000, 0.0000, 1.1560}}}, + {"co2", + {{6, 0.0000, 0.0000, 0.0000}, + {8, 0.0000, 0.0000, 1.1620}, + {8, 0.0000, 0.0000, -1.1620}}}, + {"h2o2", + {{8, 0.0000, 0.7375, -0.0528}, + {8, 0.0000, -0.7375, -0.0528}, + {1, 0.8190, 0.8170, 0.4220}, + {1, -0.8190, -0.8170, 0.4220}}}, + {"ch2o", + {{6, 0.0000, 0.0000, -0.5296}, + {8, 0.0000, 0.0000, 0.6742}, + {1, 0.0000, 0.9337, -1.1109}, + {1, 0.0000, -0.9337, -1.1109}}}, + }; + + const std::vector functionals = { + {"LDA", ExchCXX::Functional::LDA}, + {"PBE", ExchCXX::Functional::PBE}, + {"TPSS", ExchCXX::Functional::TPSS}, + }; + + // The neural .fun baselines reproduce the traditional functionals closely but + // not to machine precision: measured worst-case relative errors are ~1e-6 + // (LDA exchange is exact to ~1e-15). These tolerances leave headroom for + // random-density variation while still catching any real regression, which + // would degrade agreement by several orders of magnitude. + const double exc_tol = 1e-5; + const double vxc_tol = 2e-5; + const double grad_tol = 1e-4; + + for (const auto& mol_case : molecules) { + const GauXC::Molecule mol = make_molecule(mol_case.atoms); + GauXC::BasisSet basis = + GauXC::parse_basis(mol, basis_path, GauXC::SphericalType(true)); + const int nbf = static_cast(basis.nbf()); + + const DensityPair density = + make_density(mol_case.name, nbf, rng, replay_dir); + + // A positive semidefinite scalar density guarantees a nonnegative on-grid + // density; verify it explicitly rather than trusting diagonal dominance. + Eigen::LLT llt(density.Ps); + REQUIRE(llt.info() == Eigen::Success); + REQUIRE(density.Pz.cwiseAbs().maxCoeff() * 10.0 < + density.Ps.cwiseAbs().maxCoeff()); + + const auto mg = GauXC::MolGridFactory::create_default_molgrid( + mol, GauXC::PruningScheme::Unpruned, GauXC::BatchSize(512), + GauXC::RadialQuad::MuraKnowles, GauXC::AtomicGridSizeDefault::FineGrid); + + for (const auto& fun_case : functionals) { + const SkalaResult skala = evaluate_skala( + skala_rt, mol, basis, fun_case.skala_model, density.Ps, density.Pz); + const ReferenceResult ref = evaluate_reference( + rt, mol, mg, basis, fun_case.exchcxx_id, density.Ps, density.Pz); + + const double exc_err = rel_err(skala.exc, ref.exc); + const double vxcs_err = matrix_rel_err(skala.vxc_scalar, ref.vxc_scalar); + const double vxcz_err = matrix_rel_err(skala.vxc_z, ref.vxc_z); + + double grad_abs_err = 0.0, grad_max = 0.0; + REQUIRE(skala.gradient.size() == ref.gradient.size()); + for (std::size_t i = 0; i < ref.gradient.size(); ++i) { + grad_abs_err = std::max(grad_abs_err, + std::abs(skala.gradient[i] - ref.gradient[i])); + grad_max = std::max(grad_max, std::abs(ref.gradient[i])); + } + const double grad_err = grad_abs_err / std::max(1.0, grad_max); + + if (verbose && is_root) + std::cerr << "[traditional-integration] " << mol_case.name << " / " + << fun_case.skala_model << " nbf=" << nbf + << " EXC_skala=" << skala.exc << " EXC_ref=" << ref.exc + << " exc_rel=" << exc_err << " vxcs_rel=" << vxcs_err + << " vxcz_rel=" << vxcz_err << " grad_rel=" << grad_err + << "\n"; + + const bool ok = exc_err < exc_tol && vxcs_err < vxc_tol && + vxcz_err < vxc_tol && grad_err < grad_tol; + if (!ok && is_root && !replay_dir) { + const std::string base = + std::string("skalaxc_integration_fail_density_") + mol_case.name; + Eigen::saveMarketDense(density.Ps, base + "_scalar.mtx"); + Eigen::saveMarketDense(density.Pz, base + "_z.mtx"); + std::cerr << "[skala][traditional-integration] MISMATCH for " + << mol_case.name << " / " << fun_case.skala_model + << ". Reproduce with SKALAXC_TEST_SEED=" << seed + << " or replay via SKALAXC_TEST_DENSITY_DIR containing " + << base << "_{scalar,z}.mtx\n"; + } + + INFO("molecule=" << mol_case.name + << " functional=" << fun_case.skala_model + << " nbf=" << nbf << " seed=" << seed); + INFO("EXC_skala=" << skala.exc << " EXC_ref=" << ref.exc); + INFO("exc_rel_err=" << exc_err << " vxcs_rel_err=" << vxcs_err + << " vxcz_rel_err=" << vxcz_err + << " grad_rel_err=" << grad_err); + CHECK(exc_err < exc_tol); + CHECK(vxcs_err < vxc_tol); + CHECK(vxcz_err < vxc_tol); + CHECK(grad_err < grad_tol); + } + } +} diff --git a/SkalaXC/tests/skala_unit_main.cxx b/SkalaXC/tests/skala_unit_main.cxx new file mode 100644 index 00000000..72654ca6 --- /dev/null +++ b/SkalaXC/tests/skala_unit_main.cxx @@ -0,0 +1,49 @@ +#define CATCH_CONFIG_RUNNER +#include +#include + +#ifdef SKALAXC_HAS_CUDA +#include + +namespace { + +/** + * @brief Release unused LibTorch CUDA allocations between Catch2 cases. + * + * Catch2 v2 executes cases serially within this process. CTest may still run + * separate test processes in parallel; each process has its own allocator, + * although their live allocations still share the physical GPU. If in-process + * parallel test execution is introduced, this process-wide cleanup must be + * revisited because it can contend with concurrent cases and defeat caching. + */ +class CudaCacheCleanupListener : public Catch::TestEventListenerBase { + public: + using Catch::TestEventListenerBase::TestEventListenerBase; + + void testCaseEnded(const Catch::TestCaseStats&) override { + c10::cuda::CUDACachingAllocator::emptyCache(); + } +}; + +} // namespace + +CATCH_REGISTER_LISTENER(CudaCacheCleanupListener) +#endif + +#ifdef SKALAXC_HAS_MPI +#include +#endif + +int main(int argc, char* argv[]) { +#ifdef SKALAXC_HAS_MPI + MPI_Init(&argc, &argv); +#endif + + const int rc = Catch::Session().run(argc, argv); + +#ifdef SKALAXC_HAS_MPI + MPI_Finalize(); +#endif + + return rc; +} diff --git a/SkalaXC/tests/skala_util_unit_test.cxx b/SkalaXC/tests/skala_util_unit_test.cxx new file mode 100644 index 00000000..c0b355ef --- /dev/null +++ b/SkalaXC/tests/skala_util_unit_test.cxx @@ -0,0 +1,31 @@ +#include + +#include "task_data.hpp" +#include + +TEST_CASE("functional_type carries a model selector", "[skala][settings]") { + SkalaXC::functional_type empty; + REQUIRE(empty.empty()); + REQUIRE(empty.model().empty()); + + SkalaXC::functional_type pbe("PBE"); + REQUIRE_FALSE(pbe.empty()); + REQUIRE(pbe.model() == "PBE"); + + SkalaXC::functional_type custom("/tmp/custom_model.fun"); + REQUIRE(custom.model() == "/tmp/custom_model.fun"); +} + +TEST_CASE("Task model data starts empty", "[skala][features]") { + SkalaXC::TaskFeatureData features; + SkalaXC::TaskPotentialData potentials; + + REQUIRE(features.density.size() == 0); + REQUIRE(features.density_gradient.points() == 0); + REQUIRE(features.kinetic.size() == 0); + + REQUIRE(potentials.density.size() == 0); + REQUIRE(potentials.density_gradient.points() == 0); + REQUIRE(potentials.kinetic.size() == 0); + REQUIRE(potentials.dE_dw.size() == 0); +} diff --git a/SkalaXC/tests/skalaxc_c_api_test.c b/SkalaXC/tests/skalaxc_c_api_test.c new file mode 100644 index 00000000..d29618e6 --- /dev/null +++ b/SkalaXC/tests/skalaxc_c_api_test.c @@ -0,0 +1,838 @@ +/* SkalaXC black-box C test. + * + * A pure C consumer: it includes ONLY the public SkalaXC C header and links + * ONLY libskalaxc (plus the C HDF5 library to load its own density input). It + * has NO access to GauXC, LibTorch, or C++ symbols. Successful compilation and + * link -- as C, not C++ -- proves the C API is self-contained and ABI-isolated. + * + * It drives the per-stage pipeline (runtime -> molecule/basis -> molgrid -> + * load balancer -> molecular weights -> functional -> integrator), mirroring + * the C++ and Fortran surfaces. + */ + +#include + +#include + +#include +#include +#include +#include + +static int read_doubles(hid_t file, const char* dset, double* buf) { + hid_t d = H5Dopen2(file, dset, H5P_DEFAULT); + herr_t st; + if (d < 0) return -1; + st = H5Dread(d, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf); + H5Dclose(d); + return st < 0 ? -1 : 0; +} + +typedef struct error_call_result { + skalaxc_status_t status; + int output_reset; +} error_call_result_t; + +typedef error_call_result_t (*error_call_t)(void); + +static error_call_result_t null_runtime_output(void) { + error_call_result_t result; + result.status = skalaxc_runtime_environment_create( +#ifdef SKALAXC_HAS_MPI + MPI_COMM_WORLD, +#endif + NULL); + result.output_reset = 1; + return result; +} + +static error_call_result_t invalid_molecule_arrays(void) { + double xyz[3] = {0.0, 0.0, 0.0}; + char sentinel; + skalaxc_molecule_t output = (skalaxc_molecule_t)&sentinel; + error_call_result_t result; + result.status = skalaxc_molecule_from_arrays(1, NULL, xyz, &output); + result.output_reset = output == NULL; + return result; +} + +static error_call_result_t null_functional_model(void) { + char sentinel; + skalaxc_functional_t output = (skalaxc_functional_t)&sentinel; + error_call_result_t result; + result.status = skalaxc_functional_create(NULL, &output); + result.output_reset = output == NULL; + return result; +} + +static error_call_result_t null_exc_vxc_buffers(void) { + double value = 0.0; + error_call_result_t result; + result.status = skalaxc_xc_integrator_eval_exc_vxc_uks( + NULL, &value, &value, &value, &value, &value); + result.output_reset = 1; + return result; +} + +static error_call_result_t null_gradient_buffer(void) { + double value = 0.0; + error_call_result_t result; + result.status = + skalaxc_xc_integrator_eval_exc_grad_uks(NULL, &value, &value, NULL); + result.output_reset = 1; + return result; +} + +static error_call_result_t null_diagnostics_integrator(void) { + skalaxc_diagnostics_snapshot_t diagnostics; + error_call_result_t result; + result.status = skalaxc_xc_integrator_get_diagnostics(NULL, &diagnostics); + result.output_reset = 1; + return result; +} + +static error_call_result_t null_diagnostics_reset(void) { + error_call_result_t result; + result.status = skalaxc_xc_integrator_reset_diagnostics(NULL); + result.output_reset = 1; + return result; +} + +static int run_error_contracts(int* total) { + struct error_case { + const char* name; + error_call_t call; + int require_output_reset; + }; + static const struct error_case cases[] = { + {"null runtime output", null_runtime_output, 0}, + {"invalid molecule arrays", invalid_molecule_arrays, 1}, + {"null functional model", null_functional_model, 1}, + {"null EXC/VXC buffers", null_exc_vxc_buffers, 0}, + {"null gradient buffer", null_gradient_buffer, 0}, + {"null diagnostics integrator", null_diagnostics_integrator, 0}, + {"null diagnostics reset", null_diagnostics_reset, 0}, + }; + int failures = 0; + size_t index; + + for (index = 0; index < sizeof(cases) / sizeof(cases[0]); ++index) { + const error_call_result_t result = cases[index].call(); + const char* message = skalaxc_last_error_message(); + const int passed = + result.status == SKALAXC_INVALID_ARGUMENT && + (!cases[index].require_output_reset || result.output_reset) && + message != NULL && strstr(message, "null argument") != NULL; + printf("[%s] C error contract: %s\n", passed ? "PASS" : "FAIL", + cases[index].name); + if (!passed) ++failures; + ++*total; + } + + skalaxc_xc_integrator_destroy(NULL); + skalaxc_functional_destroy(NULL); + skalaxc_molecular_weights_destroy(NULL); + skalaxc_load_balancer_destroy(NULL); + skalaxc_molgrid_destroy(NULL); + skalaxc_basisset_destroy(NULL); + skalaxc_molecule_destroy(NULL); + skalaxc_runtime_environment_destroy(NULL); + skalaxc_device_runtime_settings_default(NULL); + skalaxc_timing_settings_default(NULL); + skalaxc_grid_settings_default(NULL); + printf("[PASS] C null destruction/default initialization\n"); + ++*total; + + { + const int queries_failed = + skalaxc_runtime_environment_comm_rank(NULL) == -1 && + strstr(skalaxc_last_error_message(), "null argument") != NULL && + skalaxc_runtime_environment_comm_size(NULL) == -1 && + strstr(skalaxc_last_error_message(), "null argument") != NULL && + skalaxc_molecule_natoms(NULL) == -1 && + strstr(skalaxc_last_error_message(), "null argument") != NULL && + skalaxc_basisset_nbf(NULL) == -1 && + strstr(skalaxc_last_error_message(), "null argument") != NULL && + skalaxc_xc_integrator_nbf(NULL) == -1 && + strstr(skalaxc_last_error_message(), "null argument") != NULL && + skalaxc_xc_integrator_natoms(NULL) == -1 && + strstr(skalaxc_last_error_message(), "null argument") != NULL; + printf("[%s] C null query sentinels and errors\n", + queries_failed ? "PASS" : "FAIL"); + if (!queries_failed) ++failures; + ++*total; + } + return failures; +} + +static int run_hdf5_failure_contracts(const char* path, int* total) { + char sentinel; + skalaxc_molecule_t molecule = (skalaxc_molecule_t)&sentinel; + skalaxc_basisset_t basis = (skalaxc_basisset_t)&sentinel; + skalaxc_status_t status; + int failures = 0; + int passed; + + status = skalaxc_molecule_from_hdf5(path, "/MISSING_MOLECULE", &molecule); + passed = status == SKALAXC_ERROR && molecule == NULL && + skalaxc_last_error_message() != NULL && + skalaxc_last_error_message()[0] != '\0'; + printf("[%s] C HDF5 molecule failure is atomic\n", passed ? "PASS" : "FAIL"); + if (!passed) ++failures; + ++*total; + + status = skalaxc_basisset_from_hdf5(path, "/MISSING_BASIS", &basis); + passed = status == SKALAXC_ERROR && basis == NULL && + skalaxc_last_error_message() != NULL && + skalaxc_last_error_message()[0] != '\0'; + printf("[%s] C HDF5 basis failure is atomic\n", passed ? "PASS" : "FAIL"); + if (!passed) ++failures; + ++*total; + + skalaxc_molecule_destroy(molecule); + skalaxc_basisset_destroy(basis); + return failures; +} + +static int check_invalid_enum(const char* name, skalaxc_status_t status, + int output_reset, const char* expected_message, + int* total) { + const char* message = skalaxc_last_error_message(); + const int passed = status == SKALAXC_INVALID_ARGUMENT && output_reset && + message != NULL && + strstr(message, expected_message) != NULL; + printf("[%s] C invalid enum: %s\n", passed ? "PASS" : "FAIL", name); + ++*total; + return passed ? 0 : 1; +} + +static int run_invalid_enum_contracts(const char* path, int* total) { + skalaxc_runtime_environment_t rt = NULL; + skalaxc_molecule_t mol = NULL; + skalaxc_basisset_t basis = NULL; + skalaxc_molgrid_t mg = NULL; + skalaxc_load_balancer_t lb = NULL; + skalaxc_molecular_weights_t mw = NULL; + skalaxc_functional_t func = NULL; + skalaxc_grid_settings_t grid; + skalaxc_integrator_settings_t integrator_settings; + skalaxc_status_t status; + char sentinel; + int failures = 0; + + status = skalaxc_runtime_environment_create( +#ifdef SKALAXC_HAS_MPI + MPI_COMM_WORLD, +#endif + &rt); + if (status != SKALAXC_SUCCESS) goto setup_failed; + status = skalaxc_molecule_from_hdf5(path, "/MOLECULE", &mol); + if (status != SKALAXC_SUCCESS) goto setup_failed; + status = skalaxc_basisset_from_hdf5(path, "/BASIS", &basis); + if (status != SKALAXC_SUCCESS) goto setup_failed; + status = skalaxc_molgrid_create_default(mol, NULL, &mg); + if (status != SKALAXC_SUCCESS) goto setup_failed; + status = skalaxc_load_balancer_create(SkalaXC_ExecutionSpace_Host, rt, mol, + mg, basis, &lb); + if (status != SKALAXC_SUCCESS) goto setup_failed; + status = skalaxc_molecular_weights_create(SkalaXC_ExecutionSpace_Host, + SkalaXC_XCWeightAlg_SSF, &mw); + if (status != SKALAXC_SUCCESS) goto setup_failed; + status = skalaxc_molecular_weights_modify_weights(mw, lb); + if (status != SKALAXC_SUCCESS) goto setup_failed; + status = skalaxc_functional_create("LDA", &func); + if (status != SKALAXC_SUCCESS) goto setup_failed; + + skalaxc_grid_settings_default(&grid); + { + skalaxc_molgrid_t output = (skalaxc_molgrid_t)&sentinel; + grid.pruning = (enum SkalaXC_PruningScheme)99; + status = skalaxc_molgrid_create_default(mol, &grid, &output); + failures += check_invalid_enum("pruning scheme", status, output == NULL, + "invalid pruning scheme", total); + } + skalaxc_grid_settings_default(&grid); + { + skalaxc_molgrid_t output = (skalaxc_molgrid_t)&sentinel; + grid.radial_quad = (enum SkalaXC_RadialQuad)99; + status = skalaxc_molgrid_create_default(mol, &grid, &output); + failures += check_invalid_enum("radial quadrature", status, output == NULL, + "invalid radial quadrature", total); + } + skalaxc_grid_settings_default(&grid); + { + skalaxc_molgrid_t output = (skalaxc_molgrid_t)&sentinel; + grid.atomic_grid = (enum SkalaXC_AtomicGridSizeDefault)99; + status = skalaxc_molgrid_create_default(mol, &grid, &output); + failures += check_invalid_enum("atomic grid size", status, output == NULL, + "invalid atomic grid size", total); + } + { + skalaxc_load_balancer_t output = (skalaxc_load_balancer_t)&sentinel; + status = skalaxc_load_balancer_create((enum SkalaXC_ExecutionSpace)99, rt, + mol, mg, basis, &output); + failures += + check_invalid_enum("load-balancer execution space", status, + output == NULL, "invalid execution space", total); + } + { + skalaxc_molecular_weights_t output = (skalaxc_molecular_weights_t)&sentinel; + status = skalaxc_molecular_weights_create((enum SkalaXC_ExecutionSpace)99, + SkalaXC_XCWeightAlg_SSF, &output); + failures += + check_invalid_enum("weight execution space", status, output == NULL, + "invalid execution space", total); + } + { + skalaxc_molecular_weights_t output = (skalaxc_molecular_weights_t)&sentinel; + status = skalaxc_molecular_weights_create( + SkalaXC_ExecutionSpace_Host, (enum SkalaXC_XCWeightAlg)99, &output); + failures += check_invalid_enum("weight algorithm", status, output == NULL, + "invalid XC weight algorithm", total); + } + { + skalaxc_xc_integrator_t output = (skalaxc_xc_integrator_t)&sentinel; + status = skalaxc_xc_integrator_create((enum SkalaXC_ExecutionSpace)99, func, + lb, &output); + failures += + check_invalid_enum("integrator execution space", status, output == NULL, + "invalid execution space", total); + } + skalaxc_integrator_settings_default(&integrator_settings); + integrator_settings.domain_batch_mode = (enum SkalaXC_DomainBatchMode)99; + { + skalaxc_xc_integrator_t output = (skalaxc_xc_integrator_t)&sentinel; + status = skalaxc_xc_integrator_create_with_settings( + SkalaXC_ExecutionSpace_Host, func, lb, &integrator_settings, &output); + failures += check_invalid_enum("domain batch mode", status, output == NULL, + "invalid domain batch mode", total); + } + goto cleanup; + +setup_failed: + printf("[FAIL] C invalid enum setup: %s\n", skalaxc_last_error_message()); + ++failures; + ++*total; + +cleanup: + skalaxc_functional_destroy(func); + skalaxc_molecular_weights_destroy(mw); + skalaxc_load_balancer_destroy(lb); + skalaxc_molgrid_destroy(mg); + skalaxc_basisset_destroy(basis); + skalaxc_molecule_destroy(mol); + skalaxc_runtime_environment_destroy(rt); + return failures; +} + +static int evaluate_native_system(skalaxc_molecule_t mol, + skalaxc_basisset_t basis, const char* name) { + skalaxc_runtime_environment_t rt = NULL; + skalaxc_molgrid_t mg = NULL; + skalaxc_load_balancer_t lb = NULL; + skalaxc_molecular_weights_t mw = NULL; + skalaxc_functional_t func = NULL; + skalaxc_xc_integrator_t xc = NULL; + skalaxc_timing_settings_t timing_settings; + skalaxc_diagnostics_snapshot_t diagnostics; + const double Ps[4] = {0.5, 0.5, 0.5, 0.5}; + const double Pz[4] = {0.0, 0.0, 0.0, 0.0}; + double VXCs[4] = {0.0, 0.0, 0.0, 0.0}; + double VXCz[4] = {0.0, 0.0, 0.0, 0.0}; + double exc = 0.0; + int rc = 1; + int index; + skalaxc_status_t status; + + status = skalaxc_runtime_environment_create( +#ifdef SKALAXC_HAS_MPI + MPI_COMM_WORLD, +#endif + &rt); + if (status != SKALAXC_SUCCESS) goto cleanup; + status = skalaxc_molgrid_create_default(mol, NULL, &mg); + if (status != SKALAXC_SUCCESS) goto cleanup; + status = skalaxc_load_balancer_create(SkalaXC_ExecutionSpace_Host, rt, mol, + mg, basis, &lb); + if (status != SKALAXC_SUCCESS) goto cleanup; + status = skalaxc_molecular_weights_create(SkalaXC_ExecutionSpace_Host, + SkalaXC_XCWeightAlg_SSF, &mw); + if (status != SKALAXC_SUCCESS) goto cleanup; + status = skalaxc_molecular_weights_modify_weights(mw, lb); + if (status != SKALAXC_SUCCESS) goto cleanup; + status = skalaxc_functional_create("LDA", &func); + if (status != SKALAXC_SUCCESS) goto cleanup; + skalaxc_timing_settings_default(&timing_settings); + { + skalaxc_integrator_settings_t integrator_settings; + skalaxc_integrator_settings_default(&integrator_settings); + if (integrator_settings.timing.verbose != 0 || + integrator_settings.timing.debug_logging != 0 || + integrator_settings.domain_batch_mode != + SkalaXC_DomainBatchMode_Conservative) + goto cleanup; + } + status = skalaxc_xc_integrator_create_with_timing( + SkalaXC_ExecutionSpace_Host, func, lb, &timing_settings, &xc); + if (status != SKALAXC_SUCCESS) goto cleanup; + status = skalaxc_xc_integrator_eval_exc_vxc_uks(xc, Ps, Pz, VXCs, VXCz, &exc); + if (status != SKALAXC_SUCCESS || skalaxc_molecule_natoms(mol) != 2 || + skalaxc_basisset_nbf(basis) != 2 || skalaxc_xc_integrator_nbf(xc) != 2 || + skalaxc_xc_integrator_natoms(xc) != 2 || !isfinite(exc) || + fabs(VXCs[1] - VXCs[2]) >= 1e-10 || fabs(VXCz[1] - VXCz[2]) >= 1e-10) + goto cleanup; + for (index = 0; index < 4; ++index) + if (!isfinite(VXCs[index]) || !isfinite(VXCz[index])) goto cleanup; + + status = skalaxc_xc_integrator_get_diagnostics(xc, &diagnostics); + if (status != SKALAXC_SUCCESS || + diagnostics.backend != SkalaXC_ExecutionSpace_Host || + diagnostics.communicator_size < 1 || diagnostics.device_id != -1 || + diagnostics.openmp_threads < 1 || diagnostics.exc_vxc_calls != 1 || + diagnostics.tasks == 0 || diagnostics.points == 0 || + diagnostics.model_batches != 2 || diagnostics.domains != 2 || + diagnostics.local_atoms != 2 || + diagnostics.configured_model_batches != 2 || + diagnostics.task_points_min <= 0 || diagnostics.task_points_max <= 0 || + diagnostics.timings[SkalaXC_TimingMetric_ModelForward].status != + SkalaXC_TimingStatus_Complete || + diagnostics.timings[SkalaXC_TimingMetric_TotalEXCVXC].call_count != 1) + goto cleanup; + + status = skalaxc_xc_integrator_reset_diagnostics(xc); + if (status != SKALAXC_SUCCESS) goto cleanup; + status = skalaxc_xc_integrator_get_diagnostics(xc, &diagnostics); + if (status != SKALAXC_SUCCESS || diagnostics.exc_vxc_calls != 0 || + diagnostics.model_batches != 0 || diagnostics.tasks == 0 || + diagnostics.points == 0 || diagnostics.configured_model_batches != 2 || + diagnostics.timings[SkalaXC_TimingMetric_ModelLoad].call_count != 1 || + diagnostics.timings[SkalaXC_TimingMetric_ModelForward].status != + SkalaXC_TimingStatus_Unavailable) + goto cleanup; + + rc = 0; + +cleanup: + printf("[%s] C native construction: %s%s%s\n", rc == 0 ? "PASS" : "FAIL", + name, rc == 0 ? "" : " : ", + rc == 0 ? "" : skalaxc_last_error_message()); + skalaxc_xc_integrator_destroy(xc); + skalaxc_functional_destroy(func); + skalaxc_molecular_weights_destroy(mw); + skalaxc_load_balancer_destroy(lb); + skalaxc_molgrid_destroy(mg); + skalaxc_basisset_destroy(basis); + skalaxc_molecule_destroy(mol); + skalaxc_runtime_environment_destroy(rt); + return rc; +} + +static int run_native_construction_case(int use_arrays) { + static const double exponents[3] = {3.42525091, 0.62391373, 0.16885540}; + static const double coefficients[3] = {0.15432897, 0.53532814, 0.44463454}; + static const double atom_xyz[6] = {-0.7, 0.0, 0.0, 0.7, 0.0, 0.0}; + skalaxc_molecule_t mol = NULL; + skalaxc_basisset_t basis = NULL; + skalaxc_status_t status; + + if (use_arrays) { + const int64_t atomic_numbers[2] = {1, 1}; + const int32_t shell_l[2] = {0, 0}; + const int32_t shell_pure[2] = {0, 0}; + const int32_t shell_nprim[2] = {3, 3}; + double primitive_exponents[6]; + double primitive_coefficients[6]; + int index; + for (index = 0; index < 3; ++index) { + primitive_exponents[index] = primitive_exponents[index + 3] = + exponents[index]; + primitive_coefficients[index] = primitive_coefficients[index + 3] = + coefficients[index]; + } + status = skalaxc_molecule_from_arrays(2, atomic_numbers, atom_xyz, &mol); + if (status == SKALAXC_SUCCESS) + status = skalaxc_basisset_from_arrays(2, shell_l, shell_pure, atom_xyz, + shell_nprim, primitive_exponents, + primitive_coefficients, &basis); + } else { + status = skalaxc_molecule_create(&mol); + if (status == SKALAXC_SUCCESS) + status = skalaxc_molecule_add_atom(mol, 1, atom_xyz[0], atom_xyz[1], + atom_xyz[2]); + if (status == SKALAXC_SUCCESS) + status = skalaxc_molecule_add_atom(mol, 1, atom_xyz[3], atom_xyz[4], + atom_xyz[5]); + if (status == SKALAXC_SUCCESS) status = skalaxc_basisset_create(&basis); + if (status == SKALAXC_SUCCESS) + status = skalaxc_basisset_add_shell(basis, 0, 0, atom_xyz, 3, exponents, + coefficients, 1); + if (status == SKALAXC_SUCCESS) + status = skalaxc_basisset_add_shell(basis, 0, 0, atom_xyz + 3, 3, + exponents, coefficients, 1); + } + + if (status == SKALAXC_SUCCESS) + return evaluate_native_system(mol, basis, + use_arrays ? "arrays" : "incremental"); + + printf("[FAIL] C native construction: %s : %s\n", + use_arrays ? "arrays" : "incremental", skalaxc_last_error_message()); + skalaxc_basisset_destroy(basis); + skalaxc_molecule_destroy(mol); + return 1; +} + +/* Build the full pipeline for one fixture. On success all output handles are + * set and SKALAXC_SUCCESS is returned; on failure everything is torn down. */ +static skalaxc_status_t build( + const char* path, const char* model, const skalaxc_grid_settings_t* grid, + enum SkalaXC_ExecutionSpace execution_space, + skalaxc_runtime_environment_t* rt, skalaxc_molecule_t* mol, + skalaxc_basisset_t* basis, skalaxc_molgrid_t* mg, + skalaxc_load_balancer_t* lb, skalaxc_molecular_weights_t* mw, + skalaxc_functional_t* func, skalaxc_xc_integrator_t* xc) { + skalaxc_status_t st; + + if (execution_space == SkalaXC_ExecutionSpace_Device) { + skalaxc_device_runtime_settings_t device_settings; + skalaxc_device_runtime_settings_default(&device_settings); + st = skalaxc_device_runtime_environment_create( +#ifdef SKALAXC_HAS_MPI + MPI_COMM_WORLD, +#endif + &device_settings, rt); + } else { + st = skalaxc_runtime_environment_create( +#ifdef SKALAXC_HAS_MPI + MPI_COMM_WORLD, +#endif + rt); + } + if (st != SKALAXC_SUCCESS) return st; + + st = skalaxc_molecule_from_hdf5(path, "/MOLECULE", mol); + if (st != SKALAXC_SUCCESS) return st; + st = skalaxc_basisset_from_hdf5(path, "/BASIS", basis); + if (st != SKALAXC_SUCCESS) return st; + + st = skalaxc_molgrid_create_default(*mol, grid, mg); + if (st != SKALAXC_SUCCESS) return st; + + st = + skalaxc_load_balancer_create(execution_space, *rt, *mol, *mg, *basis, lb); + if (st != SKALAXC_SUCCESS) return st; + + st = skalaxc_molecular_weights_create(execution_space, + SkalaXC_XCWeightAlg_SSF, mw); + if (st != SKALAXC_SUCCESS) return st; + st = skalaxc_molecular_weights_modify_weights(*mw, *lb); + if (st != SKALAXC_SUCCESS) return st; + + st = skalaxc_functional_create(model, func); + if (st != SKALAXC_SUCCESS) return st; + + return skalaxc_xc_integrator_create(execution_space, *func, *lb, xc); +} + +static int run_case(const char* path, const char* model, const char* name, + const skalaxc_grid_settings_t* grid, + enum SkalaXC_ExecutionSpace execution_space) { + skalaxc_runtime_environment_t rt = NULL; + skalaxc_molecule_t mol = NULL; + skalaxc_basisset_t basis = NULL; + skalaxc_molgrid_t mg = NULL; + skalaxc_load_balancer_t lb = NULL; + skalaxc_molecular_weights_t mw = NULL; + skalaxc_functional_t func = NULL; + skalaxc_xc_integrator_t xc = NULL; + double *Ps = NULL, *Pz = NULL, *VXCs = NULL, *VXCz = NULL; + double exc_ref = 0.0, exc = 0.0, sym_err = 0.0, denom, rel_err; + int64_t nbf = 0, i, j; + size_t n2 = 0; + hid_t file = -1; + int rc = 1; + skalaxc_status_t st; + + st = build(path, model, grid, execution_space, &rt, &mol, &basis, &mg, &lb, + &mw, &func, &xc); + if (st != SKALAXC_SUCCESS) { + printf("[FAIL] %s : build failed: %s\n", name, + skalaxc_last_error_message()); + goto cleanup; + } + + nbf = skalaxc_xc_integrator_nbf(xc); + if (nbf <= 0) { + printf("[FAIL] %s : nbf <= 0\n", name); + goto cleanup; + } + n2 = (size_t)nbf * (size_t)nbf; + Ps = (double*)calloc(n2, sizeof(double)); + Pz = (double*)calloc(n2, sizeof(double)); + VXCs = (double*)calloc(n2, sizeof(double)); + VXCz = (double*)calloc(n2, sizeof(double)); + if (!Ps || !Pz || !VXCs || !VXCz) { + printf("[FAIL] %s : out of memory\n", name); + goto cleanup; + } + + file = H5Fopen(path, H5F_ACC_RDONLY, H5P_DEFAULT); + if (file < 0 || read_doubles(file, "/DENSITY_SCALAR", Ps) || + read_doubles(file, "/DENSITY_Z", Pz) || + read_doubles(file, "/EXC", &exc_ref)) { + printf("[FAIL] %s : HDF5 read failed\n", name); + goto cleanup; + } + H5Fclose(file); + file = -1; + + st = skalaxc_xc_integrator_eval_exc_vxc_uks(xc, Ps, Pz, VXCs, VXCz, &exc); + if (st != SKALAXC_SUCCESS) { + printf("[FAIL] %s : eval failed: %s\n", name, skalaxc_last_error_message()); + goto cleanup; + } + + for (i = 0; i < nbf; ++i) + for (j = 0; j < nbf; ++j) { + double d = fabs(VXCs[i * nbf + j] - VXCs[j * nbf + i]); + if (d > sym_err) sym_err = d; + } + + denom = fabs(exc_ref) > 1.0 ? fabs(exc_ref) : 1.0; + rel_err = fabs(exc - exc_ref) / denom; + + if (rel_err < 1e-5 && sym_err < 1e-10) { + printf("[PASS] %s : nbf=%lld EXC=%.10f (ref %.10f, rel %.2e) sym=%.2e\n", + name, (long long)nbf, exc, exc_ref, rel_err, sym_err); + rc = 0; + } else { + printf("[FAIL] %s : EXC=%.10f ref=%.10f rel=%.2e sym=%.2e\n", name, exc, + exc_ref, rel_err, sym_err); + rc = 1; + } + +cleanup: + if (file >= 0) H5Fclose(file); + free(Ps); + free(Pz); + free(VXCs); + free(VXCz); + skalaxc_xc_integrator_destroy(xc); + skalaxc_functional_destroy(func); + skalaxc_molecular_weights_destroy(mw); + skalaxc_load_balancer_destroy(lb); + skalaxc_molgrid_destroy(mg); + skalaxc_basisset_destroy(basis); + skalaxc_molecule_destroy(mol); + skalaxc_runtime_environment_destroy(rt); + return rc; +} + +static int run_gradient_case(const char* path, const char* model, + const char* name, + enum SkalaXC_ExecutionSpace execution_space) { + skalaxc_runtime_environment_t rt = NULL; + skalaxc_molecule_t mol = NULL; + skalaxc_basisset_t basis = NULL; + skalaxc_molgrid_t mg = NULL; + skalaxc_load_balancer_t lb = NULL; + skalaxc_molecular_weights_t mw = NULL; + skalaxc_functional_t func = NULL; + skalaxc_xc_integrator_t xc = NULL; + double *Ps = NULL, *Pz = NULL, *gradient = NULL; + double squared_norm = 0.0, translation[3]; + int64_t nbf = 0, natoms = 0, i; + size_t n2 = 0; + hid_t file = -1; + int rc = 1; + skalaxc_status_t st; + + translation[0] = translation[1] = translation[2] = 0.0; + + st = build(path, model, NULL, execution_space, &rt, &mol, &basis, &mg, &lb, + &mw, &func, &xc); + if (st != SKALAXC_SUCCESS) { + printf("[FAIL] %s : build failed: %s\n", name, + skalaxc_last_error_message()); + goto cleanup; + } + + nbf = skalaxc_xc_integrator_nbf(xc); + natoms = skalaxc_xc_integrator_natoms(xc); + n2 = (size_t)nbf * (size_t)nbf; + Ps = (double*)calloc(n2, sizeof(double)); + Pz = (double*)calloc(n2, sizeof(double)); + gradient = (double*)calloc((size_t)(3 * natoms), sizeof(double)); + if (!Ps || !Pz || !gradient) { + printf("[FAIL] %s : out of memory\n", name); + goto cleanup; + } + + file = H5Fopen(path, H5F_ACC_RDONLY, H5P_DEFAULT); + if (file < 0 || read_doubles(file, "/DENSITY", Ps)) { + printf("[FAIL] %s : HDF5 read failed\n", name); + goto cleanup; + } + H5Fclose(file); + file = -1; + + st = skalaxc_xc_integrator_eval_exc_grad_uks(xc, Ps, Pz, gradient); + if (st != SKALAXC_SUCCESS) { + printf("[FAIL] %s : eval failed: %s\n", name, skalaxc_last_error_message()); + goto cleanup; + } + + for (i = 0; i < 3 * natoms; ++i) { + if (!isfinite(gradient[i])) goto cleanup; + squared_norm += gradient[i] * gradient[i]; + translation[i % 3] += gradient[i]; + } + if (squared_norm > 1e-6 && fabs(translation[0]) < 1e-10 && + fabs(translation[1]) < 1e-10 && fabs(translation[2]) < 1e-10) { + printf("[PASS] %s : natoms=%lld squared_norm=%.10f\n", name, + (long long)natoms, squared_norm); + rc = 0; + } + +cleanup: + if (file >= 0) H5Fclose(file); + free(Ps); + free(Pz); + free(gradient); + skalaxc_xc_integrator_destroy(xc); + skalaxc_functional_destroy(func); + skalaxc_molecular_weights_destroy(mw); + skalaxc_load_balancer_destroy(lb); + skalaxc_molgrid_destroy(mg); + skalaxc_basisset_destroy(basis); + skalaxc_molecule_destroy(mol); + skalaxc_runtime_environment_destroy(rt); + return rc; +} + +int main(void) { + const char* ref = SKALAXC_TEST_REF_DATA_PATH; + const char* names[] = {"HE/def2-qzvp/lda", "HE/def2-qzvp/pbe", + "HE/def2-qzvp/tpss"}; + const char* files[] = {"skala_he_def2qzvp_lda_uks.hdf5", + "skala_he_def2qzvp_pbe_uks.hdf5", + "skala_he_def2qzvp_tpss_uks.hdf5"}; + const char* models[] = {"LDA", "PBE", "TPSS"}; + int total = 0, failures = 0, i; + char path[1024]; + skalaxc_grid_settings_t grid; + skalaxc_device_runtime_settings_t device_settings; + + if (skalaxc_version() != NULL && + strcmp(skalaxc_version(), SKALAXC_EXPECTED_VERSION) == 0) { + printf("[PASS] SkalaXC version %s\n", skalaxc_version()); + } else { + printf("[FAIL] SkalaXC version: expected %s, got %s\n", + SKALAXC_EXPECTED_VERSION, + skalaxc_version() == NULL ? "(null)" : skalaxc_version()); + ++failures; + } + ++total; + +#ifdef SKALAXC_HAS_MPI + { + int mpi_initialized = 0; + MPI_Initialized(&mpi_initialized); + if (!mpi_initialized) MPI_Init(NULL, NULL); + } +#endif + + failures += run_error_contracts(&total); + snprintf(path, sizeof(path), "%s/%s", ref, files[0]); + failures += run_hdf5_failure_contracts(path, &total); + failures += run_invalid_enum_contracts(path, &total); + failures += run_native_construction_case(0); + ++total; + failures += run_native_construction_case(1); + ++total; + + skalaxc_device_runtime_settings_default(&device_settings); + if (device_settings.device_id == 0 && + fabs(device_settings.memory_fraction - 0.75) < 1e-15) { + printf("[PASS] device runtime defaults\n"); + } else { + printf("[FAIL] device runtime defaults\n"); + ++failures; + } + ++total; + +#ifndef SKALAXC_HAS_CUDA + { + char sentinel; + skalaxc_runtime_environment_t device_rt = + (skalaxc_runtime_environment_t)&sentinel; + const skalaxc_status_t status = skalaxc_device_runtime_environment_create( +#ifdef SKALAXC_HAS_MPI + MPI_COMM_WORLD, +#endif + &device_settings, &device_rt); + if (status == SKALAXC_ERROR && device_rt == NULL && + strstr(skalaxc_last_error_message(), "without CUDA support") != NULL) { + printf("[PASS] device runtime rejected by host build\n"); + } else { + printf("[FAIL] device runtime accepted by host build\n"); + ++failures; + if (device_rt != (skalaxc_runtime_environment_t)&sentinel) + skalaxc_runtime_environment_destroy(device_rt); + } + ++total; + } +#endif + + for (i = 0; i < 3; ++i) { + snprintf(path, sizeof(path), "%s/%s", ref, files[i]); + failures += + run_case(path, models[i], names[i], NULL, SkalaXC_ExecutionSpace_Host); + ++total; + } + + /* Grid API: an explicit default-filled struct and a NULL pointer must both + * reproduce the built-in preset (identical energy to the plain path). */ + snprintf(path, sizeof(path), "%s/%s", ref, files[1]); /* PBE fixture */ + skalaxc_grid_settings_default(&grid); + failures += run_case(path, models[1], "HE/def2-qzvp/pbe [grid:default]", + &grid, SkalaXC_ExecutionSpace_Host); + ++total; + failures += run_case(path, models[1], "HE/def2-qzvp/pbe [grid:null]", NULL, + SkalaXC_ExecutionSpace_Host); + ++total; + + snprintf(path, sizeof(path), "%s/%s", SKALAXC_GAUXC_REF_DATA_PATH, + "h2o2_def2-tzvp.hdf5"); + failures += run_gradient_case(path, "TPSS", "H2O2 gradient", + SkalaXC_ExecutionSpace_Host); + ++total; + +#ifdef SKALAXC_HAS_CUDA + snprintf(path, sizeof(path), "%s/%s", ref, files[2]); + failures += run_case(path, models[2], "HE/def2-qzvp/tpss [cuda]", NULL, + SkalaXC_ExecutionSpace_Device); + ++total; + + snprintf(path, sizeof(path), "%s/%s", SKALAXC_GAUXC_REF_DATA_PATH, + "h2o2_def2-tzvp.hdf5"); + /* The current TPSS trace can exceed sm_120 resources during backward. + * PBE keeps this language-binding test focused on the public gradient API + * until TPSS is retraced with a smaller TensorExpr kernel. */ + failures += run_gradient_case(path, "PBE", "H2O2 gradient [cuda]", + SkalaXC_ExecutionSpace_Device); + ++total; +#endif + + printf("\n%d / %d C public-API cases passed\n", total - failures, total); + +#ifdef SKALAXC_HAS_MPI + { + int mpi_finalized = 0; + MPI_Finalized(&mpi_finalized); + if (!mpi_finalized) MPI_Finalize(); + } +#endif + + return failures == 0 ? 0 : 1; +} diff --git a/SkalaXC/tests/skalaxc_fortran_assignment_test.F90 b/SkalaXC/tests/skalaxc_fortran_assignment_test.F90 new file mode 100644 index 00000000..0ead6c92 --- /dev/null +++ b/SkalaXC/tests/skalaxc_fortran_assignment_test.F90 @@ -0,0 +1,40 @@ +program skalaxc_fortran_assignment_test + use skalaxc + implicit none + + character(len=32) :: handle_type + type(skalaxc_runtime_environment_t) :: rt_source, rt_destination + type(skalaxc_molecule_t) :: mol_source, mol_destination + type(skalaxc_basisset_t) :: basis_source, basis_destination + type(skalaxc_molgrid_t) :: grid_source, grid_destination + type(skalaxc_load_balancer_t) :: lb_source, lb_destination + type(skalaxc_molecular_weights_t) :: weights_source, weights_destination + type(skalaxc_functional_t) :: func_source, func_destination + type(skalaxc_xc_integrator_t) :: xc_source, xc_destination + + if (command_argument_count() /= 1) error stop "expected one handle type" + call get_command_argument(1, handle_type) + + select case (trim(handle_type)) + case ("runtime") + rt_destination = rt_source + case ("molecule") + mol_destination = mol_source + case ("basis") + basis_destination = basis_source + case ("grid") + grid_destination = grid_source + case ("load-balancer") + lb_destination = lb_source + case ("molecular-weights") + weights_destination = weights_source + case ("functional") + func_destination = func_source + case ("integrator") + xc_destination = xc_source + case default + error stop "unknown handle type" + end select + + error stop "copy assignment unexpectedly succeeded" +end program skalaxc_fortran_assignment_test diff --git a/SkalaXC/tests/skalaxc_fortran_test.F90 b/SkalaXC/tests/skalaxc_fortran_test.F90 new file mode 100644 index 00000000..5a6d65a0 --- /dev/null +++ b/SkalaXC/tests/skalaxc_fortran_test.F90 @@ -0,0 +1,668 @@ +! SkalaXC black-box Fortran test. +! +! A pure Fortran consumer: it `use`s ONLY the `skalaxc` module and links ONLY +! libskalaxc (via skalaxc_fortran), plus HDF5-Fortran to load its own density +! input. It has NO access to GauXC or LibTorch. Successful compilation and link +! prove the Fortran API is self-contained and ABI-isolated. +! +! It drives the per-stage pipeline (runtime -> molecule/basis -> molgrid -> +! load balancer -> molecular weights -> functional -> integrator), mirroring +! the C++ and C surfaces. +! +! Usage: skalaxc_fortran_test + +program skalaxc_fortran_test + use, intrinsic :: iso_c_binding + use, intrinsic :: ieee_arithmetic, only: ieee_is_finite + use skalaxc +#ifdef SKALAXC_HAS_MPI + use mpi +#endif + use hdf5 + implicit none + + character(len=1024) :: ref_dir, gauxc_dir + integer :: nargs, herr, failures, total +#ifdef SKALAXC_HAS_MPI + integer :: mpi_err +#endif + character(len=1024) :: path + + nargs = command_argument_count() + if (nargs < 2) then + write (*, *) 'usage: skalaxc_fortran_test ' + stop 2 + end if + call get_command_argument(1, ref_dir) + call get_command_argument(2, gauxc_dir) + +#ifdef SKALAXC_HAS_MPI + block + logical :: inited + call MPI_Initialized(inited, mpi_err) + if (.not. inited) call MPI_Init(mpi_err) + end block +#endif + + call h5open_f(herr) + if (herr /= 0) stop 'h5open failed' + + failures = 0 + total = 0 + + block + character(len=:), allocatable :: version + version = skalaxc_version() + if (version == SKALAXC_EXPECTED_VERSION) then + write (*, '(A)') '[PASS] SkalaXC version '//version + else + write (*, '(A)') '[FAIL] SkalaXC version: expected '// & + SKALAXC_EXPECTED_VERSION//', got '//version + failures = failures + 1 + end if + total = total + 1 + end block + + block + type(skalaxc_device_runtime_settings_t) :: device_settings + type(skalaxc_timing_settings_t) :: timing_settings + type(skalaxc_integrator_settings_t) :: integrator_settings + device_settings = skalaxc_device_runtime_settings_default() + timing_settings = skalaxc_timing_settings_default() + integrator_settings = skalaxc_integrator_settings_default() + if (device_settings%device_id == 0 .and. & + abs(device_settings%memory_fraction - 0.75_c_double) < 1e-15_c_double & + .and. timing_settings%verbose == 0_c_int32_t .and. & + timing_settings%debug_logging == 0_c_int32_t .and. & + integrator_settings%timing%verbose == 0_c_int32_t .and. & + integrator_settings%timing%debug_logging == 0_c_int32_t .and. & + integrator_settings%domain_batch_mode == & + skalaxc_domainbatchmode%conservative) then + write (*, '(A)') '[PASS] runtime and timing defaults' + else + write (*, '(A)') '[FAIL] runtime and timing defaults' + failures = failures + 1 + end if + total = total + 1 + end block + + failures = failures + run_native_case(.false., 'incremental') + total = total + 1 + failures = failures + run_native_case(.true., 'arrays') + total = total + 1 + + failures = failures + run_handle_lifecycle_case() + total = total + 1 + + path = trim(ref_dir)//'/skala_he_def2qzvp_lda_uks.hdf5' + failures = failures + run_case(trim(path), 'LDA', 'HE/def2-qzvp/lda', & + enable_diagnostics=.true.) + total = total + 1 + + path = trim(ref_dir)//'/skala_he_def2qzvp_pbe_uks.hdf5' + failures = failures + run_case(trim(path), 'PBE', 'HE/def2-qzvp/pbe') + total = total + 1 + + path = trim(ref_dir)//'/skala_he_def2qzvp_tpss_uks.hdf5' + failures = failures + run_case(trim(path), 'TPSS', 'HE/def2-qzvp/tpss') + total = total + 1 + + path = trim(gauxc_dir)//'/h2o2_def2-tzvp.hdf5' + failures = failures + run_gradient_case(trim(path), 'TPSS', & + skalaxc_executionspace%host, 'H2O2 gradient') + total = total + 1 + +#ifdef SKALAXC_HAS_CUDA + path = trim(ref_dir)//'/skala_he_def2qzvp_tpss_uks.hdf5' + failures = failures + run_case(trim(path), 'TPSS', & + 'HE/def2-qzvp/tpss [cuda]', skalaxc_executionspace%device) + total = total + 1 + + path = trim(gauxc_dir)//'/h2o2_def2-tzvp.hdf5' + ! The current TPSS trace can exceed sm_120 resources during backward. + ! PBE keeps this language-binding test focused on the public gradient API + ! until TPSS is retraced with a smaller TensorExpr kernel. + failures = failures + run_gradient_case(trim(path), 'PBE', & + skalaxc_executionspace%device, 'H2O2 gradient [cuda]') + total = total + 1 +#endif + + write (*, '(/,I0,A,I0,A)') total - failures, ' / ', total, & + ' Fortran public-API cases passed' + + call h5close_f(herr) + +#ifdef SKALAXC_HAS_MPI + block + logical :: fin + call MPI_Finalized(fin, mpi_err) + if (.not. fin) call MPI_Finalize(mpi_err) + end block +#endif + + if (failures /= 0) stop 1 + +contains + + integer function run_handle_lifecycle_case() result(rc) + type(skalaxc_runtime_environment_t) :: rt, moved_rt + type(skalaxc_molecule_t) :: mol, moved_mol + type(skalaxc_basisset_t) :: basis, moved_basis + type(skalaxc_molgrid_t) :: mg, moved_mg + type(skalaxc_load_balancer_t) :: lb, moved_lb + type(skalaxc_molecular_weights_t) :: mw, moved_mw + type(skalaxc_functional_t) :: func, moved_func + type(skalaxc_xc_integrator_t) :: xc, moved_xc + integer(c_int) :: status + integer(c_int64_t) :: moved_mol_natoms, moved_xc_nbf, moved_basis_nbf + + rc = 1 + status = mol%create() + if (status /= SKALAXC_SUCCESS) goto 100 + status = mol%add_atom(2_c_int64_t, 0.0_c_double, 0.0_c_double, & + 0.0_c_double) + if (status /= SKALAXC_SUCCESS) goto 100 + status = basis%from_hdf5(trim(ref_dir)// & + '/skala_he_def2qzvp_lda_uks.hdf5', '/BASIS') + if (status /= SKALAXC_SUCCESS) goto 100 +#ifdef SKALAXC_HAS_MPI + status = skalaxc_runtime_environment_create(rt, MPI_COMM_WORLD) +#else + status = skalaxc_runtime_environment_create(rt) +#endif + if (status /= SKALAXC_SUCCESS) goto 100 + status = mg%create_default(mol) + if (status /= SKALAXC_SUCCESS) goto 100 + status = lb%create(skalaxc_executionspace%host, rt, mol, mg, basis) + if (status /= SKALAXC_SUCCESS) goto 100 + status = mw%create(skalaxc_executionspace%host, skalaxc_xcweightalg%ssf) + if (status /= SKALAXC_SUCCESS) goto 100 + status = mw%modify_weights(lb) + if (status /= SKALAXC_SUCCESS) goto 100 + status = func%create('LDA') + if (status /= SKALAXC_SUCCESS) goto 100 + status = xc%create(skalaxc_executionspace%host, func, lb) + if (status /= SKALAXC_SUCCESS) goto 100 + + status = moved_mol%create() + if (status /= SKALAXC_SUCCESS) goto 100 + call moved_rt%move_from(rt) + call moved_mol%move_from(mol) + call moved_basis%move_from(basis) + call moved_mg%move_from(mg) + call moved_lb%move_from(lb) + call moved_mw%move_from(mw) + call moved_func%move_from(func) + call moved_xc%move_from(xc) + + if (rt%is_valid() .or. mol%is_valid() .or. basis%is_valid() .or. & + mg%is_valid() .or. lb%is_valid() .or. mw%is_valid() .or. & + func%is_valid() .or. xc%is_valid()) goto 100 + if (.not. moved_rt%is_valid() .or. .not. moved_mol%is_valid() .or. & + .not. moved_basis%is_valid() .or. .not. moved_mg%is_valid() .or. & + .not. moved_lb%is_valid() .or. .not. moved_mw%is_valid() .or. & + .not. moved_func%is_valid() .or. .not. moved_xc%is_valid()) goto 100 + moved_mol_natoms = moved_mol%natoms() + moved_xc_nbf = moved_xc%nbf() + moved_basis_nbf = moved_basis%nbf() + if (moved_mol_natoms /= 1_c_int64_t .or. & + moved_xc_nbf /= moved_basis_nbf) goto 100 + rc = 0 + +100 continue + if (rc == 0) then + write (*, '(A)') '[PASS] Fortran unique handle ownership' + else if (status /= SKALAXC_SUCCESS) then + write (*, '(A,A)') '[FAIL] Fortran unique handle ownership: ', & + trim(skalaxc_last_error()) + else + write (*, '(A)') '[FAIL] Fortran unique handle ownership' + end if + end function run_handle_lifecycle_case + + integer function run_native_case(use_arrays, name) result(rc) + logical, intent(in) :: use_arrays + character(len=*), intent(in) :: name + type(skalaxc_runtime_environment_t) :: rt + type(skalaxc_molecule_t) :: mol + type(skalaxc_basisset_t) :: basis + type(skalaxc_molgrid_t) :: mg + type(skalaxc_load_balancer_t) :: lb + type(skalaxc_molecular_weights_t) :: mw + type(skalaxc_functional_t) :: func + type(skalaxc_xc_integrator_t) :: xc + integer(c_int64_t) :: atomic_numbers(2) + integer(c_int64_t) :: strided_atomic_numbers(4) + integer(c_int32_t) :: shell_l(2), shell_pure(2), shell_nprim(2) + integer(c_int32_t) :: strided_shell_l(4) + real(c_double) :: atom_xyz(6), exponents(3), coefficients(3) + real(c_double) :: primitive_exponents(6), primitive_coefficients(6) + real(c_double) :: Ps(4), Pz(4), VXCs(4), VXCz(4), exc + real(c_double) :: strided_matrix_storage(8), strided_gradient_storage(12) + real(c_double) :: short_matrix(3) + integer(c_int) :: status + integer(c_int64_t) :: molecule_atoms, basis_functions + integer(c_int64_t) :: integrator_atoms, integrator_basis_functions +#ifdef SKALAXC_HAS_MPI + integer(c_int) :: runtime_rank, runtime_size + integer :: world_rank, world_size, mpi_error +#endif + + atomic_numbers = [1_c_int64_t, 1_c_int64_t] + strided_atomic_numbers = [1_c_int64_t, 0_c_int64_t, 1_c_int64_t, 0_c_int64_t] + shell_l = [0_c_int32_t, 0_c_int32_t] + strided_shell_l = [0_c_int32_t, 0_c_int32_t, 0_c_int32_t, 0_c_int32_t] + shell_pure = [0_c_int32_t, 0_c_int32_t] + shell_nprim = [3_c_int32_t, 3_c_int32_t] + atom_xyz = [-0.7_c_double, 0.0_c_double, 0.0_c_double, & + 0.7_c_double, 0.0_c_double, 0.0_c_double] + exponents = [3.42525091_c_double, 0.62391373_c_double, & + 0.16885540_c_double] + coefficients = [0.15432897_c_double, 0.53532814_c_double, & + 0.44463454_c_double] + primitive_exponents = [exponents, exponents] + primitive_coefficients = [coefficients, coefficients] + rc = 1 + + if (use_arrays) then + status = mol%from_arrays(atomic_numbers, atom_xyz(1:5)) + if (status /= SKALAXC_INVALID_ARGUMENT) goto 100 + status = mol%from_arrays(strided_atomic_numbers(1:3:2), atom_xyz) + if (status /= SKALAXC_INVALID_ARGUMENT) goto 100 + status = basis%from_arrays(shell_l, shell_pure, atom_xyz, & + shell_nprim, primitive_exponents(1:5), & + primitive_coefficients) + if (status /= SKALAXC_INVALID_ARGUMENT) goto 100 + status = basis%from_arrays(strided_shell_l(1:3:2), shell_pure, & + atom_xyz, shell_nprim, primitive_exponents, & + primitive_coefficients) + if (status /= SKALAXC_INVALID_ARGUMENT) goto 100 + status = mol%from_arrays(atomic_numbers, atom_xyz) + if (status == SKALAXC_SUCCESS) then + status = basis%from_arrays(shell_l, shell_pure, atom_xyz, & + shell_nprim, primitive_exponents, & + primitive_coefficients) + end if + else + status = mol%create() + if (status == SKALAXC_SUCCESS) then + status = mol%add_atom(1_c_int64_t, atom_xyz(1), atom_xyz(2), atom_xyz(3)) + end if + if (status == SKALAXC_SUCCESS) then + status = mol%add_atom(1_c_int64_t, atom_xyz(4), atom_xyz(5), atom_xyz(6)) + end if + if (status == SKALAXC_SUCCESS) status = basis%create() + if (status == SKALAXC_SUCCESS) then + status = basis%add_shell(0_c_int32_t, 0_c_int32_t, atom_xyz(1:5:2), & + exponents, coefficients) + if (status /= SKALAXC_INVALID_ARGUMENT) goto 100 + status = basis%add_shell(0_c_int32_t, 0_c_int32_t, atom_xyz(1:3), & + exponents, coefficients) + end if + if (status == SKALAXC_SUCCESS) then + status = basis%add_shell(0_c_int32_t, 0_c_int32_t, atom_xyz(4:6), & + exponents, coefficients) + end if + end if + if (status /= SKALAXC_SUCCESS) goto 100 + +#ifdef SKALAXC_HAS_MPI + status = skalaxc_runtime_environment_create(rt, MPI_COMM_WORLD) +#else + status = skalaxc_runtime_environment_create(rt) +#endif + if (status /= SKALAXC_SUCCESS) goto 100 +#ifdef SKALAXC_HAS_MPI + call MPI_Comm_rank(MPI_COMM_WORLD, world_rank, mpi_error) + call MPI_Comm_size(MPI_COMM_WORLD, world_size, mpi_error) + runtime_rank = rt%comm_rank() + runtime_size = rt%comm_size() + if (runtime_rank /= world_rank .or. runtime_size /= world_size) goto 100 +#endif + status = mg%create_default(mol) + if (status /= SKALAXC_SUCCESS) goto 100 + status = lb%create(skalaxc_executionspace%host, rt, mol, mg, basis) + if (status /= SKALAXC_SUCCESS) goto 100 + status = mw%create(skalaxc_executionspace%host, skalaxc_xcweightalg%ssf) + if (status /= SKALAXC_SUCCESS) goto 100 + status = mw%modify_weights(lb) + if (status /= SKALAXC_SUCCESS) goto 100 + status = func%create('LDA') + if (status /= SKALAXC_SUCCESS) goto 100 + status = xc%create(skalaxc_executionspace%host, func, lb) + if (status /= SKALAXC_SUCCESS) goto 100 + + Ps = 0.5_c_double + Pz = 0.0_c_double + status = xc%eval_exc_vxc_uks(Ps, Pz, VXCs, VXCz, exc) + if (status /= SKALAXC_SUCCESS) goto 100 + status = xc%eval_exc_vxc_uks(short_matrix, Pz, VXCs, VXCz, exc) + if (status /= SKALAXC_INVALID_ARGUMENT) goto 100 + strided_matrix_storage = 0.0_c_double + status = xc%eval_exc_vxc_uks(strided_matrix_storage(1:8:2), Pz, & + VXCs, VXCz, exc) + if (status /= SKALAXC_INVALID_ARGUMENT) goto 100 + strided_gradient_storage = 0.0_c_double + status = xc%eval_exc_grad_uks(Ps, Pz, strided_gradient_storage(1:12:2)) + if (status /= SKALAXC_INVALID_ARGUMENT) goto 100 + status = SKALAXC_SUCCESS + molecule_atoms = mol%natoms() + basis_functions = basis%nbf() + integrator_atoms = xc%natoms() + integrator_basis_functions = xc%nbf() + if (molecule_atoms /= 2_c_int64_t .or. & + basis_functions /= 2_c_int64_t .or. & + integrator_atoms /= 2_c_int64_t .or. & + integrator_basis_functions /= 2_c_int64_t) goto 100 + if (.not. ieee_is_finite(exc) .or. .not. all(ieee_is_finite(VXCs)) .or. & + .not. all(ieee_is_finite(VXCz))) goto 100 + if (abs(VXCs(2) - VXCs(3)) >= 1e-10_c_double .or. & + abs(VXCz(2) - VXCz(3)) >= 1e-10_c_double) goto 100 + rc = 0 + +100 continue + if (rc == 0) then + write (*, '(A,A)') '[PASS] Fortran native construction: ', trim(name) + else if (status /= SKALAXC_SUCCESS) then + write (*, '(A,A,A,A)') '[FAIL] Fortran native construction: ', & + trim(name), ' : ', trim(skalaxc_last_error()) + else + write (*, '(A,A,A)') '[FAIL] Fortran native construction: ', & + trim(name), ' : validation failed' + end if + end function run_native_case + + !> @brief Build the full pipeline for one fixture. + subroutine build(path, model, rt, mol, basis, mg, lb, mw, func, xc, status, & + execution_space, timing_settings) + character(len=*), intent(in) :: path, model + type(skalaxc_runtime_environment_t), intent(inout) :: rt + type(skalaxc_molecule_t), intent(inout) :: mol + type(skalaxc_basisset_t), intent(inout) :: basis + type(skalaxc_molgrid_t), intent(inout) :: mg + type(skalaxc_load_balancer_t), intent(inout) :: lb + type(skalaxc_molecular_weights_t), intent(inout) :: mw + type(skalaxc_functional_t), intent(inout) :: func + type(skalaxc_xc_integrator_t), intent(inout) :: xc + integer(c_int), intent(out) :: status + integer(c_int), intent(in), optional :: execution_space + type(skalaxc_timing_settings_t), intent(in), optional :: timing_settings + integer(c_int) :: backend + type(skalaxc_device_runtime_settings_t) :: device_settings + + backend = skalaxc_executionspace%host + if (present(execution_space)) backend = execution_space + +#ifdef SKALAXC_HAS_MPI + if (backend == skalaxc_executionspace%device) then + device_settings = skalaxc_device_runtime_settings_default() + status = skalaxc_runtime_environment_create(rt, MPI_COMM_WORLD, & + device_settings) + else + status = skalaxc_runtime_environment_create(rt, MPI_COMM_WORLD) + end if +#else + if (backend == skalaxc_executionspace%device) then + device_settings = skalaxc_device_runtime_settings_default() + status = skalaxc_runtime_environment_create(rt, device_settings) + else + status = skalaxc_runtime_environment_create(rt) + end if +#endif + if (status /= SKALAXC_SUCCESS) return + status = mol%from_hdf5(path, '/MOLECULE') + if (status /= SKALAXC_SUCCESS) return + status = basis%from_hdf5(path, '/BASIS') + if (status /= SKALAXC_SUCCESS) return + status = mg%create_default(mol) + if (status /= SKALAXC_SUCCESS) return + status = lb%create(backend, rt, mol, mg, basis) + if (status /= SKALAXC_SUCCESS) return + status = mw%create(backend, skalaxc_xcweightalg%ssf) + if (status /= SKALAXC_SUCCESS) return + status = mw%modify_weights(lb) + if (status /= SKALAXC_SUCCESS) return + status = func%create(model) + if (status /= SKALAXC_SUCCESS) return + if (present(timing_settings)) then + status = xc%create(backend, func, lb, timing_settings=timing_settings) + else + status = xc%create(backend, func, lb) + end if + end subroutine build + + !> @brief Read a double dataset into a flat buffer. Returns .true. on success. + logical function read_dset(file_id, name, buf, dims) + integer(hid_t), intent(in) :: file_id + character(len=*), intent(in) :: name + real(c_double), intent(out) :: buf(:) + integer(hsize_t), intent(in) :: dims(1) + integer(hid_t) :: dset_id + integer :: e + read_dset = .false. + call h5dopen_f(file_id, name, dset_id, e) + if (e /= 0) return + call h5dread_f(dset_id, H5T_NATIVE_DOUBLE, buf, dims, e) + call h5dclose_f(dset_id, e) + read_dset = (e == 0) + end function read_dset + + !> @brief Evaluate one EXC/VXC reference case. Returns 0 on pass, 1 on fail. + integer function run_case(path, model, name, execution_space, & + enable_diagnostics) result(rc) + character(len=*), intent(in) :: path, model, name + integer(c_int), intent(in), optional :: execution_space + logical, intent(in), optional :: enable_diagnostics + type(skalaxc_runtime_environment_t) :: rt + type(skalaxc_molecule_t) :: mol + type(skalaxc_basisset_t) :: basis + type(skalaxc_molgrid_t) :: mg + type(skalaxc_load_balancer_t) :: lb + type(skalaxc_molecular_weights_t) :: mw + type(skalaxc_functional_t) :: func + type(skalaxc_xc_integrator_t) :: xc + real(c_double), allocatable :: Ps(:), Pz(:), VXCs(:), VXCz(:), one(:) + real(c_double) :: exc, exc_ref, rel_err, denom, sym_err, d + integer(c_int) :: status + integer(c_int64_t) :: nbf, n2, i, j + integer(hid_t) :: file_id + integer :: e + logical :: ok, active_rank, idle_rank + logical :: timing_enabled + type(skalaxc_timing_settings_t) :: timing_settings + type(skalaxc_diagnostics_snapshot_t) :: diagnostics + + rc = 1 + timing_enabled = .false. + if (present(enable_diagnostics)) timing_enabled = enable_diagnostics + if (timing_enabled) then + timing_settings = skalaxc_timing_settings_default() + call build(path, model, rt, mol, basis, mg, lb, mw, func, xc, status, & + execution_space, timing_settings) + else + call build(path, model, rt, mol, basis, mg, lb, mw, func, xc, status, & + execution_space) + end if + if (status /= SKALAXC_SUCCESS) then + write (*, '(A,A,A,A)') '[FAIL] ', trim(name), ' : build failed: ', & + trim(skalaxc_last_error()) + return + end if + + nbf = xc%nbf() + n2 = nbf*nbf + allocate (Ps(n2), Pz(n2), VXCs(n2), VXCz(n2), one(1)) + + call h5fopen_f(path, H5F_ACC_RDONLY_F, file_id, e) + ok = (e == 0) + if (ok) ok = read_dset(file_id, '/DENSITY_SCALAR', Ps, [int(n2, hsize_t)]) + if (ok) ok = read_dset(file_id, '/DENSITY_Z', Pz, [int(n2, hsize_t)]) + if (ok) ok = read_dset(file_id, '/EXC', one, [1_hsize_t]) + if (e == 0) call h5fclose_f(file_id, e) + if (.not. ok) then + write (*, '(A,A,A)') '[FAIL] ', trim(name), ' : HDF5 read failed' + return + end if + exc_ref = one(1) + + status = xc%eval_exc_vxc_uks(Ps, Pz, VXCs, VXCz, exc) + if (status /= SKALAXC_SUCCESS) then + write (*, '(A,A,A,A)') '[FAIL] ', trim(name), ' : eval failed: ', & + trim(skalaxc_last_error()) + return + end if + + if (timing_enabled) then + status = xc%diagnostics(diagnostics) + active_rank = diagnostics%tasks > 0_c_int64_t .and. & + diagnostics%points > 0_c_int64_t .and. & + diagnostics%local_atoms == 1_c_int64_t .and. & + diagnostics%configured_model_batches == 1_c_int64_t .and. & + diagnostics%task_points_min > 0_c_int64_t .and. & + diagnostics%task_points_max > 0_c_int64_t .and. & + diagnostics%model_batches == 1_c_int64_t .and. & + diagnostics%domains == 1_c_int64_t .and. & + diagnostics%timings(skalaxc_timing_model_forward)%status == & + skalaxc_timingstatus_complete .and. & + diagnostics%timings(skalaxc_timing_model_forward)%call_count == & + 1_c_int64_t + idle_rank = diagnostics%tasks == 0_c_int64_t .and. & + diagnostics%points == 0_c_int64_t .and. & + diagnostics%local_atoms == 0_c_int64_t .and. & + diagnostics%configured_model_batches == 0_c_int64_t .and. & + diagnostics%task_points_min == 0_c_int64_t .and. & + diagnostics%task_points_max == 0_c_int64_t .and. & + diagnostics%model_batches == 0_c_int64_t .and. & + diagnostics%domains == 0_c_int64_t .and. & + diagnostics%timings(skalaxc_timing_model_forward)%status == & + skalaxc_timingstatus_unavailable .and. & + diagnostics%timings(skalaxc_timing_model_forward)%call_count == & + 0_c_int64_t + if (status /= SKALAXC_SUCCESS .or. & + diagnostics%communicator_size < 1_c_int32_t .or. & + diagnostics%device_id /= -1_c_int32_t .or. & + diagnostics%openmp_threads < 1_c_int32_t .or. & + diagnostics%exc_vxc_calls /= 1_c_int64_t .or. & + (.not. active_rank .and. .not. idle_rank) .or. & + diagnostics%timings(skalaxc_timing_total_exc_vxc)%call_count /= & + 1_c_int64_t) return + status = xc%reset_diagnostics() + if (status /= SKALAXC_SUCCESS) return + status = xc%diagnostics(diagnostics) + if (status /= SKALAXC_SUCCESS .or. & + diagnostics%exc_vxc_calls /= 0_c_int64_t .or. & + diagnostics%model_batches /= 0_c_int64_t .or. & + diagnostics%domains /= 0_c_int64_t .or. & + diagnostics%configured_model_batches /= & + merge(1_c_int64_t, 0_c_int64_t, & + diagnostics%tasks > 0_c_int64_t) .or. & + .not. ((diagnostics%tasks > 0_c_int64_t .and. & + diagnostics%points > 0_c_int64_t) .or. & + (diagnostics%tasks == 0_c_int64_t .and. & + diagnostics%points == 0_c_int64_t)) .or. & + diagnostics%timings(skalaxc_timing_model_load)%call_count /= & + 1_c_int64_t .or. & + diagnostics%timings(skalaxc_timing_model_forward)%status /= & + skalaxc_timingstatus_unavailable) return + end if + + sym_err = 0.0_c_double + do j = 1, nbf + do i = 1, nbf + d = abs(VXCs((j - 1)*nbf + i) - VXCs((i - 1)*nbf + j)) + if (d > sym_err) sym_err = d + end do + end do + + denom = max(1.0_c_double, abs(exc_ref)) + rel_err = abs(exc - exc_ref)/denom + + if (rel_err < 1e-5_c_double .and. sym_err < 1e-10_c_double) then + write (*, '(A,A,A,I0,A,ES20.10,A,ES10.2,A,ES10.2)') '[PASS] ', & + trim(name), ' : nbf=', nbf, ' EXC=', exc, ' rel=', rel_err, & + ' sym=', sym_err + rc = 0 + else + write (*, '(A,A,A,ES20.10,A,ES10.2,A,ES10.2)') '[FAIL] ', trim(name), & + ' : EXC=', exc, ' rel=', rel_err, ' sym=', sym_err + end if + + end function run_case + + !> @brief Evaluate the H2O2 gradient case. Returns 0 on pass, 1 on fail. + integer function run_gradient_case(path, model, execution_space, name) result(rc) + character(len=*), intent(in) :: path, model, name + integer(c_int), intent(in) :: execution_space + type(skalaxc_runtime_environment_t) :: rt + type(skalaxc_molecule_t) :: mol + type(skalaxc_basisset_t) :: basis + type(skalaxc_molgrid_t) :: mg + type(skalaxc_load_balancer_t) :: lb + type(skalaxc_molecular_weights_t) :: mw + type(skalaxc_functional_t) :: func + type(skalaxc_xc_integrator_t) :: xc + real(c_double), allocatable :: Ps(:), Pz(:), gradient(:) + real(c_double) :: squared_norm, translation(3) + integer(c_int) :: status + integer(c_int64_t) :: nbf, natoms, n2, i + integer(hid_t) :: file_id + integer :: e + logical :: ok + + rc = 1 + call build(path, model, rt, mol, basis, mg, lb, mw, func, xc, status, & + execution_space) + if (status /= SKALAXC_SUCCESS) then + write (*, '(A,A,A)') '[FAIL] ', trim(name), ' : build failed: '// & + trim(skalaxc_last_error()) + return + end if + + nbf = xc%nbf() + natoms = xc%natoms() + n2 = nbf*nbf + allocate (Ps(n2), Pz(n2), gradient(3*natoms)) + Pz = 0.0_c_double + + call h5fopen_f(path, H5F_ACC_RDONLY_F, file_id, e) + ok = (e == 0) + if (ok) ok = read_dset(file_id, '/DENSITY', Ps, [int(n2, hsize_t)]) + if (e == 0) call h5fclose_f(file_id, e) + if (.not. ok) then + write (*, '(A,A,A)') '[FAIL] ', trim(name), ' : HDF5 read failed' + return + end if + + status = xc%eval_exc_grad_uks(Ps, Pz, gradient) + if (status /= SKALAXC_SUCCESS) then + write (*, '(A,A,A)') '[FAIL] ', trim(name), ' : eval failed: '// & + trim(skalaxc_last_error()) + return + end if + + squared_norm = 0.0_c_double + translation = 0.0_c_double + do i = 1, 3*natoms + if (.not. ieee_is_finite(gradient(i))) then + return + end if + squared_norm = squared_norm + gradient(i)*gradient(i) + translation(int(mod(i - 1, 3_c_int64_t)) + 1) = & + translation(int(mod(i - 1, 3_c_int64_t)) + 1) + gradient(i) + end do + + if (squared_norm > 1e-6_c_double .and. abs(translation(1)) < 1e-10_c_double & + .and. abs(translation(2)) < 1e-10_c_double & + .and. abs(translation(3)) < 1e-10_c_double) then + write (*, '(A,A,A,I0,A,ES20.10)') & + '[PASS] ', trim(name), ' : natoms=', natoms, & + ' squared_norm=', squared_norm + rc = 0 + else + write (*, '(A,A,A)') '[FAIL] ', trim(name), & + ' : validation failed' + end if + + end function run_gradient_case + +end program skalaxc_fortran_test diff --git a/SkalaXC/tests/skalaxc_public_api_test.cxx b/SkalaXC/tests/skalaxc_public_api_test.cxx new file mode 100644 index 00000000..f91e365e --- /dev/null +++ b/SkalaXC/tests/skalaxc_public_api_test.cxx @@ -0,0 +1,540 @@ +// SkalaXC black-box public-API test. +// +// This translation unit is a *consumer*: it and its test utility include only +// the public SkalaXC header and have NO access to GauXC or LibTorch +// headers/libraries. Eigen is an explicit consumer-side dependency used to own +// matrices. Successful compilation and linking prove the SkalaXC API remains +// ABI-isolated. +// +// It drives the public pipeline exactly as documented (RuntimeEnvironment -> +// Molecule/BasisSet -> MolGrid -> LoadBalancer -> MolecularWeights -> +// functional_type -> XCIntegratorFactory -> XCIntegrator), mirroring GauXC. +// +// HighFive is used solely to load the test's own density input from the HDF5 +// fixture (the consumer's responsibility); it is unrelated to GauXC. + +#include + +#include "test_utils.hpp" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace { + +using Matrix = + Eigen::Matrix; +using Integrator = SkalaXC::XCIntegrator; + +static_assert(!std::is_copy_constructible_v); +static_assert(!std::is_copy_assignable_v); +static_assert(std::is_nothrow_move_constructible_v); +static_assert(std::is_nothrow_move_assignable_v); + +// A fully-built integrator plus the sizes a consumer tracks alongside it. +struct BuiltIntegrator { + Integrator integrator; + std::int64_t nbf; + std::int64_t natoms; +}; + +struct PipelineSettings { + SkalaXC::PruningScheme pruning = SkalaXC::PruningScheme::Unpruned; + std::int64_t batch_size = 512; + SkalaXC::RadialQuad radial = SkalaXC::RadialQuad::MuraKnowles; + SkalaXC::AtomicGridSizeDefault atomic_grid = + SkalaXC::AtomicGridSizeDefault::UltraFineGrid; + SkalaXC::XCWeightAlg weight_algorithm = SkalaXC::XCWeightAlg::SSF; +}; + +template +bool throws_skala_exception(Function function) { + try { + function(); + } catch (const SkalaXC::Exception&) { + return true; + } catch (...) { + return false; + } + return false; +} + +struct StateContractResults { + bool uninitialized_integrator; + bool uninitialized_caller_owned_integrator; + bool unmodified_weights; + bool empty_functional; + bool mismatched_execution_space; + bool duplicate_weight_modification; + bool reusable_load_balancer; +}; + +// Run the public pipeline for one fixture + model. After the integrator is +// built it is self-contained, so the intermediate stages may go out of scope. +BuiltIntegrator build(const std::string& fixture, const std::string& model, + const PipelineSettings& settings = {}, + SkalaXC::TimingSettings timing_settings = {}, + SkalaXC::DomainBatchMode domain_batch_mode = + SkalaXC::DomainBatchMode::Conservative) { +#ifdef SKALAXC_HAS_MPI + SkalaXC::RuntimeEnvironment rt(MPI_COMM_WORLD); +#else + SkalaXC::RuntimeEnvironment rt; +#endif + const auto system = SkalaXC::test::load_molecular_system(fixture); + + auto mg = SkalaXC::test::make_molgrid(system.molecule, settings.atomic_grid, + settings.batch_size, settings.pruning, + settings.radial); + + SkalaXC::LoadBalancerFactory lb_factory(SkalaXC::ExecutionSpace::Host); + auto lb = lb_factory.get_instance(rt, system.molecule, mg, system.basis); + + SkalaXC::MolecularWeightsSettings weight_settings; + weight_settings.weight_alg = settings.weight_algorithm; + SkalaXC::MolecularWeightsFactory mw_factory(SkalaXC::ExecutionSpace::Host, + "Default", weight_settings); + auto mw = mw_factory.get_instance(); + mw.modify_weights(lb); + + SkalaXC::functional_type func(model); + SkalaXC::XCIntegratorFactory xc_factory( + SkalaXC::ExecutionSpace::Host, timing_settings, domain_batch_mode); + return BuiltIntegrator{xc_factory.get_instance(func, lb), + static_cast(system.basis.nbf()), + static_cast(system.molecule.natoms())}; +} + +StateContractResults check_state_contracts(const std::string& fixture) { + StateContractResults results{}; + results.uninitialized_integrator = throws_skala_exception([] { + SkalaXC::XCIntegrator integrator; + const Matrix density; + (void)integrator.eval_exc_vxc(density, density); + }); + results.uninitialized_caller_owned_integrator = throws_skala_exception([] { + SkalaXC::XCIntegrator integrator; + Matrix density; + Matrix scalar_potential; + Matrix spin_potential; + (void)integrator.eval_exc_vxc(density, density, scalar_potential, + spin_potential); + }); + +#ifdef SKALAXC_HAS_MPI + SkalaXC::RuntimeEnvironment rt(MPI_COMM_WORLD); +#else + SkalaXC::RuntimeEnvironment rt; +#endif + const auto system = SkalaXC::test::load_molecular_system(fixture); + auto mg = SkalaXC::test::make_molgrid( + system.molecule, SkalaXC::AtomicGridSizeDefault::UltraFineGrid); + SkalaXC::LoadBalancerFactory lb_factory(SkalaXC::ExecutionSpace::Host); + auto lb = lb_factory.get_instance(rt, system.molecule, mg, system.basis); + SkalaXC::XCIntegratorFactory host_factory( + SkalaXC::ExecutionSpace::Host); + + results.unmodified_weights = throws_skala_exception([&] { + (void)host_factory.get_instance(SkalaXC::functional_type("PBE"), lb); + }); + + SkalaXC::MolecularWeightsFactory mw_factory( + SkalaXC::ExecutionSpace::Host, "Default", + SkalaXC::MolecularWeightsSettings{}); + auto mw = mw_factory.get_instance(); + mw.modify_weights(lb); + + auto first = host_factory.get_instance(SkalaXC::functional_type("PBE"), lb); + auto second = host_factory.get_instance(SkalaXC::functional_type("PBE"), lb); + const auto density = + SkalaXC::test::load_uks_density(fixture, "/DENSITY_SCALAR", "/DENSITY_Z"); + (void)first.eval_exc_vxc(density.scalar, density.spin); + const auto first_diagnostics = first.diagnostics(); + const auto second_before = second.diagnostics(); + (void)second.eval_exc_vxc(density.scalar, density.spin); + const auto second_after = second.diagnostics(); + results.reusable_load_balancer = + first_diagnostics.exc_vxc_calls == 1 && + second_before.exc_vxc_calls == 0 && second_after.exc_vxc_calls == 1 && + first_diagnostics.timing(SkalaXC::TimingMetric::ModelLoad).call_count == + 1 && + second_before.timing(SkalaXC::TimingMetric::ModelLoad).call_count == 1; + + results.empty_functional = throws_skala_exception( + [&] { (void)host_factory.get_instance(SkalaXC::functional_type{}, lb); }); + results.mismatched_execution_space = throws_skala_exception([&] { + SkalaXC::XCIntegratorFactory device_factory( + SkalaXC::ExecutionSpace::Device); + (void)device_factory.get_instance(SkalaXC::functional_type("PBE"), lb); + }); + results.duplicate_weight_modification = + throws_skala_exception([&] { mw.modify_weights(lb); }); + return results; +} + +struct CaseResult { + double exc, exc_ref, exc_rel_err; + std::int64_t nbf; + bool vxc_symmetric; + bool vxc_finite; +}; + +CaseResult run_case(const std::string& fixture, const std::string& model, + const PipelineSettings& settings = {}) { + BuiltIntegrator built = build(fixture, model, settings); + const std::int64_t nbf = built.nbf; + + HighFive::File file(fixture, HighFive::File::ReadOnly); + const auto density = + SkalaXC::test::load_uks_density(fixture, "/DENSITY_SCALAR", "/DENSITY_Z"); + double EXC_ref = 0.0; + file.getDataSet("/EXC").read(&EXC_ref); + + auto [EXC, VXCs, VXCz] = + built.integrator.eval_exc_vxc(density.scalar, density.spin); + + // VXC must be symmetric (nbf x nbf). + const bool sym = (VXCs - VXCs.transpose()).cwiseAbs().maxCoeff() <= 1e-10 && + (VXCz - VXCz.transpose()).cwiseAbs().maxCoeff() <= 1e-10; + + CaseResult r; + r.nbf = nbf; + r.exc = EXC; + r.exc_ref = EXC_ref; + r.exc_rel_err = std::abs(EXC - EXC_ref) / std::max(1.0, std::abs(EXC_ref)); + r.vxc_symmetric = sym; + r.vxc_finite = VXCs.allFinite() && VXCz.allFinite(); + return r; +} + +// A density whose extent does not match the basis must be rejected. +bool rejects_invalid_input_dimensions(const std::string& fixture) { + BuiltIntegrator built = build(fixture, "PBE"); + const std::int64_t nbf = built.nbf; + Matrix Ps(nbf, nbf > 1 ? nbf - 1 : nbf + 1); + Matrix Pz(nbf, nbf); + try { + (void)built.integrator.eval_exc_vxc(Ps, Pz); + } catch (const SkalaXC::Exception&) { + return true; + } + return false; +} + +bool caller_owned_potential_api_works(const std::string& fixture) { + BuiltIntegrator built = build(fixture, "PBE"); + const auto density = + SkalaXC::test::load_uks_density(fixture, "/DENSITY_SCALAR", "/DENSITY_Z"); + const auto [allocated_exc, allocated_scalar, allocated_spin] = + built.integrator.eval_exc_vxc(density.scalar, density.spin); + + Matrix scalar(built.nbf, built.nbf); + Matrix spin(built.nbf, built.nbf); + scalar.setConstant(-1.0); + spin.setConstant(-2.0); + const double caller_owned_exc = + built.integrator.eval_exc_vxc(density.scalar, density.spin, scalar, spin); + if (std::abs(caller_owned_exc - allocated_exc) > 1e-12 || + (scalar - allocated_scalar).cwiseAbs().maxCoeff() > 1e-12 || + (spin - allocated_spin).cwiseAbs().maxCoeff() > 1e-12) + return false; + + Matrix invalid_scalar(built.nbf, built.nbf > 1 ? built.nbf - 1 : 2); + Matrix untouched_spin = Matrix::Constant(built.nbf, built.nbf, 17.0); + if (!throws_skala_exception([&] { + (void)built.integrator.eval_exc_vxc(density.scalar, density.spin, + invalid_scalar, untouched_spin); + })) + return false; + return (untouched_spin.array() == 17.0).all(); +} + +bool gradient_api_works(const std::string& fixture) { + SkalaXC::TimingSettings timing_settings; + BuiltIntegrator built = build(fixture, "TPSS", {}, timing_settings); + BuiltIntegrator aggressive = build(fixture, "TPSS", {}, timing_settings, + SkalaXC::DomainBatchMode::Aggressive); + const std::int64_t natoms = built.natoms; + + const auto density = SkalaXC::test::load_uks_density(fixture, "/DENSITY", ""); + + const auto gradient = + built.integrator.eval_exc_grad(density.scalar, density.spin); + std::vector caller_owned_gradient( + static_cast(3 * natoms), -1.0); + built.integrator.eval_exc_grad(density.scalar, density.spin, + caller_owned_gradient); + const auto aggressive_gradient = + aggressive.integrator.eval_exc_grad(density.scalar, density.spin); + if (gradient.size() != static_cast(3 * natoms)) return false; + for (std::size_t i = 0; i < gradient.size(); ++i) + if (std::abs(caller_owned_gradient[i] - gradient[i]) > 1e-12) return false; + if (aggressive_gradient.size() != gradient.size()) return false; + + std::vector invalid_gradient(gradient.size() + 1, 19.0); + if (!throws_skala_exception([&] { + built.integrator.eval_exc_grad(density.scalar, density.spin, + invalid_gradient); + }) || + !std::all_of(invalid_gradient.begin(), invalid_gradient.end(), + [](double value) { return value == 19.0; })) + return false; + + double squared_norm = 0.0; + double translation[3] = {0.0, 0.0, 0.0}; + for (std::size_t i = 0; i < gradient.size(); ++i) { + if (!std::isfinite(gradient[i])) return false; + if (!std::isfinite(aggressive_gradient[i]) || + std::abs(aggressive_gradient[i] - gradient[i]) > 1e-10) + return false; + squared_norm += gradient[i] * gradient[i]; + translation[i % 3] += gradient[i]; + } + + // SkalaXC supports only weight-derivative-inclusive gradients; requesting + // otherwise must be rejected. + bool rejects_no_weight_derivatives = false; + SkalaXC::IntegratorSettingsEXC_GRAD no_weight_derivatives; + no_weight_derivatives.include_weight_derivatives = false; + try { + (void)built.integrator.eval_exc_grad(density.scalar, density.spin, + no_weight_derivatives); + } catch (const SkalaXC::Exception&) { + rejects_no_weight_derivatives = true; + } + + const auto diagnostics = built.integrator.diagnostics(); + const bool diagnostics_valid = + diagnostics.exc_gradient_calls == 2 && + diagnostics.timing(SkalaXC::TimingMetric::TotalEXCGradient).status == + SkalaXC::TimingStatus::Complete && + diagnostics.timing(SkalaXC::TimingMetric::GradientAssembly).status == + SkalaXC::TimingStatus::Complete; + + return diagnostics_valid && rejects_no_weight_derivatives && + std::sqrt(squared_norm) > 1e-3 && std::abs(translation[0]) < 1e-10 && + std::abs(translation[1]) < 1e-10 && std::abs(translation[2]) < 1e-10; +} + +bool diagnostics_api_works(const std::string& fixture) { + SkalaXC::TimingSettings timing_settings; + BuiltIntegrator built = build(fixture, "PBE", {}, timing_settings); + + const auto density = + SkalaXC::test::load_uks_density(fixture, "/DENSITY_SCALAR", "/DENSITY_Z"); + + (void)built.integrator.eval_exc_vxc(density.scalar, density.spin); + auto snapshot = built.integrator.diagnostics(); + const auto& model_load = snapshot.timing(SkalaXC::TimingMetric::ModelLoad); + const auto& model_forward = + snapshot.timing(SkalaXC::TimingMetric::ModelForward); + const auto& total = snapshot.timing(SkalaXC::TimingMetric::TotalEXCVXC); + const bool active_rank = + snapshot.tasks > 0 && snapshot.points > 0 && snapshot.local_atoms == 1 && + snapshot.configured_model_batches == 1 && snapshot.task_points_min > 0 && + snapshot.task_points_max > 0 && snapshot.model_batches == 1 && + snapshot.domains == 1 && + model_forward.status == SkalaXC::TimingStatus::Complete && + model_forward.call_count == 1; + const bool idle_rank = + snapshot.tasks == 0 && snapshot.points == 0 && + snapshot.local_atoms == 0 && snapshot.configured_model_batches == 0 && + snapshot.task_points_min == 0 && snapshot.task_points_max == 0 && + snapshot.model_batches == 0 && snapshot.domains == 0 && + model_forward.status == SkalaXC::TimingStatus::Unavailable && + model_forward.call_count == 0; + if (snapshot.backend != SkalaXC::ExecutionSpace::Host || + snapshot.communicator_size < 1 || snapshot.device_id != -1 || + snapshot.openmp_threads < 1 || snapshot.exc_vxc_calls != 1 || + (!active_rank && !idle_rank) || + model_load.status != SkalaXC::TimingStatus::Complete || + total.status != SkalaXC::TimingStatus::Complete || + model_load.call_count != 1 || total.call_count != 1) + return false; + + built.integrator.reset_diagnostics(); + snapshot = built.integrator.diagnostics(); + return snapshot.timing(SkalaXC::TimingMetric::ModelLoad).call_count == 1 && + snapshot.configured_model_batches == (snapshot.tasks > 0 ? 1 : 0) && + snapshot.timing(SkalaXC::TimingMetric::ModelForward).status == + SkalaXC::TimingStatus::Unavailable && + snapshot.exc_vxc_calls == 0 && snapshot.model_batches == 0 && + snapshot.domains == 0 && + ((snapshot.tasks > 0 && snapshot.points > 0) || + (snapshot.tasks == 0 && snapshot.points == 0)); +} + +} // namespace + +int main() { + const auto version = SkalaXC::version(); + if (version != SKALAXC_EXPECTED_VERSION) { + std::printf("[FAIL] SkalaXC version: expected %s, got %.*s\n", + SKALAXC_EXPECTED_VERSION, static_cast(version.size()), + version.data()); + return 1; + } + std::printf("[PASS] SkalaXC version %.*s\n", static_cast(version.size()), + version.data()); + +#ifdef SKALAXC_HAS_MPI + int mpi_initialized = 0; + MPI_Initialized(&mpi_initialized); + if (!mpi_initialized) MPI_Init(nullptr, nullptr); +#endif + + const SkalaXC::DeviceRuntimeSettings device_settings; + if (device_settings.device_id != 0 || + std::abs(device_settings.memory_fraction - 0.75) > 1e-15) { + std::printf("[FAIL] device runtime defaults\n"); + return 1; + } + + const std::string ref_dir = std::string(SKALAXC_TEST_REF_DATA_PATH); + + struct Fixture { + const char* name; + const char* file; + const char* model; + }; + const std::vector fixtures = { + {"HE / def2-qzvp / lda", "/skala_he_def2qzvp_lda_uks.hdf5", "LDA"}, + {"HE / def2-qzvp / pbe", "/skala_he_def2qzvp_pbe_uks.hdf5", "PBE"}, + {"HE / def2-qzvp / tpss", "/skala_he_def2qzvp_tpss_uks.hdf5", "TPSS"}, + }; + + int failures = 0; + for (const auto& fx : fixtures) { + try { + const CaseResult r = run_case(ref_dir + fx.file, fx.model); + const bool ok = (r.exc_rel_err < 1e-5) && r.vxc_symmetric && + r.vxc_finite && std::isfinite(r.exc); + std::printf( + "[%s] %s : nbf=%lld EXC=%.10f (ref %.10f, rel %.2e) vxc_sym=%d\n", + ok ? "PASS" : "FAIL", fx.name, (long long)r.nbf, r.exc, r.exc_ref, + r.exc_rel_err, (int)r.vxc_symmetric); + if (!ok) ++failures; + } catch (const SkalaXC::Exception& e) { + std::printf("[FAIL] %s : SkalaXC::Exception: %s\n", fx.name, e.what()); + ++failures; + } catch (const std::exception& e) { + std::printf("[FAIL] %s : std::exception: %s\n", fx.name, e.what()); + ++failures; + } + } + + struct SettingsCase { + const char* name; + PipelineSettings settings; + bool expect_success; + }; + const std::vector settings_cases = { + {"robust/becke/superfine/becke-weights", + {SkalaXC::PruningScheme::Robust, 128, SkalaXC::RadialQuad::Becke, + SkalaXC::AtomicGridSizeDefault::SuperFineGrid, + SkalaXC::XCWeightAlg::Becke}, + true}, + {"treutler/mhl/gm3/lko-weights", + {SkalaXC::PruningScheme::Treutler, 256, + SkalaXC::RadialQuad::MurrayHandyLaming, + SkalaXC::AtomicGridSizeDefault::GM3, SkalaXC::XCWeightAlg::LKO}, + true}, + {"unpruned/treutler-ahlrichs/gm5/ssf", + {SkalaXC::PruningScheme::Unpruned, 64, + SkalaXC::RadialQuad::TreutlerAhlrichs, + SkalaXC::AtomicGridSizeDefault::GM5, SkalaXC::XCWeightAlg::SSF}, + true}, + {"unpartitioned weights rejected", + {SkalaXC::PruningScheme::Unpruned, 512, SkalaXC::RadialQuad::MuraKnowles, + SkalaXC::AtomicGridSizeDefault::FineGrid, + SkalaXC::XCWeightAlg::NOTPARTITIONED}, + false}, + }; + const std::string settings_fixture = ref_dir + fixtures[1].file; + for (const auto& settings_case : settings_cases) { + try { + const CaseResult result = + run_case(settings_fixture, "PBE", settings_case.settings); + const bool passed = settings_case.expect_success && + std::isfinite(result.exc) && result.vxc_finite && + result.vxc_symmetric; + std::printf("[%s] settings: %s\n", passed ? "PASS" : "FAIL", + settings_case.name); + if (!passed) ++failures; + } catch (const std::exception& error) { + const bool passed = !settings_case.expect_success; + std::printf("[%s] settings: %s%s%s\n", passed ? "PASS" : "FAIL", + settings_case.name, passed ? "" : " : ", + passed ? "" : error.what()); + if (!passed) ++failures; + } + } + + if (!rejects_invalid_input_dimensions(ref_dir + fixtures.front().file)) { + std::printf("[FAIL] invalid input dimensions were accepted\n"); + ++failures; + } else { + std::printf("[PASS] invalid input dimensions rejected\n"); + } + + const StateContractResults state_contracts = + check_state_contracts(ref_dir + fixtures.front().file); + const auto check_contract = [&failures](const char* name, bool passed) { + std::printf("[%s] %s\n", passed ? "PASS" : "FAIL", name); + if (!passed) ++failures; + }; + check_contract("uninitialized integrator rejected", + state_contracts.uninitialized_integrator); + check_contract("uninitialized caller-owned integrator rejected", + state_contracts.uninitialized_caller_owned_integrator); + check_contract("integrator rejected unmodified weights", + state_contracts.unmodified_weights); + check_contract("empty functional rejected", state_contracts.empty_functional); + check_contract("mismatched execution spaces rejected", + state_contracts.mismatched_execution_space); + check_contract("duplicate weight modification rejected", + state_contracts.duplicate_weight_modification); + check_contract("load balancer reused with independent diagnostics", + state_contracts.reusable_load_balancer); + + if (!caller_owned_potential_api_works(ref_dir + fixtures[1].file)) { + std::printf("[FAIL] caller-owned potential API validation failed\n"); + ++failures; + } else { + std::printf("[PASS] caller-owned potential API\n"); + } + + const std::string gradient_fixture = + std::string(SKALAXC_GAUXC_REF_DATA_PATH) + "/h2o2_def2-tzvp.hdf5"; + if (!gradient_api_works(gradient_fixture)) { + std::printf("[FAIL] public gradient API validation failed\n"); + ++failures; + } else { + std::printf("[PASS] public gradient API\n"); + } + + if (!diagnostics_api_works(ref_dir + fixtures[1].file)) { + std::printf("[FAIL] public diagnostics API validation failed\n"); + ++failures; + } else { + std::printf("[PASS] public diagnostics API\n"); + } + + std::printf("\npublic-API failures: %d\n", failures); + +#ifdef SKALAXC_HAS_MPI + int mpi_finalized = 0; + MPI_Finalized(&mpi_finalized); + if (!mpi_finalized) MPI_Finalize(); +#endif + + return failures == 0 ? 0 : 1; +} diff --git a/SkalaXC/tests/spin_gradient_unit_test.cxx b/SkalaXC/tests/spin_gradient_unit_test.cxx new file mode 100644 index 00000000..9a7bd07d --- /dev/null +++ b/SkalaXC/tests/spin_gradient_unit_test.cxx @@ -0,0 +1,197 @@ +#include + +#include "component_matrix_map.hpp" +#include "spin_gradient.hpp" + +#include + +#include +#include +#include +#include + +namespace { + +double value(SkalaXC::Direction direction, Eigen::Index point, + SkalaXC::SpinChannel channel) { + return 100.0 * static_cast(direction) + + 10.0 * static_cast(point) + static_cast(channel); +} + +SkalaXC::SpinGradient make_gradient(Eigen::Index points) { + SkalaXC::SpinGradient gradient(points); + for (Eigen::Index point = 0; point < points; ++point) + for (Eigen::Index direction = 0; direction < SkalaXC::direction_dimension; + ++direction) + for (Eigen::Index spin = 0; spin < SkalaXC::spin_dimension; ++spin) + gradient(static_cast(direction), point, + static_cast(spin)) = + value(static_cast(direction), point, + static_cast(spin)); + return gradient; +} + +std::vector permutation( + std::initializer_list values) { + std::vector result; + result.reserve(values.size()); + for (const auto value : values) + result.push_back(SkalaXC::types::PermutationIndex{value}); + return result; +} + +} // namespace + +TEST_CASE("SpinGradient exposes GauXC direction-major storage", + "[eigen][spin-gradient]") { + const auto gradient = make_gradient(3); + + CHECK(gradient.points() == 3); + CHECK(gradient.direction_data(SkalaXC::Y) - + gradient.direction_data(SkalaXC::X) == + 6); + CHECK(gradient.direction_data(SkalaXC::Z) - + gradient.direction_data(SkalaXC::Y) == + 6); + + const auto x_direction = gradient.direction(SkalaXC::X); + CHECK(x_direction.rows() == gradient.points()); + CHECK(x_direction.cols() == SkalaXC::spin_dimension); + for (Eigen::Index point = 0; point < gradient.points(); ++point) { + CHECK(x_direction(point, SkalaXC::SpinChannel::Alpha) == + value(SkalaXC::X, point, SkalaXC::SpinChannel::Alpha)); + CHECK(x_direction(point, SkalaXC::SpinChannel::Beta) == + value(SkalaXC::X, point, SkalaXC::SpinChannel::Beta)); + } +} + +TEST_CASE("SpinGradient reuses storage for an unchanged point count", + "[eigen][spin-gradient]") { + SkalaXC::SpinGradient gradient(3); + auto* storage = gradient.direction_data(SkalaXC::X); + + gradient.resize(3); + + CHECK(gradient.points() == 3); + CHECK(gradient.direction_data(SkalaXC::X) == storage); + CHECK_THROWS_AS(gradient.resize(-1), std::invalid_argument); +} + +TEST_CASE("Scalar-z gradients convert once to alpha-beta gradients", + "[eigen][spin-gradient][representation]") { + SkalaXC::ScalarZGradient scalar_z(1); + scalar_z(SkalaXC::X, 0, SkalaXC::PauliChannel::Scalar) = 6.0; + scalar_z(SkalaXC::Y, 0, SkalaXC::PauliChannel::Scalar) = 8.0; + scalar_z(SkalaXC::Z, 0, SkalaXC::PauliChannel::Scalar) = 10.0; + scalar_z(SkalaXC::X, 0, SkalaXC::PauliChannel::SpinZ) = 2.0; + scalar_z(SkalaXC::Y, 0, SkalaXC::PauliChannel::SpinZ) = -2.0; + scalar_z(SkalaXC::Z, 0, SkalaXC::PauliChannel::SpinZ) = 4.0; + + SkalaXC::SpinGradient alpha_beta; + SkalaXC::convert_scalar_z_to_alpha_beta(scalar_z, alpha_beta); + + REQUIRE(alpha_beta(SkalaXC::X, 0, SkalaXC::SpinChannel::Alpha) == 4.0); + REQUIRE(alpha_beta(SkalaXC::Y, 0, SkalaXC::SpinChannel::Alpha) == 3.0); + REQUIRE(alpha_beta(SkalaXC::Z, 0, SkalaXC::SpinChannel::Alpha) == 7.0); + REQUIRE(alpha_beta(SkalaXC::X, 0, SkalaXC::SpinChannel::Beta) == 2.0); + REQUIRE(alpha_beta(SkalaXC::Y, 0, SkalaXC::SpinChannel::Beta) == 5.0); + REQUIRE(alpha_beta(SkalaXC::Z, 0, SkalaXC::SpinChannel::Beta) == 3.0); + + SkalaXC::AlphaBetaMatrix model_potential(1, SkalaXC::spin_dimension); + model_potential << 7.0, 3.0; + const auto potential_scalar_z = + SkalaXC::alpha_beta_to_scalar_z(model_potential); + STATIC_REQUIRE(SkalaXC::ScalarZChannels::ColsAtCompileTime == + SkalaXC::spin_dimension); + REQUIRE(potential_scalar_z(0, SkalaXC::PauliChannel::Scalar) == 5.0); + REQUIRE(potential_scalar_z(0, SkalaXC::PauliChannel::SpinZ) == 2.0); +} + +TEST_CASE("SpinGradient converts Torch tensors by semantic index", + "[eigen][spin-gradient]") { + const auto original = make_gradient(4); + const auto tensor = SkalaXC::spin_gradient_to_torch(original, true); + + REQUIRE(tensor.dim() == 3); + CHECK(tensor.size(0) == 2); + CHECK(tensor.size(1) == 3); + CHECK(tensor.size(2) == 4); + CHECK(tensor.scalar_type() == torch::kFloat64); + CHECK(tensor.requires_grad()); + + const auto round_trip = SkalaXC::spin_gradient_from_torch(tensor); + for (Eigen::Index point = 0; point < original.points(); ++point) + for (Eigen::Index direction = 0; direction < SkalaXC::direction_dimension; + ++direction) + for (Eigen::Index spin = 0; spin < SkalaXC::spin_dimension; ++spin) + CHECK(round_trip(static_cast(direction), point, + static_cast(spin)) == + original(static_cast(direction), point, + static_cast(spin))); + + CHECK_THROWS_AS(SkalaXC::spin_gradient_from_torch( + torch::zeros({2, 4, 3}, torch::kFloat64)), + std::invalid_argument); + CHECK_THROWS_AS(SkalaXC::spin_gradient_from_torch( + torch::zeros({2, 3, 3}, torch::kFloat32)), + std::invalid_argument); +} + +TEST_CASE("SpinGradient permutes whole point records", + "[eigen][spin-gradient]") { + auto gradient = make_gradient(3); + gradient.permute_points(permutation({2, 0, 1})); + + for (Eigen::Index direction = 0; direction < SkalaXC::direction_dimension; + ++direction) + for (Eigen::Index spin = 0; spin < SkalaXC::spin_dimension; ++spin) { + const auto direction_value = static_cast(direction); + const auto spin_value = static_cast(spin); + CHECK(gradient(direction_value, 2, spin_value) == + value(direction_value, 0, spin_value)); + CHECK(gradient(direction_value, 0, spin_value) == + value(direction_value, 1, spin_value)); + CHECK(gradient(direction_value, 1, spin_value) == + value(direction_value, 2, spin_value)); + } + + CHECK_THROWS_AS(gradient.permute_points(permutation({0, 1})), + std::invalid_argument); + CHECK_THROWS_AS(gradient.permute_points(permutation({0, 0, 2})), + std::invalid_argument); + CHECK_THROWS_AS(gradient.permute_points(permutation({0, 1, 3})), + std::invalid_argument); +} + +TEST_CASE("ComponentMatrixMap flattens component matrices without copying", + "[eigen][component-map]") { + constexpr Eigen::Index components = 3; + constexpr Eigen::Index rows = 2; + constexpr Eigen::Index points = 4; + std::vector storage(components * rows * points, -1.0); + SkalaXC::ComponentMatrixMap values(storage.data(), components, rows, points); + + CHECK(values.components() == components); + CHECK(values.rows() == rows); + CHECK(values.points() == points); + for (Eigen::Index component = 0; component < components; ++component) { + CHECK(values.component_data(component) == + storage.data() + component * rows * points); + for (Eigen::Index point = 0; point < points; ++point) + for (Eigen::Index row = 0; row < rows; ++row) { + const auto expected_offset = + component * rows * points + point * rows + row; + values(component, row, point) = static_cast(expected_offset); + CHECK(&values(component, row, point) == + storage.data() + expected_offset); + CHECK(values.component(component)(row, point) == + static_cast(expected_offset)); + } + } + + const auto& const_values = values; + CHECK(const_values.component(2)(1, 3) == storage.back()); + CHECK_THROWS_AS(values.component(components), std::out_of_range); + CHECK_THROWS_AS(values(0, rows, 0), std::out_of_range); + CHECK_THROWS_AS(values(0, 0, points), std::out_of_range); +} \ No newline at end of file diff --git a/SkalaXC/tests/test_utils.cxx b/SkalaXC/tests/test_utils.cxx new file mode 100644 index 00000000..38a1c865 --- /dev/null +++ b/SkalaXC/tests/test_utils.cxx @@ -0,0 +1,94 @@ +#include "test_utils.hpp" + +#ifdef SKALAXC_HAS_HDF5 +#include +#endif + +#include +#include + +namespace SkalaXC::test { + +#ifdef SKALAXC_HAS_HDF5 +namespace { + +Eigen::MatrixXd load_square_matrix(HighFive::File& file, + const std::string& dataset) { + const auto data = file.getDataSet(dataset); + const auto dimensions = data.getDimensions(); + if (dimensions.size() != 2 || dimensions[0] != dimensions[1]) + throw std::runtime_error("Expected a square matrix in " + dataset); + + Eigen::MatrixXd matrix(static_cast(dimensions[0]), + static_cast(dimensions[1])); + data.read(matrix.data()); + return matrix; +} + +} // namespace +#endif + +BasisSet make_sto3g_hydrogen_basis(const Molecule& molecule) { + Shell::prim_array exponents{}; + Shell::prim_array coefficients{}; + exponents[0] = 3.42525091; + exponents[1] = 0.62391373; + exponents[2] = 0.16885540; + coefficients[0] = 0.15432897; + coefficients[1] = 0.53532814; + coefficients[2] = 0.44463454; + + BasisSet basis; + for (const auto& atom : molecule) + basis.emplace_back(PrimSize(3), AngularMomentum(0), SphericalType(false), + exponents, coefficients, + Shell::cart_array{atom.x, atom.y, atom.z}); + return basis; +} + +MolecularSystem make_rotated_h2_sto3g_system(double x_displacement) { + Molecule molecule; + molecule.emplace_back(AtomicNumber(1), -0.252 - x_displacement, 0.336, -0.56); + molecule.emplace_back(AtomicNumber(1), 0.252 + x_displacement, -0.336, 0.56); + auto basis = make_sto3g_hydrogen_basis(molecule); + return MolecularSystem{std::move(molecule), std::move(basis)}; +} + +MolGrid make_molgrid(const Molecule& molecule, AtomicGridSizeDefault grid_size, + std::int64_t batch_size, PruningScheme pruning, + RadialQuad radial) { + return MolGridFactory::create_default_molgrid( + molecule, pruning, BatchSize(batch_size), radial, grid_size); +} + +#ifdef SKALAXC_HAS_HDF5 +MolecularSystem load_molecular_system(const std::string& fixture) { + MolecularSystem system; + read_hdf5_record(system.molecule, fixture, "/MOLECULE"); + read_hdf5_record(system.basis, fixture, "/BASIS"); + return system; +} + +UksDensity load_uks_density(const std::string& fixture, + const std::string& scalar_dataset, + const std::string& spin_dataset) { + HighFive::File file(fixture, HighFive::File::ReadOnly); + UksDensity density; + density.scalar = load_square_matrix(file, scalar_dataset); + density.spin = + spin_dataset.empty() + ? Eigen::MatrixXd::Zero(density.scalar.rows(), density.scalar.cols()) + : load_square_matrix(file, spin_dataset); + if (density.spin.rows() != density.scalar.rows() || + density.spin.cols() != density.scalar.cols()) + throw std::runtime_error("Scalar and spin density dimensions differ"); + return density; +} +#endif + +double matrix_error_per_basis(const Eigen::MatrixXd& actual, + const Eigen::MatrixXd& reference) { + return (actual - reference).norm() / static_cast(reference.rows()); +} + +} // namespace SkalaXC::test \ No newline at end of file diff --git a/SkalaXC/tests/test_utils.hpp b/SkalaXC/tests/test_utils.hpp new file mode 100644 index 00000000..ba53b6f2 --- /dev/null +++ b/SkalaXC/tests/test_utils.hpp @@ -0,0 +1,42 @@ +#pragma once + +#include + +#include + +#include +#include + +namespace SkalaXC::test { + +struct MolecularSystem { + Molecule molecule; + BasisSet basis; +}; + +struct UksDensity { + Eigen::MatrixXd scalar; + Eigen::MatrixXd spin; +}; + +BasisSet make_sto3g_hydrogen_basis(const Molecule& molecule); + +MolecularSystem make_rotated_h2_sto3g_system(double x_displacement = 0.0); + +MolGrid make_molgrid(const Molecule& molecule, AtomicGridSizeDefault grid_size, + std::int64_t batch_size = 512, + PruningScheme pruning = PruningScheme::Unpruned, + RadialQuad radial = RadialQuad::MuraKnowles); + +#ifdef SKALAXC_HAS_HDF5 +MolecularSystem load_molecular_system(const std::string& fixture); + +UksDensity load_uks_density(const std::string& fixture, + const std::string& scalar_dataset, + const std::string& spin_dataset); +#endif + +double matrix_error_per_basis(const Eigen::MatrixXd& actual, + const Eigen::MatrixXd& reference); + +} // namespace SkalaXC::test \ No newline at end of file From d1931f0716757c15e8ca7959b7cda07e44f65d14 Mon Sep 17 00:00:00 2001 From: jenswehner Date: Fri, 4 Sep 2026 11:36:39 +0200 Subject: [PATCH 11/33] Add native examples and API docs --- SkalaXC/Doxyfile.in | 85 ++++ SkalaXC/README.md | 592 ++++++++++++++++++++++ SkalaXC/cmake/skalaxc-doxygen.cmake | 20 + SkalaXC/examples/CMakeLists.txt | 58 +++ SkalaXC/examples/c/skalaxc_eval.c | 171 +++++++ SkalaXC/examples/cpp/skalaxc_eval.cpp | 112 ++++ SkalaXC/examples/fortran/skalaxc_eval.F90 | 135 +++++ 7 files changed, 1173 insertions(+) create mode 100644 SkalaXC/Doxyfile.in create mode 100644 SkalaXC/README.md create mode 100644 SkalaXC/cmake/skalaxc-doxygen.cmake create mode 100644 SkalaXC/examples/CMakeLists.txt create mode 100644 SkalaXC/examples/c/skalaxc_eval.c create mode 100644 SkalaXC/examples/cpp/skalaxc_eval.cpp create mode 100644 SkalaXC/examples/fortran/skalaxc_eval.F90 diff --git a/SkalaXC/Doxyfile.in b/SkalaXC/Doxyfile.in new file mode 100644 index 00000000..82bedafe --- /dev/null +++ b/SkalaXC/Doxyfile.in @@ -0,0 +1,85 @@ +PROJECT_NAME = "SkalaXC" +PROJECT_NUMBER = "@SKALAXC_DOXYGEN_PROJECT_VERSION@" +OUTPUT_DIRECTORY = "@SKALAXC_DOXYGEN_OUTPUT_DIRECTORY@" + +OUTPUT_LANGUAGE = English +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = YES +ALWAYS_DETAILED_SEC = YES +FULL_PATH_NAMES = YES +STRIP_FROM_PATH = "@SKALAXC_DOXYGEN_SOURCE_DIR@/" +JAVADOC_AUTOBRIEF = YES +INHERIT_DOCS = YES +TAB_SIZE = 2 +MARKDOWN_SUPPORT = YES +AUTOLINK_SUPPORT = YES +BUILTIN_STL_SUPPORT = YES + +EXTRACT_ALL = NO +EXTRACT_PRIVATE = NO +EXTRACT_STATIC = YES +EXTRACT_LOCAL_CLASSES = NO +HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_CLASSES = NO + +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_IF_INCOMPLETE_DOC = YES +WARN_NO_PARAMDOC = YES +WARN_AS_ERROR = FAIL_ON_WARNINGS +EXCLUDE_SYMBOLS = at::Tensor \ + GauXC::XCDeviceAoSData + +INPUT = "@SKALAXC_DOXYGEN_SOURCE_DIR@/include" \ + "@SKALAXC_DOXYGEN_SOURCE_DIR@/src" +FILE_PATTERNS = *.h \ + *.h.in \ + *.hpp \ + *.hpp.in \ + *.c \ + *.cxx \ + *.cu \ + *.F90 \ + *.f90 +RECURSIVE = YES +# Exclude Doxygen Fortran-parser noise, unresolved private PIMPL definitions, +# and configured/generated API headers documented from their generated forms. +EXCLUDE_PATTERNS = */build*/* \ + */external/* \ + */src/fortran/* \ + */src/skalaxc_api.cxx \ + */include/skalaxc/detail/integrator_core.hpp \ + */include/skalaxc/c/config.h.in \ + */include/skalaxc/skalaxc_config.hpp.in \ + */include/skalaxc/skalaxc_export.h + +SOURCE_BROWSER = YES +INLINE_SOURCES = NO +REFERENCED_BY_RELATION = YES +REFERENCES_RELATION = YES + +GENERATE_HTML = YES +HTML_OUTPUT = html +GENERATE_TREEVIEW = YES +GENERATE_LATEX = NO +GENERATE_XML = NO +GENERATE_MAN = NO + +QUIET = YES + +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = YES +EXPAND_ONLY_PREDEF = YES +SEARCH_INCLUDES = NO +SKIP_FUNCTION_MACROS = YES +PREDEFINED = __global__= \ + __host__= \ + __device__= \ + __forceinline__= \ + __restrict__= \ + SKALAXC_HAS_MPI=1 \ + "SKALAXC_MPI_CODE(...)=__VA_ARGS__" +EXTENSION_MAPPING = cu=C++ + +HAVE_DOT = NO diff --git a/SkalaXC/README.md b/SkalaXC/README.md new file mode 100644 index 00000000..a39dfe34 --- /dev/null +++ b/SkalaXC/README.md @@ -0,0 +1,592 @@ +# SkalaXC + +SkalaXC is a standalone machine-learning exchange–correlation (XC) functional +library. It reuses GauXC's internal numerical machinery (grid, load balancer, collocation / local work + driver, molecular weights, HDF5 I/O), **without** using GauXC's public + `XCIntegrator` XC API, and exposes its **own ABI-isolated public API** (C++, C, and Fortran) for ML XC + evaluation. No GauXC or LibTorch type ever crosses the SkalaXC boundary. + +The complete validated capability is **host (CPU)** evaluation of the +**unrestricted (UKS)** ML XC energy, potential, and nuclear gradient for the +LDA, GGA, and kinetic-energy-dependent meta-GGA Skala models. An optional CUDA +backend is available with the limitations described below. + +--- + +## Layout and naming + +| Path | Contents | +| --- | --- | +| `include/skalaxc/` | Installed C++ and C public headers. | +| `src/host/` | Private CPU implementation of the Skala model and host driver. | +| `src/device/` | Private optional CUDA implementation, grouped by backend. | +| `src/c-api/`, `src/fortran/` | Private language-binding implementations. | +| `examples/{c,cpp,fortran}/` | Minimal public-API consumer programs. | +| `tests/` | Test suite, fixture provenance, tolerances, and focused commands. | +| `tests/ref_data/` | SkalaXC-owned HDF5 reference-integration fixtures. | + +The `skalaxc_` prefix is reserved for the library's public API and consumer +artifacts. The `skala_` prefix identifies private Skala model/driver code and +its white-box tests. This keeps the boundary visible in both source names and +build targets. + +--- + +## Design decisions + +These are the load-bearing decisions; keep them in mind before changing the +build or the public headers. + +### 1. GauXC is an internal implementation detail — reused, never leaked +- SkalaXC consumes GauXC as a **source-tree dependency** (`add_subdirectory`), + not an installed package. This is deliberate: GauXC's `gauxc` target publishes + `${GauXC}/src` on its `PUBLIC BUILD_INTERFACE` include path, which is what + grants SkalaXC access to GauXC's **private** headers (the concrete + `LocalHostWorkDriver` collocation engine, `XCHostData` scratch buffers, and + `gen_compressed_submat_map`). An *installed* GauXC would not expose these — and + that is the point: SkalaXC reuses internals, it never ships them. +- **GauXC `master` is never modified.** All SkalaXC code lives under + `skala/SkalaXC/`. A configure-time guard fails the build if the GauXC tree + carries any `onedft`/`skala` surface API (`GAUXC_HAS_ONEDFT`). + +#### Exactly which internals — and why the public API cannot substitute + +The ML path drives GauXC's concrete host work engine directly, so it depends on +three headers that live under `${GauXC}/src` and are therefore **never installed** +by GauXC (its `install()` ships `include/` only): + +- `xc_integrator/local_work_driver/host/local_host_work_driver.hpp` — + `LocalHostWorkDriver`, the concrete collocation / `xmat` / `uvvar` / `zmat` / + `inc_vxc` / `partition_weights` engine. +- `xc_integrator/replicated/host/xc_host_data.hpp` — `XCHostData`, the per-batch + host scratch buffers. +- `xc_integrator/integrator_util/integrator_common.hpp` — + `gen_compressed_submat_map`, the compressed AO-submatrix layout helper. + +Everything else SkalaXC takes from GauXC is already public/installed +(`LoadBalancer`, `MolecularWeights`, `BasisSetMap`, the abstract `LocalWorkDriver` +and `LocalWorkDriverFactory`, `MolGridFactory`, `RuntimeEnvironment`, +`Atom` / `Shell` / `Molecule` / `BasisSet`, and, when HDF5 support is enabled, +`read_hdf5_record`). + +This is why the source-tree build is **required**, not a convenience: + +- GauXC master's public `XCIntegrator::eval_exc_vxc*` only evaluates conventional + ExchCXX functionals point-wise; it has no hook for a TorchScript model that + needs the full grid feature set plus autograd back-propagation. +- The one public seam below that — the abstract `LocalWorkDriver` base — is an + empty interface (a virtual destructor and nothing else). Every operation the + ML path calls is declared on the non-installed `LocalHostWorkDriver`, reached + by down-casting the factory's base pointer. +- Because these three headers are neither installed nor a stable API, their types + can never appear in SkalaXC's public contract. The PIMPL boundary and symbol + hiding in decision 3 are therefore a **consequence** of reusing them, not an + independent choice. + +### 2. No pass-through to the GauXC XC entry point +SkalaXC reimplements the ML orchestration (collocation → features → model → +`VXC`) directly on GauXC's lowest-level reusable primitives. It never calls +`XCIntegrator::eval_exc_vxc*`. Structures that the ML path needs but that only +existed on the `skala` branch (per-task feature buffers, raw grid weights) are +**owned by SkalaXC** as parallel storage, not patched into GauXC. + +On both host and CUDA, each complete atomic grid domain belongs to exactly one +MPI rank. That rank constructs its features, runs its own model and autograd, +maps the derivatives back to local tasks, and assembles local AO or +nuclear-gradient contributions. OpenMP parallelizes atomic-grid generation and +screening; the CUDA backend keeps collocation and assembly work on the selected +device. MPI communication is reserved for the final EXC, VXC, electron-count, +and gradient reductions; model inputs and derivatives are not gathered or +scattered. + +During integrator construction, rank zero of the runtime communicator resolves +and reads the selected TorchScript archive. SkalaXC broadcasts the archive +bytes on that communicator, then every rank deserializes and owns its own model +module. Only runtime rank zero therefore needs filesystem access to the `.fun` +file. If rank zero cannot read the model, it broadcasts the error message so +that all ranks fail consistently instead of leaving non-root ranks blocked in +an MPI collective. Every rank still needs enough memory for its local model. + +### 3. Strict ABI isolation (C, C++, and Fortran) +The public boundary exposes **zero** GauXC / LibTorch symbols or types: +- **C++** — strict PIMPL: `SkalaXC::XCIntegrator` holds only a forward-declared + `unique_ptr`; all GauXC/Torch usage is confined to the `.cxx` TUs. Its + header-only matrix facade returns `(EXC, VXCs, VXCz)` using the caller's + owning column-major dense matrix type. `eval_exc_grad` returns an owning + `std::vector` with `3 * natoms` atom-major `xyz` values. Overloads + also write potentials into pre-sized `nbf × nbf` matrices and gradients into + a pre-sized `std::vector` under the same column-major and atom-major + contracts. `SkalaSettings` selects the model when the integrator is + constructed. The integrator loads and owns that TorchScript module for its + lifetime, so subsequent evaluations neither reload it nor use a process-wide + model cache. +- **C** — opaque handle (`skalaxc_calculator_t`) + status codes + POD only. +- **Fortran** — `iso_c_binding` wrapper over the C API; binds only to SkalaXC + opaque handles. Assumed-shape array wrappers reject noncontiguous storage and + extents that do not match the native molecule, basis, matrix, or gradient + contracts before calling C. +- At the binary boundary, densities and potentials cross as raw `double*` + (`nbf × nbf`, column-major). The C API passes caller-owned output buffers to + the private non-allocating integration core; it does not allocate or copy + output matrices. Gradients use caller-owned, atom-major `xyz` storage in C + and Fortran as well. GauXC exceptions are caught at the boundary and + re-thrown as `SkalaXC::Exception` (C++) or converted to status codes + (C/Fortran). +- **Link/runtime:** GauXC and its static dependencies are embedded into + `libskalaxc.so`; Eigen expressions are compiled only in private translation + units. Everything is compiled `-fvisibility=hidden` + and a linker **version script** (`cmake/skalaxc-exports.map`) plus + `--exclude-libs,ALL` export **only** `skalaxc_*` / `SkalaXC::*` symbols. This + prevents ODR / symbol-interposition clashes if the host application links its + own (possibly different) GauXC or LibTorch. + +Consumers therefore need **only** this repository's public headers and +`libskalaxc` — not GauXC, LibTorch, or Eigen. + +An `XCIntegrator` instance is not safe for concurrent evaluation calls. Use a +separate integrator per calling thread or serialize access to a shared one. +The Python binding releases the GIL during synchronous `eval_exc_vxc` and +`eval_exc_grad` calls because LibTorch autograd must run without it; therefore, +the same restriction applies to Python threads. + +### 4. CUDA is optional and private +`SKALAXC_ENABLE_CUDA` (**OFF** by default) builds a private device driver on +GauXC's Scheme1 CUDA work engine. Collocation, density variables, AO assembly, +Pulay terms, and partition-weight derivatives remain on the GPU. SkalaXC owns +the CUDA feature packing, TorchScript/autograd execution, model-potential +unpacking, and Skala-specific VXC transforms. CUDA, GauXC, Torch, and Eigen +types remain behind the same public PIMPL boundary as the host implementation. + +The CUDA backend supports UKS `EXC` + scalar/z `VXC` and nuclear gradients for +LDA, GGA, and kinetic-energy-dependent meta-GGA models. Repeated calls reuse +the model owned by the integrator. In an MPI build, every active rank evaluates +its locally owned complete domains with its own CUDA model. Only the final AO +potential, energy, electron-count, and nuclear-gradient values are reduced on +the **runtime communicator**. No CUDA path substitutes `MPI_COMM_WORLD` for the +communicator supplied by the caller. + +CUDA support remains experimental: it is disabled by default, and its device +orchestration is not yet a production-supported surface. Enable it only after +compiling and validating the required model, GPU architecture, and runtime +configuration. The complete production-validated backend remains host CPU. + +SkalaXC invokes each archive's integrated `get_exc()` method. Autograd provides +the density-feature potentials and `dE/dw`, the derivative of the integrated +energy with respect to each grid weight. GauXC evaluates the partition-weight +response through the chain rule `dE/dR = sum_i (dE/dw_i) (dw_i/dR)`. +This matches the Python Skala execution path and avoids retaining a separate +per-point energy-density model interface. + +The bundled TPSS archive remains supported for CUDA `EXC`/`VXC`. TPSS CUDA +gradients are not validated: its current TensorExpr backward trace can exceed +kernel launch resources on `sm_120` at LibTorch's default launch configuration. +TPSS CUDA-gradient validation is deferred until that archive is retraced with +lower register pressure. LDA/PBE host-device gradient parity and neural Skala's +kinetic-density and explicit-geometry gradients remain covered. SkalaXC does +not mutate LibTorch's process-global TensorExpr launch settings. + +--- + +## Prerequisites + +- **CMake ≥ 3.21** and a generator (Ninja recommended). +- **C++17 compiler** and a **C** compiler (GCC and Clang 22 are CI-tested); + **gfortran** only if building the Fortran API (enabled lazily, so + C/C++-only consumers do not need it). +- **Eigen >= 5.0,<6.0** (found as a private build dependency; Eigen 5.0.1 is + fetched when no compatible installation is available), **LibTorch** (found + via `find_package(Torch)`), and **nlohmann_json** (found or fetched). + **HDF5** and HighFive are required only when `SKALAXC_ENABLE_HDF5=ON`. +- For `SKALAXC_ENABLE_CUDA=ON`: an NVIDIA CUDA toolkit/compiler, a + CUDA-enabled LibTorch package compatible with that toolkit, and a CUDA + architecture supported by both. GauXC and the fetched ExchCXX dependency are + configured with CUDA as part of the same build. +- **GauXC `master` source** — vendored as a **git submodule** at + `SkalaXC/external/GauXC`, pinned to the exact commit SkalaXC was validated + against. Initialize it after cloning (see *Getting the source* below). Override + the location with `-DSKALAXC_GAUXC_SOURCE_DIR=/path/to/GauXC`; if the submodule + is absent, the same pinned commit is fetched from GitHub as a fallback. + +In this repository the dependencies are locked by the root `pixi.toml` and +`pixi.lock`. From the repository root, install the host environment and run the +standard configure, build, and test task: + +```bash +pixi install --locked -e skalaxc-host +OMP_NUM_THREADS=4 pixi run -e skalaxc-host skalaxc-test-host +``` + +`skalaxc-host` is locked for Linux x86-64, Linux ARM64, and macOS ARM64. The +Linux-only `skalaxc-host-clang` environment provides the CI-tested Clang 22 +toolchain, and `skalaxc-tools` owns clang-tidy and Doxygen: + +```bash +pixi run -e skalaxc-host-clang skalaxc-clang-tidy +pixi run -e skalaxc-tools skalaxc-doxygen +``` + +CUDA environments use named custom Linux x86-64 platforms so CUDA 12 and 13 +remain separate platform solutions in the root lockfile. Pass both the environment +and platform: + +```bash +pixi install --locked -e skalaxc-cuda12 -p linux-64-cuda12 +pixi install --locked -e skalaxc-cuda13 -p linux-64-cuda13 +``` + +The CUDA host compiler is constrained separately from the unrestricted CPU +toolchain. The root environments currently use these validated combinations: + +| Environment | CUDA toolkit | Host compiler | +| --- | --- | --- | +| `skalaxc-cuda12` | `>=12.8,<13` | GCC 14 | +| `skalaxc-cuda13` | `>=13,<14` | GCC 15 | +| `skalaxc-cuda13-clang` | `>=13,<14` | Clang 20 | + +The CMake compatibility table follows PyTorch's +[`CUDA_GCC_VERSIONS` and `CUDA_CLANG_VERSIONS`](https://github.com/pytorch/pytorch/blob/v2.13.0/torch/utils/cpp_extension.py). + +Use the same `-e` and `-p` pair with `pixi run` when configuring, building, or +testing a CUDA tree. + +--- + +## Build options + +| Option | Default | Description | +| --- | --- | --- | +| `SKALAXC_BUILD_FORTRAN` | `ON` | Build the Fortran API (`iso_c_binding`). | +| `SKALAXC_BUILD_TESTS` | `OFF` | Build the test suite. | +| `SKALAXC_BUILD_EXAMPLES` | `OFF` | Build the C/C++/Fortran example programs. | +| `SKALAXC_BUILD_DOCS` | `OFF` | Add the strict project-wide Doxygen target. | +| `SKALAXC_ENABLE_OPENMP` | `ON` | OpenMP threading in the host driver. | +| `SKALAXC_ENABLE_MPI` | `OFF` | MPI support. | +| `SKALAXC_ENABLE_CUDA` | `OFF` | CUDA UKS `EXC`/`VXC`/gradient backend. | +| `SKALAXC_ENABLE_HDF5` | `ON` | HDF5 molecule/basis readers and fixture-driven tests/examples. | +| `SKALAXC_ENABLE_SANITIZERS` | `OFF` | ASan/UBSan instrumentation for GNU/Clang validation builds. | + +--- + +## Compiling + +GauXC is a git submodule, so initialize it first (a fresh clone of the `skala` +repo should use `git clone --recursive`, or run this once afterwards): + +```bash +git submodule update --init SkalaXC/external/GauXC +``` + +Configure and build the library, tests, and examples: + +```bash +cmake -S . -B build -G Ninja \ + -DSKALAXC_BUILD_TESTS=ON \ + -DSKALAXC_BUILD_EXAMPLES=ON + +cmake --build build +``` + +Install the public headers, libraries, Fortran module, verified baseline +models, and CMake package metadata under a chosen prefix: + +```bash +cmake -S . -B build -G Ninja -DCMAKE_INSTALL_PREFIX=/path/to/prefix +cmake --build build +cmake --install build +``` + +Downstream CMake projects can then use `find_package(SkalaXC CONFIG REQUIRED)` +and link `SkalaXC::skalaxc` or, when enabled, `SkalaXC::skalaxc_fortran`. +Model aliases such as `LDA`, `PBE`, and `TPSS` resolve from +`/share/skalaxc/skala_models`; the package also exposes that directory +as `SkalaXC_MODEL_DIR`. + +The bundled `skala-1.1.fun` checkpoint contains Skala 1.1 revision 1 for host +evaluation. CUDA builds also bundle the device-compatible revision 1 checkpoint +as `skala-1.1-cuda.fun`. Pass the appropriate installed path or relative filename +to use the learned functional; only `LDA`, `PBE`, and `TPSS` have named aliases. + +The installed CMake package also exports the native feature flags, +`SkalaXC_TORCH_VERSION`, `SkalaXC_TORCH_CXX11_ABI`, +`SkalaXC_TORCH_CUDA_VERSION`, and `SkalaXC_CUDA_TOOLKIT_VERSION`. External +language bindings can use these values to reject incompatible runtime +dependencies before loading `libskalaxc`. CUDA-enabled builds require LibTorch +and the compiler toolkit to share a CUDA major compatibility family; minor +toolkit releases within that family may differ. + +An existing `.fun` path passed as the model selector always takes precedence. +Otherwise, aliases and relative model names resolve from the directory in the +`SKALAXC_MODEL_PATH` environment variable when it is set, or from the installed +model directory. + +Binary packagers can set `SKALAXC_INSTALL_RPATH` to a semicolon-separated list +of package-relative loader paths. The default remains empty for ordinary CMake +consumers; package builds should use relative entries appropriate to their +artifact layout and must not publish staging-prefix RPATHs. + +### Building Conda packages + +The multi-output recipe in `SkalaXC/recipe` produces `libskalaxc`, +`skalaxc-fortran`, and `skalaxc-python`. Its variant matrix covers `nompi` and +`openmpi`, Python 3.11 through 3.13, CPU packages on Linux x86-64, Linux ARM64, +and macOS ARM64, and CUDA 12/13 packages on Linux x86-64 only. Install the +locked packaging environment and build a representative CPU triplet from the +repository root: + +```bash +pixi install --locked -e skalaxc-package +OMP_NUM_THREADS=4 CPU_COUNT=2 pixi run -e skalaxc-package \ + rattler-build build --recipe SkalaXC/recipe/recipe.yaml \ + --target-platform linux-64 \ + --variant mpi=nompi --variant cuda=cpu --variant python=3.12 \ + --output-dir SkalaXC/output-packages --log-style plain +``` + +Use `linux-aarch64` or `osx-arm64` on the matching native runner. CUDA package +builds select `cuda12` or `cuda13` while retaining `linux-64` as the target +platform. `SkalaXC/pixi.toml` registers the package with the root Pixi workspace, +so package builds and future Python tests share the root `pixi.lock` and environments. + +### Querying the library version + +The public APIs return the semantic version of the loaded SkalaXC library as a +plain string, leaving logging and output control to the caller: + +```cpp +std::cout << "SkalaXC " << SkalaXC::version() << '\n'; +``` + +```c +printf("SkalaXC %s\n", skalaxc_version()); +``` + +```fortran +write (*, '(A)') 'SkalaXC '//skalaxc_version() +``` + +The C string and the storage referenced by the C++ view have static storage +duration and must not be modified or freed. The Fortran function returns an +allocatable character value. + +### Fortran handle ownership + +Each Fortran pipeline handle uniquely owns its underlying C object and releases +it automatically when finalized. Handles are non-copyable: intrinsic-looking +assignment terminates with an ownership error. Transfer ownership explicitly +with `call destination%move_from(source)`; the source becomes invalid and may +be checked with `source%is_valid()`. Calling a creation method on an already +valid handle replaces its object only after the new construction succeeds. + +For a CUDA build, select the architecture explicitly. For example, Blackwell +(`sm_120`) with a CUDA-enabled LibTorch installation can be configured with: + +```bash +cmake -S . -B build-cuda -G Ninja \ + -DSKALAXC_ENABLE_CUDA=ON \ + -DCMAKE_CUDA_ARCHITECTURES=120 \ + -DBLAS_LIBRARIES=$CONDA_PREFIX/lib/libblas.so + +cmake --build build-cuda +``` + +To validate and generate project-wide API and implementation documentation, +install Doxygen 1.9 or newer and enable the documentation target: + +```bash +cmake -S . -B build-doxygen -G Ninja \ + -DSKALAXC_BUILD_DOCS=ON +cmake --build build-doxygen --target skalaxc_doxygen +``` + +All SkalaXC-owned C, C++, CUDA, and Fortran sources are scanned; build trees and +the external GauXC source tree are excluded. Warnings for undocumented +entities, incomplete parameter documentation, and malformed Doxygen commands +fail the target after the full scan. Generated HTML is written to +`build-doxygen/doxygen/html` and is not installed or published with the public +Skala documentation. + +Create a device runtime and use `ExecutionSpace::Device` consistently for the +load balancer, molecular weights, and integrator factories: + +```cpp +SkalaXC::DeviceRuntimeSettings settings; +settings.device_id = 0; +settings.memory_fraction = 0.75; +SkalaXC::RuntimeEnvironment runtime{ + SKALAXC_MPI_CODE(comm, ) settings}; + +SkalaXC::LoadBalancerFactory load_balancer_factory{ + SkalaXC::ExecutionSpace::Device, "Default"}; +SkalaXC::MolecularWeightsFactory weights_factory{ + SkalaXC::ExecutionSpace::Device, "Default", {}}; +SkalaXC::XCIntegratorFactory integrator_factory{ + SkalaXC::ExecutionSpace::Device}; +``` + +The C API uses `skalaxc_device_runtime_environment_create` and +`SkalaXC_ExecutionSpace_Device`; the Fortran API passes +`skalaxc_device_runtime_settings_default()` to +`skalaxc_runtime_environment_create` and uses +`skalaxc_executionspace%device`. + +### Complete-domain batching + +Host and CUDA model calls use complete, dense atomic domains. Conservative +batching is the default and evaluates one domain per model call. Aggressive +batching groups all locally owned domains having the same exact grid size into +one call; it never mixes sizes, pads between domains, or presents ragged model +inputs. + +```cpp +SkalaXC::XCIntegratorFactory factory{ + SkalaXC::ExecutionSpace::Host, + SkalaXC::TimingSettings{}, + SkalaXC::DomainBatchMode::Aggressive}; +``` + +The C API uses `skalaxc_integrator_settings_t` with +`skalaxc_xc_integrator_create_with_settings`. The Fortran `xc%create` method +accepts the optional `domain_batch_mode` argument, for example +`skalaxc_domainbatchmode%aggressive`. + +Conservative mode minimizes model activation memory but does not guarantee that +one unusually large domain fits. Aggressive mode batches every compatible local +domain and may use substantially more memory. Neither mode predicts available +memory or retries after an allocation failure. Automatic memory-aware batching +is not implemented. `DeviceRuntimeSettings::memory_fraction` controls GauXC's +CUDA arena and does not cap Torch model memory. + +### Lightweight diagnostics + +Integrator-owned timing and structured setup diagnostics are always enabled. +Host timing uses `std::chrono::steady_clock` around model loading and coarse +evaluation phases; no task-level timers, MPI collectives, or synchronization +calls are added when a host snapshot is read. Retrieve the rank-local snapshot +directly from any integrator: + +```cpp +SkalaXC::XCIntegratorFactory factory{ + SkalaXC::ExecutionSpace::Host}; +auto integrator = factory.get_instance(functional, load_balancer); + +const auto snapshot = integrator.diagnostics(); +const auto forward = snapshot.timing(SkalaXC::TimingMetric::ModelForward); +integrator.reset_diagnostics(); +``` + +Snapshots contain fixed phase IDs, call counts, communicator/backend setup, +OpenMP and CUDA settings, local task/point/atom ranges, configured model-batch +geometry, and processed model-batch/domain counts. Empty MPI ranks report zero +for workload ranges. Host snapshots additionally contain last and cumulative +phase timings. Resetting clears evaluation values while preserving all setup +topology and the integrator's model-load timing. Load-balancer construction and +molecular weighting precede integrator construction and are therefore not +included. The C API exposes the same fixed data as POD structs in +`` through +`skalaxc_xc_integrator_create_with_timing`, +`skalaxc_xc_integrator_get_diagnostics`, and +`skalaxc_xc_integrator_reset_diagnostics`. The Fortran module provides the +corresponding interoperable types, optional `timing_settings` argument to +`xc%create`, and `xc%diagnostics`/`xc%reset_diagnostics` methods. + +Set `TimingSettings::debug_logging=true` to emit a human-readable trace to +`stderr`. Every runtime-communicator rank writes independently and prefixes +each complete line with its backend, local rank/size, and phase. The setup +report identifies the selected model, model features, parallel configuration, +local workload, batching policy, every exact-size model batch, and completed +model-load timing. Evaluation reports contain density-matrix traces/norms/maxima +and final EXC, potential, or gradient summaries. Matrix summaries add +enabled-only $O(n_\mathrm{bf}^2)$ host work. The textual format is intended for +interactive debugging and is not a stable parsing interface; use +`DiagnosticsSnapshot` for programmatic consumers. + +CUDA snapshots currently report evaluation calls, local tasks/points, model +batches, domains, setup topology, and model-load timing. With debug logging +enabled, CUDA evaluation timing is reported as unavailable. The planned CUDA +event collector will use query-only harvesting: +completed events contribute device timings and incomplete events remain +pending. `TimingSettings::verbose=true` is reserved for waiting for outstanding +events when a snapshot is read. CUDA event collection is not implemented yet; +host snapshots never require device synchronization. + +### Troubleshooting: BLAS selection + +GauXC's linalg auto-search may pick up a **system** BLAS (e.g. +`/usr/lib/x86_64-linux-gnu/libopenblas.so`) ahead of the one in your conda +environment. On toolchains where the system multiarch headers +(`/usr/include/x86_64-linux-gnu`) are incompatible with the conda compiler this +shows up as a `libstdc++`/`pthread` error while compiling GauXC (e.g. +`cannot convert … to 'unsigned int' … __GTHREAD_COND_INIT`). Pin the +environment's BLAS/LAPACK to avoid it: + +```bash +cmake -S . -B build -G Ninja \ + -DBLAS_LIBRARIES=$CONDA_PREFIX/lib/libblas.so +``` + +--- + +## Running the tests + +```bash +ctest --test-dir build --output-on-failure +``` + +CTest discovers the available tests for the enabled language backends and +execution spaces. See [`tests/README.md`](tests/README.md) for the suite's +assurance layers, feature coverage, exact focused commands, fixture provenance, +and numerical tolerance rationale. + +CUDA builds also run TPSS device EXC/VXC and PBE device-gradient evaluations +through the pure C and Fortran black-box tests. + +The black-box tests double as ABI-isolation proofs: they are given no GauXC +include dirs and do not link GauXC/LibTorch, so a successful compile+link is +itself part of the test. + +--- + +## Running the examples + +Enable `-DSKALAXC_BUILD_EXAMPLES=ON` with `SKALAXC_ENABLE_HDF5=ON`, then run any of the three consumer programs +against an HDF5 file containing `/MOLECULE`, `/BASIS`, `/DENSITY_SCALAR`, +`/DENSITY_Z`. The bundled fixtures work out of the box: + +```bash +export SKALAXC_MODEL_PATH="$PWD/build/data/skala_models" +./build/examples/skalaxc_eval_cpp tests/ref_data/skala_he_def2qzvp_pbe_uks.hdf5 PBE +./build/examples/skalaxc_eval_c tests/ref_data/skala_he_def2qzvp_lda_uks.hdf5 LDA +./build/examples/skalaxc_eval_fortran tests/ref_data/skala_he_def2qzvp_tpss_uks.hdf5 TPSS +``` + +Each prints `nbf`, the ML `EXC`, and a summary of the potential. The `model` +argument is `"LDA"`, `"PBE"`, `"TPSS"` (resolved using the model lookup rules +above), or a path to a `.fun` model. The examples bind that model when creating +the integrator; evaluation calls provide only densities and output storage. + +--- + +## Verifying ABI isolation + +```bash +# Only skalaxc_* / SkalaXC::* symbols are exported (no GauXC/torch): +nm -D --defined-only build/src/libskalaxc.so.0.1.0 | grep -Ev 'skalaxc|SkalaXC' # → empty + +# A pure-C consumer links only the SkalaXC C surface: +readelf -d build/examples/skalaxc_eval_c | grep NEEDED +# → libskalaxc.so.0, libhdf5.so.320, libm.so.6, libc.so.6 +``` + +--- + +## Status & limitations + +- **Host and CUDA UKS** evaluation (`EXC` + scalar/z `VXC` and XC energy + gradients) is validated across the C, C++, and Fortran APIs for LDA, GGA, + and kinetic-energy-dependent meta-GGA models. +- **RKS** is not implemented (UKS only). +- Laplacian-dependent meta-GGA models are not supported. +- CUDA MPI inference is rank-local over complete atomic domains, followed by + final reductions on the supplied runtime communicator. Every rank must + select an accessible CUDA device; mapping ranks to devices is the caller's + responsibility. diff --git a/SkalaXC/cmake/skalaxc-doxygen.cmake b/SkalaXC/cmake/skalaxc-doxygen.cmake new file mode 100644 index 00000000..b8d331b8 --- /dev/null +++ b/SkalaXC/cmake/skalaxc-doxygen.cmake @@ -0,0 +1,20 @@ +if(NOT DEFINED SKALAXC_DOXYGEN_SOURCE_DIR) + message(FATAL_ERROR "SKALAXC_DOXYGEN_SOURCE_DIR is required") +endif() + +if(NOT DEFINED SKALAXC_DOXYGEN_BINARY_DIR) + message(FATAL_ERROR "SKALAXC_DOXYGEN_BINARY_DIR is required") +endif() + +if(NOT DEFINED SKALAXC_DOXYGEN_PROJECT_VERSION) + set(SKALAXC_DOXYGEN_PROJECT_VERSION "development") +endif() + +file(MAKE_DIRECTORY "${SKALAXC_DOXYGEN_BINARY_DIR}") +set(SKALAXC_DOXYGEN_OUTPUT_DIRECTORY + "${SKALAXC_DOXYGEN_BINARY_DIR}/doxygen") +configure_file( + "${SKALAXC_DOXYGEN_SOURCE_DIR}/Doxyfile.in" + "${SKALAXC_DOXYGEN_BINARY_DIR}/Doxyfile" + @ONLY +) \ No newline at end of file diff --git a/SkalaXC/examples/CMakeLists.txt b/SkalaXC/examples/CMakeLists.txt new file mode 100644 index 00000000..41d7ab02 --- /dev/null +++ b/SkalaXC/examples/CMakeLists.txt @@ -0,0 +1,58 @@ +# SkalaXC examples: minimal standalone consumer programs, one per language +# binding. HDF5 / HighFive are used purely to load each example's own density +# input (the consumer's job), never to reach GauXC. Built only when +# SKALAXC_BUILD_EXAMPLES is ON. +# +# Run against the bundled fixtures, e.g.: +# ./skalaxc_eval_cpp ../tests/ref_data/skala_he_def2qzvp_pbe_uks.hdf5 PBE +# ./skalaxc_eval_c ../tests/ref_data/skala_he_def2qzvp_lda_uks.hdf5 LDA +# ./skalaxc_eval_fortran ../tests/ref_data/skala_he_def2qzvp_tpss_uks.hdf5 TPSS + +if(NOT SKALAXC_HAS_HDF5) + message(STATUS "SkalaXC examples: HDF5 support disabled; skipping HDF5 examples") + return() +endif() + +# --- C++ example ------------------------------------------------------------ +add_executable(skalaxc_eval_cpp cpp/skalaxc_eval.cpp) +target_link_libraries(skalaxc_eval_cpp PRIVATE skalaxc HighFive Eigen3::Eigen) +target_compile_features(skalaxc_eval_cpp PRIVATE cxx_std_17) +if(SKALAXC_ENABLE_MPI) + find_package(MPI REQUIRED COMPONENTS CXX) + target_link_libraries(skalaxc_eval_cpp PRIVATE MPI::MPI_CXX) +endif() + +# --- C example -------------------------------------------------------------- +find_package(HDF5 QUIET COMPONENTS C) +if(HDF5_FOUND AND HDF5_C_LIBRARIES) + add_executable(skalaxc_eval_c c/skalaxc_eval.c) + # `m` for sqrt(): unlike C++/Fortran, a C program must link libm explicitly. + target_link_libraries(skalaxc_eval_c PRIVATE skalaxc ${HDF5_C_LIBRARIES} m) + target_include_directories(skalaxc_eval_c PRIVATE ${HDF5_INCLUDE_DIRS}) + if(SKALAXC_ENABLE_MPI) + find_package(MPI REQUIRED COMPONENTS C) + target_link_libraries(skalaxc_eval_c PRIVATE MPI::MPI_C) + endif() +else() + message(STATUS "SkalaXC examples: HDF5 C component not found; skipping C example") +endif() + +# --- Fortran example -------------------------------------------------------- +if(SKALAXC_BUILD_FORTRAN) + find_package(HDF5 QUIET COMPONENTS Fortran) + if(HDF5_FOUND AND HDF5_Fortran_FOUND) + add_executable(skalaxc_eval_fortran fortran/skalaxc_eval.F90) + set_source_files_properties(fortran/skalaxc_eval.F90 PROPERTIES + Fortran_PREPROCESS ON) + if(SKALAXC_ENABLE_MPI) + find_package(MPI REQUIRED COMPONENTS Fortran) + target_compile_definitions(skalaxc_eval_fortran PRIVATE SKALAXC_HAS_MPI) + target_link_libraries(skalaxc_eval_fortran PRIVATE MPI::MPI_Fortran) + endif() + target_link_libraries(skalaxc_eval_fortran PRIVATE + skalaxc_fortran ${HDF5_Fortran_LIBRARIES}) + target_include_directories(skalaxc_eval_fortran PRIVATE ${HDF5_Fortran_INCLUDE_DIRS}) + else() + message(STATUS "SkalaXC examples: HDF5 Fortran component not found; skipping Fortran example") + endif() +endif() diff --git a/SkalaXC/examples/c/skalaxc_eval.c b/SkalaXC/examples/c/skalaxc_eval.c new file mode 100644 index 00000000..b1abd87e --- /dev/null +++ b/SkalaXC/examples/c/skalaxc_eval.c @@ -0,0 +1,171 @@ +/* SkalaXC C example: evaluate a UKS machine-learning exchange-correlation + * functional on a system + density loaded from an HDF5 file. + * + * Consumption contract: this program includes ONLY and + * links ONLY libskalaxc (plus the C HDF5 library to load its own density + * input). No GauXC, LibTorch, or C++ symbols appear in the link line. + * + * The program follows the SkalaXC C pipeline (one opaque handle per stage): + * runtime environment -> molecule / basis set -> molecular grid -> + * load balancer -> molecular weights -> functional -> XC integrator + * + * Usage: skalaxc_eval_c [model] + * HDF5 file with /MOLECULE, /BASIS, /DENSITY_SCALAR, + * /DENSITY_Z + * [model] "LDA", "PBE" (default), "TPSS", or a path to a .fun model + */ + +#include + +#include + +#include +#include +#include + +static int read_doubles(hid_t file, const char* dset, double* buf) { + hid_t d = H5Dopen2(file, dset, H5P_DEFAULT); + herr_t st; + if (d < 0) return -1; + st = H5Dread(d, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf); + H5Dclose(d); + return st < 0 ? -1 : 0; +} + +int main(int argc, char** argv) { + const char* path; + const char* model; + skalaxc_runtime_environment_t rt = NULL; + skalaxc_molecule_t mol = NULL; + skalaxc_basisset_t basis = NULL; + skalaxc_molgrid_t mg = NULL; + skalaxc_load_balancer_t lb = NULL; + skalaxc_molecular_weights_t mw = NULL; + skalaxc_functional_t func = NULL; + skalaxc_xc_integrator_t xc = NULL; + double* Ps = NULL; + double* Pz = NULL; + double* VXCs = NULL; + double* VXCz = NULL; + int64_t nbf = 0; + size_t n2 = 0, i; + double exc = 0.0, vs = 0.0; + hid_t file; + int rc = 1; + + if (argc < 2) { + fprintf(stderr, "usage: %s [model]\n", argv[0]); + return 2; + } + path = argv[1]; + model = argc > 2 ? argv[2] : "PBE"; + +#ifdef SKALAXC_HAS_MPI + if (MPI_Init(&argc, &argv) != MPI_SUCCESS) { + fprintf(stderr, "MPI_Init failed\n"); + return 1; + } +#endif + + /* 1. Runtime environment. */ + if (skalaxc_runtime_environment_create( +#ifdef SKALAXC_HAS_MPI + MPI_COMM_WORLD, +#endif + &rt) != SKALAXC_SUCCESS) + goto fail; + + /* 2. Load the molecule and basis set from the file. */ + if (skalaxc_molecule_from_hdf5(path, "/MOLECULE", &mol) != SKALAXC_SUCCESS) + goto fail; + if (skalaxc_basisset_from_hdf5(path, "/BASIS", &basis) != SKALAXC_SUCCESS) + goto fail; + + /* 3. Build the default molecular integration grid (NULL = built-in preset). + */ + if (skalaxc_molgrid_create_default(mol, NULL, &mg) != SKALAXC_SUCCESS) + goto fail; + + /* 4. Distribute the quadrature tasks. */ + if (skalaxc_load_balancer_create(SkalaXC_ExecutionSpace_Host, rt, mol, mg, + basis, &lb) != SKALAXC_SUCCESS) + goto fail; + + /* 5. Partition the quadrature weights in place. */ + if (skalaxc_molecular_weights_create(SkalaXC_ExecutionSpace_Host, + SkalaXC_XCWeightAlg_SSF, + &mw) != SKALAXC_SUCCESS) + goto fail; + if (skalaxc_molecular_weights_modify_weights(mw, lb) != SKALAXC_SUCCESS) + goto fail; + + /* 6. Select the Skala ML functional model. */ + if (skalaxc_functional_create(model, &func) != SKALAXC_SUCCESS) goto fail; + + /* 7. Build the XC integrator. */ + if (skalaxc_xc_integrator_create(SkalaXC_ExecutionSpace_Host, func, lb, + &xc) != SKALAXC_SUCCESS) + goto fail; + + nbf = skalaxc_xc_integrator_nbf(xc); + if (nbf <= 0) { + fprintf(stderr, "SkalaXC error: invalid nbf\n"); + goto cleanup; + } + n2 = (size_t)nbf * (size_t)nbf; + Ps = (double*)calloc(n2, sizeof(double)); + Pz = (double*)calloc(n2, sizeof(double)); + VXCs = (double*)calloc(n2, sizeof(double)); + VXCz = (double*)calloc(n2, sizeof(double)); + if (!Ps || !Pz || !VXCs || !VXCz) { + fprintf(stderr, "allocation failed\n"); + goto cleanup; + } + + /* 8. Load the input spin densities (your data; here from the same file). */ + file = H5Fopen(path, H5F_ACC_RDONLY, H5P_DEFAULT); + if (file < 0) { + fprintf(stderr, "H5Fopen failed\n"); + goto cleanup; + } + if (read_doubles(file, "/DENSITY_SCALAR", Ps) || + read_doubles(file, "/DENSITY_Z", Pz)) { + fprintf(stderr, "HDF5 read failed\n"); + H5Fclose(file); + goto cleanup; + } + H5Fclose(file); + + /* 9. Evaluate the ML exchange-correlation energy and potential (UKS). */ + if (skalaxc_xc_integrator_eval_exc_vxc_uks(xc, Ps, Pz, VXCs, VXCz, &exc) != + SKALAXC_SUCCESS) + goto fail; + + /* 10. Report the energy and a summary of the potential. */ + for (i = 0; i < n2; ++i) vs += VXCs[i] * VXCs[i]; + printf("model=%s nbf=%lld EXC=%.10f |VXC_scalar|_F=%.6e\n", model, + (long long)nbf, exc, sqrt(vs)); + rc = 0; + goto cleanup; + +fail: + fprintf(stderr, "SkalaXC error: %s\n", skalaxc_last_error_message()); + +cleanup: + free(Ps); + free(Pz); + free(VXCs); + free(VXCz); + skalaxc_xc_integrator_destroy(xc); + skalaxc_functional_destroy(func); + skalaxc_molecular_weights_destroy(mw); + skalaxc_load_balancer_destroy(lb); + skalaxc_molgrid_destroy(mg); + skalaxc_basisset_destroy(basis); + skalaxc_molecule_destroy(mol); + skalaxc_runtime_environment_destroy(rt); +#ifdef SKALAXC_HAS_MPI + MPI_Finalize(); +#endif + return rc; +} diff --git a/SkalaXC/examples/cpp/skalaxc_eval.cpp b/SkalaXC/examples/cpp/skalaxc_eval.cpp new file mode 100644 index 00000000..4fc9c13a --- /dev/null +++ b/SkalaXC/examples/cpp/skalaxc_eval.cpp @@ -0,0 +1,112 @@ +// SkalaXC C++ example: evaluate a UKS machine-learning exchange-correlation +// functional on a system + density loaded from an HDF5 file. +// +// Consumption contract: this program includes ONLY from +// SkalaXC and has no access to GauXC or LibTorch. Eigen owns the caller-side +// matrices, while HighFive loads the density input. +// +// The program follows the GauXC-style host pipeline mirrored by SkalaXC: +// RuntimeEnvironment -> Molecule / BasisSet -> MolGrid -> LoadBalancer -> +// MolecularWeights -> functional_type -> XCIntegratorFactory -> XCIntegrator +// +// Usage: skalaxc_eval_cpp [model] +// HDF5 file with /MOLECULE, /BASIS, /DENSITY_SCALAR, +// /DENSITY_Z +// [model] "LDA", "PBE" (default), "TPSS", or a path to a .fun model + +#include + +#include +#include + +#include +#include +#include +#include + +namespace { + +using Matrix = + Eigen::Matrix; + +} // namespace + +int main(int argc, char** argv) { + if (argc < 2) { + std::fprintf(stderr, "usage: %s [model]\n", argv[0]); + return 2; + } + const std::string path = argv[1]; + const std::string model = argc > 2 ? argv[2] : "PBE"; + +#ifdef SKALAXC_HAS_MPI + if (MPI_Init(&argc, &argv) != MPI_SUCCESS) { + std::fprintf(stderr, "MPI_Init failed\n"); + return 1; + } +#endif + + int status = 0; + try { + // 1. Runtime environment. +#ifdef SKALAXC_HAS_MPI + SkalaXC::RuntimeEnvironment rt(MPI_COMM_WORLD); +#else + SkalaXC::RuntimeEnvironment rt; +#endif + + // 2. Load the molecule and basis set from the file. + SkalaXC::Molecule mol; + SkalaXC::read_hdf5_record(mol, path, "/MOLECULE"); + SkalaXC::BasisSet basis; + SkalaXC::read_hdf5_record(basis, path, "/BASIS"); + + // 3. Build the default molecular integration grid. + auto mg = SkalaXC::MolGridFactory::create_default_molgrid( + mol, SkalaXC::PruningScheme::Unpruned, SkalaXC::BatchSize(512), + SkalaXC::RadialQuad::MuraKnowles, + SkalaXC::AtomicGridSizeDefault::UltraFineGrid); + + // 4. Distribute the quadrature tasks. + SkalaXC::LoadBalancerFactory lb_factory(SkalaXC::ExecutionSpace::Host); + auto lb = lb_factory.get_instance(rt, mol, mg, basis); + + // 5. Partition the quadrature weights in place. + SkalaXC::MolecularWeightsFactory mw_factory( + SkalaXC::ExecutionSpace::Host, "Default", + SkalaXC::MolecularWeightsSettings{}); + auto mw = mw_factory.get_instance(); + mw.modify_weights(lb); + + // 6. Select the Skala ML functional model. + SkalaXC::functional_type func(model); + + // 7. Build the XC integrator over the caller's matrix type. + SkalaXC::XCIntegratorFactory xc_factory( + SkalaXC::ExecutionSpace::Host); + auto integrator = xc_factory.get_instance(func, lb); + + // 8. Load the input spin densities. Here we read them from the same file; + // in a real driver they come from your SCF. + const std::int64_t nbf = basis.nbf(); + HighFive::File file(path, HighFive::File::ReadOnly); + Matrix Ps(nbf, nbf), Pz(nbf, nbf); + file.getDataSet("/DENSITY_SCALAR").read(Ps.data()); + file.getDataSet("/DENSITY_Z").read(Pz.data()); + + // 9. Evaluate the ML exchange-correlation energy and potential (UKS). + auto [EXC, VXCs, VXCz] = integrator.eval_exc_vxc(Ps, Pz); + + // 10. Report the energy and a summary of the potential. + std::printf("model=%s nbf=%lld EXC=%.10f |VXC_scalar|_F=%.6e\n", + model.c_str(), (long long)nbf, EXC, VXCs.norm()); + } catch (const SkalaXC::Exception& e) { + std::fprintf(stderr, "SkalaXC error: %s\n", e.what()); + status = 1; + } + +#ifdef SKALAXC_HAS_MPI + MPI_Finalize(); +#endif + return status; +} diff --git a/SkalaXC/examples/fortran/skalaxc_eval.F90 b/SkalaXC/examples/fortran/skalaxc_eval.F90 new file mode 100644 index 00000000..91913fd2 --- /dev/null +++ b/SkalaXC/examples/fortran/skalaxc_eval.F90 @@ -0,0 +1,135 @@ +! SkalaXC Fortran example: evaluate a UKS machine-learning exchange-correlation +! functional on a system + density loaded from an HDF5 file. +! +! Consumption contract: this program `use`s ONLY the `skalaxc` module and links +! ONLY libskalaxc (through skalaxc_fortran). HDF5-Fortran is used purely to load +! the caller's own density input. +! +! The program follows the SkalaXC pipeline (one opaque derived type per stage): +! runtime environment -> molecule / basis set -> molecular grid -> +! load balancer -> molecular weights -> functional -> XC integrator +! +! Usage: skalaxc_eval_fortran [model] +! HDF5 file with /MOLECULE, /BASIS, /DENSITY_SCALAR, /DENSITY_Z +! [model] "LDA", "PBE" (default), "TPSS", or a path to a .fun model + +program skalaxc_eval_fortran + use, intrinsic :: iso_c_binding + use skalaxc +#ifdef SKALAXC_HAS_MPI + use mpi +#endif + use hdf5 + implicit none + + character(len=1024) :: path, model + integer :: nargs, ierr + + nargs = command_argument_count() + if (nargs < 1) then + write (*, *) 'usage: skalaxc_eval_fortran [model]' + stop 2 + end if + call get_command_argument(1, path) + if (nargs >= 2) then + call get_command_argument(2, model) + else + model = 'PBE' + end if + +#ifdef SKALAXC_HAS_MPI + call MPI_Init(ierr) + if (ierr /= MPI_SUCCESS) stop 'MPI_Init failed' +#endif + + call h5open_f(ierr) + if (ierr /= 0) stop 'h5open failed' + + block + type(skalaxc_runtime_environment_t) :: rt + type(skalaxc_molecule_t) :: mol + type(skalaxc_basisset_t) :: basis + type(skalaxc_molgrid_t) :: mg + type(skalaxc_load_balancer_t) :: lb + type(skalaxc_molecular_weights_t) :: mw + type(skalaxc_functional_t) :: func + type(skalaxc_xc_integrator_t) :: xc + integer(c_int64_t) :: nbf, n2, i + integer(hid_t) :: file_id, dset_id + integer(hsize_t) :: dims(1) + real(c_double), allocatable :: Ps(:), Pz(:), VXCs(:), VXCz(:) + real(c_double) :: exc, vs + + ! 1. Runtime environment. +#ifdef SKALAXC_HAS_MPI + call check(skalaxc_runtime_environment_create(rt, MPI_COMM_WORLD)) +#else + call check(skalaxc_runtime_environment_create(rt)) +#endif + + ! 2. Load the molecule and basis set from the file. + call check(mol%from_hdf5(trim(path), '/MOLECULE')) + call check(basis%from_hdf5(trim(path), '/BASIS')) + + ! 3. Build the default molecular integration grid. + call check(mg%create_default(mol)) + + ! 4. Distribute the quadrature tasks. + call check(lb%create(skalaxc_executionspace%host, rt, mol, mg, basis)) + + ! 5. Partition the quadrature weights in place. + call check(mw%create(skalaxc_executionspace%host, skalaxc_xcweightalg%ssf)) + call check(mw%modify_weights(lb)) + + ! 6. Select the Skala ML functional model. + call check(func%create(trim(model))) + + ! 7. Build the XC integrator. + call check(xc%create(skalaxc_executionspace%host, func, lb)) + + nbf = xc%nbf() + n2 = nbf*nbf + allocate (Ps(n2), Pz(n2), VXCs(n2), VXCz(n2)) + + ! 8. Load the input spin densities (your data; here from the same file). + call h5fopen_f(trim(path), H5F_ACC_RDONLY_F, file_id, ierr) + if (ierr /= 0) stop 'h5fopen failed' + dims(1) = int(n2, hsize_t) + call h5dopen_f(file_id, '/DENSITY_SCALAR', dset_id, ierr) + call h5dread_f(dset_id, H5T_NATIVE_DOUBLE, Ps, dims, ierr) + call h5dclose_f(dset_id, ierr) + call h5dopen_f(file_id, '/DENSITY_Z', dset_id, ierr) + call h5dread_f(dset_id, H5T_NATIVE_DOUBLE, Pz, dims, ierr) + call h5dclose_f(dset_id, ierr) + call h5fclose_f(file_id, ierr) + + ! 9. Evaluate the ML exchange-correlation energy and potential (UKS). + call check(xc%eval_exc_vxc_uks(Ps, Pz, VXCs, VXCz, exc)) + + ! 10. Report the energy and a summary of the potential. + vs = 0.0_c_double + do i = 1, n2 + vs = vs + VXCs(i)*VXCs(i) + end do + write (*, '(A,A,A,I0,A,ES20.10,A,ES14.6)') 'model=', trim(model), & + ' nbf=', nbf, ' EXC=', exc, ' |VXC_scalar|_F=', sqrt(vs) + end block + + call h5close_f(ierr) + +#ifdef SKALAXC_HAS_MPI + call MPI_Finalize(ierr) +#endif + +contains + + !> @brief Abort with the SkalaXC error message if status is not success. + subroutine check(status) + integer(c_int), intent(in) :: status + if (status /= SKALAXC_SUCCESS) then + write (*, '(A,A)') 'SkalaXC error: ', trim(skalaxc_last_error()) + stop 1 + end if + end subroutine check + +end program skalaxc_eval_fortran From a73f11fb73ceb2ba277590f613786b1bf3f8f7ca Mon Sep 17 00:00:00 2001 From: jenswehner Date: Fri, 4 Sep 2026 11:36:39 +0200 Subject: [PATCH 12/33] Add Python bindings and tests --- SkalaXC/python/CMakeLists.txt | 137 ++++ SkalaXC/python/README.md | 127 ++++ SkalaXC/python/pyproject.toml | 43 ++ SkalaXC/python/src/bindings/module.cxx | 622 ++++++++++++++++++ .../src/bindings/stubgen-common.patterns | 20 + .../src/bindings/stubgen-cuda-mpi.patterns | 8 + .../python/src/bindings/stubgen-mpi.patterns | 3 + SkalaXC/python/src/skalaxc/__init__.py | 153 +++++ SkalaXC/python/src/skalaxc/__init__.pyi | 17 + SkalaXC/python/src/skalaxc/_build_info.py.in | 12 + SkalaXC/python/src/skalaxc/py.typed | 0 SkalaXC/python/tests/test_cuda.py | 226 +++++++ SkalaXC/python/tests/test_integration.py | 221 +++++++ SkalaXC/python/tests/test_mpi.py | 88 +++ SkalaXC/python/tests/test_torch_config.py | 18 + SkalaXC/python/tests/test_typing.py | 34 + SkalaXC/python/tests/typing/cpu.py | 8 + SkalaXC/python/tests/typing/cuda.py | 9 + SkalaXC/python/tests/typing/cuda_mpi.py | 19 + SkalaXC/python/tests/typing/interface.py | 21 + SkalaXC/python/tests/typing/mpi.py | 13 + SkalaXC/python/tools/torch_config.py | 48 ++ 22 files changed, 1847 insertions(+) create mode 100644 SkalaXC/python/CMakeLists.txt create mode 100644 SkalaXC/python/README.md create mode 100644 SkalaXC/python/pyproject.toml create mode 100644 SkalaXC/python/src/bindings/module.cxx create mode 100644 SkalaXC/python/src/bindings/stubgen-common.patterns create mode 100644 SkalaXC/python/src/bindings/stubgen-cuda-mpi.patterns create mode 100644 SkalaXC/python/src/bindings/stubgen-mpi.patterns create mode 100644 SkalaXC/python/src/skalaxc/__init__.py create mode 100644 SkalaXC/python/src/skalaxc/__init__.pyi create mode 100644 SkalaXC/python/src/skalaxc/_build_info.py.in create mode 100644 SkalaXC/python/src/skalaxc/py.typed create mode 100644 SkalaXC/python/tests/test_cuda.py create mode 100644 SkalaXC/python/tests/test_integration.py create mode 100644 SkalaXC/python/tests/test_mpi.py create mode 100644 SkalaXC/python/tests/test_torch_config.py create mode 100644 SkalaXC/python/tests/test_typing.py create mode 100644 SkalaXC/python/tests/typing/cpu.py create mode 100644 SkalaXC/python/tests/typing/cuda.py create mode 100644 SkalaXC/python/tests/typing/cuda_mpi.py create mode 100644 SkalaXC/python/tests/typing/interface.py create mode 100644 SkalaXC/python/tests/typing/mpi.py create mode 100644 SkalaXC/python/tools/torch_config.py diff --git a/SkalaXC/python/CMakeLists.txt b/SkalaXC/python/CMakeLists.txt new file mode 100644 index 00000000..d16ecfc5 --- /dev/null +++ b/SkalaXC/python/CMakeLists.txt @@ -0,0 +1,137 @@ +cmake_minimum_required(VERSION 3.21 FATAL_ERROR) + +project(SkalaXCPython VERSION 0.1.0 LANGUAGES CXX) + +find_package(Python 3.11...<3.14 REQUIRED COMPONENTS Interpreter Development.Module) +find_package(nanobind CONFIG REQUIRED) +find_package(SkalaXC 0.1.0 EXACT CONFIG REQUIRED) + +set(SKALAXC_PYTHON_LAYOUT "WHEEL" CACHE STRING + "Python package layout: WHEEL bundles native assets; CONDA uses the environment prefix") +set_property(CACHE SKALAXC_PYTHON_LAYOUT PROPERTY STRINGS WHEEL CONDA) +set(_skalaxc_python_layouts WHEEL CONDA) +if(NOT SKALAXC_PYTHON_LAYOUT IN_LIST _skalaxc_python_layouts) + message(FATAL_ERROR + "SKALAXC_PYTHON_LAYOUT must be WHEEL or CONDA, got '${SKALAXC_PYTHON_LAYOUT}'") +endif() +unset(_skalaxc_python_layouts) + +if(NOT DEFINED SkalaXC_TORCH_VERSION OR SkalaXC_TORCH_VERSION STREQUAL "") + message(FATAL_ERROR + "The selected SkalaXC package does not publish its LibTorch version") +endif() +if(NOT DEFINED SkalaXC_TORCH_CUDA_VERSION OR + SkalaXC_TORCH_CUDA_VERSION STREQUAL "") + set(SkalaXC_TORCH_CUDA_VERSION "none") +endif() +if(NOT DEFINED SkalaXC_CUDA_TOOLKIT_VERSION OR + SkalaXC_CUDA_TOOLKIT_VERSION STREQUAL "") + set(SkalaXC_CUDA_TOOLKIT_VERSION "none") +endif() + +nanobind_add_module(_skalaxc src/bindings/module.cxx) +target_link_libraries(_skalaxc PRIVATE SkalaXC::skalaxc) +target_compile_features(_skalaxc PRIVATE cxx_std_17) +set(_skalaxc_stub_common_patterns + "${CMAKE_CURRENT_SOURCE_DIR}/src/bindings/stubgen-common.patterns") +set(_skalaxc_stub_variant_patterns) +if(SkalaXC_MPI_ENABLED) + execute_process( + COMMAND "${Python_EXECUTABLE}" -c + "import mpi4py; print(mpi4py.get_include(), end='')" + RESULT_VARIABLE _skalaxc_mpi4py_result + OUTPUT_VARIABLE _skalaxc_mpi4py_include + ERROR_VARIABLE _skalaxc_mpi4py_error) + if(NOT _skalaxc_mpi4py_result EQUAL 0 OR + NOT EXISTS "${_skalaxc_mpi4py_include}/mpi4py/mpi4py.h") + message(FATAL_ERROR + "MPI-enabled SkalaXC Python bindings require mpi4py for the selected " + "Python interpreter: ${_skalaxc_mpi4py_error}") + endif() + target_include_directories(_skalaxc PRIVATE "${_skalaxc_mpi4py_include}") + if(SkalaXC_CUDA_ENABLED) + set(_skalaxc_stub_variant_patterns + "${CMAKE_CURRENT_SOURCE_DIR}/src/bindings/stubgen-cuda-mpi.patterns") + else() + set(_skalaxc_stub_variant_patterns + "${CMAKE_CURRENT_SOURCE_DIR}/src/bindings/stubgen-mpi.patterns") + endif() +endif() +file(READ "${_skalaxc_stub_common_patterns}" _skalaxc_stub_patterns_content) +set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS + "${_skalaxc_stub_common_patterns}") +if(_skalaxc_stub_variant_patterns) + file(READ "${_skalaxc_stub_variant_patterns}" + _skalaxc_stub_variant_patterns_content) + string(APPEND _skalaxc_stub_patterns_content + "\n${_skalaxc_stub_variant_patterns_content}") + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS + "${_skalaxc_stub_variant_patterns}") +endif() +set(_skalaxc_stub_patterns + "${CMAKE_CURRENT_BINARY_DIR}/_skalaxc-stubgen.patterns") +file(WRITE "${_skalaxc_stub_patterns}" "${_skalaxc_stub_patterns_content}") +nanobind_add_stub(_skalaxc_stub + MODULE _skalaxc + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_skalaxc.pyi" + PYTHON_PATH "$" + PATTERN_FILE "${_skalaxc_stub_patterns}" + DEPENDS _skalaxc) +if(APPLE) + set(_skalaxc_install_origin "@loader_path") +else() + set(_skalaxc_install_origin "$ORIGIN") +endif() +if(SKALAXC_PYTHON_LAYOUT STREQUAL "CONDA") + string(APPEND _skalaxc_install_origin "/../../..") +endif() +set_target_properties(_skalaxc PROPERTIES + BUILD_RPATH "$" + INSTALL_RPATH "${_skalaxc_install_origin}" + INSTALL_REMOVE_ENVIRONMENT_RPATH TRUE) +unset(_skalaxc_install_origin) + +set(_skalaxc_python_cuda False) +if(SkalaXC_CUDA_ENABLED) + set(_skalaxc_python_cuda True) +endif() +set(_skalaxc_python_mpi False) +if(SkalaXC_MPI_ENABLED) + set(_skalaxc_python_mpi True) +endif() +set(_skalaxc_python_openmp False) +if(SkalaXC_OpenMP_ENABLED) + set(_skalaxc_python_openmp True) +endif() +set(_skalaxc_python_hdf5 False) +if(SkalaXC_HDF5_ENABLED) + set(_skalaxc_python_hdf5 True) +endif() + +configure_file( + src/skalaxc/_build_info.py.in + generated/skalaxc/_build_info.py + @ONLY) + +install(TARGETS _skalaxc LIBRARY DESTINATION skalaxc) +if(SKALAXC_PYTHON_LAYOUT STREQUAL "WHEEL") + install(IMPORTED_RUNTIME_ARTIFACTS SkalaXC::skalaxc + LIBRARY DESTINATION skalaxc + RUNTIME DESTINATION skalaxc) +endif() +install(FILES + "${CMAKE_CURRENT_BINARY_DIR}/generated/skalaxc/_build_info.py" + "${CMAKE_CURRENT_BINARY_DIR}/_skalaxc.pyi" + "${CMAKE_CURRENT_SOURCE_DIR}/src/skalaxc/__init__.pyi" + "${CMAKE_CURRENT_SOURCE_DIR}/src/skalaxc/py.typed" + DESTINATION skalaxc) +if(SKALAXC_PYTHON_LAYOUT STREQUAL "WHEEL" AND + EXISTS "${SkalaXC_MODEL_DIR}") + install(DIRECTORY "${SkalaXC_MODEL_DIR}/" + DESTINATION skalaxc/models + FILES_MATCHING PATTERN "*.fun") +endif() + +unset(_skalaxc_mpi4py_error) +unset(_skalaxc_mpi4py_include) +unset(_skalaxc_mpi4py_result) \ No newline at end of file diff --git a/SkalaXC/python/README.md b/SkalaXC/python/README.md new file mode 100644 index 00000000..b0e23dc8 --- /dev/null +++ b/SkalaXC/python/README.md @@ -0,0 +1,127 @@ +# SkalaXC Python bindings + +This package binds the public SkalaXC C++ API directly with nanobind. It does +not route through the C or Fortran wrappers. Density and potential matrices are +CPU NumPy arrays with shape `(nbf, nbf)` and are converted to column-major +`float64` storage. Gradients are returned as atom-major `(natoms, 3)` arrays. +The selected native SkalaXC build may execute internally on the host or CUDA. + +## Binary and source packages + +The build is package-manager neutral. The selected Python interpreter supplies +Torch, while `SkalaXC_DIR` identifies an exact installed native SkalaXC CMake +package. The binding CMake project never searches for or links Torch itself. +Binary artifacts carry `_skalaxc`, their matching `libskalaxc`, model files, +and native build metadata. They require NumPy and the supported Torch 2.13 +minor line from the target environment. + +A source build first installs SkalaXC into an isolated prefix using the +`Torch_DIR` and C++ ABI reported by `tools/torch_config.py`, then builds this +directory with `SkalaXC_DIR` set to that prefix's CMake package directory. +This contract is the same for pip, uv, conda, pixi, or another frontend. +Binary recipes also set `SKALAXC_INSTALL_RPATH` while building the native stage: +wheel layouts use `$ORIGIN/../torch/lib`, while conda/pixi layouts use +`$ORIGIN/../../..` to reach the environment's `lib` directory. Multiple +relative entries may be supplied as a CMake list. Packaged binaries must not +retain staging-prefix paths. + +## Evaluation + +`Molecule.from_hdf5()` and `BasisSet.from_hdf5()` are present when the native +library was built with `SKALAXC_ENABLE_HDF5=ON` (the default), reported as +`skalaxc.HDF5_ENABLED`. HDF5-disabled builds construct molecules and basis sets +through `Atom`, `Shell`, and `append()` instead. + +```python +import h5py +import numpy as np +import skalaxc + +molecule = skalaxc.Molecule.from_hdf5("system.hdf5") +basis = skalaxc.BasisSet.from_hdf5("system.hdf5") +grid = skalaxc.MolGridFactory.create_default(molecule) +runtime = skalaxc.RuntimeEnvironment() +load_balancer = skalaxc.LoadBalancerFactory( + skalaxc.ExecutionSpace.HOST +).get_instance(runtime, molecule, grid, basis) +weights = skalaxc.MolecularWeightsFactory( + skalaxc.ExecutionSpace.HOST +).get_instance() +weights.modify_weights(load_balancer) +integrator = skalaxc.XCIntegratorFactory( + skalaxc.ExecutionSpace.HOST +).get_instance(skalaxc.Functional("PBE"), load_balancer) + +with h5py.File("system.hdf5") as handle: + scalar = np.asfortranarray(handle["/DENSITY_SCALAR"]) + spin = np.asfortranarray(handle["/DENSITY_Z"]) + +energy, scalar_potential, spin_potential = integrator.eval_exc_vxc( + scalar, spin +) +gradient = integrator.eval_exc_grad(scalar, spin) +``` + +The binding releases the Python GIL while `eval_exc_vxc` and `eval_exc_grad` +run. Do not call one `XCIntegrator` instance concurrently from multiple +threads; use one integrator per thread or serialize access to a shared one. + +Named models resolve from the packaged `skalaxc.MODEL_DIR` unless +`SKALAXC_MODEL_PATH` is already set. Diagnostics are rank-local and available +through `integrator.diagnostics()` and `integrator.reset_diagnostics()`. + +## CUDA and MPI variants + +CUDA variants still accept and return CPU NumPy arrays. They expose +`ExecutionSpace.DEVICE` and `DeviceRuntimeSettings` only when the native +SkalaXC package was built with CUDA, and require the runtime Torch CUDA major +compatibility family recorded by that native build. Minor toolkit releases +within one CUDA major family are accepted. + +MPI variants require `mpi4py` and an explicit intracommunicator: + +```python +from mpi4py import MPI +import skalaxc + +runtime = skalaxc.RuntimeEnvironment(MPI.COMM_SELF) +``` + +`None`, `MPI.COMM_NULL`, freed communicators, and intercommunicators are +rejected. The communicator is not duplicated or freed by SkalaXC. Python +objects retain it through load balancing and integration, but callers must not +explicitly free it while dependent objects remain alive. All evaluation calls +are collective over that exact communicator. + +Run the CUDA+MPI communicator checks from this directory with: + +```bash +OMP_NUM_THREADS=4 mpiexec -n 3 python -m pytest \ + tests/test_cuda.py::test_cuda_uses_mpi_world_with_an_idle_domain_rank -v +OMP_NUM_THREADS=4 mpiexec -n 4 python -m pytest \ + tests/test_cuda.py::test_cuda_uses_runtime_mpi_subcommunicator -v +``` + +The first command covers an idle domain rank. The second splits four ranks into +two independent communicators with distinct inputs, detecting accidental +collectives over `MPI.COMM_WORLD`. + +## Typing + +Every package includes `py.typed` and a generated native stub. The stub matches +the selected native build: CPU, CUDA, MPI, and CUDA+MPI packages expose only +their supported `RuntimeEnvironment` constructors. MPI constructors accept +`mpi4py.MPI.Intracomm`; evaluation matrices are typed as two-dimensional NumPy +`float64` arrays. At runtime, nanobind accepts NumPy arrays with other +convertible dtypes or layouts and materializes Fortran-contiguous `float64` +temporaries before evaluation. + +Run the common interface fixture and the fixture matching the installed build: + +```bash +mypy tests/typing/interface.py tests/typing/cuda_mpi.py +``` + +The other build fixtures are `cpu.py`, `cuda.py`, and `mpi.py` in the same +directory. Unused-ignore checking ensures each fixture also verifies that +constructors unavailable in that build remain rejected. \ No newline at end of file diff --git a/SkalaXC/python/pyproject.toml b/SkalaXC/python/pyproject.toml new file mode 100644 index 00000000..676a53ed --- /dev/null +++ b/SkalaXC/python/pyproject.toml @@ -0,0 +1,43 @@ +[build-system] +requires = [ + "scikit-build-core>=0.11", + "nanobind>=2.4", +] +build-backend = "scikit_build_core.build" + +[project] +name = "skalaxc" +version = "0.1.0" +description = "Direct Python bindings for the SkalaXC C++ library" +readme = "README.md" +requires-python = ">=3.11,<3.14" +dependencies = [ + "numpy>=1.23", + "torch>=2.13,<2.14", +] + +[project.optional-dependencies] +test = [ + "h5py>=3.10", + "mypy>=1.11", + "pytest>=8", + "typing-extensions>=4.0", +] +mpi = ["mpi4py>=4"] + +[tool.scikit-build] +minimum-version = "build-system.requires" +cmake.version = ">=3.21" +build-dir = "build/{wheel_tag}" +wheel.packages = ["src/skalaxc"] + +[tool.scikit-build.cmake.define] +SkalaXC_DIR = { env = "SkalaXC_DIR" } +SKALAXC_PYTHON_LAYOUT = { env = "SKALAXC_PYTHON_LAYOUT", default = "WHEEL" } + +[tool.pytest.ini_options] +testpaths = ["tests"] + +[tool.mypy] +strict = true +warn_unused_ignores = true \ No newline at end of file diff --git a/SkalaXC/python/src/bindings/module.cxx b/SkalaXC/python/src/bindings/module.cxx new file mode 100644 index 00000000..2ffa3404 --- /dev/null +++ b/SkalaXC/python/src/bindings/module.cxx @@ -0,0 +1,622 @@ +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef SKALAXC_HAS_MPI +#include +#endif + +namespace nb = nanobind; +using namespace nb::literals; + +namespace { + +using Shell = SkalaXC::Shell; + +/** + * @brief Matrix adapter for the templated public SkalaXC integrator API. + * + * Integrator outputs use the two-argument constructor and own writable, + * column-major storage. Python inputs use the three-argument constructor as + * read-only, non-owning views of nanobind's DLPack-backed array storage. The + * input arrays (including any dtype or layout conversion temporaries) remain + * alive for the complete synchronous integrator call, so no additional input + * copy is required. + */ +class Matrix { + public: + using value_type = double; + + Matrix(std::int64_t rows, std::int64_t cols) + : rows_(rows), + cols_(cols), + values_(static_cast(rows * cols)), + view_data_(nullptr), + owns_storage_(true) {} + + Matrix(std::int64_t rows, std::int64_t cols, const double* data) + : rows_(rows), cols_(cols), view_data_(data), owns_storage_(false) {} + + std::int64_t rows() const { return rows_; } + std::int64_t cols() const { return cols_; } + double* data() { + if (!owns_storage_) + throw std::logic_error("cannot write to a matrix input view"); + return values_.data(); + } + const double* data() const { + return owns_storage_ ? values_.data() : view_data_; + } + + private: + std::int64_t rows_; + std::int64_t cols_; + std::vector values_; + const double* view_data_; + bool owns_storage_; +}; + +// Keep conversions enabled so nanobind materializes float64, Fortran-contiguous +// CPU temporaries for other NumPy dtypes and layouts. +using InputMatrix = nb::ndarray, + nb::f_contig, nb::device::cpu>; +using OutputMatrix = + nb::ndarray, nb::f_contig, nb::device::cpu>; +using OutputGradient = + nb::ndarray, nb::c_contig, nb::device::cpu>; +using Integrator = SkalaXC::XCIntegrator; +using IntegratorFactory = SkalaXC::XCIntegratorFactory; + +struct PythonRuntimeEnvironment { +#ifndef SKALAXC_HAS_MPI + PythonRuntimeEnvironment() : value() {} + explicit PythonRuntimeEnvironment(SkalaXC::DeviceRuntimeSettings settings) + : value(settings) {} +#else + PythonRuntimeEnvironment(nb::object owner, MPI_Comm communicator, bool device, + SkalaXC::DeviceRuntimeSettings settings = {}) + : communicator_owner(std::move(owner)), + value(device ? SkalaXC::RuntimeEnvironment(communicator, settings) + : SkalaXC::RuntimeEnvironment(communicator)) {} +#endif + + nb::object communicator_owner; + SkalaXC::RuntimeEnvironment value; +}; + +struct PythonLoadBalancer { + PythonLoadBalancer(SkalaXC::LoadBalancer&& load_balancer, + std::int64_t basis_size, std::int64_t atom_count, + nb::object communicator) + : communicator_owner(std::move(communicator)), + value(std::move(load_balancer)), + nbf(basis_size), + natoms(atom_count) {} + + nb::object communicator_owner; + SkalaXC::LoadBalancer value; + std::int64_t nbf; + std::int64_t natoms; +}; + +struct PythonIntegrator { + PythonIntegrator(Integrator&& integrator, std::int64_t basis_size, + std::int64_t atom_count, nb::object communicator) + : communicator_owner(std::move(communicator)), + value(std::move(integrator)), + nbf(basis_size), + natoms(atom_count) {} + + nb::object communicator_owner; + Integrator value; + std::int64_t nbf; + std::int64_t natoms; +}; + +Matrix matrix_view(const InputMatrix& array, std::int64_t expected_size) { + if (array.shape(0) != static_cast(expected_size) || + array.shape(1) != static_cast(expected_size)) + throw nb::value_error("density matrices must have shape (nbf, nbf)"); + return Matrix(expected_size, expected_size, array.data()); +} + +OutputMatrix move_matrix_to_numpy(Matrix&& matrix) { + auto storage = std::make_unique(std::move(matrix)); + const auto rows = static_cast(storage->rows()); + const auto cols = static_cast(storage->cols()); + double* data = storage->data(); + nb::capsule owner(storage.get(), [](void* pointer) noexcept { + delete static_cast(pointer); + }); + storage.release(); + return OutputMatrix(data, {rows, cols}, owner); +} + +OutputGradient move_gradient_to_numpy(std::vector&& gradient, + std::int64_t atom_count) { + if (atom_count < 0 || + gradient.size() != static_cast(atom_count) * 3) + throw std::runtime_error("gradient has an unexpected size"); + auto storage = std::make_unique>(std::move(gradient)); + double* data = storage->data(); + nb::capsule owner(storage.get(), [](void* pointer) noexcept { + delete static_cast*>(pointer); + }); + storage.release(); + return OutputGradient( + data, {static_cast(atom_count), std::size_t{3}}, owner); +} + +#ifdef SKALAXC_HAS_MPI +void check_mpi_call(int error, const char* operation) { + if (error == MPI_SUCCESS) return; + char message[MPI_MAX_ERROR_STRING] = {}; + int length = 0; + MPI_Error_string(error, message, &length); + throw std::runtime_error( + std::string(operation) + + " failed: " + std::string(message, static_cast(length))); +} + +MPI_Comm mpi4py_communicator(const nb::object& communicator) { + int initialized = 0; + int finalized = 0; + check_mpi_call(MPI_Initialized(&initialized), "MPI_Initialized"); + check_mpi_call(MPI_Finalized(&finalized), "MPI_Finalized"); + if (!initialized) + throw nb::value_error("MPI must be initialized before creating a runtime"); + if (finalized) throw nb::value_error("MPI has already been finalized"); + if (communicator.is_none() || + !PyObject_TypeCheck(communicator.ptr(), &PyMPIComm_Type)) + throw nb::type_error( + "communicator must be an explicit mpi4py.MPI.Comm instance"); + MPI_Comm* native_communicator = PyMPIComm_Get(communicator.ptr()); + if (native_communicator == nullptr) throw nb::python_error(); + if (*native_communicator == MPI_COMM_NULL) + throw nb::value_error("communicator must not be MPI.COMM_NULL or freed"); + int is_intercommunicator = 0; + check_mpi_call( + MPI_Comm_test_inter(*native_communicator, &is_intercommunicator), + "MPI_Comm_test_inter"); + if (is_intercommunicator) + throw nb::value_error("MPI intercommunicators are not supported"); + return *native_communicator; +} + +std::string trim_mpi_version(std::string value) { + while (!value.empty() && + std::isspace(static_cast(value.back()))) + value.pop_back(); + return value; +} + +void verify_mpi_implementation() { + char version[MPI_MAX_LIBRARY_VERSION_STRING] = {}; + int length = 0; + check_mpi_call(MPI_Get_library_version(version, &length), + "MPI_Get_library_version"); + const std::string native_version = + trim_mpi_version(std::string(version, static_cast(length))); + const std::string mpi4py_version = trim_mpi_version(nb::cast( + nb::module_::import_("mpi4py.MPI").attr("Get_library_version")())); + if (native_version != mpi4py_version) { + PyErr_Format(PyExc_ImportError, + "SkalaXC and mpi4py use different MPI implementations: " + "SkalaXC='%s', mpi4py='%s'", + native_version.c_str(), mpi4py_version.c_str()); + throw nb::python_error(); + } +} +#endif + +} // namespace + +NB_MODULE(_skalaxc, module) { + module.doc() = "Direct bindings for the public SkalaXC C++ API"; + + nb::exception(module, "SkalaXCError"); + module.def("native_version", [] { return std::string(SkalaXC::version()); }); + + auto execution_space = + nb::enum_(module, "ExecutionSpace") + .value("HOST", SkalaXC::ExecutionSpace::Host); +#ifdef SKALAXC_HAS_CUDA + execution_space.value("DEVICE", SkalaXC::ExecutionSpace::Device); +#endif + nb::enum_(module, "DomainBatchMode") + .value("CONSERVATIVE", SkalaXC::DomainBatchMode::Conservative) + .value("AGGRESSIVE", SkalaXC::DomainBatchMode::Aggressive); + nb::enum_(module, "RadialQuad") + .value("BECKE", SkalaXC::RadialQuad::Becke) + .value("MURA_KNOWLES", SkalaXC::RadialQuad::MuraKnowles) + .value("MURRAY_HANDY_LAMING", SkalaXC::RadialQuad::MurrayHandyLaming) + .value("TREUTLER_AHLRICHS", SkalaXC::RadialQuad::TreutlerAhlrichs); + nb::enum_(module, "AtomicGridSize") + .value("FINE", SkalaXC::AtomicGridSizeDefault::FineGrid) + .value("ULTRA_FINE", SkalaXC::AtomicGridSizeDefault::UltraFineGrid) + .value("SUPER_FINE", SkalaXC::AtomicGridSizeDefault::SuperFineGrid) + .value("GM3", SkalaXC::AtomicGridSizeDefault::GM3) + .value("GM5", SkalaXC::AtomicGridSizeDefault::GM5); + nb::enum_(module, "PruningScheme") + .value("UNPRUNED", SkalaXC::PruningScheme::Unpruned) + .value("ROBUST", SkalaXC::PruningScheme::Robust) + .value("TREUTLER", SkalaXC::PruningScheme::Treutler); + nb::enum_(module, "XCWeightAlgorithm") + .value("NOT_PARTITIONED", SkalaXC::XCWeightAlg::NOTPARTITIONED) + .value("BECKE", SkalaXC::XCWeightAlg::Becke) + .value("SSF", SkalaXC::XCWeightAlg::SSF) + .value("LKO", SkalaXC::XCWeightAlg::LKO); + nb::enum_(module, "TimingStatus") + .value("UNAVAILABLE", SkalaXC::TimingStatus::Unavailable) + .value("PENDING", SkalaXC::TimingStatus::Pending) + .value("COMPLETE", SkalaXC::TimingStatus::Complete); + nb::enum_(module, "TimingMetric") + .value("MODEL_LOAD", SkalaXC::TimingMetric::ModelLoad) + .value("FEATURE_CONSTRUCTION", SkalaXC::TimingMetric::FeatureConstruction) + .value("MODEL_BATCH_PACKING", SkalaXC::TimingMetric::ModelBatchPacking) + .value("MODEL_FORWARD", SkalaXC::TimingMetric::ModelForward) + .value("MODEL_BACKWARD", SkalaXC::TimingMetric::ModelBackward) + .value("POTENTIAL_MAPPING", SkalaXC::TimingMetric::PotentialMapping) + .value("AO_ASSEMBLY", SkalaXC::TimingMetric::AOAssembly) + .value("GRADIENT_ASSEMBLY", SkalaXC::TimingMetric::GradientAssembly) + .value("MPI_REDUCTION", SkalaXC::TimingMetric::MPIReduction) + .value("TOTAL_EXC_VXC", SkalaXC::TimingMetric::TotalEXCVXC) + .value("TOTAL_EXC_GRADIENT", SkalaXC::TimingMetric::TotalEXCGradient); + +#ifdef SKALAXC_HAS_CUDA + nb::class_(module, "DeviceRuntimeSettings") + .def(nb::init<>()) + .def_rw("device_id", &SkalaXC::DeviceRuntimeSettings::device_id) + .def_rw("memory_fraction", + &SkalaXC::DeviceRuntimeSettings::memory_fraction); +#endif + nb::class_(module, "TimingSettings") + .def(nb::init<>()) + .def_rw("verbose", &SkalaXC::TimingSettings::verbose) + .def_rw("debug_logging", &SkalaXC::TimingSettings::debug_logging); + nb::class_(module, + "MolecularWeightsSettings") + .def(nb::init<>()) + .def_rw("weight_algorithm", + &SkalaXC::MolecularWeightsSettings::weight_alg); + nb::class_(module, "GradientSettings") + .def(nb::init<>()) + .def_rw("include_weight_derivatives", + &SkalaXC::IntegratorSettingsEXC_GRAD::include_weight_derivatives); + + nb::class_(module, "TimingValue") + .def_ro("last_nanoseconds", &SkalaXC::TimingValue::last_nanoseconds) + .def_ro("total_nanoseconds", &SkalaXC::TimingValue::total_nanoseconds) + .def_ro("call_count", &SkalaXC::TimingValue::call_count) + .def_ro("status", &SkalaXC::TimingValue::status); + nb::class_(module, "DiagnosticsSnapshot") + .def_ro("backend", &SkalaXC::DiagnosticsSnapshot::backend) + .def_ro("rank", &SkalaXC::DiagnosticsSnapshot::rank) + .def_ro("communicator_size", + &SkalaXC::DiagnosticsSnapshot::communicator_size) + .def_ro("device_id", &SkalaXC::DiagnosticsSnapshot::device_id) + .def_ro("openmp_threads", &SkalaXC::DiagnosticsSnapshot::openmp_threads) + .def_ro("device_memory_fraction", + &SkalaXC::DiagnosticsSnapshot::device_memory_fraction) + .def_ro("domain_batch_mode", + &SkalaXC::DiagnosticsSnapshot::domain_batch_mode) + .def_ro("exc_vxc_calls", &SkalaXC::DiagnosticsSnapshot::exc_vxc_calls) + .def_ro("exc_gradient_calls", + &SkalaXC::DiagnosticsSnapshot::exc_gradient_calls) + .def_ro("model_batches", &SkalaXC::DiagnosticsSnapshot::model_batches) + .def_ro("domains", &SkalaXC::DiagnosticsSnapshot::domains) + .def_ro("tasks", &SkalaXC::DiagnosticsSnapshot::tasks) + .def_ro("points", &SkalaXC::DiagnosticsSnapshot::points) + .def_ro("local_atoms", &SkalaXC::DiagnosticsSnapshot::local_atoms) + .def("timing", &SkalaXC::DiagnosticsSnapshot::timing, + nb::rv_policy::reference_internal, "metric"_a); + + nb::class_(module, "Atom") + .def( + "__init__", + [](SkalaXC::Atom* atom, std::int64_t atomic_number, double x, + double y, double z) { + new (atom) + SkalaXC::Atom(SkalaXC::AtomicNumber(atomic_number), x, y, z); + }, + "atomic_number"_a, "x"_a, "y"_a, "z"_a) + .def_prop_rw( + "atomic_number", + [](const SkalaXC::Atom& atom) { return atom.Z.raw(); }, + [](SkalaXC::Atom& atom, std::int64_t value) { + atom.Z = SkalaXC::AtomicNumber(value); + }) + .def_rw("x", &SkalaXC::Atom::x) + .def_rw("y", &SkalaXC::Atom::y) + .def_rw("z", &SkalaXC::Atom::z); + + nb::class_(module, "Molecule") + .def(nb::init<>()) +#ifdef SKALAXC_HAS_HDF5 + .def_static( + "from_hdf5", + [](const std::string& path, const std::string& dataset) { + SkalaXC::Molecule molecule; + SkalaXC::read_hdf5_record(molecule, path, dataset); + return molecule; + }, + "path"_a, "dataset"_a = "/MOLECULE") +#endif + .def("append", + [](SkalaXC::Molecule& molecule, const SkalaXC::Atom& atom) { + molecule.push_back(atom); + }) + .def("__len__", &SkalaXC::Molecule::natoms) + .def( + "__getitem__", + [](SkalaXC::Molecule& molecule, std::size_t index) -> SkalaXC::Atom& { + if (index >= molecule.size()) throw nb::index_error(); + return molecule[index]; + }, + nb::rv_policy::reference_internal) + .def_prop_ro("natoms", &SkalaXC::Molecule::natoms); + + nb::class_(module, "Shell") + .def( + "__init__", + [](Shell* shell, std::int32_t angular_momentum, bool pure, + const std::vector& exponents, + const std::vector& coefficients, + const Shell::cart_array& center, bool normalize) { + if (exponents.empty() || exponents.size() > 32 || + coefficients.size() != exponents.size()) + throw nb::value_error( + "exponents and coefficients must have equal lengths in " + "the range [1, 32]"); + Shell::prim_array alpha{}; + Shell::prim_array coeff{}; + std::copy(exponents.begin(), exponents.end(), alpha.begin()); + std::copy(coefficients.begin(), coefficients.end(), coeff.begin()); + new (shell) Shell( + SkalaXC::PrimSize(static_cast(exponents.size())), + SkalaXC::AngularMomentum(angular_momentum), + SkalaXC::SphericalType(pure ? 1 : 0), alpha, coeff, center, + normalize); + }, + "angular_momentum"_a, "pure"_a, "exponents"_a, "coefficients"_a, + "center"_a, "normalize"_a = true) + .def_prop_ro("nprim", &Shell::nprim) + .def_prop_ro("angular_momentum", &Shell::l) + .def_prop_ro("pure", [](const Shell& shell) { return shell.pure() != 0; }) + .def_prop_ro("normalized", &Shell::normalized) + .def_prop_ro("size", &Shell::size) + .def_prop_ro("exponents", + [](const Shell& shell) { + return std::vector( + shell.alpha_data(), + shell.alpha_data() + shell.nprim()); + }) + .def_prop_ro("coefficients", + [](const Shell& shell) { + return std::vector( + shell.coeff_data(), + shell.coeff_data() + shell.nprim()); + }) + .def_prop_ro("center", [](const Shell& shell) { + return Shell::cart_array{shell.O_data()[0], shell.O_data()[1], + shell.O_data()[2]}; + }); + + nb::class_>(module, "BasisSet") + .def(nb::init<>()) +#ifdef SKALAXC_HAS_HDF5 + .def_static( + "from_hdf5", + [](const std::string& path, const std::string& dataset) { + SkalaXC::BasisSet basis; + SkalaXC::read_hdf5_record(basis, path, dataset); + return basis; + }, + "path"_a, "dataset"_a = "/BASIS") +#endif + .def("append", [](SkalaXC::BasisSet& basis, + const Shell& shell) { basis.push_back(shell); }) + .def("__len__", + [](const SkalaXC::BasisSet& basis) { return basis.size(); }) + .def( + "__getitem__", + [](SkalaXC::BasisSet& basis, std::size_t index) -> Shell& { + if (index >= basis.size()) throw nb::index_error(); + return basis[index]; + }, + nb::rv_policy::reference_internal) + .def_prop_ro("nshells", &SkalaXC::BasisSet::nshells) + .def_prop_ro("nbf", &SkalaXC::BasisSet::nbf) + .def_prop_ro("nbf_cart", &SkalaXC::BasisSet::nbf_cart) + .def_prop_ro("max_angular_momentum", &SkalaXC::BasisSet::max_l); + + nb::class_(module, "Functional") + .def(nb::init(), "model"_a) + .def_prop_ro("model", &SkalaXC::functional_type::model) + .def_prop_ro("empty", &SkalaXC::functional_type::empty); + + auto runtime = + nb::class_(module, "RuntimeEnvironment"); +#ifdef SKALAXC_HAS_MPI + if (import_mpi4py() < 0) throw nb::python_error(); + verify_mpi_implementation(); + runtime + .def( + "__init__", + [](PythonRuntimeEnvironment* environment, nb::object communicator) { + const MPI_Comm native = mpi4py_communicator(communicator); + new (environment) PythonRuntimeEnvironment(std::move(communicator), + native, false); + }, + "communicator"_a.none()) +#ifdef SKALAXC_HAS_CUDA + .def( + "__init__", + [](PythonRuntimeEnvironment* environment, nb::object communicator, + SkalaXC::DeviceRuntimeSettings settings) { + const MPI_Comm native = mpi4py_communicator(communicator); + new (environment) PythonRuntimeEnvironment(std::move(communicator), + native, true, settings); + }, + "communicator"_a.none(), "settings"_a) +#endif + ; +#else + runtime.def(nb::init<>()); +#ifdef SKALAXC_HAS_CUDA + runtime.def(nb::init(), "settings"_a); +#endif +#endif + runtime + .def_prop_ro("rank", + [](const PythonRuntimeEnvironment& environment) { + return environment.value.comm_rank(); + }) + .def_prop_ro("size", [](const PythonRuntimeEnvironment& environment) { + return environment.value.comm_size(); + }); + + nb::class_(module, "MolGrid"); + nb::class_(module, "MolGridFactory") + .def_static( + "create_default", + [](const SkalaXC::Molecule& molecule, + SkalaXC::PruningScheme pruning_scheme, std::int64_t batch_size, + SkalaXC::RadialQuad radial_quad, + SkalaXC::AtomicGridSizeDefault grid_size) { + if (batch_size <= 0) + throw nb::value_error("batch_size must be positive"); + return SkalaXC::MolGridFactory::create_default_molgrid( + molecule, pruning_scheme, SkalaXC::BatchSize(batch_size), + radial_quad, grid_size); + }, + "molecule"_a, "pruning_scheme"_a = SkalaXC::PruningScheme::Unpruned, + "batch_size"_a = 512, + "radial_quad"_a = SkalaXC::RadialQuad::MuraKnowles, + "grid_size"_a = SkalaXC::AtomicGridSizeDefault::UltraFineGrid); + + nb::class_(module, "LoadBalancer") + .def_prop_ro("nbf", + [](const PythonLoadBalancer& load_balancer) { + return load_balancer.nbf; + }) + .def_prop_ro("natoms", [](const PythonLoadBalancer& load_balancer) { + return load_balancer.natoms; + }); + nb::class_(module, "LoadBalancerFactory") + .def(nb::init(), + "execution_space"_a, "kernel"_a = "Default") + .def( + "get_instance", + [](SkalaXC::LoadBalancerFactory& factory, + const PythonRuntimeEnvironment& runtime, + const SkalaXC::Molecule& molecule, const SkalaXC::MolGrid& grid, + const SkalaXC::BasisSet& basis) { + return PythonLoadBalancer( + factory.get_instance(runtime.value, molecule, grid, basis), + basis.nbf(), static_cast(molecule.natoms()), + runtime.communicator_owner); + }, + "runtime"_a, "molecule"_a, "grid"_a, "basis"_a); + + nb::class_(module, "MolecularWeights") + .def("modify_weights", [](const SkalaXC::MolecularWeights& weights, + PythonLoadBalancer& load_balancer) { + weights.modify_weights(load_balancer.value); + }); + nb::class_(module, + "MolecularWeightsFactory") + .def(nb::init(), + "execution_space"_a, "kernel"_a = "Default", + "settings"_a = SkalaXC::MolecularWeightsSettings{}) + .def("get_instance", &SkalaXC::MolecularWeightsFactory::get_instance); + + nb::class_( + module, "XCIntegrator", + "ML XC integrator. Instances are not safe for concurrent calls; " + "serialize shared access or use one integrator per thread.") + .def( + "eval_exc_vxc", + [](PythonIntegrator& integrator, const InputMatrix& scalar_density, + const InputMatrix& spin_density) { + Matrix scalar = matrix_view(scalar_density, integrator.nbf); + Matrix spin = matrix_view(spin_density, integrator.nbf); + auto result = [&] { + nb::gil_scoped_release release; + return integrator.value.eval_exc_vxc(scalar, spin); + }(); + + return nb::make_tuple( + std::get<0>(result), + move_matrix_to_numpy(std::move(std::get<1>(result))), + move_matrix_to_numpy(std::move(std::get<2>(result)))); + }, + "scalar_density"_a, "spin_density"_a, + "Evaluate UKS XC energy and potential. Releases the Python GIL; " + "do not call concurrently on the same instance.") + .def( + "eval_exc_grad", + [](PythonIntegrator& integrator, const InputMatrix& scalar_density, + const InputMatrix& spin_density, + const SkalaXC::IntegratorSettingsEXC_GRAD* settings) { + Matrix scalar = matrix_view(scalar_density, integrator.nbf); + Matrix spin = matrix_view(spin_density, integrator.nbf); + const SkalaXC::IntegratorSettingsEXC_GRAD default_settings{}; + + auto result = [&] { + nb::gil_scoped_release release; + return integrator.value.eval_exc_grad( + scalar, spin, settings ? *settings : default_settings); + }(); + + return move_gradient_to_numpy(std::move(result), integrator.natoms); + }, + "scalar_density"_a, "spin_density"_a, + "settings"_a.none() = nb::none(), + "Evaluate the UKS XC nuclear gradient. Releases the Python GIL; " + "do not call concurrently on the same instance.") + .def("diagnostics", + [](const PythonIntegrator& integrator) { + return integrator.value.diagnostics(); + }) + .def("reset_diagnostics", + [](PythonIntegrator& integrator) { + integrator.value.reset_diagnostics(); + }) + .def_prop_ro( + "nbf", + [](const PythonIntegrator& integrator) { return integrator.nbf; }) + .def_prop_ro("natoms", [](const PythonIntegrator& integrator) { + return integrator.natoms; + }); + nb::class_(module, "XCIntegratorFactory") + .def(nb::init(), + "execution_space"_a, "timing_settings"_a = SkalaXC::TimingSettings{}, + "domain_batch_mode"_a = SkalaXC::DomainBatchMode::Conservative) + .def( + "get_instance", + [](IntegratorFactory& factory, const SkalaXC::functional_type& func, + const PythonLoadBalancer& load_balancer) { + return PythonIntegrator( + factory.get_instance(func, load_balancer.value), + load_balancer.nbf, load_balancer.natoms, + load_balancer.communicator_owner); + }, + "functional"_a, "load_balancer"_a); +} diff --git a/SkalaXC/python/src/bindings/stubgen-common.patterns b/SkalaXC/python/src/bindings/stubgen-common.patterns new file mode 100644 index 00000000..9b35f945 --- /dev/null +++ b/SkalaXC/python/src/bindings/stubgen-common.patterns @@ -0,0 +1,20 @@ +_skalaxc.XCIntegrator.eval_exc_vxc: + \import numpy as np + def eval_exc_vxc( + self, + scalar_density: np.ndarray[tuple[int, int], np.dtype[np.float64]], + spin_density: np.ndarray[tuple[int, int], np.dtype[np.float64]], + ) -> tuple[ + float, + np.ndarray[tuple[int, int], np.dtype[np.float64]], + np.ndarray[tuple[int, int], np.dtype[np.float64]], + ]: ... + +_skalaxc.XCIntegrator.eval_exc_grad: + \import numpy as np + def eval_exc_grad( + self, + scalar_density: np.ndarray[tuple[int, int], np.dtype[np.float64]], + spin_density: np.ndarray[tuple[int, int], np.dtype[np.float64]], + settings: GradientSettings = ..., + ) -> np.ndarray[tuple[int, int], np.dtype[np.float64]]: ... \ No newline at end of file diff --git a/SkalaXC/python/src/bindings/stubgen-cuda-mpi.patterns b/SkalaXC/python/src/bindings/stubgen-cuda-mpi.patterns new file mode 100644 index 00000000..3de87fcc --- /dev/null +++ b/SkalaXC/python/src/bindings/stubgen-cuda-mpi.patterns @@ -0,0 +1,8 @@ +_skalaxc.RuntimeEnvironment.__init__: + \from mpi4py.MPI import Intracomm + \from typing import overload + @overload + def __init__(self, communicator: Intracomm) -> None: ... + + @overload + def __init__(self, communicator: Intracomm, settings: DeviceRuntimeSettings) -> None: ... \ No newline at end of file diff --git a/SkalaXC/python/src/bindings/stubgen-mpi.patterns b/SkalaXC/python/src/bindings/stubgen-mpi.patterns new file mode 100644 index 00000000..5e4266f7 --- /dev/null +++ b/SkalaXC/python/src/bindings/stubgen-mpi.patterns @@ -0,0 +1,3 @@ +_skalaxc.RuntimeEnvironment.__init__: + \from mpi4py.MPI import Intracomm + def __init__(self, communicator: Intracomm) -> None: ... \ No newline at end of file diff --git a/SkalaXC/python/src/skalaxc/__init__.py b/SkalaXC/python/src/skalaxc/__init__.py new file mode 100644 index 00000000..a0ab882e --- /dev/null +++ b/SkalaXC/python/src/skalaxc/__init__.py @@ -0,0 +1,153 @@ +"""Direct Python bindings for SkalaXC.""" + +from __future__ import annotations + +import os as _os +import sys as _sys +from pathlib import Path as _Path + +import torch as _torch + +from ._build_info import ( + CUDA_ENABLED, + CUDA_TOOLKIT_VERSION, + HDF5_ENABLED, + MPI_ENABLED, + OPENMP_ENABLED, + PYTHON_LAYOUT, + SKALAXC_VERSION, + TORCH_CUDA_VERSION, + TORCH_CXX11_ABI, + TORCH_VERSION, +) + + +def _major_minor(version: str) -> tuple[int, int]: + release = version.split("+", maxsplit=1)[0].split(".") + return int(release[0]), int(release[1]) + + +def _cuda_versions_compatible(build_version: str, runtime_version: str) -> bool: + build_major = int(build_version.split(".", maxsplit=1)[0]) + runtime_major = int(runtime_version.split(".", maxsplit=1)[0]) + return build_major == runtime_major + + +if _major_minor(_torch.__version__) != _major_minor(TORCH_VERSION): + raise ImportError( + "SkalaXC was built against Torch " + f"{TORCH_VERSION}, but this environment provides {_torch.__version__}" + ) + +if TORCH_CXX11_ABI != "unknown": + runtime_abi = int(bool(_torch._C._GLIBCXX_USE_CXX11_ABI)) + if runtime_abi != int(TORCH_CXX11_ABI): + raise ImportError( + "SkalaXC and Torch use different libstdc++ C++11 ABIs: " + f"SkalaXC={TORCH_CXX11_ABI}, Torch={runtime_abi}" + ) + +if CUDA_ENABLED: + if _torch.version.cuda is None: + raise ImportError( + "CUDA-enabled SkalaXC requires a CUDA-enabled Torch installation" + ) + if not _cuda_versions_compatible(_torch.version.cuda, TORCH_CUDA_VERSION): + raise ImportError( + "SkalaXC was built for the Torch CUDA " + f"{TORCH_CUDA_VERSION}, but this environment provides " + f"Torch CUDA {_torch.version.cuda}; their CUDA major versions " + "must match" + ) + +from . import _skalaxc as _native # noqa: E402 + +if PYTHON_LAYOUT == "WHEEL": + MODEL_DIR = _Path(_native.__file__).with_name("models") +elif PYTHON_LAYOUT == "CONDA": + MODEL_DIR = _Path(_sys.prefix) / "share" / "skalaxc" / "skala_models" +else: + raise ImportError(f"Unsupported SkalaXC Python layout: {PYTHON_LAYOUT}") +_os.environ.setdefault("SKALAXC_MODEL_PATH", str(MODEL_DIR)) + +from ._skalaxc import ( # noqa: E402 + Atom, + AtomicGridSize, + BasisSet, + DiagnosticsSnapshot, + DomainBatchMode, + ExecutionSpace, + Functional, + GradientSettings, + LoadBalancer, + LoadBalancerFactory, + MolecularWeights, + MolecularWeightsFactory, + MolecularWeightsSettings, + Molecule, + MolGrid, + MolGridFactory, + PruningScheme, + RadialQuad, + RuntimeEnvironment, + Shell, + SkalaXCError, + TimingMetric, + TimingSettings, + TimingStatus, + TimingValue, + XCIntegrator, + XCIntegratorFactory, + XCWeightAlgorithm, + native_version, +) + +if CUDA_ENABLED: + DeviceRuntimeSettings = _native.DeviceRuntimeSettings + +__version__ = SKALAXC_VERSION + +__all__ = [ + "CUDA_ENABLED", + "CUDA_TOOLKIT_VERSION", + "HDF5_ENABLED", + "MODEL_DIR", + "MPI_ENABLED", + "OPENMP_ENABLED", + "PYTHON_LAYOUT", + "SKALAXC_VERSION", + "TORCH_CUDA_VERSION", + "TORCH_VERSION", + "Atom", + "AtomicGridSize", + "BasisSet", + "DiagnosticsSnapshot", + "DomainBatchMode", + "ExecutionSpace", + "Functional", + "GradientSettings", + "LoadBalancer", + "LoadBalancerFactory", + "MolGrid", + "MolGridFactory", + "MolecularWeights", + "MolecularWeightsFactory", + "MolecularWeightsSettings", + "Molecule", + "PruningScheme", + "RadialQuad", + "RuntimeEnvironment", + "Shell", + "SkalaXCError", + "TimingMetric", + "TimingSettings", + "TimingStatus", + "TimingValue", + "XCIntegrator", + "XCIntegratorFactory", + "XCWeightAlgorithm", + "native_version", +] + +if CUDA_ENABLED: + __all__.append("DeviceRuntimeSettings") diff --git a/SkalaXC/python/src/skalaxc/__init__.pyi b/SkalaXC/python/src/skalaxc/__init__.pyi new file mode 100644 index 00000000..8c6a5661 --- /dev/null +++ b/SkalaXC/python/src/skalaxc/__init__.pyi @@ -0,0 +1,17 @@ +from pathlib import Path + +from ._skalaxc import * # noqa: F403 + +CUDA_ENABLED: bool +CUDA_TOOLKIT_VERSION: str +HDF5_ENABLED: bool +MPI_ENABLED: bool +MODEL_DIR: Path +OPENMP_ENABLED: bool +PYTHON_LAYOUT: str +SKALAXC_VERSION: str +TORCH_VERSION: str +TORCH_CUDA_VERSION: str +__version__: str + +def _cuda_versions_compatible(build_version: str, runtime_version: str) -> bool: ... diff --git a/SkalaXC/python/src/skalaxc/_build_info.py.in b/SkalaXC/python/src/skalaxc/_build_info.py.in new file mode 100644 index 00000000..45017676 --- /dev/null +++ b/SkalaXC/python/src/skalaxc/_build_info.py.in @@ -0,0 +1,12 @@ +"""Native build metadata generated by CMake.""" + +SKALAXC_VERSION = "@SkalaXC_VERSION@" +TORCH_VERSION = "@SkalaXC_TORCH_VERSION@" +TORCH_CXX11_ABI = "@SkalaXC_TORCH_CXX11_ABI@" +TORCH_CUDA_VERSION = "@SkalaXC_TORCH_CUDA_VERSION@" +CUDA_TOOLKIT_VERSION = "@SkalaXC_CUDA_TOOLKIT_VERSION@" +CUDA_ENABLED = @_skalaxc_python_cuda@ +MPI_ENABLED = @_skalaxc_python_mpi@ +OPENMP_ENABLED = @_skalaxc_python_openmp@ +HDF5_ENABLED = @_skalaxc_python_hdf5@ +PYTHON_LAYOUT = "@SKALAXC_PYTHON_LAYOUT@" \ No newline at end of file diff --git a/SkalaXC/python/src/skalaxc/py.typed b/SkalaXC/python/src/skalaxc/py.typed new file mode 100644 index 00000000..e69de29b diff --git a/SkalaXC/python/tests/test_cuda.py b/SkalaXC/python/tests/test_cuda.py new file mode 100644 index 00000000..ed12833a --- /dev/null +++ b/SkalaXC/python/tests/test_cuda.py @@ -0,0 +1,226 @@ +from __future__ import annotations + +import numpy as np +import pytest +import skalaxc + +pytestmark = pytest.mark.skipif( + not skalaxc.CUDA_ENABLED, reason="SkalaXC was built without CUDA" +) + + +def make_h2_sto3g( + x_displacement: float = 0.0, +) -> tuple[skalaxc.Molecule, skalaxc.BasisSet]: + molecule = skalaxc.Molecule() + molecule.append(skalaxc.Atom(1, -0.252 - x_displacement, 0.336, -0.56)) + molecule.append(skalaxc.Atom(1, 0.252 + x_displacement, -0.336, 0.56)) + + exponents = [3.42525091, 0.62391373, 0.16885540] + coefficients = [0.15432897, 0.53532814, 0.44463454] + basis = skalaxc.BasisSet() + for atom in (molecule[0], molecule[1]): + basis.append( + skalaxc.Shell( + 0, + False, + exponents, + coefficients, + [atom.x, atom.y, atom.z], + ) + ) + return molecule, basis + + +def make_runtime(execution_space: skalaxc.ExecutionSpace) -> skalaxc.RuntimeEnvironment: + if skalaxc.MPI_ENABLED: + from mpi4py import MPI + + if execution_space == skalaxc.ExecutionSpace.DEVICE: + settings = skalaxc.DeviceRuntimeSettings() + settings.memory_fraction = 0.8 + return skalaxc.RuntimeEnvironment(MPI.COMM_SELF, settings) + return skalaxc.RuntimeEnvironment(MPI.COMM_SELF) + + if execution_space == skalaxc.ExecutionSpace.DEVICE: + settings = skalaxc.DeviceRuntimeSettings() + settings.memory_fraction = 0.8 + return skalaxc.RuntimeEnvironment(settings) + return skalaxc.RuntimeEnvironment() + + +def make_integrator( + execution_space: skalaxc.ExecutionSpace, + batch_mode: skalaxc.DomainBatchMode, + runtime: skalaxc.RuntimeEnvironment | None = None, + x_displacement: float = 0.0, +) -> skalaxc.XCIntegrator: + molecule, basis = make_h2_sto3g(x_displacement) + grid = skalaxc.MolGridFactory.create_default( + molecule, grid_size=skalaxc.AtomicGridSize.FINE + ) + if runtime is None: + runtime = make_runtime(execution_space) + load_balancer = skalaxc.LoadBalancerFactory(execution_space).get_instance( + runtime, molecule, grid, basis + ) + weights = skalaxc.MolecularWeightsFactory(execution_space).get_instance() + weights.modify_weights(load_balancer) + return skalaxc.XCIntegratorFactory( + execution_space, domain_batch_mode=batch_mode + ).get_instance(skalaxc.Functional("TPSS"), load_balancer) + + +@pytest.mark.parametrize( + "batch_mode", + [ + skalaxc.DomainBatchMode.CONSERVATIVE, + skalaxc.DomainBatchMode.AGGRESSIVE, + ], +) +def test_cuda_matches_host_through_python_binding( + batch_mode: skalaxc.DomainBatchMode, +) -> None: + scalar_density = np.asfortranarray([[0.5, 0.5], [0.5, 0.5]]) + spin_density = np.zeros((2, 2), dtype=np.float64, order="F") + + host = make_integrator(skalaxc.ExecutionSpace.HOST, batch_mode) + device = make_integrator(skalaxc.ExecutionSpace.DEVICE, batch_mode) + host_energy, host_scalar, host_spin = host.eval_exc_vxc( + scalar_density, spin_density + ) + device_energy, device_scalar, device_spin = device.eval_exc_vxc( + scalar_density, spin_density + ) + host_gradient = host.eval_exc_grad(scalar_density, spin_density) + device_gradient = device.eval_exc_grad(scalar_density, spin_density) + + assert device_energy == pytest.approx(host_energy, abs=1e-10) + assert np.linalg.norm(device_scalar - host_scalar) / device.nbf <= 1e-7 + assert np.linalg.norm(device_spin - host_spin) / device.nbf <= 1e-10 + assert np.max(np.abs(device_gradient - host_gradient)) <= 1e-6 + + diagnostics = device.diagnostics() + assert diagnostics.backend == skalaxc.ExecutionSpace.DEVICE + assert diagnostics.device_id == 0 + assert diagnostics.device_memory_fraction == pytest.approx(0.8) + assert diagnostics.domain_batch_mode == batch_mode + assert diagnostics.exc_vxc_calls == 1 + assert diagnostics.exc_gradient_calls == 1 + assert ( + diagnostics.timing(skalaxc.TimingMetric.TOTAL_EXC_GRADIENT).status + == skalaxc.TimingStatus.UNAVAILABLE + ) + + +@pytest.mark.skipif(not skalaxc.MPI_ENABLED, reason="SkalaXC was built without MPI") +def test_cuda_uses_mpi_world_with_an_idle_domain_rank() -> None: + from mpi4py import MPI + + if MPI.COMM_WORLD.size != 3: + pytest.skip("CUDA idle-domain coverage requires exactly three MPI ranks") + + settings = skalaxc.DeviceRuntimeSettings() + settings.memory_fraction = 0.8 / MPI.COMM_WORLD.size + host_runtime = skalaxc.RuntimeEnvironment(MPI.COMM_WORLD) + device_runtime = skalaxc.RuntimeEnvironment(MPI.COMM_WORLD, settings) + host = make_integrator( + skalaxc.ExecutionSpace.HOST, + skalaxc.DomainBatchMode.CONSERVATIVE, + host_runtime, + ) + device = make_integrator( + skalaxc.ExecutionSpace.DEVICE, + skalaxc.DomainBatchMode.CONSERVATIVE, + device_runtime, + ) + scalar_density = np.asfortranarray([[0.5, 0.5], [0.5, 0.5]]) + spin_density = np.zeros((2, 2), dtype=np.float64, order="F") + + host_energy, host_scalar, host_spin = host.eval_exc_vxc( + scalar_density, spin_density + ) + device_energy, device_scalar, device_spin = device.eval_exc_vxc( + scalar_density, spin_density + ) + host_gradient = host.eval_exc_grad(scalar_density, spin_density) + device_gradient = device.eval_exc_grad(scalar_density, spin_density) + + assert device_energy == pytest.approx(host_energy, abs=1e-10) + assert np.linalg.norm(device_scalar - host_scalar) / device.nbf <= 1e-7 + assert np.linalg.norm(device_spin - host_spin) / device.nbf <= 1e-10 + assert np.max(np.abs(device_gradient - host_gradient)) <= 1e-6 + assert MPI.COMM_WORLD.allgather(device_energy) == pytest.approx( + [device_energy] * MPI.COMM_WORLD.size + ) + + diagnostics = device.diagnostics() + local_atoms = MPI.COMM_WORLD.allgather(diagnostics.local_atoms) + assert diagnostics.communicator_size == MPI.COMM_WORLD.size + assert sum(local_atoms) == 2 + assert 0 in local_atoms + + +@pytest.mark.skipif(not skalaxc.MPI_ENABLED, reason="SkalaXC was built without MPI") +def test_cuda_uses_runtime_mpi_subcommunicator() -> None: + from mpi4py import MPI + + if MPI.COMM_WORLD.size != 4: + pytest.skip("CUDA subcommunicator coverage requires exactly four MPI ranks") + + color = MPI.COMM_WORLD.rank % 2 + communicator = MPI.COMM_WORLD.Split(color=color, key=MPI.COMM_WORLD.rank) + host: skalaxc.XCIntegrator | None = None + device: skalaxc.XCIntegrator | None = None + host_runtime: skalaxc.RuntimeEnvironment | None = None + device_runtime: skalaxc.RuntimeEnvironment | None = None + try: + settings = skalaxc.DeviceRuntimeSettings() + settings.memory_fraction = 0.8 / MPI.COMM_WORLD.size + host_runtime = skalaxc.RuntimeEnvironment(communicator) + device_runtime = skalaxc.RuntimeEnvironment(communicator, settings) + displacement = 0.04 * color + host = make_integrator( + skalaxc.ExecutionSpace.HOST, + skalaxc.DomainBatchMode.CONSERVATIVE, + host_runtime, + displacement, + ) + device = make_integrator( + skalaxc.ExecutionSpace.DEVICE, + skalaxc.DomainBatchMode.CONSERVATIVE, + device_runtime, + displacement, + ) + assert host is not None + assert device is not None + scalar_density = np.asfortranarray( + [[0.5 + 0.02 * color, 0.5], [0.5, 0.5 - 0.02 * color]] + ) + spin_density = np.zeros((2, 2), dtype=np.float64, order="F") + + host_energy, host_scalar, host_spin = host.eval_exc_vxc( + scalar_density, spin_density + ) + device_energy, device_scalar, device_spin = device.eval_exc_vxc( + scalar_density, spin_density + ) + host_gradient = host.eval_exc_grad(scalar_density, spin_density) + device_gradient = device.eval_exc_grad(scalar_density, spin_density) + + assert device_energy == pytest.approx(host_energy, abs=1e-10) + assert np.linalg.norm(device_scalar - host_scalar) / device.nbf <= 1e-7 + assert np.linalg.norm(device_spin - host_spin) / device.nbf <= 1e-10 + assert np.max(np.abs(device_gradient - host_gradient)) <= 1e-6 + assert communicator.allgather(device_energy) == pytest.approx( + [device_energy] * communicator.size + ) + + world_energies = MPI.COMM_WORLD.allgather(device_energy) + assert world_energies[0] == pytest.approx(world_energies[2]) + assert world_energies[1] == pytest.approx(world_energies[3]) + assert world_energies[0] != pytest.approx(world_energies[1], abs=1e-8) + assert device.diagnostics().communicator_size == communicator.size + finally: + del host, device, host_runtime, device_runtime + communicator.Free() diff --git a/SkalaXC/python/tests/test_integration.py b/SkalaXC/python/tests/test_integration.py new file mode 100644 index 00000000..32007ec5 --- /dev/null +++ b/SkalaXC/python/tests/test_integration.py @@ -0,0 +1,221 @@ +from __future__ import annotations + +import hashlib +import sys +from pathlib import Path + +import h5py +import numpy as np +import pytest +import skalaxc + +REFERENCE_DATA = Path(__file__).parents[2] / "tests" / "ref_data" +SKALA_1_1_REV1_SHA256 = ( + "7f3e8622e1eb520ccd88a55464c3e359ac4d7e5ccbd1fb77a26afa1e1c20a5cd" +) +SKALA_1_1_REV1_CUDA_SHA256 = ( + "f848eae769dca91741a518ae7275d10caac398ab21db649f91bc1f136872f223" +) + + +def test_cuda_version_compatibility_uses_major_family() -> None: + assert skalaxc._cuda_versions_compatible("13.3.73", "13.0") + assert skalaxc._cuda_versions_compatible("12.9", "12.1") + assert not skalaxc._cuda_versions_compatible("13.0", "12.9") + + +def test_model_directory_matches_package_layout() -> None: + if skalaxc.PYTHON_LAYOUT == "WHEEL": + expected = Path(skalaxc.__file__).parent / "models" + else: + assert skalaxc.PYTHON_LAYOUT == "CONDA" + expected = Path(sys.prefix) / "share" / "skalaxc" / "skala_models" + + assert skalaxc.MODEL_DIR == expected + for model in ("ldax.fun", "pbe.fun", "tpss.fun", "skala-1.1.fun"): + assert (skalaxc.MODEL_DIR / model).is_file() + + skala_model = skalaxc.MODEL_DIR / "skala-1.1.fun" + assert hashlib.sha256(skala_model.read_bytes()).hexdigest() == SKALA_1_1_REV1_SHA256 + if skalaxc.CUDA_ENABLED: + cuda_model = skalaxc.MODEL_DIR / "skala-1.1-cuda.fun" + assert cuda_model.is_file() + assert ( + hashlib.sha256(cuda_model.read_bytes()).hexdigest() + == SKALA_1_1_REV1_CUDA_SHA256 + ) + + +def build_integrator( + fixture: Path, + model: str = "LDA", + runtime: skalaxc.RuntimeEnvironment | None = None, +) -> skalaxc.XCIntegrator: + molecule = skalaxc.Molecule.from_hdf5(str(fixture)) + basis = skalaxc.BasisSet.from_hdf5(str(fixture)) + grid = skalaxc.MolGridFactory.create_default(molecule) + if runtime is None: + if skalaxc.MPI_ENABLED: + from mpi4py import MPI + + runtime = skalaxc.RuntimeEnvironment(MPI.COMM_SELF) + else: + runtime = skalaxc.RuntimeEnvironment() + load_balancer = skalaxc.LoadBalancerFactory( + skalaxc.ExecutionSpace.HOST + ).get_instance(runtime, molecule, grid, basis) + weights = skalaxc.MolecularWeightsFactory( + skalaxc.ExecutionSpace.HOST + ).get_instance() + weights.modify_weights(load_balancer) + return skalaxc.XCIntegratorFactory(skalaxc.ExecutionSpace.HOST).get_instance( + skalaxc.Functional(model), load_balancer + ) + + +@pytest.mark.parametrize( + ("filename", "model"), + [ + ("skala_he_def2qzvp_lda_uks.hdf5", "LDA"), + ("skala_he_def2qzvp_pbe_uks.hdf5", "PBE"), + ("skala_he_def2qzvp_tpss_uks.hdf5", "TPSS"), + ], +) +def test_exc_vxc_matches_native_reference(filename: str, model: str) -> None: + fixture = REFERENCE_DATA / filename + integrator = build_integrator(fixture, model) + with h5py.File(fixture) as reference: + scalar_density = np.asfortranarray(reference["/DENSITY_SCALAR"]) + spin_density = np.asfortranarray(reference["/DENSITY_Z"]) + scalar_reference = np.asarray(reference["/VXC_SCALAR"]) + spin_reference = np.asarray(reference["/VXC_Z"]) + energy_reference = float(np.asarray(reference["/EXC"]).reshape(-1)[0]) + + energy, scalar_potential, spin_potential = integrator.eval_exc_vxc( + scalar_density, spin_density + ) + + assert energy == pytest.approx(energy_reference, rel=1e-5) + assert np.linalg.norm(scalar_potential - scalar_reference) / integrator.nbf < 1e-7 + assert np.linalg.norm(spin_potential - spin_reference) / integrator.nbf < 1e-10 + assert scalar_potential.shape == (integrator.nbf, integrator.nbf) + assert spin_potential.shape == (integrator.nbf, integrator.nbf) + assert scalar_potential.dtype == np.float64 + assert spin_potential.dtype == np.float64 + assert scalar_potential.flags.f_contiguous + assert spin_potential.flags.f_contiguous + assert integrator.diagnostics().exc_vxc_calls == 1 + + +def test_packaged_skala_1_1_model_evaluates() -> None: + fixture = REFERENCE_DATA / "skala_he_def2qzvp_tpss_uks.hdf5" + model = skalaxc.MODEL_DIR / "skala-1.1.fun" + integrator = build_integrator(fixture, str(model)) + with h5py.File(fixture) as reference: + scalar_density = np.asfortranarray(reference["/DENSITY_SCALAR"]) + spin_density = np.asfortranarray(reference["/DENSITY_Z"]) + + energy, scalar_potential, spin_potential = integrator.eval_exc_vxc( + scalar_density, spin_density + ) + + assert np.isfinite(energy) + assert np.isfinite(scalar_potential).all() + assert np.isfinite(spin_potential).all() + assert scalar_potential.shape == (integrator.nbf, integrator.nbf) + assert spin_potential.shape == (integrator.nbf, integrator.nbf) + + +def test_density_validation_rejects_wrong_shape() -> None: + fixture = REFERENCE_DATA / "skala_he_def2qzvp_lda_uks.hdf5" + integrator = build_integrator(fixture) + wrong_shape = np.zeros((integrator.nbf, integrator.nbf - 1), order="F") + density = np.zeros((integrator.nbf, integrator.nbf), order="F") + + with pytest.raises(ValueError, match="shape"): + integrator.eval_exc_vxc(wrong_shape, density) + + +def test_density_inputs_are_coerced_to_float64_fortran_order() -> None: + fixture = REFERENCE_DATA / "skala_he_def2qzvp_lda_uks.hdf5" + integrator = build_integrator(fixture) + with h5py.File(fixture) as reference: + scalar_values = np.array( + reference["/DENSITY_SCALAR"], dtype=np.float32, order="C" + ) + spin_values = np.array(reference["/DENSITY_Z"], dtype=np.float32, order="C") + + scalar_strided_storage = np.empty( + (2 * integrator.nbf, 2 * integrator.nbf), dtype=np.float32 + ) + spin_strided_storage = np.empty_like(scalar_strided_storage) + scalar_strided = scalar_strided_storage[::2, ::2] + spin_strided = spin_strided_storage[::2, ::2] + scalar_strided[...] = scalar_values + spin_strided[...] = spin_values + + scalar_read_only = scalar_values.copy() + spin_read_only = spin_values.copy() + scalar_read_only.flags.writeable = False + spin_read_only.flags.writeable = False + + assert scalar_values.flags.c_contiguous + assert not scalar_values.flags.f_contiguous + assert not scalar_strided.flags.c_contiguous + assert not scalar_strided.flags.f_contiguous + assert not scalar_read_only.flags.writeable + + inputs = [ + (scalar_values, spin_values), + (scalar_strided, spin_strided), + (scalar_read_only, spin_read_only), + ] + for scalar_density, spin_density in inputs: + expected = integrator.eval_exc_vxc( + np.asfortranarray(scalar_density, dtype=np.float64), + np.asfortranarray(spin_density, dtype=np.float64), + ) + actual = integrator.eval_exc_vxc(scalar_density, spin_density) + + assert actual[0] == expected[0] + np.testing.assert_allclose(actual[1], expected[1], rtol=0.0, atol=1e-14) + np.testing.assert_allclose(actual[2], expected[2], rtol=0.0, atol=1e-14) + assert actual[1].dtype == np.float64 + assert actual[2].dtype == np.float64 + assert actual[1].flags.f_contiguous + assert actual[2].flags.f_contiguous + + +def test_gradient_is_atom_major_and_tracks_diagnostics() -> None: + fixture = ( + Path(__file__).parents[2] + / "external" + / "GauXC" + / "tests" + / "ref_data" + / "h2o2_def2-tzvp.hdf5" + ) + integrator = build_integrator(fixture, "TPSS") + with h5py.File(fixture) as reference: + scalar_density = np.asfortranarray(reference["/DENSITY"]) + spin_density = np.zeros_like(scalar_density, order="F") + + gradient = integrator.eval_exc_grad(scalar_density, spin_density) + + assert gradient.shape == (integrator.natoms, 3) + assert gradient.dtype == np.float64 + assert gradient.flags.c_contiguous + assert np.isfinite(gradient).all() + assert np.linalg.norm(gradient) > 1e-3 + assert np.abs(gradient.sum(axis=0)).max() < 1e-10 + diagnostics = integrator.diagnostics() + assert diagnostics.exc_gradient_calls == 1 + assert ( + diagnostics.timing(skalaxc.TimingMetric.TOTAL_EXC_GRADIENT).status + == skalaxc.TimingStatus.COMPLETE + ) + + settings = skalaxc.GradientSettings() + settings.include_weight_derivatives = False + with pytest.raises(skalaxc.SkalaXCError, match="weight_derivatives"): + integrator.eval_exc_grad(scalar_density, spin_density, settings) diff --git a/SkalaXC/python/tests/test_mpi.py b/SkalaXC/python/tests/test_mpi.py new file mode 100644 index 00000000..579144e9 --- /dev/null +++ b/SkalaXC/python/tests/test_mpi.py @@ -0,0 +1,88 @@ +from __future__ import annotations + +import gc +import sys + +import h5py +import numpy as np +import pytest +import skalaxc +from mpi4py import MPI +from test_integration import REFERENCE_DATA, build_integrator + +pytestmark = pytest.mark.skipif( + not skalaxc.MPI_ENABLED, reason="SkalaXC was built without MPI" +) + + +def test_runtime_requires_valid_explicit_intracommunicator() -> None: + runtime = skalaxc.RuntimeEnvironment(MPI.COMM_SELF) + assert runtime.rank == 0 + assert runtime.size == 1 + + with pytest.raises(TypeError): + skalaxc.RuntimeEnvironment() + with pytest.raises(TypeError, match="explicit mpi4py"): + skalaxc.RuntimeEnvironment(None) + with pytest.raises(ValueError, match="COMM_NULL"): + skalaxc.RuntimeEnvironment(MPI.COMM_NULL) + + freed = MPI.COMM_SELF.Dup() + freed.Free() + with pytest.raises(ValueError, match="freed"): + skalaxc.RuntimeEnvironment(freed) + + +def test_integrator_retains_communicator_owner() -> None: + communicator = MPI.COMM_SELF.Dup() + references_before = sys.getrefcount(communicator) + runtime = skalaxc.RuntimeEnvironment(communicator) + assert sys.getrefcount(communicator) == references_before + 1 + + integrator = build_integrator( + REFERENCE_DATA / "skala_he_def2qzvp_lda_uks.hdf5", + runtime=runtime, + ) + del runtime + gc.collect() + assert sys.getrefcount(communicator) >= references_before + 1 + + del integrator + gc.collect() + assert sys.getrefcount(communicator) == references_before + communicator.Free() + + +def test_explicit_subcommunicator_evaluation() -> None: + world = MPI.COMM_WORLD + communicator = world.Split(color=0, key=world.size - world.rank) + try: + runtime = skalaxc.RuntimeEnvironment(communicator) + assert runtime.rank == communicator.rank + assert runtime.size == communicator.size + fixture = REFERENCE_DATA / "skala_he_def2qzvp_lda_uks.hdf5" + integrator = build_integrator(fixture, runtime=runtime) + with h5py.File(fixture) as reference: + scalar_density = np.asfortranarray(reference["/DENSITY_SCALAR"]) + spin_density = np.asfortranarray(reference["/DENSITY_Z"]) + energy, _, _ = integrator.eval_exc_vxc(scalar_density, spin_density) + energies = communicator.allgather(energy) + assert energies == pytest.approx([energies[0]] * communicator.size) + finally: + communicator.Free() + + +def test_intercommunicator_is_rejected() -> None: + world = MPI.COMM_WORLD + if world.size != 2: + pytest.skip("intercommunicator construction requires exactly two ranks") + local = world.Split(color=world.rank, key=0) + intercommunicator = local.Create_intercomm( + 0, world, remote_leader=1 - world.rank, tag=717 + ) + try: + with pytest.raises(ValueError, match="intercommunicators"): + skalaxc.RuntimeEnvironment(intercommunicator) + finally: + intercommunicator.Free() + local.Free() diff --git a/SkalaXC/python/tests/test_torch_config.py b/SkalaXC/python/tests/test_torch_config.py new file mode 100644 index 00000000..e777bbd6 --- /dev/null +++ b/SkalaXC/python/tests/test_torch_config.py @@ -0,0 +1,18 @@ +from __future__ import annotations + +import importlib.util +from pathlib import Path + + +def test_torch_configuration_matches_imported_torch() -> None: + script = Path(__file__).parents[1] / "tools" / "torch_config.py" + spec = importlib.util.spec_from_file_location("torch_config", script) + assert spec is not None and spec.loader is not None + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + + configuration = module.torch_configuration() + assert Path(configuration["torch_dir"], "TorchConfig.cmake").is_file() + assert configuration["version"] + assert configuration["cxx11_abi"] in (0, 1) + assert configuration["cuda"] is None or configuration["cuda"] diff --git a/SkalaXC/python/tests/test_typing.py b/SkalaXC/python/tests/test_typing.py new file mode 100644 index 00000000..54706140 --- /dev/null +++ b/SkalaXC/python/tests/test_typing.py @@ -0,0 +1,34 @@ +from __future__ import annotations + +import subprocess +import sys +from pathlib import Path + +import skalaxc + + +def test_installed_stub_matches_native_build() -> None: + if skalaxc.CUDA_ENABLED and skalaxc.MPI_ENABLED: + variant = "cuda_mpi" + elif skalaxc.CUDA_ENABLED: + variant = "cuda" + elif skalaxc.MPI_ENABLED: + variant = "mpi" + else: + variant = "cpu" + + package_root = Path(__file__).parent.parent + result = subprocess.run( + [ + sys.executable, + "-m", + "mypy", + "tests/typing/interface.py", + f"tests/typing/{variant}.py", + ], + cwd=package_root, + check=False, + capture_output=True, + text=True, + ) + assert result.returncode == 0, result.stdout + result.stderr diff --git a/SkalaXC/python/tests/typing/cpu.py b/SkalaXC/python/tests/typing/cpu.py new file mode 100644 index 00000000..0e9efef9 --- /dev/null +++ b/SkalaXC/python/tests/typing/cpu.py @@ -0,0 +1,8 @@ +from __future__ import annotations + +import skalaxc +from typing_extensions import assert_type # noqa: UP035 + +assert_type(skalaxc.RuntimeEnvironment(), skalaxc.RuntimeEnvironment) +skalaxc.RuntimeEnvironment(None) # type: ignore[call-arg] +skalaxc.DeviceRuntimeSettings() # type: ignore[attr-defined] diff --git a/SkalaXC/python/tests/typing/cuda.py b/SkalaXC/python/tests/typing/cuda.py new file mode 100644 index 00000000..b2d60eb5 --- /dev/null +++ b/SkalaXC/python/tests/typing/cuda.py @@ -0,0 +1,9 @@ +from __future__ import annotations + +import skalaxc +from typing_extensions import assert_type # noqa: UP035 + +settings = skalaxc.DeviceRuntimeSettings() +assert_type(skalaxc.RuntimeEnvironment(), skalaxc.RuntimeEnvironment) +assert_type(skalaxc.RuntimeEnvironment(settings), skalaxc.RuntimeEnvironment) +skalaxc.RuntimeEnvironment(None) # type: ignore[call-overload] diff --git a/SkalaXC/python/tests/typing/cuda_mpi.py b/SkalaXC/python/tests/typing/cuda_mpi.py new file mode 100644 index 00000000..ed60e4b1 --- /dev/null +++ b/SkalaXC/python/tests/typing/cuda_mpi.py @@ -0,0 +1,19 @@ +from __future__ import annotations + +import skalaxc +from mpi4py import MPI +from typing_extensions import assert_type # noqa: UP035 + +settings = skalaxc.DeviceRuntimeSettings() +assert_type( + skalaxc.RuntimeEnvironment(MPI.COMM_SELF), + skalaxc.RuntimeEnvironment, +) +assert_type( + skalaxc.RuntimeEnvironment(MPI.COMM_SELF, settings), + skalaxc.RuntimeEnvironment, +) + +skalaxc.RuntimeEnvironment() # type: ignore[call-overload] +skalaxc.RuntimeEnvironment(None) # type: ignore[call-overload] +skalaxc.RuntimeEnvironment(settings) # type: ignore[call-overload] diff --git a/SkalaXC/python/tests/typing/interface.py b/SkalaXC/python/tests/typing/interface.py new file mode 100644 index 00000000..cf9bb349 --- /dev/null +++ b/SkalaXC/python/tests/typing/interface.py @@ -0,0 +1,21 @@ +from __future__ import annotations + +import numpy as np +import skalaxc +from typing_extensions import assert_type # noqa: UP035 + +Matrix = np.ndarray[tuple[int, int], np.dtype[np.float64]] + + +def check_evaluation_types( + integrator: skalaxc.XCIntegrator, + density: Matrix, +) -> None: + energy, scalar_potential, spin_potential = integrator.eval_exc_vxc(density, density) + assert_type(energy, float) + assert_type(scalar_potential, Matrix) + assert_type(spin_potential, Matrix) + assert_type( + integrator.eval_exc_grad(density, density), + Matrix, + ) diff --git a/SkalaXC/python/tests/typing/mpi.py b/SkalaXC/python/tests/typing/mpi.py new file mode 100644 index 00000000..6b12511f --- /dev/null +++ b/SkalaXC/python/tests/typing/mpi.py @@ -0,0 +1,13 @@ +from __future__ import annotations + +import skalaxc +from mpi4py import MPI +from typing_extensions import assert_type # noqa: UP035 + +assert_type( + skalaxc.RuntimeEnvironment(MPI.COMM_SELF), + skalaxc.RuntimeEnvironment, +) +skalaxc.RuntimeEnvironment() # type: ignore[call-arg] +skalaxc.RuntimeEnvironment(None) # type: ignore[arg-type] +skalaxc.DeviceRuntimeSettings() # type: ignore[attr-defined] diff --git a/SkalaXC/python/tools/torch_config.py b/SkalaXC/python/tools/torch_config.py new file mode 100644 index 00000000..a95934a1 --- /dev/null +++ b/SkalaXC/python/tools/torch_config.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python3 +"""Report CMake configuration for the Torch imported by this interpreter.""" + +from __future__ import annotations + +import argparse +import json +from pathlib import Path +from typing import Any + +import torch + + +def torch_configuration() -> dict[str, Any]: + """Return build metadata for the Torch package in this environment.""" + cmake_prefixes = [Path(path) for path in torch.utils.cmake_prefix_path.split(";")] + torch_dirs = [prefix / "Torch" for prefix in cmake_prefixes] + torch_dir = next( + (path for path in torch_dirs if (path / "TorchConfig.cmake").is_file()), + None, + ) + if torch_dir is None: + searched = ", ".join(str(path) for path in torch_dirs) + raise RuntimeError(f"TorchConfig.cmake was not found under: {searched}") + + return { + "torch_dir": str(torch_dir.resolve()), + "version": torch.__version__, + "cxx11_abi": int(bool(torch._C._GLIBCXX_USE_CXX11_ABI)), + "cuda": torch.version.cuda, + } + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("--format", choices=("json", "cmake"), default="json") + args = parser.parse_args() + configuration = torch_configuration() + if args.format == "cmake": + print(f"-DTorch_DIR={configuration['torch_dir']}") + print(f"-DSKALAXC_TORCH_CXX11_ABI={configuration['cxx11_abi']}") + print(f"-DSKALAXC_TORCH_CUDA_VERSION={configuration['cuda'] or 'none'}") + else: + print(json.dumps(configuration, sort_keys=True)) + + +if __name__ == "__main__": + main() From 229c7ac7e9c376d612f142c3a4ab5b2ecaf6c552 Mon Sep 17 00:00:00 2001 From: jenswehner Date: Fri, 4 Sep 2026 11:36:39 +0200 Subject: [PATCH 13/33] Add package build recipes --- SkalaXC/python/recipe/build.sh | 29 +++++ SkalaXC/python/recipe/recipe.yaml | 75 ++++++++++++ SkalaXC/recipe/build-native.sh | 59 +++++++++ SkalaXC/recipe/build-python.sh | 11 ++ SkalaXC/recipe/recipe.yaml | 197 ++++++++++++++++++++++++++++++ SkalaXC/recipe/variants.yaml | 15 +++ tools/check_release_artifacts.py | 2 +- 7 files changed, 387 insertions(+), 1 deletion(-) create mode 100644 SkalaXC/python/recipe/build.sh create mode 100644 SkalaXC/python/recipe/recipe.yaml create mode 100644 SkalaXC/recipe/build-native.sh create mode 100644 SkalaXC/recipe/build-python.sh create mode 100644 SkalaXC/recipe/recipe.yaml create mode 100644 SkalaXC/recipe/variants.yaml diff --git a/SkalaXC/python/recipe/build.sh b/SkalaXC/python/recipe/build.sh new file mode 100644 index 00000000..d66c43f2 --- /dev/null +++ b/SkalaXC/python/recipe/build.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +set -euo pipefail + +SKALAXC_SOURCE="${SRC_DIR}/SkalaXC" +NATIVE_BUILD="${SRC_DIR}/build-python-package" +NATIVE_PREFIX="${SRC_DIR}/build-python-prefix" +mapfile -t TORCH_CMAKE_ARGS < <( + "${PYTHON}" "${SKALAXC_SOURCE}/python/tools/torch_config.py" --format cmake +) + +cmake -S "${SKALAXC_SOURCE}" -B "${NATIVE_BUILD}" -G Ninja \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX="${NATIVE_PREFIX}" \ + -DSKALAXC_BUILD_EXAMPLES=OFF \ + -DSKALAXC_BUILD_FORTRAN=OFF \ + -DSKALAXC_BUILD_TESTS=OFF \ + -DSKALAXC_DOWNLOAD_MODELS=OFF \ + -DSKALAXC_ENABLE_CUDA=OFF \ + -DSKALAXC_ENABLE_MPI=OFF \ + '-DSKALAXC_INSTALL_RPATH=$ORIGIN/../../..' \ + -DSKALAXC_MODEL_PATH="${SRC_DIR}/data/skala_models" \ + -DBLAS_LIBRARIES="${PREFIX}/lib/libblas.so" \ + "${TORCH_CMAKE_ARGS[@]}" +cmake --build "${NATIVE_BUILD}" --parallel "${CPU_COUNT}" +cmake --install "${NATIVE_BUILD}" + +SkalaXC_DIR="${NATIVE_PREFIX}/lib/cmake/SkalaXC" \ + "${PYTHON}" -m pip install "${SKALAXC_SOURCE}/python" \ + --no-build-isolation --no-deps -vv \ No newline at end of file diff --git a/SkalaXC/python/recipe/recipe.yaml b/SkalaXC/python/recipe/recipe.yaml new file mode 100644 index 00000000..eb0a49a2 --- /dev/null +++ b/SkalaXC/python/recipe/recipe.yaml @@ -0,0 +1,75 @@ +schema_version: 1 + +context: + version: "0.1.0" + torch_min: "2.8" + torch_max: "2.9" + +package: + name: skalaxc + version: ${{ version }} + +source: + - path: ../../.. + - url: https://huggingface.co/microsoft/skala-baselines/resolve/main/ldax.fun + sha256: dd30928579ac970ffccc0c6f4ff6e2f7d7eeda3665352229a3f2678b3d0cb32e + file_name: ldax.fun + target_directory: data/skala_models + - url: https://huggingface.co/microsoft/skala-baselines/resolve/main/pbe.fun + sha256: da4da7dfed02bde938606c77b38e785283f15ad3be69159051e11cf213a97862 + file_name: pbe.fun + target_directory: data/skala_models + - url: https://huggingface.co/microsoft/skala-baselines/resolve/main/tpss.fun + sha256: c2775e8c9512e399e8b35f1d4424052fdafaa8631a8e638a28ff460619999449 + file_name: tpss.fun + target_directory: data/skala_models + - url: https://huggingface.co/microsoft/skala-1.1/resolve/main/skala-1.1-rev1.fun + sha256: 7f3e8622e1eb520ccd88a55464c3e359ac4d7e5ccbd1fb77a26afa1e1c20a5cd + file_name: skala-1.1.fun + target_directory: data/skala_models + - url: https://huggingface.co/microsoft/skala-1.1/resolve/main/skala-1.1-rev1-cuda.fun + sha256: f848eae769dca91741a518ae7275d10caac398ab21db649f91bc1f136872f223 + file_name: skala-1.1-cuda.fun + target_directory: data/skala_models + +build: + number: 1 + skip: + - not linux + script: + file: build.sh + +requirements: + build: + - ${{ compiler('c') }} + - ${{ compiler('cxx') }} + - cmake >=3.21 + - ninja + host: + - python >=3.10 + - pip + - scikit-build-core >=0.11 + - nanobind >=2.4 + - numpy >=1.23 + - pytorch >=${{ torch_min }},<${{ torch_max }} + - hdf5 + - libblas + - nlohmann_json + - eigen >=5,<6 + run: + - python >=3.10 + - numpy >=1.23 + - pytorch >=${{ torch_min }},<${{ torch_max }} + +tests: + - python: + imports: + - skalaxc + pip_check: true + +about: + homepage: https://github.com/microsoft/skala + repository: https://github.com/microsoft/skala + license: MIT + license_file: LICENSE.txt + summary: Direct Python bindings for the SkalaXC C++ library \ No newline at end of file diff --git a/SkalaXC/recipe/build-native.sh b/SkalaXC/recipe/build-native.sh new file mode 100644 index 00000000..5c2d1597 --- /dev/null +++ b/SkalaXC/recipe/build-native.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env bash +set -euo pipefail + +source_dir="${SRC_DIR}/SkalaXC" +build_dir="${BUILD_DIR}/skalaxc-native" + +case "${SKALAXC_MPI_VARIANT}" in + nompi) mpi_enabled=OFF ;; + openmpi) mpi_enabled=ON ;; + *) echo "Unsupported MPI variant: ${SKALAXC_MPI_VARIANT}" >&2; exit 2 ;; +esac + +case "${SKALAXC_CUDA_VARIANT}" in + cpu) cuda_enabled=OFF ;; + cuda12|cuda13) cuda_enabled=ON ;; + *) echo "Unsupported CUDA variant: ${SKALAXC_CUDA_VARIANT}" >&2; exit 2 ;; +esac + +if [[ "$(uname -s)" == "Darwin" ]]; then + install_rpath='@loader_path' +else + install_rpath='$ORIGIN' +fi + +torch_config="$(${PYTHON} "${source_dir}/python/tools/torch_config.py" --format json)" +torch_value() { + printf '%s' "${torch_config}" | "${PYTHON}" -c \ + 'import json, sys; print(json.load(sys.stdin)[sys.argv[1]])' "$1" +} +torch_dir="$(torch_value torch_dir)" +torch_cxx11_abi="$(torch_value cxx11_abi)" +torch_cuda_version="$(torch_value cuda)" +if [[ "${torch_cuda_version}" == "None" ]]; then + torch_cuda_version=none +fi + +export CONDA_PREFIX="${PREFIX}" +cmake -S "${source_dir}" -B "${build_dir}" -G Ninja \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DCMAKE_INSTALL_PREFIX="${PREFIX}" \ + -DTorch_DIR="${torch_dir}" \ + -DSKALAXC_TORCH_CXX11_ABI="${torch_cxx11_abi}" \ + -DSKALAXC_TORCH_CUDA_VERSION="${torch_cuda_version}" \ + -DSKALAXC_BUILD_EXAMPLES=OFF \ + -DSKALAXC_BUILD_FORTRAN=ON \ + -DSKALAXC_BUILD_TESTS=OFF \ + -DSKALAXC_DOWNLOAD_MODELS=OFF \ + -DSKALAXC_ENABLE_CUDA="${cuda_enabled}" \ + -DSKALAXC_ENABLE_HDF5=ON \ + -DSKALAXC_ENABLE_MPI="${mpi_enabled}" \ + -DSKALAXC_ENABLE_OPENMP=ON \ + -DSKALAXC_ENABLE_SANITIZERS=OFF \ + -DSKALAXC_INSTALL_RPATH="${install_rpath}" \ + -DSKALAXC_MODEL_PATH="${SRC_DIR}/data/skala_models" \ + ${CMAKE_ARGS:-} + +cmake --build "${build_dir}" --parallel "${CPU_COUNT}" +cmake --install "${build_dir}" diff --git a/SkalaXC/recipe/build-python.sh b/SkalaXC/recipe/build-python.sh new file mode 100644 index 00000000..f46e9e48 --- /dev/null +++ b/SkalaXC/recipe/build-python.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +set -euo pipefail + +export SkalaXC_DIR="${PREFIX}/lib/cmake/SkalaXC" +export SKALAXC_PYTHON_LAYOUT=CONDA + +"${PYTHON}" -m pip install "${SRC_DIR}/SkalaXC/python" \ + --no-build-isolation \ + --no-deps \ + --prefix "${PREFIX}" \ + --verbose diff --git a/SkalaXC/recipe/recipe.yaml b/SkalaXC/recipe/recipe.yaml new file mode 100644 index 00000000..9b07b265 --- /dev/null +++ b/SkalaXC/recipe/recipe.yaml @@ -0,0 +1,197 @@ +schema_version: 1 + +context: + version: "0.1.0" + torch_min: "2.13" + torch_max: "2.14" + cuda12_gcc: "14" + cuda13_gcc: "15" + +recipe: + name: skalaxc-split + version: ${{ version }} + +source: + - path: ../.. + - url: https://huggingface.co/microsoft/skala-baselines/resolve/main/ldax.fun + sha256: dd30928579ac970ffccc0c6f4ff6e2f7d7eeda3665352229a3f2678b3d0cb32e + file_name: ldax.fun + target_directory: data/skala_models + - url: https://huggingface.co/microsoft/skala-baselines/resolve/main/pbe.fun + sha256: da4da7dfed02bde938606c77b38e785283f15ad3be69159051e11cf213a97862 + file_name: pbe.fun + target_directory: data/skala_models + - url: https://huggingface.co/microsoft/skala-baselines/resolve/main/tpss.fun + sha256: c2775e8c9512e399e8b35f1d4424052fdafaa8631a8e638a28ff460619999449 + file_name: tpss.fun + target_directory: data/skala_models + - url: https://huggingface.co/microsoft/skala-1.1/resolve/main/skala-1.1-rev1.fun + sha256: 7f3e8622e1eb520ccd88a55464c3e359ac4d7e5ccbd1fb77a26afa1e1c20a5cd + file_name: skala-1.1.fun + target_directory: data/skala_models + - url: https://huggingface.co/microsoft/skala-1.1/resolve/main/skala-1.1-rev1-cuda.fun + sha256: f848eae769dca91741a518ae7275d10caac398ab21db649f91bc1f136872f223 + file_name: skala-1.1-cuda.fun + target_directory: data/skala_models + +build: + number: 1 + +outputs: + - staging: + name: skalaxc-native-build + requirements: + build: + - if: cuda == "cpu" + then: + - ${{ compiler('c') }} + - ${{ compiler('cxx') }} + - ${{ compiler('fortran') }} + - if: cuda == "cuda12" + then: + - gcc_linux-64 ${{ cuda12_gcc }}.* + - gxx_linux-64 ${{ cuda12_gcc }}.* + - gfortran_linux-64 ${{ cuda12_gcc }}.* + - cuda-compiler >=12.8,<13 + - if: cuda == "cuda13" + then: + - gcc_linux-64 ${{ cuda13_gcc }}.* + - gxx_linux-64 ${{ cuda13_gcc }}.* + - gfortran_linux-64 ${{ cuda13_gcc }}.* + - cuda-compiler >=13,<14 + - cmake >=3.21,<4 + - git + - ninja + - pkg-config + host: + - python 3.12.* + - if: cuda == "cpu" + then: pytorch >=${{ torch_min }},<${{ torch_max }} cpu_* + else: pytorch-gpu >=${{ torch_min }},<${{ torch_max }} + - if: cuda == "cuda12" + then: + - cuda-cudart-dev >=12.8,<13 + - cuda-nvrtc-dev >=12.8,<13 + - cuda-version >=12.8,<13 + - libcublas-dev >=12.8,<13 + - if: cuda == "cuda13" + then: + - cuda-cudart-dev >=13,<14 + - cuda-nvrtc-dev >=13,<14 + - cuda-version >=13,<14 + - libcublas-dev >=13,<14 + - if: mpi == "openmpi" + then: openmpi + - eigen >=5,<6 + - hdf5 + - libblas + - liblapack + - nlohmann_json >=3.9 + build: + script: + file: build-native.sh + env: + SKALAXC_MPI_VARIANT: ${{ mpi }} + SKALAXC_CUDA_VARIANT: ${{ cuda }} + + - package: + name: libskalaxc + inherit: skalaxc-native-build + build: + string: ${{ mpi }}_${{ cuda }}_h${{ hash }}_${{ build_number }} + files: + - include/skalaxc/** + - lib/libskalaxc.* + - lib/cmake/SkalaXC/SkalaXCConfig.cmake + - lib/cmake/SkalaXC/SkalaXCConfigVersion.cmake + - lib/cmake/SkalaXC/SkalaXCCoreTargets*.cmake + - share/skalaxc/skala_models/*.fun + requirements: + run: + - if: cuda == "cpu" + then: pytorch >=${{ torch_min }},<${{ torch_max }} cpu_* + else: pytorch-gpu >=${{ torch_min }},<${{ torch_max }} + - if: cuda == "cuda12" + then: + - __cuda >=12 + - cuda-version >=12,<13 + - if: cuda == "cuda13" + then: + - __cuda >=13 + - cuda-version >=13,<14 + - if: mpi == "openmpi" + then: openmpi + - hdf5 + - libblas + - liblapack + tests: + - script: + - test -d "${PREFIX}/include/skalaxc" + - test -f "${PREFIX}/lib/cmake/SkalaXC/SkalaXCConfig.cmake" + - test -f "${PREFIX}/share/skalaxc/skala_models/skala-1.1.fun" + - test -f "${PREFIX}/share/skalaxc/skala_models/skala-1.1-cuda.fun" + - 'ls "${PREFIX}"/lib/libskalaxc.* >/dev/null' + + - package: + name: skalaxc-fortran + inherit: + from: skalaxc-native-build + run_exports: false + build: + string: ${{ mpi }}_${{ cuda }}_h${{ hash }}_${{ build_number }} + files: + - include/*.mod + - lib/libskalaxc_fortran.* + - lib/cmake/SkalaXC/SkalaXCFortranTargets*.cmake + requirements: + run: + - ${{ pin_subpackage('libskalaxc', exact=True) }} + tests: + - script: + - test -f "${PREFIX}/lib/cmake/SkalaXC/SkalaXCFortranTargets.cmake" + - 'ls "${PREFIX}"/include/*.mod >/dev/null' + + - package: + name: skalaxc-python + build: + string: py${{ python | replace('.', '') }}_${{ mpi }}_${{ cuda }}_h${{ hash }}_${{ build_number }} + script: + file: build-python.sh + files: + - lib/python*/site-packages/skalaxc/** + requirements: + build: + - if: cuda == "cpu" + then: ${{ compiler('cxx') }} + - if: cuda == "cuda12" + then: gxx_linux-64 ${{ cuda12_gcc }}.* + - if: cuda == "cuda13" + then: gxx_linux-64 ${{ cuda13_gcc }}.* + - cmake >=3.21,<4 + - ninja + host: + - ${{ pin_subpackage('libskalaxc', exact=True) }} + - python ${{ python }}.* + - pip + - scikit-build-core >=0.11 + - nanobind >=2.4 + - numpy >=1.23 + run: + - ${{ pin_subpackage('libskalaxc', exact=True) }} + - python ${{ python }}.* + - numpy >=1.23 + tests: + - python: + imports: + - skalaxc + pip_check: true + - script: + - OMP_NUM_THREADS=4 python -c "import skalaxc; assert skalaxc.PYTHON_LAYOUT == 'CONDA'; assert skalaxc.MODEL_DIR.is_dir()" + +about: + homepage: https://github.com/microsoft/skala + repository: https://github.com/microsoft/skala + documentation: https://microsoft.github.io/skala + license: MIT + license_file: LICENSE.txt + summary: Standalone neural-network exchange-correlation functional library diff --git a/SkalaXC/recipe/variants.yaml b/SkalaXC/recipe/variants.yaml new file mode 100644 index 00000000..acf441ac --- /dev/null +++ b/SkalaXC/recipe/variants.yaml @@ -0,0 +1,15 @@ +mpi: + - nompi + - openmpi + +cuda: + - cpu + - if: target_platform == "linux-64" + then: + - cuda12 + - cuda13 + +python: + - "3.11" + - "3.12" + - "3.13" diff --git a/tools/check_release_artifacts.py b/tools/check_release_artifacts.py index d5404a26..8aec9810 100644 --- a/tools/check_release_artifacts.py +++ b/tools/check_release_artifacts.py @@ -10,7 +10,7 @@ PACKAGES = ("skala", "microsoft-skala", "skala-cuda12x", "skala-cuda13x") -FORBIDDEN_PARTS = {"tests", "model", "gauxc", "docs", "examples", "benchmark"} +FORBIDDEN_PARTS = {"tests", "model", "docs", "examples", "benchmark"} FORBIDDEN_RUNTIME_PATHS = { PurePosixPath("skala/functional/layers.py"), PurePosixPath("skala/functional/model.py"), From a54045657c04f43f0d7662fa06954fa9e6b70dc4 Mon Sep 17 00:00:00 2001 From: jenswehner Date: Fri, 4 Sep 2026 11:36:46 +0200 Subject: [PATCH 14/33] Integrate SkalaXC into Pixi --- pixi.lock | 19877 ----------------------- pixi.toml | 179 +- tests/__init__.py | 1 + tests/skalaxc_test_utils.py | 143 + tests/test_pyscf_skalaxc_gpu_parity.py | 235 + tests/test_pyscf_skalaxc_parity.py | 219 + 6 files changed, 733 insertions(+), 19921 deletions(-) delete mode 100644 pixi.lock create mode 100644 tests/__init__.py create mode 100644 tests/skalaxc_test_utils.py create mode 100644 tests/test_pyscf_skalaxc_gpu_parity.py create mode 100644 tests/test_pyscf_skalaxc_parity.py diff --git a/pixi.lock b/pixi.lock deleted file mode 100644 index cb3664c9..00000000 --- a/pixi.lock +++ /dev/null @@ -1,19877 +0,0 @@ -version: 7 -platforms: -- name: linux-64 - virtual-packages: - - __unix=0=0 - - __linux=4.18 - - __glibc=2.28 - - __archspec=0=x86_64 -- name: linux-64-cuda12 - subdir: linux-64 - virtual-packages: - - __cuda=12 - - __unix=0=0 - - __linux=4.18 - - __glibc=2.28 - - __archspec=0=x86_64 -- name: linux-64-cuda13 - subdir: linux-64 - virtual-packages: - - __cuda=13 - - __unix=0=0 - - __linux=4.18 - - __glibc=2.28 - - __archspec=0=x86_64 -- name: linux-aarch64 - virtual-packages: - - __unix=0=0 - - __linux=4.18 - - __glibc=2.28 - - __archspec=0=aarch64 -- name: osx-arm64 - virtual-packages: - - __unix=0=0 - - __osx=13.0 - - __archspec=0=m1 -environments: - assets: - channels: - - url: https://conda.anaconda.org/conda-forge/ - packages: - linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-h8ab3286_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.14.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.28.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - cpp-integration: - channels: - - url: https://conda.anaconda.org/conda-forge/ - indexes: - - https://pypi.org/simple - packages: - linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-2.0.0-ha29393d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.3.0-h8846f6e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-2.0.0-hdab9b82_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.3.0-hc6a0c74_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.3.0-hc4b3cbe_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.3.0-hc6a0c74_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.3.0-h90d9265_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py312h0a2e395_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-9_h5875eb1_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-9_hfef963f_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.21.0-ha042cf0_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.1.0-h79bb938_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-h45c3219_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.3.1-h23af247_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-9_h5e43f62_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h2840a7c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.3.0-h54950a5_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.1.0-hdf11a46_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-h9d88235_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.8-h3206bd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py312h4c94fcb_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hecca717_244.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py312h50c33e8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb03c661_1003.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-h8ab3286_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py312h54fa4ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.14.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/e3nn-0.6.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.28.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.3.0-h2b852eb_102.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.3.0-hb2c5482_102.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opt-einsum-3.4.0-hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum_fx-0.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - pypi: ./model - - pypi: ./skala - - pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/9e/e9/1a19e42cd43cc1365e127db6aae85e1c671da1d9a5d746f4d34a50edb577/h5py-3.16.0-cp312-cp312-manylinux_2_28_x86_64.whl - linux-64-cuda12: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-2.0.0-ha29393d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.3.0-h8846f6e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-2.0.0-hdab9b82_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.3.0-hc6a0c74_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.3.0-hc4b3cbe_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.3.0-hc6a0c74_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.3.0-h90d9265_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py312h0a2e395_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-9_h5875eb1_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-9_hfef963f_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.21.0-ha042cf0_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.1.0-h79bb938_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-h45c3219_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.3.1-h23af247_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-9_h5e43f62_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h2840a7c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.3.0-h54950a5_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.1.0-hdf11a46_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-h9d88235_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.8-h3206bd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py312h4c94fcb_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hecca717_244.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py312h50c33e8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb03c661_1003.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-h8ab3286_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py312h54fa4ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.14.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/e3nn-0.6.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.28.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.3.0-h2b852eb_102.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.3.0-hb2c5482_102.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opt-einsum-3.4.0-hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum_fx-0.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - pypi: ./model - - pypi: ./skala - - pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/9e/e9/1a19e42cd43cc1365e127db6aae85e1c671da1d9a5d746f4d34a50edb577/h5py-3.16.0-cp312-cp312-manylinux_2_28_x86_64.whl - default: - channels: - - url: https://conda.anaconda.org/conda-forge/ - indexes: - - https://pypi.org/simple - packages: - linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ast-serialize-0.8.0-py310hd8a072f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-hb7a77c6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.14-h2aa3ae6_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.2-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h720e601_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.1-h6ffeea8_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-h38ae05a_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.3-h6f4d18d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.16.0-h21f4ec5_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.8-h46fcd08_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h720e601_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h720e601_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.40.1-h102d43b_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.833-hc7390e0_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.3-h206d751_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-h71f81a8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.18.0-h74b55db_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.14.0-hf596fc9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.16.0-h1f05bef_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.1.1-py312h703531f_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.15.4-py312h589e9ff_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/elfutils-0.194-h849f50c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.3.1-h54a6638_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hb7133d2_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gnutls-3.8.13-h18acefa_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py312hfaa9938_104.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_110.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py312h0a2e395_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.9-gpl_h3152399_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-25.0.0-hcc2f0d9_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-25.0.0-h635bf11_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-25.0.0-h53684a4_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-25.0.0-h635bf11_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-25.0.0-h66fbfdd_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-9_h5875eb1_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-9_hfef963f_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.21.0-ha042cf0_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.1.0-h79bb938_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-h45c3219_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.8.0-hbc29df5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.8.0-hdbdcf42_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.82.1-h792040b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.3.1-h23af247_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.8-hfac485b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-9_h5e43f62_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libmicrohttpd-1.0.10-hc2fc477_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.27.0-h3133023_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.27.0-ha770c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-25.0.0-h7376487_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h2840a7c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h60473fc_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.1.0-hdf11a46_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtasn1-4.21.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-h9d88235_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.8.3-h65a8314_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.8-h3206bd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-hee9eb32_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-hebe6cf0_1003.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py312h4c94fcb_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/memray-1.19.3-py312ha9ecdfb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hecca717_244.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-2.3.1-py312h89dfda2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.10.1-h5ef0d04_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.1-h443056b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.26.5-h586ad30_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.5-py312h8ecdadd_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py312h50c33e8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h5253ce2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb03c661_1003.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/py-spy-0.4.2-hbe0e3b8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-25.0.0-py312h7900ff3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-25.0.0-py312h2054cf2_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-h8ab3286_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-librt-0.15.0-py312h5253ce2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h94463f1_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.5-h7e3ee7f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py312h54fa4ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py312hd9148b4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.14.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.3-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/e3nn-0.6.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.28.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opt-einsum-3.4.0-hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum_fx-0.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.11.3-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.5.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/textual-8.2.8-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.7.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda - - pypi: ./benchmark - - pypi: ./model - - pypi: ./skala - - pypi: https://files.pythonhosted.org/packages/08/52/eefeba09be4ef2a1eb989eb92934561e8e502a6ee3c32654996e4be7e399/types_pyyaml-6.0.12.20260815-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2f/d4/c6a2b043e33f0dd012486dcebe0593585588d400175d22aad42049c88321/optype-0.17.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/60/c2/959caec5c46f484b5f8bb6def4b0cf7a45ba6acda26f12b75142d98cc5ae/pandas_stubs-3.0.5.260730-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/7c/5c2892e6bc0628a2ccf4e938e1e2db22794657ccb374672d66e20d73839e/numpy_typing_compat-20251206.2.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/65/6c/eea1d03e475217aea95b1d52aee09c97575d05bbc592c39c085b71dab89f/pyarrow_stubs-20.0.0.20260819-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/e1/26/d4bc2ba3427a623f79a6c10c8f427c7a55b56eb8b3eddc369319d97f741b/scipy_stubs-1.17.1.5-py3-none-any.whl - linux-aarch64: - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ast-serialize-0.8.0-py310h8c58d24_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.10.4-h03961ac_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.9.14-h6c1c863_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.14.2-he30d5cf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.3.2-hbf34bff_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.7.1-h423fd5f_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.11.0-hb2c4768_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.27.3-hc846123_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.16.0-hf64e385_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.12.8-h681413d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.2.7-hbf34bff_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.2.10-hbf34bff_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.40.1-h18900c3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.833-h1131a43_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-core-cpp-1.16.3-h412bcfc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-identity-cpp-1.13.3-hd0001b6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-blobs-cpp-12.18.0-h2e50874_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-common-cpp-12.14.0-hacd5e5f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-files-datalake-cpp-12.16.0-hde34f15_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-1.2.0-h52fc18c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-bin-1.2.0-hdc3483e_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.8-h29ee22c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-h0b6afd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-2.1.1-py312h563f9cf_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/contourpy-1.3.3-py312hf18b547_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/coverage-7.15.4-py312h2b0bcae_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fmt-12.1.0-h166da81_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.18.3-ha4b22b4_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fonttools-4.63.0-py312ha4530ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.14.3-h8af1aa0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fribidi-1.0.16-he30d5cf_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.3.1-h7ac5ae9_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glog-0.7.1-ha2f5727_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gmp-6.3.0-h4d6b352_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gmpy2-2.3.1-py312h70c4b35_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.15-h7ac5ae9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/h5py-3.16.0-nompi_py312h613db53_104.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/hdf5-1.14.6-nompi_hf95b8e7_110.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/hf-xet-1.5.2-py310h160093b_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-py311h3512406_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h5bc82ec_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/kiwisolver-1.5.0-py312h1683e8e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-h095d8e5_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.19.1-h9d5b58d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.2.0-h52b7260_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20260526.0-cxx17_hc5e897d_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libaec-1.1.5-hff7e48a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-25.0.0-hf28620a_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-25.0.0-hb326ee9_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-compute-25.0.0-hdd99842_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-25.0.0-hb326ee9_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-25.0.0-hd99807d_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-9_haddc8a3_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.2.0-h384ecca_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.2.0-h011f0d3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.2.0-hb247b97_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-9_hd72aa62_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.21.0-h86273da_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-hfa851ae_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321hc48eb74_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h80f16a2_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.1-hfae3067_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.7.0-h376a255_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-h9cc7050_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-16.1.0-he9431aa_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-16.1.0-he9431aa_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-16.1.0-h47adacf_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.88.3-had1c41b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-3.8.0-h2efc11c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-3.8.0-h66d5b86_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgrpc-1.82.1-h05b84e8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libharfbuzz-14.3.1-h8f7ccb3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h1ea5142_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.2.0-he30d5cf_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-9_h88aeb00_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.68.1-ha4b982d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.34-openmp_h1a8b088_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-1.27.0-hbe47268_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-headers-1.27.0-h8af1aa0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-25.0.0-h87079af_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.58-hf9b7768_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-7.35.1-h30ec8a2_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpsl-0.23.1-hb8431ed_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libraqm-0.11.0-hd2f8911_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2025.11.05-h149037f_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.4-h399dd60_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-h7572e3e_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-16.1.0-hdbbeba8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libthrift-0.22.0-ha522d1d_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.2-hdb009f0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtorch-2.13.0-cpu_generic_hf6f405e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.11.3-hec6f9f7_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42.2-h1022ec0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.52.1-h80f16a2_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h3f04742_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.38-h80f16a2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-16-2.15.3-h79dcc73_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.15.3-h869d058_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/llvm-openmp-22.1.8-hfdfeb53_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-hfb11796_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py312hd077ced_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-base-3.11.1-py312h0683553_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpc-1.4.0-he6dc3fb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpfr-4.2.2-h4b21e80_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-2.3.1-py312hd0d9aba_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-h2b6f883_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nlohmann_json-3.12.0-h7ac5ae9_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.6-py312hce9e0af_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/onednn-3.12-omp_h605b386_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.4-h5da879a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.3-h546c87b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/optree-0.20.0-py312h579b322_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orc-2.3.1-h1fb4f23_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-3.0.5-py312hf55c4e8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-12.3.0-py312h3b21937_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.46.4-h7ac5ae9_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/prometheus-cpp-1.3.0-h7938499_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-7.2.2-py312hd41f8a7_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-he30d5cf_1003.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-25.0.0-py312h8025657_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-core-25.0.0-py312h2cce741_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.13-ha505bbe_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-librt-0.15.0-py312hd41f8a7_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pytorch-2.13.0-cpu_generic_py312_h556be23_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py312ha4530ae_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/qhull-2020.2-h70be974_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/re2-2025.11.05-hfb2350b_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-ha7194a6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.7.5-h61cb6f2_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/scipy-1.18.0-py312ha7f05e0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sleef-3.9.0-h5bb93e2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.2-he774c54_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_hf03c496_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ukkonen-1.1.0-py312h4f740d2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/unicodedata2-17.0.1-py312hcd1a082_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libice-1.1.2-h80f16a2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libsm-1.2.6-hf23e593_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libx11-1.8.13-h63a1b12_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxext-1.3.7-h5bc82ec_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrender-0.9.12-he30d5cf_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h29ee22c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.2-hdc9db2a_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-ng-2.3.3-h1024f78_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h9d15635_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.14.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.3-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/e3nn-0.6.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.28.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/opt-einsum-3.4.0-hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum_fx-0.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.11.3-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.5.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.7.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda - - pypi: ./benchmark - - pypi: ./model - - pypi: ./skala - - pypi: https://files.pythonhosted.org/packages/08/52/eefeba09be4ef2a1eb989eb92934561e8e502a6ee3c32654996e4be7e399/types_pyyaml-6.0.12.20260815-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/0a/9b/9053d2a5a6276352b883d57192ce0bed68b1bc2415b35824ea6942c2c999/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/2f/d4/c6a2b043e33f0dd012486dcebe0593585588d400175d22aad42049c88321/optype-0.17.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/60/c2/959caec5c46f484b5f8bb6def4b0cf7a45ba6acda26f12b75142d98cc5ae/pandas_stubs-3.0.5.260730-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/7c/5c2892e6bc0628a2ccf4e938e1e2db22794657ccb374672d66e20d73839e/numpy_typing_compat-20251206.2.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/65/6c/eea1d03e475217aea95b1d52aee09c97575d05bbc592c39c085b71dab89f/pyarrow_stubs-20.0.0.20260819-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/89/f2/24c58dad0c33ab417c5a090695a6788292d5d4edceae59bad055e5377e92/pyscf-2.14.0-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/e1/26/d4bc2ba3427a623f79a6c10c8f427c7a55b56eb8b3eddc369319d97f741b/scipy_stubs-1.17.1.5-py3-none-any.whl - osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.14.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.3-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/e3nn-0.6.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.28.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/opt-einsum-3.4.0-hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum_fx-0.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.11.3-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.5.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.7.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ast-serialize-0.8.0-py310h3b8a9b8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.4-h0f08c97_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.14-hb9ed60c_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.14.2-h84a0fba_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-hf0b4b85_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.7.1-ha581b6a_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.11.0-h27f0cb5_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.27.3-ha24efe8_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.16.0-hf1a914d_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.12.8-hdc61527_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.7-hf0b4b85_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-hf0b4b85_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.40.1-h5b5d287_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.833-haa98fb3_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.3-he5ae378_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.3-h05177fb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.18.0-h409340b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.14.0-h7cba3ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.16.0-h16bb3af_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.2.0-hf00d406_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.2.0-he4a93e4_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h4e30115_10.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.8-h74c22ad_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.4-he0f2337_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.1.1-py312hc892d8b_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py312h3093aea_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.15.4-py312hada1361_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/dftd3-python-1.5.0-py312h2bbb03f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fmt-12.1.0-h99e4e11_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.18.3-h81aa574_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.63.0-py312h04c11ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.3-hce30654_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-h84a0fba_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.3.1-h784d473_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-h6f9ecc1_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-hf5e55b1_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.3.1-py312h1af6244_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.15-h784d473_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.16.0-nompi_py312h3cfd1a2_104.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.6-nompi_had3affe_110.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hf-xet-1.5.2-py310he76dbf2_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-py310h579977c_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jonquil-0.3.2-gfortran_h04795c8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.5.0-py312h3093aea_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h34f8a20_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.19.1-hdfa7624_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.2.0-h1eee2c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260526.0-cxx17_h4c27e2a_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.5-h8664d51_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-25.0.0-haaed7fe_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-25.0.0-heaff1e6_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-25.0.0-h93a2d87_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-25.0.0-heaff1e6_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-25.0.0-h2208e57_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-9_h51639a9_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-h1dcdb26_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-h5295a6a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-h2ddc9cb_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-9_hb0561ab_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.21.0-h6651222_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.8-h55c6f16_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-he7e0567_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321h26f1114_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h1a92334_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.7.0-hcf2aa1b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-h2ed5691_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-16.1.0-h3cf6597_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-16.1.0-h07b0088_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-16.1.0-h32cdfcc_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.3-ha531971_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-3.8.0-ha595bda_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-3.8.0-hc8aed40_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.82.1-hf3e839d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libharfbuzz-14.3.1-hcda0f7c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-he4c29f2_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.2.0-h84a0fba_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-9_hd9741b5_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h435687b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.34-openmp_he657e61_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.27.0-h46c1d2a_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.27.0-hce30654_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-25.0.0-h0de02aa_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-hf5e6511_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-7.35.1-h8daa630_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpsl-0.23.1-hdb0c161_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libraqm-0.11.0-h45af499_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h5d15848_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.4-hca69786_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-hbf2880b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h1fb9c8a_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.2-h282da08_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtorch-2.13.0-cpu_generic_hf893bd3_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.3-h2431656_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.52.1-h1a92334_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h202fb40_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hbffa61f_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-h5654f7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.8-hc225544_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-hdca3b7d_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py312h04c11ed_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.11.1-py312h07c8dfe_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mctc-lib-0.5.2-gfortran_h0230218_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.4.0-h169892a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.2-h72846b0_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-2.3.1-py312h9b6eb38_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-he64c551_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.12.0-h784d473_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.6-py312ha003a3f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/onednn-3.12-omp_h95bb4b2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hd9e9057_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/optree-0.20.0-py312h42f75bc_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.3.1-hef2a647_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-3.0.5-py312h6510ced_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.3.0-py312h4e908a4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h784d473_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.2.2-py312hb3ab3e3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-h84a0fba_1003.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-25.0.0-py312h1f38498_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-25.0.0-py312h7d9569a_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.13-hd1323d7_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-librt-0.15.0-py312hb3ab3e3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pytorch-2.13.0-cpu_generic_py312_ha1580ae_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py312h04c11ed_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-h5d60da5_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h8b90a29_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/s2n-1.7.5-h1b28cb6_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.18.0-py312h4519d97_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/simple-dftd3-1.5.0-gfortran_h0230218_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sleef-3.9.0-hb028509_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.2-hada39a4_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-hbeba79b_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/toml-f-0.5.2-gfortran_h04795c8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.1.0-py312h766f71e_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-17.0.1-py312h2bbb03f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h84a0fba_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-h84a0fba_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h74c22ad_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.2-h8088a28_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.3-h31dac16_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hf451053_7.conda - - pypi: ./benchmark - - pypi: ./model - - pypi: ./skala - - pypi: https://files.pythonhosted.org/packages/08/52/eefeba09be4ef2a1eb989eb92934561e8e502a6ee3c32654996e4be7e399/types_pyyaml-6.0.12.20260815-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2f/d4/c6a2b043e33f0dd012486dcebe0593585588d400175d22aad42049c88321/optype-0.17.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/48/ed/bb4aeb728505b4ce7edd55e9b2e35bcbd99ad0b0cae5c45b59e48b9ed62d/pyscf-2.14.0-py3-none-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/60/c2/959caec5c46f484b5f8bb6def4b0cf7a45ba6acda26f12b75142d98cc5ae/pandas_stubs-3.0.5.260730-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/7c/5c2892e6bc0628a2ccf4e938e1e2db22794657ccb374672d66e20d73839e/numpy_typing_compat-20251206.2.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/65/6c/eea1d03e475217aea95b1d52aee09c97575d05bbc592c39c085b71dab89f/pyarrow_stubs-20.0.0.20260819-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e1/26/d4bc2ba3427a623f79a6c10c8f427c7a55b56eb8b3eddc369319d97f741b/scipy_stubs-1.17.1.5-py3-none-any.whl - docs: - channels: - - url: https://conda.anaconda.org/conda-forge/ - indexes: - - https://pypi.org/simple - packages: - linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-hb7a77c6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.14-h2aa3ae6_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.2-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h720e601_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.1-h6ffeea8_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-h38ae05a_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.3-h6f4d18d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.16.0-h21f4ec5_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.8-h46fcd08_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h720e601_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h720e601_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.40.1-h102d43b_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.833-hc7390e0_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.3-h206d751_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-h71f81a8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.18.0-h74b55db_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.14.0-hf596fc9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.16.0-h1f05bef_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.7.0-py312h3f22e6b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312he9c40d5_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.21-py312h8285ef7_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.3.1-h54a6638_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hb7133d2_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.5.5-py312h8285ef7_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py312h0a2e395_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-25.0.0-hcc2f0d9_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-25.0.0-h635bf11_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-25.0.0-h53684a4_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-25.0.0-h635bf11_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-25.0.0-h66fbfdd_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-9_h5875eb1_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-9_hfef963f_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.21.0-ha042cf0_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.1.0-h79bb938_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-h45c3219_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.8.0-hbc29df5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.8.0-hdbdcf42_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.82.1-h792040b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.3.1-h23af247_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-9_h5e43f62_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.27.0-h3133023_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.27.0-ha770c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-25.0.0-h7376487_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h2840a7c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h60473fc_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.22-hebe6cf0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.1.0-hdf11a46_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-h9d88235_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.8-h3206bd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-hee9eb32_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py312h4c94fcb_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hecca717_244.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.1-h443056b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.5-py312h8ecdadd_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py312h50c33e8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h5253ce2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb03c661_1003.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-25.0.0-py312h7900ff3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-25.0.0-py312h2054cf2_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-h8ab3286_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h94463f1_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-2026.6.3-py312h192e038_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.5-h7e3ee7f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py312h54fa4ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.52-py312h5253ce2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.8-py312h4c3975b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h09e67af_11.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.14.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.15.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.5.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/future-1.0.0-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.28.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.3.0-pyha191276_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.16.1-pyh53cf698_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.9-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.20.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-cache-1.0.1-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.9.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.17-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/myst-nb-1.4.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/myst-parser-5.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.11.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.11.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio2-1.7.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.11.3-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.53-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybtex-0.26.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybtex-docutils-1.0.3-pyhcf101f3_4.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.20.0-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.22.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.1.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.9.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-book-theme-1.4.0-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-fortran-1.1.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-bibtex-2.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-moderncmakedomain-3.29.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-2.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.16.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.8.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.16-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda - - pypi: ./benchmark - - pypi: ./skala - - pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/9e/e9/1a19e42cd43cc1365e127db6aae85e1c671da1d9a5d746f4d34a50edb577/h5py-3.16.0-cp312-cp312-manylinux_2_28_x86_64.whl - ftorch: - channels: - - url: https://conda.anaconda.org/conda-forge/ - packages: - linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-2.0.0-ha29393d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.3.0-h8846f6e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-2.0.0-hdab9b82_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-2.0.0-h0f4f740_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.3.0-hc6a0c74_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.3.0-hc4b3cbe_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-15.3.0-hc6a0c74_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-15.3.0-h27ced10_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.3.0-hc6a0c74_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.3.0-h90d9265_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-9_h5875eb1_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-9_hfef963f_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.21.0-ha042cf0_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.1.0-h79bb938_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-9_h5e43f62_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h2840a7c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.3.0-h54950a5_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.8-h3206bd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hecca717_244.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.5.2-py312h33ff503_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-h8ab3286_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.14.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.28.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.3.0-h2b852eb_102.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.3.0-hb2c5482_102.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - linux-64-cuda12: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-2.0.0-ha29393d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.3.0-h8846f6e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-2.0.0-hdab9b82_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-2.0.0-h0f4f740_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.3.0-hc6a0c74_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.3.0-hc4b3cbe_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-15.3.0-hc6a0c74_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-15.3.0-h27ced10_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.3.0-hc6a0c74_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.3.0-h90d9265_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-9_h5875eb1_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-9_hfef963f_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.21.0-ha042cf0_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.1.0-h79bb938_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-9_h5e43f62_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h2840a7c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.3.0-h54950a5_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.8-h3206bd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hecca717_244.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.5.2-py312h33ff503_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-h8ab3286_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.14.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.28.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.3.0-h2b852eb_102.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.3.0-hb2c5482_102.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - gauxc-cuda12: - channels: - - url: https://conda.anaconda.org/conda-forge/ - packages: - linux-64-cuda12: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-h4610da3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.15-h6bbde05_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.3-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h01ee8f8_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-hbe094ff_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.5-h4f381ba_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.13.1-h7508075_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h01ee8f8_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h01ee8f8_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils-2.46.1-default_h4852527_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.46.1-default_h4852527_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-14.4.0-h611768e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-crt-tools-12.9.86-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.9.79-h5888daf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-12.9.79-h5888daf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-12.9.79-h5888daf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cuobjdump-12.9.82-hffce074_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-12.9.79-h676940d_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cuxxfilt-12.9.82-hffce074_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-12.9.86-hcdd1206_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-impl-12.9.86-h85509e4_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-tools-12.9.86-he02047a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc_linux-64-12.9.86-he0b4e1d_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvdisasm-12.9.88-hffce074_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvprune-12.9.82-hffce074_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.9.86-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-dev-12.9.86-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-12.9.79-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-12.9.86-h4bc722e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-12.9.86-h4bc722e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-1.11.0-hfcd1e18_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/exchcxx-1.0.0-cuda129_h897a41e_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gau2grid-2.0.9-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-14.4.0-hc6a0c74_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.4.0-h43a9cce_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.4.0-hc469d41_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-14.4.0-hc6a0c74_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.4.0-hc436dd5_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.4.0-he93183a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.2.0-nompi_hc529623_100.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/integratorxx-1.0.0-hb700be7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-9_h5875eb1_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-h084b8d7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-9_hfef963f_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-12.9.2.10-h676940d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-dev-12.9.2.10-h676940d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcudnn-9.10.2.21-hf7e9902_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcudss-0.8.0.10-h58dd1b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-11.4.1.4-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.14.1.1-hbc026e6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.3.10.19-h676940d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.21.0-ha042cf0_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-11.7.5.82-h676940d_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.5.10.65-hecca717_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-dev-12.5.10.65-hecca717_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.1.0-h79bb938_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-9_h5e43f62_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libmagma-2.10.0-ha7672b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libmagma-devel-2.10.0-he75a2d3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libmagma_sparse-2.10.0-ha954185_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.9.86-hecca717_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvptxcompiler-dev-12.9.86-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h2840a7c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.4.0-hf39dbba_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cuda129_mkl_h546cc0b_302.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxc-c-7.1.2-cpu_h75f4f88_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.8-h3206bd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hecca717_244.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nccl-2.30.7.1-h4d09622_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.5.2-py312h33ff503_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-h8ab3286_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cuda129_mkl_py312_h0509a7e_302.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-gpu-2.13.0-cuda129_mkl_h0d04637_302.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-63.0-h192683f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.6-h7e3ee7f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/triton-3.7.1-cuda129py312h811769c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-12.9.27-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-compiler-12.9.2-hbad6d8a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-12.9.86-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-12.9.79-h3f2d84a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-12.9.79-h3f2d84a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.9.79-h3f2d84a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-driver-dev_linux-64-12.9.79-h3f2d84a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvcc-dev_linux-64-12.9.86-he91c749_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-12.9.86-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.4.0-hd9a9cd0_102.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_linux-64-12.9.86-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.4.0-ha5b54cb_102.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - gauxc-mpi: - channels: - - url: https://conda.anaconda.org/conda-forge/ - packages: - linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-h4610da3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.15-h6bbde05_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.3-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h01ee8f8_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-hbe094ff_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.5-h4f381ba_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.13.1-h7508075_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h01ee8f8_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h01ee8f8_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-2.0.0-ha29393d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.3.0-h8846f6e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-2.0.0-hdab9b82_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/exchcxx-1.0.0-cpu_h2ebb00f_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gau2grid-2.0.9-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.3.0-hc6a0c74_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.3.0-hc4b3cbe_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.3.0-hc6a0c74_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.3.0-h90d9265_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.2.0-mpi_openmpi_ha740f27_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/integratorxx-1.0.0-hb700be7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-9_h5875eb1_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-h084b8d7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-9_hfef963f_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.21.0-ha042cf0_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfabric-2.6.0-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfabric1-2.6.0-h6b3ec72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.1.0-h79bb938_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-9_h5e43f62_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpmix-5.0.8-h31fc519_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h2840a7c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.3.0-h54950a5_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxc-c-7.1.2-cpu_h75f4f88_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.8-h3206bd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hecca717_244.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.5.2-py312h33ff503_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openmpi-5.0.10-h67ed482_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-h8ab3286_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-63.0-h192683f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.6-h7e3ee7f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ucc-1.8.0-hcedbda0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ucx-1.20.1-hbe80e26_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.3.0-h2b852eb_102.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.3.0-hb2c5482_102.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpi-1.0.1-openmpi.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - linux-64-cuda12: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-h4610da3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.15-h6bbde05_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.3-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h01ee8f8_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-hbe094ff_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.5-h4f381ba_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.13.1-h7508075_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h01ee8f8_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h01ee8f8_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-2.0.0-ha29393d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.3.0-h8846f6e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-2.0.0-hdab9b82_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/exchcxx-1.0.0-cpu_h2ebb00f_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gau2grid-2.0.9-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.3.0-hc6a0c74_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.3.0-hc4b3cbe_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.3.0-hc6a0c74_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.3.0-h90d9265_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.2.0-mpi_openmpi_ha740f27_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/integratorxx-1.0.0-hb700be7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-9_h5875eb1_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-h084b8d7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-9_hfef963f_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.21.0-ha042cf0_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfabric-2.6.0-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfabric1-2.6.0-h6b3ec72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.1.0-h79bb938_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-9_h5e43f62_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpmix-5.0.8-h31fc519_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h2840a7c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.3.0-h54950a5_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxc-c-7.1.2-cpu_h75f4f88_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.8-h3206bd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hecca717_244.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.5.2-py312h33ff503_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openmpi-5.0.10-h67ed482_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-h8ab3286_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-63.0-h192683f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.6-h7e3ee7f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ucc-1.8.0-hcedbda0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ucx-1.20.1-hbe80e26_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.3.0-h2b852eb_102.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.3.0-hb2c5482_102.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpi-1.0.1-openmpi.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - gauxc-mpi-fortran: - channels: - - url: https://conda.anaconda.org/conda-forge/ - packages: - linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-h4610da3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.15-h6bbde05_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.3-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h01ee8f8_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-hbe094ff_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.5-h4f381ba_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.13.1-h7508075_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h01ee8f8_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h01ee8f8_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-2.0.0-ha29393d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.3.0-h8846f6e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-2.0.0-hdab9b82_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/exchcxx-1.0.0-cpu_h2ebb00f_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-2.0.0-h0f4f740_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gau2grid-2.0.9-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.3.0-hc6a0c74_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.3.0-hc4b3cbe_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-15.3.0-hc6a0c74_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-15.3.0-h27ced10_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.3.0-hc6a0c74_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.3.0-h90d9265_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.2.0-mpi_openmpi_ha740f27_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/integratorxx-1.0.0-hb700be7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-9_h5875eb1_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-h084b8d7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-9_hfef963f_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.21.0-ha042cf0_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfabric-2.6.0-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfabric1-2.6.0-h6b3ec72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.1.0-h79bb938_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-9_h5e43f62_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpmix-5.0.8-h31fc519_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h2840a7c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.3.0-h54950a5_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxc-c-7.1.2-cpu_h75f4f88_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.8-h3206bd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hecca717_244.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.5.2-py312h33ff503_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openmpi-5.0.10-h67ed482_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-h8ab3286_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-63.0-h192683f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.6-h7e3ee7f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ucc-1.8.0-hcedbda0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ucx-1.20.1-hbe80e26_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.3.0-h2b852eb_102.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.3.0-hb2c5482_102.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpi-1.0.1-openmpi.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - linux-64-cuda12: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-h4610da3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.15-h6bbde05_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.3-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h01ee8f8_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-hbe094ff_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.5-h4f381ba_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.13.1-h7508075_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h01ee8f8_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h01ee8f8_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-2.0.0-ha29393d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.3.0-h8846f6e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-2.0.0-hdab9b82_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/exchcxx-1.0.0-cpu_h2ebb00f_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-2.0.0-h0f4f740_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gau2grid-2.0.9-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.3.0-hc6a0c74_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.3.0-hc4b3cbe_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-15.3.0-hc6a0c74_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-15.3.0-h27ced10_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.3.0-hc6a0c74_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.3.0-h90d9265_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.2.0-mpi_openmpi_ha740f27_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/integratorxx-1.0.0-hb700be7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-9_h5875eb1_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-h084b8d7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-9_hfef963f_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.21.0-ha042cf0_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfabric-2.6.0-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfabric1-2.6.0-h6b3ec72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.1.0-h79bb938_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-9_h5e43f62_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpmix-5.0.8-h31fc519_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h2840a7c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.3.0-h54950a5_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxc-c-7.1.2-cpu_h75f4f88_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.8-h3206bd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hecca717_244.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.5.2-py312h33ff503_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openmpi-5.0.10-h67ed482_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-h8ab3286_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-63.0-h192683f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.6-h7e3ee7f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ucc-1.8.0-hcedbda0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ucx-1.20.1-hbe80e26_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.3.0-h2b852eb_102.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.3.0-hb2c5482_102.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpi-1.0.1-openmpi.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - gauxc-openmp: - channels: - - url: https://conda.anaconda.org/conda-forge/ - packages: - linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-h4610da3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.15-h6bbde05_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.3-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h01ee8f8_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-hbe094ff_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.5-h4f381ba_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.13.1-h7508075_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h01ee8f8_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h01ee8f8_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-2.0.0-ha29393d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.3.0-h8846f6e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-2.0.0-hdab9b82_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/exchcxx-1.0.0-cpu_h2ebb00f_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gau2grid-2.0.9-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.3.0-hc6a0c74_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.3.0-hc4b3cbe_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.3.0-hc6a0c74_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.3.0-h90d9265_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.2.0-nompi_hc529623_100.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/integratorxx-1.0.0-hb700be7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-9_h5875eb1_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-9_hfef963f_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.21.0-ha042cf0_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.1.0-h79bb938_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-9_h5e43f62_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h2840a7c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.3.0-h54950a5_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxc-c-7.1.2-cpu_h75f4f88_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.8-h3206bd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hecca717_244.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.5.2-py312h33ff503_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-h8ab3286_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.6-h7e3ee7f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.3.0-h2b852eb_102.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.3.0-hb2c5482_102.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - linux-64-cuda12: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-h4610da3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.15-h6bbde05_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.3-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h01ee8f8_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-hbe094ff_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.5-h4f381ba_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.13.1-h7508075_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h01ee8f8_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h01ee8f8_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-2.0.0-ha29393d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.3.0-h8846f6e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-2.0.0-hdab9b82_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/exchcxx-1.0.0-cpu_h2ebb00f_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gau2grid-2.0.9-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.3.0-hc6a0c74_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.3.0-hc4b3cbe_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.3.0-hc6a0c74_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.3.0-h90d9265_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.2.0-nompi_hc529623_100.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/integratorxx-1.0.0-hb700be7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-9_h5875eb1_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-9_hfef963f_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.21.0-ha042cf0_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.1.0-h79bb938_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-9_h5e43f62_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h2840a7c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.3.0-h54950a5_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxc-c-7.1.2-cpu_h75f4f88_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.8-h3206bd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hecca717_244.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.5.2-py312h33ff503_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-h8ab3286_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.6-h7e3ee7f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.3.0-h2b852eb_102.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.3.0-hb2c5482_102.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - gauxc-openmp-fortran: - channels: - - url: https://conda.anaconda.org/conda-forge/ - packages: - linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-h4610da3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.15-h6bbde05_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.3-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h01ee8f8_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-hbe094ff_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.5-h4f381ba_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.13.1-h7508075_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h01ee8f8_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h01ee8f8_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-2.0.0-ha29393d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.3.0-h8846f6e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-2.0.0-hdab9b82_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/exchcxx-1.0.0-cpu_h2ebb00f_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-2.0.0-h0f4f740_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gau2grid-2.0.9-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.3.0-hc6a0c74_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.3.0-hc4b3cbe_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-15.3.0-hc6a0c74_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-15.3.0-h27ced10_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.3.0-hc6a0c74_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.3.0-h90d9265_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.2.0-nompi_hc529623_100.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/integratorxx-1.0.0-hb700be7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-9_h5875eb1_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-9_hfef963f_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.21.0-ha042cf0_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.1.0-h79bb938_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-9_h5e43f62_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h2840a7c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.3.0-h54950a5_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxc-c-7.1.2-cpu_h75f4f88_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.8-h3206bd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hecca717_244.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.5.2-py312h33ff503_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-h8ab3286_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.6-h7e3ee7f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.3.0-h2b852eb_102.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.3.0-hb2c5482_102.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - linux-64-cuda12: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-h4610da3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.15-h6bbde05_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.3-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h01ee8f8_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-hbe094ff_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.5-h4f381ba_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.13.1-h7508075_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h01ee8f8_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h01ee8f8_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-2.0.0-ha29393d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.3.0-h8846f6e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-2.0.0-hdab9b82_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/exchcxx-1.0.0-cpu_h2ebb00f_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-2.0.0-h0f4f740_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gau2grid-2.0.9-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.3.0-hc6a0c74_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.3.0-hc4b3cbe_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-15.3.0-hc6a0c74_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-15.3.0-h27ced10_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.3.0-hc6a0c74_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.3.0-h90d9265_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.2.0-nompi_hc529623_100.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/integratorxx-1.0.0-hb700be7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-9_h5875eb1_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-9_hfef963f_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.21.0-ha042cf0_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.1.0-h79bb938_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-9_h5e43f62_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h2840a7c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.3.0-h54950a5_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxc-c-7.1.2-cpu_h75f4f88_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.8-h3206bd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hecca717_244.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.5.2-py312h33ff503_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-h8ab3286_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.6-h7e3ee7f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.3.0-h2b852eb_102.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.3.0-hb2c5482_102.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - gpu-cuda12-torch212: - channels: - - url: https://conda.anaconda.org/conda-forge/ - indexes: - - https://pypi.org/simple - packages: - linux-64-cuda12: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-hb7a77c6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.14-h2aa3ae6_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.2-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h720e601_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.1-h6ffeea8_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-h38ae05a_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.3-h6f4d18d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.16.0-h21f4ec5_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.8-h46fcd08_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h720e601_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h720e601_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.40.1-h102d43b_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.833-hc7390e0_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.3-h206d751_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-h71f81a8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.18.0-h74b55db_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.14.0-hf596fc9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.16.0-h1f05bef_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.15.4-py312h589e9ff_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-crt-tools-12.9.86-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.9.79-h5888daf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-12.9.79-h5888daf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-12.9.79-h5888daf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cuobjdump-12.9.82-hffce074_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-12.9.79-h676940d_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-tools-12.9.86-he02047a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvdisasm-12.9.88-hffce074_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.9.86-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-12.9.79-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-12.9.86-h4bc722e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cutensor-2.7.0.5-h2d75abc_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.3.1-h54a6638_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hb7133d2_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py312h0a2e395_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-25.0.0-hcc2f0d9_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-25.0.0-h635bf11_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-25.0.0-h53684a4_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-25.0.0-h635bf11_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-25.0.0-h66fbfdd_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-9_h5875eb1_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-h084b8d7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-9_hfef963f_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-12.9.2.10-h676940d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcudnn-9.10.2.21-hf7e9902_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcudss-0.8.0.10-h58dd1b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-11.4.1.4-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.14.1.1-hbc026e6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.3.10.19-h676940d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.21.0-ha042cf0_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-11.7.5.82-h676940d_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.5.10.65-hecca717_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.1.0-h79bb938_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-h45c3219_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.8.0-hbc29df5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.8.0-hdbdcf42_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.82.1-h792040b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.3.1-h23af247_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-9_h5e43f62_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libmagma-2.10.0-ha7672b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.9.86-hecca717_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.27.0-h3133023_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.27.0-ha770c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-25.0.0-h7376487_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h2840a7c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h60473fc_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.1.0-hdf11a46_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-h9d88235_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.12.1-cuda129_mkl_h6b8258c_300.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.8-h3206bd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-hee9eb32_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py312h4c94fcb_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hecca717_244.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nccl-2.30.7.1-h4d09622_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.1-h443056b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.5-py312h8ecdadd_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py312h50c33e8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb03c661_1003.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-25.0.0-py312h7900ff3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-25.0.0-py312h2054cf2_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-h8ab3286_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.12.1-cuda129_mkl_py312_h51dba9f_300.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-gpu-2.12.1-cuda129_mkl_h0d04637_300.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-63.0-h192683f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h94463f1_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.5-h7e3ee7f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py312h54fa4ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/triton-3.7.1-cuda129py312h811769c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.14.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-12.9.27-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-12.9.79-h3f2d84a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-12.9.79-h3f2d84a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.9.79-h3f2d84a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/e3nn-0.6.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.28.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opt-einsum-3.4.0-hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum_fx-0.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - pypi: ./benchmark - - pypi: ./model - - pypi: ./skala - - pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/4d/57/f53eb30c38aa4eeabddc3bddf283f4c10616de65d95fcd1f43900721f425/geometric-1.1.1.tar.gz - - pypi: https://files.pythonhosted.org/packages/63/b5/ff337f8db80e67c464846a7d10f7f6bc1039c40a2c8b57ecb90d6b0c11d9/gpu4pyscf_libxc_cuda12x-0.8.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/7c/5b/65124de2dbaf2e85109f611a41947e39acd6dd938751c04b4c4d7bf6fc82/cupy_cuda12x-14.2.0-cp312-cp312-manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/99/a7/6ed6f987f79d6442e553841ddd45439aa90a3992d8e009ccd47e46901814/gpu4pyscf_cuda12x-1.8.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/9e/e9/1a19e42cd43cc1365e127db6aae85e1c671da1d9a5d746f4d34a50edb577/h5py-3.16.0-cp312-cp312-manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/e3/1e/2942a0d6d52240d439f44384a40c65d359d9ca70325b65b265c020113121/cuda_pathfinder-1.6.1-py3-none-any.whl - gpu-cuda12-torch213: - channels: - - url: https://conda.anaconda.org/conda-forge/ - indexes: - - https://pypi.org/simple - packages: - linux-64-cuda12: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-hb7a77c6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.14-h2aa3ae6_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.2-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h720e601_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.1-h6ffeea8_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-h38ae05a_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.3-h6f4d18d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.16.0-h21f4ec5_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.8-h46fcd08_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h720e601_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h720e601_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.40.1-h102d43b_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.833-hc7390e0_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.3-h206d751_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-h71f81a8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.18.0-h74b55db_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.14.0-hf596fc9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.16.0-h1f05bef_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.15.4-py312h589e9ff_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-crt-tools-12.9.86-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.9.79-h5888daf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-12.9.79-h5888daf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-12.9.79-h5888daf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cuobjdump-12.9.82-hffce074_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-12.9.79-h676940d_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-tools-12.9.86-he02047a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvdisasm-12.9.88-hffce074_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.9.86-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-12.9.79-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-12.9.86-h4bc722e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cutensor-2.7.0.5-h2d75abc_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.3.1-h54a6638_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hb7133d2_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py312h0a2e395_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-25.0.0-hcc2f0d9_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-25.0.0-h635bf11_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-25.0.0-h53684a4_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-25.0.0-h635bf11_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-25.0.0-h66fbfdd_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-9_h5875eb1_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-h084b8d7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-9_hfef963f_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-12.9.2.10-h676940d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcudnn-9.10.2.21-hf7e9902_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcudss-0.8.0.10-h58dd1b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-11.4.1.4-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.14.1.1-hbc026e6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.3.10.19-h676940d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.21.0-ha042cf0_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-11.7.5.82-h676940d_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.5.10.65-hecca717_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.1.0-h79bb938_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-h45c3219_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.8.0-hbc29df5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.8.0-hdbdcf42_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.82.1-h792040b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.3.1-h23af247_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-9_h5e43f62_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libmagma-2.10.0-ha7672b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.9.86-hecca717_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.27.0-h3133023_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.27.0-ha770c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-25.0.0-h7376487_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h2840a7c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h60473fc_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.1.0-hdf11a46_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-h9d88235_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cuda129_mkl_h546cc0b_302.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.8-h3206bd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-hee9eb32_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py312h4c94fcb_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hecca717_244.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nccl-2.30.7.1-h4d09622_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.1-h443056b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.5-py312h8ecdadd_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py312h50c33e8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb03c661_1003.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-25.0.0-py312h7900ff3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-25.0.0-py312h2054cf2_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-h8ab3286_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cuda129_mkl_py312_h0509a7e_302.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-gpu-2.13.0-cuda129_mkl_h0d04637_302.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-63.0-h192683f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h94463f1_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.5-h7e3ee7f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py312h54fa4ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/triton-3.7.1-cuda129py312h811769c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.14.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-12.9.27-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-12.9.79-h3f2d84a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-12.9.79-h3f2d84a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.9.79-h3f2d84a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/e3nn-0.6.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.28.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opt-einsum-3.4.0-hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum_fx-0.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - pypi: ./benchmark - - pypi: ./model - - pypi: ./skala - - pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/4d/57/f53eb30c38aa4eeabddc3bddf283f4c10616de65d95fcd1f43900721f425/geometric-1.1.1.tar.gz - - pypi: https://files.pythonhosted.org/packages/63/b5/ff337f8db80e67c464846a7d10f7f6bc1039c40a2c8b57ecb90d6b0c11d9/gpu4pyscf_libxc_cuda12x-0.8.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/7c/5b/65124de2dbaf2e85109f611a41947e39acd6dd938751c04b4c4d7bf6fc82/cupy_cuda12x-14.2.0-cp312-cp312-manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/99/a7/6ed6f987f79d6442e553841ddd45439aa90a3992d8e009ccd47e46901814/gpu4pyscf_cuda12x-1.8.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/9e/e9/1a19e42cd43cc1365e127db6aae85e1c671da1d9a5d746f4d34a50edb577/h5py-3.16.0-cp312-cp312-manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/e3/1e/2942a0d6d52240d439f44384a40c65d359d9ca70325b65b265c020113121/cuda_pathfinder-1.6.1-py3-none-any.whl - gpu-cuda13-torch213: - channels: - - url: https://conda.anaconda.org/conda-forge/ - indexes: - - https://pypi.org/simple - packages: - linux-64-cuda13: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-hb7a77c6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.14-h2aa3ae6_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.2-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h720e601_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.1-h6ffeea8_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-h38ae05a_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.3-h6f4d18d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.16.0-h21f4ec5_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.8-h46fcd08_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h720e601_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h720e601_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.40.1-h102d43b_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.833-hc7390e0_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.3-h206d751_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-h71f81a8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.18.0-h74b55db_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.14.0-hf596fc9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.16.0-h1f05bef_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.15.4-py312h589e9ff_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-crt-tools-13.3.73-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-13.3.29-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-13.3.29-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-13.3.29-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cuobjdump-13.3.73-hffce074_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-13.3.75-h676940d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-tools-13.3.73-he02047a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvdisasm-13.3.73-hffce074_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-13.3.33-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-13.3.29-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-13.3.73-h4bc722e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cutensor-2.7.0.5-h15eaa2f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.3.1-h54a6638_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hb7133d2_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py312h0a2e395_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-25.0.0-hcc2f0d9_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-25.0.0-h635bf11_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-25.0.0-h53684a4_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-25.0.0-h635bf11_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-25.0.0-h66fbfdd_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-9_h5875eb1_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-h084b8d7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-9_hfef963f_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-13.6.0.2-h676940d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcudnn-9.25.0.15-ha4b6413_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcudss-0.8.0.10-h7bcfba5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-12.3.0.29-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.18.1.6-h053a66a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.4.3.29-h676940d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.21.0-ha042cf0_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-12.2.6.9-h676940d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.8.2.51-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.1.0-h79bb938_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-h45c3219_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.8.0-hbc29df5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.8.0-hdbdcf42_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.82.1-h792040b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.3.1-h23af247_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-9_h5e43f62_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libmagma-2.10.0-hd93470c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-13.3.33-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.27.0-h3133023_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.27.0-ha770c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-25.0.0-h7376487_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h2840a7c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h60473fc_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.1.0-hdf11a46_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-h9d88235_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cuda130_mkl_h1ca3d63_302.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.8-h3206bd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-hee9eb32_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py312h4c94fcb_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hecca717_244.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nccl-2.30.7.1-h1aa9b5a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.1-h443056b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.5-py312h8ecdadd_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py312h50c33e8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb03c661_1003.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-25.0.0-py312h7900ff3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-25.0.0-py312h2054cf2_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-h8ab3286_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cuda130_mkl_py312_hcdc9d04_302.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-gpu-2.13.0-cuda129_mkl_h0d04637_302.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-63.0-h192683f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h94463f1_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.5-h7e3ee7f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py312h54fa4ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/triton-3.7.1-cuda130py312hc6dca4b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.14.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-13.3.3.4.1-ha770c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-13.3.29-h376f20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-13.3.29-h376f20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-13.3.29-h376f20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/e3nn-0.6.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.28.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opt-einsum-3.4.0-hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum_fx-0.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - pypi: ./benchmark - - pypi: ./model - - pypi: ./skala - - pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/4d/57/f53eb30c38aa4eeabddc3bddf283f4c10616de65d95fcd1f43900721f425/geometric-1.1.1.tar.gz - - pypi: https://files.pythonhosted.org/packages/5a/3e/d7ead2933f8434f264ac8e092c7f3793f982450e4ffa6a6c82fc60014508/gpu4pyscf_cuda13x-1.8.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/7e/bf/c4c25e97552320451afdcd459d4b6e0b715459594e998b23051c06db64c3/cupy_cuda13x-14.2.0-cp312-cp312-manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/81/1d/4fcbbf1ad89454d67ef227af32fe07a86a2bdc746c4cf245e105e227e64a/gpu4pyscf_libxc_cuda13x-0.8.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/9e/e9/1a19e42cd43cc1365e127db6aae85e1c671da1d9a5d746f4d34a50edb577/h5py-3.16.0-cp312-cp312-manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/e3/1e/2942a0d6d52240d439f44384a40c65d359d9ca70325b65b265c020113121/cuda_pathfinder-1.6.1-py3-none-any.whl - lint: - channels: - - url: https://conda.anaconda.org/conda-forge/ - indexes: - - https://pypi.org/simple - packages: - linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ast-serialize-0.8.0-py310hd8a072f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-hb7a77c6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.14-h2aa3ae6_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.2-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h720e601_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.1-h6ffeea8_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-h38ae05a_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.3-h6f4d18d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.16.0-h21f4ec5_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.8-h46fcd08_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h720e601_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h720e601_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.40.1-h102d43b_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.833-hc7390e0_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.3-h206d751_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-h71f81a8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.18.0-h74b55db_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.14.0-hf596fc9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.16.0-h1f05bef_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.1.1-py312h703531f_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.15.4-py312h589e9ff_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/elfutils-0.194-h849f50c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.3.1-h54a6638_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hb7133d2_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gnutls-3.8.13-h18acefa_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py312hfaa9938_104.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_110.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py312h0a2e395_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.9-gpl_h3152399_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-25.0.0-hcc2f0d9_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-25.0.0-h635bf11_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-25.0.0-h53684a4_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-25.0.0-h635bf11_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-25.0.0-h66fbfdd_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-9_h5875eb1_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-9_hfef963f_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.21.0-ha042cf0_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.1.0-h79bb938_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-h45c3219_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.8.0-hbc29df5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.8.0-hdbdcf42_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.82.1-h792040b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.3.1-h23af247_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.8-hfac485b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-9_h5e43f62_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libmicrohttpd-1.0.10-hc2fc477_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.27.0-h3133023_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.27.0-ha770c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-25.0.0-h7376487_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h2840a7c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h60473fc_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.1.0-hdf11a46_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtasn1-4.21.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-h9d88235_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.8.3-h65a8314_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.8-h3206bd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-hee9eb32_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-hebe6cf0_1003.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py312h4c94fcb_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/memray-1.19.3-py312ha9ecdfb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hecca717_244.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-2.3.1-py312h89dfda2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.10.1-h5ef0d04_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.1-h443056b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.26.5-h586ad30_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.5-py312h8ecdadd_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py312h50c33e8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h5253ce2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb03c661_1003.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/py-spy-0.4.2-hbe0e3b8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-25.0.0-py312h7900ff3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-25.0.0-py312h2054cf2_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-h8ab3286_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-librt-0.15.0-py312h5253ce2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h94463f1_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.5-h7e3ee7f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py312h54fa4ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py312hd9148b4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.14.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.3-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/e3nn-0.6.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.28.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opt-einsum-3.4.0-hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum_fx-0.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.11.3-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.5.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/textual-8.2.8-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.7.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda - - pypi: ./benchmark - - pypi: ./model - - pypi: ./skala - - pypi: https://files.pythonhosted.org/packages/08/52/eefeba09be4ef2a1eb989eb92934561e8e502a6ee3c32654996e4be7e399/types_pyyaml-6.0.12.20260815-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2f/d4/c6a2b043e33f0dd012486dcebe0593585588d400175d22aad42049c88321/optype-0.17.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/60/c2/959caec5c46f484b5f8bb6def4b0cf7a45ba6acda26f12b75142d98cc5ae/pandas_stubs-3.0.5.260730-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/7c/5c2892e6bc0628a2ccf4e938e1e2db22794657ccb374672d66e20d73839e/numpy_typing_compat-20251206.2.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/65/6c/eea1d03e475217aea95b1d52aee09c97575d05bbc592c39c085b71dab89f/pyarrow_stubs-20.0.0.20260819-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/e1/26/d4bc2ba3427a623f79a6c10c8f427c7a55b56eb8b3eddc369319d97f741b/scipy_stubs-1.17.1.5-py3-none-any.whl - release: - channels: - - url: https://conda.anaconda.org/conda-forge/ - packages: - linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-h8ab3286_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.5.0-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda - test-py311-pyscf214-torch213: - channels: - - url: https://conda.anaconda.org/conda-forge/ - indexes: - - https://pypi.org/simple - packages: - linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py311h724c32c_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.15.4-py311hc6a3e95_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py311h3778330_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py311hbc40be8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py311h724c32c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-9_h5875eb1_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-9_hfef963f_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.1.0-h79bb938_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-h45c3219_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.3.1-h23af247_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-9_h5e43f62_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h2840a7c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.1.0-hdf11a46_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-h9d88235_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.8-h3206bd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py311h3778330_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py311he401cf6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hecca717_244.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py311h2e04523_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py311h5f908af_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py311hf88fc01_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb03c661_1003.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.15-h8ab3286_2_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py311_h249fa5d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py311h3778330_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py311hbe70eeb_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py311h49ec1c0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.14.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.11.15-py311hd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.28.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.11.15-hd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - pypi: ./skala - - pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/52/a0/c1f604538ff6db22a0690be2dc44ab59178e115f63c917794e529356ab23/h5py-3.16.0-cp311-cp311-manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - test-py312-pyscf214-torch212: - channels: - - url: https://conda.anaconda.org/conda-forge/ - indexes: - - https://pypi.org/simple - packages: - linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-hb7a77c6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.14-h2aa3ae6_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.2-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h720e601_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.1-h6ffeea8_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-h38ae05a_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.3-h6f4d18d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.16.0-h21f4ec5_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.8-h46fcd08_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h720e601_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h720e601_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.40.1-h102d43b_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.833-hc7390e0_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.3-h206d751_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-h71f81a8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.18.0-h74b55db_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.14.0-hf596fc9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.16.0-h1f05bef_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.15.4-py312h589e9ff_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/elfutils-0.194-h849f50c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.3.1-h54a6638_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hb7133d2_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gnutls-3.8.13-h18acefa_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py312h0a2e395_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.9-gpl_h3152399_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-25.0.0-hcc2f0d9_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-25.0.0-h635bf11_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-25.0.0-h53684a4_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-25.0.0-h635bf11_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-25.0.0-h66fbfdd_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-9_h5875eb1_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-9_hfef963f_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.21.0-ha042cf0_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.1.0-h79bb938_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-h45c3219_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.8.0-hbc29df5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.8.0-hdbdcf42_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.82.1-h792040b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.3.1-h23af247_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.8-hfac485b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-9_h5e43f62_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libmicrohttpd-1.0.10-hc2fc477_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.27.0-h3133023_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.27.0-ha770c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-25.0.0-h7376487_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h2840a7c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h60473fc_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.1.0-hdf11a46_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtasn1-4.21.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-h9d88235_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.12.1-cpu_mkl_h4f7e408_100.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.8.3-h65a8314_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.8-h3206bd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-hee9eb32_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-hebe6cf0_1003.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py312h4c94fcb_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/memray-1.19.3-py312ha9ecdfb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hecca717_244.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.10.1-h5ef0d04_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.1-h443056b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.26.5-h586ad30_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.5-py312h8ecdadd_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py312h50c33e8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb03c661_1003.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/py-spy-0.4.2-hbe0e3b8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-25.0.0-py312h7900ff3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-25.0.0-py312h2054cf2_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-h8ab3286_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.12.1-cpu_mkl_py312_h38523ed_100.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h94463f1_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.5-h7e3ee7f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py312h54fa4ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.14.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.28.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.11.3-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/textual-8.2.8-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda - - pypi: ./benchmark - - pypi: ./skala - - pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/9e/e9/1a19e42cd43cc1365e127db6aae85e1c671da1d9a5d746f4d34a50edb577/h5py-3.16.0-cp312-cp312-manylinux_2_28_x86_64.whl - linux-aarch64: - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.10.4-h03961ac_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.9.14-h6c1c863_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.14.2-he30d5cf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.3.2-hbf34bff_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.7.1-h423fd5f_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.11.0-hb2c4768_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.27.3-hc846123_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.16.0-hf64e385_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.12.8-h681413d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.2.7-hbf34bff_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.2.10-hbf34bff_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.40.1-h18900c3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.833-h1131a43_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-core-cpp-1.16.3-h412bcfc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-identity-cpp-1.13.3-hd0001b6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-blobs-cpp-12.18.0-h2e50874_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-common-cpp-12.14.0-hacd5e5f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-files-datalake-cpp-12.16.0-hde34f15_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-1.2.0-h52fc18c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-bin-1.2.0-hdc3483e_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.8-h29ee22c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-h0b6afd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/contourpy-1.3.3-py312hf18b547_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/coverage-7.15.4-py312h2b0bcae_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fmt-12.1.0-h166da81_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.18.3-ha4b22b4_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fonttools-4.63.0-py312ha4530ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.14.3-h8af1aa0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fribidi-1.0.16-he30d5cf_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.3.1-h7ac5ae9_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glog-0.7.1-ha2f5727_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gmp-6.3.0-h4d6b352_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gmpy2-2.3.1-py312h70c4b35_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.15-h7ac5ae9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/hf-xet-1.5.2-py310h160093b_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-py311h3512406_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h5bc82ec_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/kiwisolver-1.5.0-py312h1683e8e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-h095d8e5_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.19.1-h9d5b58d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.2.0-h52b7260_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20260526.0-cxx17_hc5e897d_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-25.0.0-hf28620a_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-25.0.0-hb326ee9_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-compute-25.0.0-hdd99842_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-25.0.0-hb326ee9_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-25.0.0-hd99807d_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-9_haddc8a3_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.2.0-h384ecca_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.2.0-h011f0d3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.2.0-hb247b97_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-9_hd72aa62_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.21.0-h86273da_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-hfa851ae_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321hc48eb74_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h80f16a2_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.1-hfae3067_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.7.0-h376a255_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-h9cc7050_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-16.1.0-he9431aa_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-16.1.0-he9431aa_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-16.1.0-h47adacf_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.88.3-had1c41b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-3.8.0-h2efc11c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-3.8.0-h66d5b86_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgrpc-1.82.1-h05b84e8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libharfbuzz-14.3.1-h8f7ccb3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h1ea5142_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.2.0-he30d5cf_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-9_h88aeb00_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.68.1-ha4b982d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.34-openmp_h1a8b088_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-1.27.0-hbe47268_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-headers-1.27.0-h8af1aa0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-25.0.0-h87079af_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.58-hf9b7768_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-7.35.1-h30ec8a2_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpsl-0.23.1-hb8431ed_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libraqm-0.11.0-hd2f8911_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2025.11.05-h149037f_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.4-h399dd60_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-h7572e3e_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-16.1.0-hdbbeba8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libthrift-0.22.0-ha522d1d_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.2-hdb009f0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtorch-2.12.1-cpu_generic_hb12a5ee_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.11.3-hec6f9f7_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42.2-h1022ec0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.52.1-h80f16a2_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h3f04742_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.38-h80f16a2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-16-2.15.3-h79dcc73_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.15.3-h869d058_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/llvm-openmp-22.1.8-hfdfeb53_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-hfb11796_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py312hd077ced_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-base-3.11.1-py312h0683553_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpc-1.4.0-he6dc3fb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpfr-4.2.2-h4b21e80_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-h2b6f883_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nlohmann_json-3.12.0-h7ac5ae9_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.6-py312hce9e0af_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/onednn-3.12-omp_h605b386_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.4-h5da879a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.3-h546c87b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/optree-0.20.0-py312h579b322_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orc-2.3.1-h1fb4f23_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-3.0.5-py312hf55c4e8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-he574923_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-12.3.0-py312h3b21937_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.46.4-h7ac5ae9_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/prometheus-cpp-1.3.0-h7938499_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-he30d5cf_1003.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-25.0.0-py312h8025657_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-core-25.0.0-py312h2cce741_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.13-ha505bbe_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pytorch-2.12.1-cpu_generic_py312_h9dd5f13_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py312ha4530ae_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/qhull-2020.2-h70be974_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/re2-2025.11.05-hfb2350b_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-ha7194a6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.7.5-h61cb6f2_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/scipy-1.18.0-py312ha7f05e0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sleef-3.9.0-h5bb93e2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.2-he774c54_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_hf03c496_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/unicodedata2-17.0.1-py312hcd1a082_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libice-1.1.2-h80f16a2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libsm-1.2.6-hf23e593_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libx11-1.8.13-h63a1b12_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxext-1.3.7-h5bc82ec_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrender-0.9.12-he30d5cf_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h29ee22c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.2-hdc9db2a_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-ng-2.3.3-h1024f78_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h9d15635_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.14.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.28.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - pypi: ./benchmark - - pypi: ./skala - - pypi: https://files.pythonhosted.org/packages/0a/9b/9053d2a5a6276352b883d57192ce0bed68b1bc2415b35824ea6942c2c999/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/89/84/06281c82d4d1686fde1ac6b0f307c50918f1c0151062445ab3b6fa5a921d/h5py-3.16.0-cp312-cp312-manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/89/f2/24c58dad0c33ab417c5a090695a6788292d5d4edceae59bad055e5377e92/pyscf-2.14.0-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl - osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.14.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.28.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.4-h0f08c97_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.14-hb9ed60c_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.14.2-h84a0fba_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-hf0b4b85_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.7.1-ha581b6a_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.11.0-h27f0cb5_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.27.3-ha24efe8_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.16.0-hf1a914d_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.12.8-hdc61527_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.7-hf0b4b85_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-hf0b4b85_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.40.1-h5b5d287_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.833-haa98fb3_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.3-he5ae378_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.3-h05177fb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.18.0-h409340b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.14.0-h7cba3ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.16.0-h16bb3af_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.2.0-hf00d406_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.2.0-he4a93e4_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h4e30115_10.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.8-h74c22ad_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.4-he0f2337_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.1.1-py312hc892d8b_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py312h3093aea_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.15.4-py312hada1361_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/dftd3-python-1.5.0-py312h2bbb03f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fmt-12.1.0-h99e4e11_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.18.3-h81aa574_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.63.0-py312h04c11ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.3-hce30654_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-h84a0fba_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.3.1-h784d473_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-h6f9ecc1_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-hf5e55b1_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.3.1-py312h1af6244_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.15-h784d473_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hf-xet-1.5.2-py310he76dbf2_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-py310h579977c_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jonquil-0.3.2-gfortran_h04795c8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.5.0-py312h3093aea_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h34f8a20_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.19.1-hdfa7624_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.2.0-h1eee2c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260526.0-cxx17_h4c27e2a_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-25.0.0-haaed7fe_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-25.0.0-heaff1e6_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-25.0.0-h93a2d87_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-25.0.0-heaff1e6_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-25.0.0-h2208e57_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-9_h51639a9_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-h1dcdb26_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-h5295a6a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-h2ddc9cb_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-9_hb0561ab_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.21.0-h6651222_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.8-h55c6f16_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-he7e0567_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321h26f1114_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h1a92334_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.7.0-hcf2aa1b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-h2ed5691_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-16.1.0-h3cf6597_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-16.1.0-h07b0088_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-16.1.0-h32cdfcc_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.3-ha531971_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-3.8.0-ha595bda_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-3.8.0-hc8aed40_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.82.1-hf3e839d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libharfbuzz-14.3.1-hcda0f7c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-he4c29f2_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.2.0-h84a0fba_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-9_hd9741b5_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h435687b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.34-openmp_he657e61_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.27.0-h46c1d2a_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.27.0-hce30654_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-25.0.0-h0de02aa_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-hf5e6511_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-7.35.1-h8daa630_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpsl-0.23.1-hdb0c161_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libraqm-0.11.0-h45af499_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h5d15848_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.4-hca69786_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-hbf2880b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h1fb9c8a_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.2-h282da08_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtorch-2.12.1-cpu_generic_h931913c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.3-h2431656_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.52.1-h1a92334_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h202fb40_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hbffa61f_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-h5654f7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.8-hc225544_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-hdca3b7d_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py312h04c11ed_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.11.1-py312h07c8dfe_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mctc-lib-0.5.2-gfortran_h0230218_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.4.0-h169892a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.2-h72846b0_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-he64c551_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.12.0-h784d473_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.6-py312ha003a3f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/onednn-3.12-omp_h95bb4b2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hd9e9057_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/optree-0.20.0-py312h42f75bc_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.3.1-hef2a647_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-3.0.5-py312h6510ced_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-he63d830_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.3.0-py312h4e908a4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h784d473_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-h84a0fba_1003.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-25.0.0-py312h1f38498_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-25.0.0-py312h7d9569a_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.13-hd1323d7_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pytorch-2.12.1-cpu_generic_py312_h7a5249f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py312h04c11ed_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-h5d60da5_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h8b90a29_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/s2n-1.7.5-h1b28cb6_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.18.0-py312h4519d97_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/simple-dftd3-1.5.0-gfortran_h0230218_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sleef-3.9.0-hb028509_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.2-hada39a4_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-hbeba79b_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/toml-f-0.5.2-gfortran_h04795c8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-17.0.1-py312h2bbb03f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h84a0fba_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-h84a0fba_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h74c22ad_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.2-h8088a28_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.3-h31dac16_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hf451053_7.conda - - pypi: ./benchmark - - pypi: ./skala - - pypi: https://files.pythonhosted.org/packages/48/ed/bb4aeb728505b4ce7edd55e9b2e35bcbd99ad0b0cae5c45b59e48b9ed62d/pyscf-2.14.0-py3-none-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/b0/42/c84efcc1d4caebafb1ecd8be4643f39c85c47a80fe254d92b8b43b1eadaf/h5py-3.16.0-cp312-cp312-macosx_11_0_arm64.whl - test-py312-pyscf214-torch213: - channels: - - url: https://conda.anaconda.org/conda-forge/ - indexes: - - https://pypi.org/simple - packages: - linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-hb7a77c6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.14-h2aa3ae6_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.2-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h720e601_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.1-h6ffeea8_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-h38ae05a_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.3-h6f4d18d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.16.0-h21f4ec5_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.8-h46fcd08_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h720e601_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h720e601_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.40.1-h102d43b_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.833-hc7390e0_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.3-h206d751_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-h71f81a8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.18.0-h74b55db_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.14.0-hf596fc9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.16.0-h1f05bef_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.15.4-py312h589e9ff_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/elfutils-0.194-h849f50c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.3.1-h54a6638_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hb7133d2_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gnutls-3.8.13-h18acefa_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py312h0a2e395_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.9-gpl_h3152399_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-25.0.0-hcc2f0d9_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-25.0.0-h635bf11_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-25.0.0-h53684a4_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-25.0.0-h635bf11_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-25.0.0-h66fbfdd_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-9_h5875eb1_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-9_hfef963f_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.21.0-ha042cf0_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.1.0-h79bb938_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-h45c3219_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.8.0-hbc29df5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.8.0-hdbdcf42_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.82.1-h792040b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.3.1-h23af247_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.8-hfac485b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-9_h5e43f62_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libmicrohttpd-1.0.10-hc2fc477_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.27.0-h3133023_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.27.0-ha770c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-25.0.0-h7376487_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h2840a7c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h60473fc_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.1.0-hdf11a46_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtasn1-4.21.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-h9d88235_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.8.3-h65a8314_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.8-h3206bd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-hee9eb32_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-hebe6cf0_1003.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py312h4c94fcb_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/memray-1.19.3-py312ha9ecdfb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hecca717_244.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.10.1-h5ef0d04_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.1-h443056b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.26.5-h586ad30_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.5-py312h8ecdadd_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py312h50c33e8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb03c661_1003.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/py-spy-0.4.2-hbe0e3b8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-25.0.0-py312h7900ff3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-25.0.0-py312h2054cf2_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-h8ab3286_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h94463f1_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.5-h7e3ee7f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py312h54fa4ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.14.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.28.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.11.3-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/textual-8.2.8-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda - - pypi: ./benchmark - - pypi: ./skala - - pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/9e/e9/1a19e42cd43cc1365e127db6aae85e1c671da1d9a5d746f4d34a50edb577/h5py-3.16.0-cp312-cp312-manylinux_2_28_x86_64.whl - linux-aarch64: - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.10.4-h03961ac_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.9.14-h6c1c863_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.14.2-he30d5cf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.3.2-hbf34bff_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.7.1-h423fd5f_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.11.0-hb2c4768_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.27.3-hc846123_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.16.0-hf64e385_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.12.8-h681413d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.2.7-hbf34bff_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.2.10-hbf34bff_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.40.1-h18900c3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.833-h1131a43_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-core-cpp-1.16.3-h412bcfc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-identity-cpp-1.13.3-hd0001b6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-blobs-cpp-12.18.0-h2e50874_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-common-cpp-12.14.0-hacd5e5f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-files-datalake-cpp-12.16.0-hde34f15_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-1.2.0-h52fc18c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-bin-1.2.0-hdc3483e_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.8-h29ee22c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-h0b6afd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/contourpy-1.3.3-py312hf18b547_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/coverage-7.15.4-py312h2b0bcae_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fmt-12.1.0-h166da81_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.18.3-ha4b22b4_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fonttools-4.63.0-py312ha4530ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.14.3-h8af1aa0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fribidi-1.0.16-he30d5cf_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.3.1-h7ac5ae9_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glog-0.7.1-ha2f5727_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gmp-6.3.0-h4d6b352_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gmpy2-2.3.1-py312h70c4b35_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.15-h7ac5ae9_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/hf-xet-1.5.2-py310h160093b_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-py311h3512406_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h5bc82ec_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/kiwisolver-1.5.0-py312h1683e8e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-h095d8e5_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.19.1-h9d5b58d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.2.0-h52b7260_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20260526.0-cxx17_hc5e897d_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-25.0.0-hf28620a_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-25.0.0-hb326ee9_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-compute-25.0.0-hdd99842_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-25.0.0-hb326ee9_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-25.0.0-hd99807d_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-9_haddc8a3_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.2.0-h384ecca_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.2.0-h011f0d3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.2.0-hb247b97_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-9_hd72aa62_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.21.0-h86273da_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-hfa851ae_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321hc48eb74_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h80f16a2_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.1-hfae3067_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.7.0-h376a255_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-h9cc7050_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-16.1.0-he9431aa_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-16.1.0-he9431aa_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-16.1.0-h47adacf_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.88.3-had1c41b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-3.8.0-h2efc11c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-3.8.0-h66d5b86_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgrpc-1.82.1-h05b84e8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libharfbuzz-14.3.1-h8f7ccb3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h1ea5142_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.2.0-he30d5cf_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-9_h88aeb00_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.68.1-ha4b982d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.34-openmp_h1a8b088_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-1.27.0-hbe47268_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-headers-1.27.0-h8af1aa0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-25.0.0-h87079af_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.58-hf9b7768_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-7.35.1-h30ec8a2_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpsl-0.23.1-hb8431ed_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libraqm-0.11.0-hd2f8911_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2025.11.05-h149037f_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.4-h399dd60_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-h7572e3e_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-16.1.0-hdbbeba8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libthrift-0.22.0-ha522d1d_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.2-hdb009f0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtorch-2.13.0-cpu_generic_hf6f405e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.11.3-hec6f9f7_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42.2-h1022ec0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.52.1-h80f16a2_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h3f04742_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.38-h80f16a2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-16-2.15.3-h79dcc73_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.15.3-h869d058_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/llvm-openmp-22.1.8-hfdfeb53_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-hfb11796_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py312hd077ced_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-base-3.11.1-py312h0683553_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpc-1.4.0-he6dc3fb_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpfr-4.2.2-h4b21e80_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-h2b6f883_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nlohmann_json-3.12.0-h7ac5ae9_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.6-py312hce9e0af_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/onednn-3.12-omp_h605b386_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.4-h5da879a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.3-h546c87b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/optree-0.20.0-py312h579b322_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orc-2.3.1-h1fb4f23_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-3.0.5-py312hf55c4e8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-he574923_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-12.3.0-py312h3b21937_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.46.4-h7ac5ae9_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/prometheus-cpp-1.3.0-h7938499_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-he30d5cf_1003.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-25.0.0-py312h8025657_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-core-25.0.0-py312h2cce741_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.13-ha505bbe_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pytorch-2.13.0-cpu_generic_py312_h556be23_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py312ha4530ae_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/qhull-2020.2-h70be974_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/re2-2025.11.05-hfb2350b_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-ha7194a6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.7.5-h61cb6f2_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/scipy-1.18.0-py312ha7f05e0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sleef-3.9.0-h5bb93e2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.2-he774c54_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_hf03c496_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/unicodedata2-17.0.1-py312hcd1a082_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libice-1.1.2-h80f16a2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libsm-1.2.6-hf23e593_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libx11-1.8.13-h63a1b12_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxext-1.3.7-h5bc82ec_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrender-0.9.12-he30d5cf_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h29ee22c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.2-hdc9db2a_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-ng-2.3.3-h1024f78_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h9d15635_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.14.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.28.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - pypi: ./benchmark - - pypi: ./skala - - pypi: https://files.pythonhosted.org/packages/0a/9b/9053d2a5a6276352b883d57192ce0bed68b1bc2415b35824ea6942c2c999/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/89/84/06281c82d4d1686fde1ac6b0f307c50918f1c0151062445ab3b6fa5a921d/h5py-3.16.0-cp312-cp312-manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/89/f2/24c58dad0c33ab417c5a090695a6788292d5d4edceae59bad055e5377e92/pyscf-2.14.0-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl - osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.14.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.28.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.4-h0f08c97_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.14-hb9ed60c_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.14.2-h84a0fba_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-hf0b4b85_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.7.1-ha581b6a_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.11.0-h27f0cb5_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.27.3-ha24efe8_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.16.0-hf1a914d_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.12.8-hdc61527_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.7-hf0b4b85_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-hf0b4b85_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.40.1-h5b5d287_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.833-haa98fb3_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.3-he5ae378_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.3-h05177fb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.18.0-h409340b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.14.0-h7cba3ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.16.0-h16bb3af_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.2.0-hf00d406_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.2.0-he4a93e4_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h4e30115_10.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.8-h74c22ad_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.4-he0f2337_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.1.1-py312hc892d8b_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py312h3093aea_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.15.4-py312hada1361_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/dftd3-python-1.5.0-py312h2bbb03f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fmt-12.1.0-h99e4e11_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.18.3-h81aa574_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.63.0-py312h04c11ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.3-hce30654_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-h84a0fba_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.3.1-h784d473_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-h6f9ecc1_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-hf5e55b1_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.3.1-py312h1af6244_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.15-h784d473_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hf-xet-1.5.2-py310he76dbf2_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-py310h579977c_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jonquil-0.3.2-gfortran_h04795c8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.5.0-py312h3093aea_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h34f8a20_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.19.1-hdfa7624_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.2.0-h1eee2c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260526.0-cxx17_h4c27e2a_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-25.0.0-haaed7fe_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-25.0.0-heaff1e6_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-25.0.0-h93a2d87_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-25.0.0-heaff1e6_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-25.0.0-h2208e57_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-9_h51639a9_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-h1dcdb26_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-h5295a6a_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-h2ddc9cb_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-9_hb0561ab_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.21.0-h6651222_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.8-h55c6f16_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-he7e0567_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321h26f1114_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h1a92334_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.7.0-hcf2aa1b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-h2ed5691_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-16.1.0-h3cf6597_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-16.1.0-h07b0088_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-16.1.0-h32cdfcc_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.3-ha531971_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-3.8.0-ha595bda_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-3.8.0-hc8aed40_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.82.1-hf3e839d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libharfbuzz-14.3.1-hcda0f7c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-he4c29f2_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.2.0-h84a0fba_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-9_hd9741b5_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h435687b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.34-openmp_he657e61_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.27.0-h46c1d2a_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.27.0-hce30654_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-25.0.0-h0de02aa_4_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-hf5e6511_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-7.35.1-h8daa630_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpsl-0.23.1-hdb0c161_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libraqm-0.11.0-h45af499_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h5d15848_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.4-hca69786_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-hbf2880b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h1fb9c8a_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.2-h282da08_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtorch-2.13.0-cpu_generic_hf893bd3_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.3-h2431656_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.52.1-h1a92334_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h202fb40_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hbffa61f_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-h5654f7c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.8-hc225544_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-hdca3b7d_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py312h04c11ed_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.11.1-py312h07c8dfe_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mctc-lib-0.5.2-gfortran_h0230218_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.4.0-h169892a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.2-h72846b0_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-he64c551_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.12.0-h784d473_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.6-py312ha003a3f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/onednn-3.12-omp_h95bb4b2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hd9e9057_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/optree-0.20.0-py312h42f75bc_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.3.1-hef2a647_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-3.0.5-py312h6510ced_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-he63d830_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.3.0-py312h4e908a4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h784d473_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-h84a0fba_1003.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-25.0.0-py312h1f38498_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-25.0.0-py312h7d9569a_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.13-hd1323d7_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pytorch-2.13.0-cpu_generic_py312_ha1580ae_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py312h04c11ed_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-h5d60da5_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h8b90a29_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/s2n-1.7.5-h1b28cb6_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.18.0-py312h4519d97_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/simple-dftd3-1.5.0-gfortran_h0230218_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sleef-3.9.0-hb028509_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.2-hada39a4_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-hbeba79b_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/toml-f-0.5.2-gfortran_h04795c8_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-17.0.1-py312h2bbb03f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h84a0fba_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-h84a0fba_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h74c22ad_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.2-h8088a28_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.3-h31dac16_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hf451053_7.conda - - pypi: ./benchmark - - pypi: ./skala - - pypi: https://files.pythonhosted.org/packages/48/ed/bb4aeb728505b4ce7edd55e9b2e35bcbd99ad0b0cae5c45b59e48b9ed62d/pyscf-2.14.0-py3-none-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/b0/42/c84efcc1d4caebafb1ecd8be4643f39c85c47a80fe254d92b8b43b1eadaf/h5py-3.16.0-cp312-cp312-macosx_11_0_arm64.whl - test-py313-pyscf214-torch213: - channels: - - url: https://conda.anaconda.org/conda-forge/ - indexes: - - https://pypi.org/simple - packages: - linux-64: - - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py313hc8edb43_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.15.4-py313h55b89ea_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py313h3dea7bd_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py313ha4a6282_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py313hc8edb43_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-9_h5875eb1_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-9_hfef963f_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h3435931_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.1.0-h69a702a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.1.0-h79bb938_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-h45c3219_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.3.1-h23af247_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-9_h5e43f62_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h2840a7c_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.1.0-hdf11a46_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-h9d88235_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.8-h3206bd6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py313h134213a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hecca717_244.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py313hf6604e3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py313h6bdb861_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py313h80991f8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb03c661_1003.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.15-hb101c97_101_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py313_h80c0f76_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py313h4b8bb8b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.14.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.15-py313hd8ed1ab_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.28.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.15-h4df99d1_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - - pypi: ./skala - - pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/bd/98/ef2b6fe2903e377cbe870c3b2800d62552f1e3dbe81ce49e1923c53d1c5c/h5py-3.16.0-cp313-cp313-manylinux_2_28_x86_64.whl -packages: -- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - build_number: 20 - sha256: 1dd3fffd892081df9726d7eb7e0dea6198962ba775bd88842135a4ddb4deb3c9 - md5: a9f577daf3de00bca7c3c76c0ecbd1de - depends: - - __glibc >=2.17,<3.0.a0 - - libgomp >=7.5.0 - constrains: - - openmp_impl <0.0a0 - license: BSD-3-Clause - license_family: BSD - run_exports: - strong: - - _openmp_mutex >=4.5 - size: 28948 - timestamp: 1770939786096 -- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-7_kmp_llvm.conda - build_number: 7 - sha256: c0cddb66070dd6355311f7667ce2acccf70d1013edaa6e97f22859502fefdb22 - md5: 887b70e1d607fba7957aa02f9ee0d939 - depends: - - llvm-openmp >=9.0.1 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - _openmp_mutex >=4.5 - size: 8244 - timestamp: 1764092331208 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ast-serialize-0.8.0-py310hd8a072f_0.conda - noarch: python - sha256: 25c15e85cb03a1c4d43d02d0ff37c8c9a970c3e84abeaf420fc190bb053bbe3f - md5: e46fc69f093a840e98b9e2c29727862d - depends: - - python >=3.10 - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - _python_abi3_support 1.* - - cpython >=3.10 - constrains: - - __glibc >=2.17 - license: MIT - license_family: MIT - purls: - - pkg:pypi/ast-serialize?source=compressed-mapping - run_exports: {} - size: 1116952 - timestamp: 1786328964477 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-h4610da3_2.conda - sha256: 0c92dc5ddf4edd4038a63adb79f9f0b03f61e9455ce3253b7d2cf708e06ff99e - md5: cefa84dbf94066e7a6902af288a2fedd - depends: - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - aws-c-http >=0.11.0,<0.11.1.0a0 - - aws-c-common >=0.14.3,<0.14.4.0a0 - - aws-c-io >=0.27.5,<0.27.6.0a0 - - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 - - aws-c-cal >=0.9.15,<0.9.16.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-c-auth >=0.10.4,<0.10.5.0a0 - size: 135127 - timestamp: 1785199053057 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-hb7a77c6_1.conda - sha256: 845fe32ee750d4a4d3efdb1d95a8c29c3388e3ea9787b77341ec4abe4e198b11 - md5: 4347d5ffdf34adf9c5edd10837727d96 - depends: - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - aws-c-http >=0.11.0,<0.11.1.0a0 - - aws-c-io >=0.27.3,<0.27.4.0a0 - - aws-c-cal >=0.9.14,<0.9.15.0a0 - - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 - - aws-c-common >=0.14.2,<0.14.3.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-c-auth >=0.10.4,<0.10.5.0a0 - size: 135073 - timestamp: 1784086842394 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.14-h2aa3ae6_4.conda - sha256: a67c944be1728f576c02fe8f28b0cbb78b5353415075db3da4ef71bc9dd8c00c - md5: 9c6072e7b882d35ac956c07e493d6a9e - depends: - - __glibc >=2.17,<3.0.a0 - - aws-c-common >=0.14.2,<0.14.3.0a0 - - libgcc >=14 - - openssl >=3.5.7,<4.0a0 - license: Apache-2.0 - license_family: Apache - purls: [] - run_exports: - weak: - - aws-c-cal >=0.9.14,<0.9.15.0a0 - size: 56752 - timestamp: 1784043396713 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.15-h6bbde05_1.conda - sha256: 6eb21a0129e0aa7c6be733c7f2d1de6bc97a60c8382c1016f19dced722600d73 - md5: 8f2b374c79908f271be3d0e9f1c462a8 - depends: - - __glibc >=2.17,<3.0.a0 - - aws-c-common >=0.14.3,<0.14.4.0a0 - - libgcc >=14 - - openssl >=3.5.7,<4.0a0 - license: Apache-2.0 - license_family: Apache - purls: [] - run_exports: - weak: - - aws-c-cal >=0.9.15,<0.9.16.0a0 - size: 56630 - timestamp: 1785157790550 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.2-hb03c661_0.conda - sha256: 701398f1c9978c41e93cb0947869a66b7f8004e9d6e548d63d11aedae83cfb02 - md5: f3e0b2e044485ae90d4a59c77e7a0182 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: Apache-2.0 - license_family: Apache - purls: [] - run_exports: - weak: - - aws-c-common >=0.14.2,<0.14.3.0a0 - size: 246263 - timestamp: 1783637234072 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.3-hb03c661_0.conda - sha256: 8ea79f36d50ba90d7147fe1a047f9a7f2d33b114a3d4bacf1360cd8df43986e4 - md5: ce8664d7c01d4a598ad38107b289b5ec - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: Apache-2.0 - license_family: Apache - purls: [] - run_exports: - weak: - - aws-c-common >=0.14.3,<0.14.4.0a0 - size: 245819 - timestamp: 1784596136918 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h01ee8f8_5.conda - sha256: 27f8581573c533a92a1a9619516ebb66d390b9923d296331985cfd342dc32d29 - md5: ae862abdbb3160f97478d3d4749164c0 - depends: - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - aws-c-common >=0.14.3,<0.14.4.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-c-compression >=0.3.2,<0.3.3.0a0 - size: 22282 - timestamp: 1785157574179 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h720e601_4.conda - sha256: 8e0a5513cfc42df8bd16adbd8e83a37d3ca89b8e04cb20eb04eb177bbbfea365 - md5: c9be3f5854f349ae77a1a174b59e11a8 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - aws-c-common >=0.14.2,<0.14.3.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-c-compression >=0.3.2,<0.3.3.0a0 - size: 22301 - timestamp: 1784042853709 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.1-h6ffeea8_4.conda - sha256: b1f35f7b7a5e745e2d56cf93212770bb56f5207fa9f0e38f98b0c05a1b898a90 - md5: 204d1e8d60c3ae839bd1898e4c7742c8 - depends: - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - aws-checksums >=0.2.10,<0.2.11.0a0 - - aws-c-common >=0.14.2,<0.14.3.0a0 - - aws-c-io >=0.27.3,<0.27.4.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-c-event-stream >=0.7.1,<0.7.2.0a0 - size: 59633 - timestamp: 1784075699558 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-h38ae05a_4.conda - sha256: 4b939b4a76a11c9ec50c891ae9bf232da8dcaf8797701df1e79ae51c988be2d4 - md5: 97f2799ae6ff7b6f52dfa321fef9676b - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - aws-c-compression >=0.3.2,<0.3.3.0a0 - - aws-c-io >=0.27.3,<0.27.4.0a0 - - aws-c-cal >=0.9.14,<0.9.15.0a0 - - aws-c-common >=0.14.2,<0.14.3.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-c-http >=0.11.0,<0.11.1.0a0 - size: 231294 - timestamp: 1784075685646 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-hbe094ff_5.conda - sha256: a4a5e24b398e7c0ef64de5a341ecb3f0fa87c2879177695c5d0bcbde0c4f8b5e - md5: c09f7ec7327b8bd52fc2d6eacaa18d3b - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - aws-c-io >=0.27.5,<0.27.6.0a0 - - aws-c-cal >=0.9.15,<0.9.16.0a0 - - aws-c-common >=0.14.3,<0.14.4.0a0 - - aws-c-compression >=0.3.2,<0.3.3.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-c-http >=0.11.0,<0.11.1.0a0 - size: 231270 - timestamp: 1785186134512 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.3-h6f4d18d_1.conda - sha256: 94c32ca672ce290e250aea1cfb92582cca4658bdc3ec7cb1ceef254f34451595 - md5: bd19b685b88557830f1a617a6d404eb2 - depends: - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - aws-c-cal >=0.9.14,<0.9.15.0a0 - - s2n >=1.7.5,<1.7.6.0a0 - - aws-c-common >=0.14.2,<0.14.3.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-c-io >=0.27.3,<0.27.4.0a0 - size: 183100 - timestamp: 1784054829913 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.5-h4f381ba_1.conda - sha256: 76ab4eb6cae12e14244cb1fe11ecccc2f103f8ffa7e80e222099c6b16c19ae20 - md5: 948f5a4fddac779b7942626e5807caba - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - aws-c-common >=0.14.3,<0.14.4.0a0 - - aws-c-cal >=0.9.15,<0.9.16.0a0 - - s2n >=1.7.6,<1.7.7.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-c-io >=0.27.5,<0.27.6.0a0 - size: 183633 - timestamp: 1785170070776 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.16.0-h21f4ec5_2.conda - sha256: 0252f072e2f493f8348575938c69b48b2799f29f0489c4ad2c5a919ab7e3d02e - md5: 9728195c2f600ef427a1964ee193e707 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - aws-c-io >=0.27.3,<0.27.4.0a0 - - aws-c-http >=0.11.0,<0.11.1.0a0 - - aws-c-common >=0.14.2,<0.14.3.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-c-mqtt >=0.16.0,<0.16.1.0a0 - size: 224933 - timestamp: 1784087527918 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.8-h46fcd08_1.conda - sha256: a423bffbb0e6cacb5e2a0861b918ba3180e5132509afb1faf225ee9f0ec8f981 - md5: 706aa99414d18db5b23475b45cc93a0b - depends: - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - aws-c-io >=0.27.3,<0.27.4.0a0 - - aws-c-http >=0.11.0,<0.11.1.0a0 - - openssl >=3.5.7,<4.0a0 - - aws-c-cal >=0.9.14,<0.9.15.0a0 - - aws-c-auth >=0.10.4,<0.10.5.0a0 - - aws-checksums >=0.2.10,<0.2.11.0a0 - - aws-c-common >=0.14.2,<0.14.3.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-c-s3 >=0.12.8,<0.12.9.0a0 - size: 156174 - timestamp: 1784100985258 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.13.1-h7508075_1.conda - sha256: d24f7f34b3b564535b533b17176e71f71b6944aa2cb71813283bece139908d9f - md5: 2daf54d3eef87b757f68d7597534dd2f - depends: - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - aws-c-http >=0.11.0,<0.11.1.0a0 - - aws-c-auth >=0.10.4,<0.10.5.0a0 - - openssl >=3.5.7,<4.0a0 - - aws-c-common >=0.14.3,<0.14.4.0a0 - - aws-checksums >=0.2.10,<0.2.11.0a0 - - aws-c-io >=0.27.5,<0.27.6.0a0 - - aws-c-cal >=0.9.15,<0.9.16.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-c-s3 >=0.13.1,<0.13.2.0a0 - size: 157667 - timestamp: 1785351292770 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h01ee8f8_3.conda - sha256: b308c393a3db78cef29942c6b83ca7321f86d357fbb47504d59f55254601c87a - md5: 412f0cf18cc4c4945655dba954ca2d76 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - aws-c-common >=0.14.3,<0.14.4.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 - size: 68574 - timestamp: 1785159234141 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h720e601_2.conda - sha256: e419e179e04021fc680d98af23fac4b4c2369cea61171087e57a734e968dd9bd - md5: 816f62fa82532118ebb2398382090945 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - aws-c-common >=0.14.2,<0.14.3.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 - size: 68515 - timestamp: 1784044260935 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h01ee8f8_5.conda - sha256: f8d2cd9faccb273df739fc28431b484a90aca10027ef44f7fec1d4f0bd229a76 - md5: 4d70caf5260e0787675c3bf61ae5b64c - depends: - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - aws-c-common >=0.14.3,<0.14.4.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-checksums >=0.2.10,<0.2.11.0a0 - size: 101887 - timestamp: 1785159213897 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h720e601_4.conda - sha256: 6cc8617854a43040291dea791fe111ba408e7a5bbd9ee9e5a99375da7a16846b - md5: 24ee781effc5779206a80139323c9caf - depends: - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - aws-c-common >=0.14.2,<0.14.3.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-checksums >=0.2.10,<0.2.11.0a0 - size: 101904 - timestamp: 1784044248506 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.40.1-h102d43b_3.conda - sha256: e0c3a119c7035a00e0da325187ee723e07e0e6337e50362349d178ab40961f97 - md5: 3315ce09371baf6d70248b8927aa9866 - depends: - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 - - aws-c-mqtt >=0.16.0,<0.16.1.0a0 - - aws-c-auth >=0.10.4,<0.10.5.0a0 - - aws-c-s3 >=0.12.8,<0.12.9.0a0 - - aws-c-common >=0.14.2,<0.14.3.0a0 - - aws-c-io >=0.27.3,<0.27.4.0a0 - - aws-c-event-stream >=0.7.1,<0.7.2.0a0 - - aws-c-cal >=0.9.14,<0.9.15.0a0 - - aws-c-http >=0.11.0,<0.11.1.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-crt-cpp >=0.40.1,<0.40.2.0a0 - size: 416399 - timestamp: 1784113232967 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.833-hc7390e0_9.conda - sha256: 0c15c036c3b71471eecc58bbe08a68c66fd6a051b548dca7675c7c924ed3972b - md5: c65efa87d532339a090c87093097bf09 - depends: - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - libzlib >=1.3.2,<2.0a0 - - aws-c-event-stream >=0.7.1,<0.7.2.0a0 - - aws-c-common >=0.14.2,<0.14.3.0a0 - - libcurl >=8.21.0,<9.0a0 - - aws-crt-cpp >=0.40.1,<0.40.2.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-sdk-cpp >=1.11.833,<1.11.834.0a0 - size: 3394321 - timestamp: 1784137257627 -- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.3-h206d751_0.conda - sha256: fffc66e9be8806a92b314e27129c42b1298ea7065028c9e5d175dacb07829261 - md5: 0cabc152dc8896c3a4c4aebf2b308627 - depends: - - __glibc >=2.17,<3.0.a0 - - libcurl >=8.19.0,<9.0a0 - - libgcc >=14 - - libstdcxx >=14 - - openssl >=3.5.5,<4.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - azure-core-cpp >=1.16.3,<1.16.4.0a0 - size: 349147 - timestamp: 1775238757304 -- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-h71f81a8_2.conda - sha256: ebca774f1ebaa24c150730603b418b33fc7862811a16d097716b1a29f34798c5 - md5: f4fc754ec17176046988c46a54962a8c - depends: - - __glibc >=2.17,<3.0.a0 - - azure-core-cpp >=1.16.3,<1.16.4.0a0 - - libgcc >=14 - - libstdcxx >=14 - - openssl >=3.5.7,<4.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - azure-identity-cpp >=1.13.3,<1.13.4.0a0 - size: 250737 - timestamp: 1781268163278 -- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.18.0-h74b55db_1.conda - sha256: 04bb27dbf1d426b4447b28c3dc92ec01c807fa784eea86ffa1f8c2bd9b9e8076 - md5: 43151a3b0a8e037747d79a82dff9f967 - depends: - - __glibc >=2.17,<3.0.a0 - - azure-core-cpp >=1.16.3,<1.16.4.0a0 - - azure-storage-common-cpp >=12.14.0,<12.14.1.0a0 - - libgcc >=14 - - libstdcxx >=14 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - azure-storage-blobs-cpp >=12.18.0,<12.18.1.0a0 - size: 589716 - timestamp: 1781283775801 -- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.14.0-hf596fc9_1.conda - sha256: 8a806f9852d280926d7613df548889b49e2a1c5d836385bcb2cedb24e7b08c64 - md5: 7896f4a6ee78538e2d0261e3b36dfa69 - depends: - - __glibc >=2.17,<3.0.a0 - - azure-core-cpp >=1.16.3,<1.16.4.0a0 - - libgcc >=14 - - libstdcxx >=14 - - libxml2 - - libxml2-16 >=2.14.6 - - openssl >=3.5.7,<4.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - azure-storage-common-cpp >=12.14.0,<12.14.1.0a0 - size: 159394 - timestamp: 1781268171097 -- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.16.0-h1f05bef_1.conda - sha256: 13e2e6eb942f65bf81e9089bf6b5926534d9245c781288c5270beb3a25c9156b - md5: 70972c9cb0893d6499dd4118415a966b - depends: - - __glibc >=2.17,<3.0.a0 - - azure-core-cpp >=1.16.3,<1.16.4.0a0 - - azure-storage-blobs-cpp >=12.18.0,<12.18.1.0a0 - - azure-storage-common-cpp >=12.14.0,<12.14.1.0a0 - - libgcc >=14 - - libstdcxx >=14 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - azure-storage-files-datalake-cpp >=12.16.0,<12.16.1.0a0 - size: 308699 - timestamp: 1781538835962 -- conda: https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.7.0-py312h3f22e6b_0.conda - sha256: c10df0467f534472f0aa39013850d6dd9dd38ea5a6fb5c0812afb6f3fc768924 - md5: e7eb25765bdf21397cc6e30828871625 - depends: - - python - - __glibc >=2.17,<3.0.a0 - - libgcc >=15 - - python_abi 3.12.* *_cp312 - - zstd >=1.5.7,<1.6.0a0 - license: BSD-3-Clause AND MIT AND EPL-2.0 - purls: - - pkg:pypi/backports-zstd?source=hash-mapping - run_exports: {} - size: 240967 - timestamp: 1786861419155 -- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils-2.46.1-default_h4852527_102.conda - sha256: 659c367ef49df7741749a2ad240b007d7df51b4f210505a78543deafb001e44c - md5: e8452fe381cac5fff20563a07722dfa5 - depends: - - binutils_impl_linux-64 >=2.46.1,<2.46.2.0a0 - license: GPL-3.0-only - license_family: GPL - run_exports: {} - size: 35399 - timestamp: 1784214547142 -- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda - sha256: fb7bf36984a37ce7e4714d1d1da0bd0e3bfc679520f5cdc184afc676fd4b5da2 - md5: a0c5e0b7f58c8ceeb08e5bc41251d5a2 - depends: - - ld_impl_linux-64 2.46.1 default_hbd61a6d_102 - - sysroot_linux-64 - - zstd >=1.5.7,<1.6.0a0 - license: GPL-3.0-only - license_family: GPL - purls: [] - run_exports: {} - size: 3713752 - timestamp: 1784214522814 -- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.46.1-default_h4852527_102.conda - sha256: 08d7238663fc408ba2ab60b02fa3d06a7ca9d872962e03e90c7e0fdecb7ed1d0 - md5: 32fd07abe84eb14f17c7f5cc6fa8df82 - depends: - - binutils_impl_linux-64 2.46.1 default_hfdba357_102 - license: GPL-3.0-only - license_family: GPL - run_exports: {} - size: 36337 - timestamp: 1784214551894 -- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_3.conda - sha256: 1f2ccfebe6e0113bfc473b21906372c1ee4eb69bf6faef0ad7f3d4d79af63a98 - md5: 6ff307b78fbfb7dcafb7e25ff8bc9c10 - depends: - - __glibc >=2.17,<3.0.a0 - - brotli-bin 1.2.0 h9908984_3 - - libbrotlidec 1.2.0 ha411449_3 - - libbrotlienc 1.2.0 h018ffa1_3 - - libgcc >=15 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libbrotlicommon >=1.2.0,<1.3.0a0 - - libbrotlienc >=1.2.0,<1.3.0a0 - - libbrotlidec >=1.2.0,<1.3.0a0 - size: 20676 - timestamp: 1786622810792 -- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_3.conda - sha256: 56b2e5e8a49f9887af74cc63e0d55a3654e60b667ad5558da089549a36ae6a0c - md5: 8929291d9efc59715df1cfa7daf5e3ed - depends: - - __glibc >=2.17,<3.0.a0 - - libbrotlidec 1.2.0 ha411449_3 - - libbrotlienc 1.2.0 h018ffa1_3 - - libgcc >=15 - license: MIT - license_family: MIT - purls: [] - run_exports: {} - size: 21598 - timestamp: 1786622801722 -- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312he9c40d5_3.conda - sha256: 32ae6e002843704af9f39395f3116815fa66f2b27de1bd9044fb2a2d53fbe3d3 - md5: d176f3ed2824f930b524c45eb8f158bb - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=15 - - libstdcxx >=15 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - constrains: - - libbrotlicommon 1.2.0 h39a168f_3 - license: MIT - license_family: MIT - purls: - - pkg:pypi/brotli?source=compressed-mapping - run_exports: {} - size: 367032 - timestamp: 1786622975850 -- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda - sha256: 1a0d382c515ebf55f8ee1f38c8b81bc95af5c2acc42ad53b66bc5df932032f96 - md5: e675fabcf81499adc7edf58124fb1e01 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: bzip2-1.0.6 - license_family: BSD - purls: [] - run_exports: - weak: - - bzip2 >=1.0.8,<2.0a0 - size: 257808 - timestamp: 1785906269155 -- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda - sha256: 9c37cc233238adf366ea75b0e845662a5be07ceadf62e458183516369340274b - md5: 3ad2b403be8fc5612b9159e2ce621f69 - depends: - - libgcc >=15 - - __glibc >=2.17,<3.0.a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - c-ares >=1.34.8,<2.0a0 - size: 228700 - timestamp: 1787169971173 -- conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda - sha256: 8e7a40f16400d7839c82581410aa05c1f8324a693c9d50079f8c50dc9fb241f0 - md5: abd85120de1187b0d1ec305c2173c71b - depends: - - binutils - - gcc - - gcc_linux-64 14.* - license: BSD-3-Clause - license_family: BSD - run_exports: {} - size: 6693 - timestamp: 1753098721814 -- conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-2.0.0-ha29393d_0.conda - sha256: a54488d2b00380f542a2e1aa00dee3d878803a8c2c025dfce852a23685584dc6 - md5: b08763a8d93f2ba35bbf956dab90950b - depends: - - gcc 15.* - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: {} - size: 7017 - timestamp: 1786642183250 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda - sha256: 06525fa0c4e4f56e771a3b986d0fdf0f0fc5a3270830ee47e127a5105bde1b9a - md5: bb6c4808bfa69d6f7f6b07e5846ced37 - depends: - - __glibc >=2.17,<3.0.a0 - - fontconfig >=2.15.0,<3.0a0 - - fonts-conda-ecosystem - - icu >=78.1,<79.0a0 - - libexpat >=2.7.3,<3.0a0 - - libfreetype >=2.14.1 - - libfreetype6 >=2.14.1 - - libgcc >=14 - - libglib >=2.86.3,<3.0a0 - - libpng >=1.6.53,<1.7.0a0 - - libstdcxx >=14 - - libxcb >=1.17.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - pixman >=0.46.4,<1.0a0 - - xorg-libice >=1.1.2,<2.0a0 - - xorg-libsm >=1.2.6,<2.0a0 - - xorg-libx11 >=1.8.12,<2.0a0 - - xorg-libxext >=1.3.6,<2.0a0 - - xorg-libxrender >=0.9.12,<0.10.0a0 - license: LGPL-2.1-only or MPL-1.1 - purls: [] - run_exports: - weak: - - cairo >=1.18.4,<2.0a0 - size: 989514 - timestamp: 1766415934926 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.1.1-py312h703531f_2.conda - sha256: b649eacfd07be8fb889ef609601436dff831b2e9d095ef029601f3f10946c7d6 - md5: 3101547f7c22db267bd40988f67d7ab1 - depends: - - __glibc >=2.17,<3.0.a0 - - libffi >=3.7.0,<3.8.0a0 - - libgcc >=15 - - pycparser - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: MIT - license_family: MIT - purls: - - pkg:pypi/cffi?source=hash-mapping - run_exports: {} - size: 302100 - timestamp: 1786775110054 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda - sha256: 10660ed21b9d591f8306028bd36212467b94f23bc2f78faec76524f6ee592613 - md5: 057e16a12847eea846ecf99710d3591b - depends: - - __glibc >=2.17,<3.0.a0 - - bzip2 >=1.0.8,<2.0a0 - - libcurl >=8.14.1,<9.0a0 - - libexpat >=2.7.1,<3.0a0 - - libgcc >=14 - - liblzma >=5.8.1,<6.0a0 - - libstdcxx >=14 - - libuv >=1.51.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - rhash >=1.4.6,<2.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: {} - size: 20991288 - timestamp: 1757877168657 -- conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-14.4.0-h611768e_2.conda - sha256: 665bd4c95d7fecadffd95c2ba9567793e219daa23c136a296ddb5ff69d326d5a - md5: a43926da754ebbb69e63dff785f09108 - depends: - - gcc_impl_linux-64 >=14.4.0,<14.4.1.0a0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - run_exports: {} - size: 32427 - timestamp: 1787164994321 -- conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.3.0-h8846f6e_2.conda - sha256: 351e1f8cd4ed85340c0bed23590af4d2eacd247e4e7fb85dee8522ecb8ee2db5 - md5: 0d8b5e1d7d51db95888f68f506bc4ab2 - depends: - - gcc_impl_linux-64 >=15.3.0,<15.3.1.0a0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - run_exports: {} - size: 32386 - timestamp: 1787165290908 -- conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py311h724c32c_4.conda - sha256: fd7aca059253cff3d8b0aec71f0c1bf2904823b13f1997bf222aea00a76f3cce - md5: d04e508f5a03162c8bab4586a65d00bf - depends: - - numpy >=1.25 - - python - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - python_abi 3.11.* *_cp311 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/contourpy?source=hash-mapping - run_exports: {} - size: 320553 - timestamp: 1769155975008 -- conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda - sha256: 62447faf7e8eb691e407688c0b4b7c230de40d5ecf95bf301111b4d05c5be473 - md5: 43c2bc96af3ae5ed9e8a10ded942aa50 - depends: - - numpy >=1.25 - - python - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - libgcc >=14 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/contourpy?source=hash-mapping - run_exports: {} - size: 320386 - timestamp: 1769155979897 -- conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py313hc8edb43_4.conda - sha256: 7f86eb205d2d7fcf2c82654a08c6a240623ac34cb406206b4b1f1afa5cda8e49 - md5: 33639459bc29437315d4bff9ed5bc7a7 - depends: - - numpy >=1.25 - - python - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - libgcc >=14 - - python_abi 3.13.* *_cp313 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/contourpy?source=hash-mapping - run_exports: {} - size: 321850 - timestamp: 1769155964333 -- conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.15.4-py311hc6a3e95_1.conda - sha256: 109c8c336afb39cad7092f5e789b8cd40182196559cc9cb451a93bb6de0dd504 - md5: 8f84f42796fc87743928198920a51d94 - depends: - - python - - tomli - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - python_abi 3.11.* *_cp311 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/coverage?source=compressed-mapping - run_exports: {} - size: 426282 - timestamp: 1786292729866 -- conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.15.4-py312h589e9ff_1.conda - sha256: 12157c219d58e85b0454705ba23caed5b6a1e1129715fab1a38d1c974a82a5ff - md5: da913109cf05fb71022186f534874a5d - depends: - - python - - tomli - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - python_abi 3.12.* *_cp312 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/coverage?source=compressed-mapping - run_exports: {} - size: 415149 - timestamp: 1786292729866 -- conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.15.4-py313h55b89ea_1.conda - sha256: 04f234ebf4d9b697b1674108263ad5d651f7ec467ef93f09f34c26be8a32dbf7 - md5: b8f4dc4f7a959ab778cd11e463d90e0f - depends: - - python - - tomli - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - python_abi 3.13.* *_cp313 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/coverage?source=compressed-mapping - run_exports: {} - size: 423474 - timestamp: 1786292729866 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-crt-tools-12.9.86-ha770c72_2.conda - sha256: 2da9964591af14ba11b2379bed01d56e7185260ee0998d1a939add7fb752db45 - md5: 503a94e20d2690d534d676a764a1852c - depends: - - cuda-version >=12.9,<12.10.0a0 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 29138 - timestamp: 1753975252445 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-crt-tools-13.3.73-ha770c72_0.conda - sha256: c15de6531b48744560311f3db12a2503e57d5ed737f4613e9f5ec56e96ae1967 - md5: 0250c452d2fbe477d4ea1a4c43e8c2b5 - depends: - - cuda-version >=13.3,<13.4.0a0 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 30173 - timestamp: 1782782850002 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.9.79-h5888daf_0.conda - sha256: 57d1294ecfaf9dc8cdb5fc4be3e63ebc7614538bddb5de53cfd9b1b7de43aed5 - md5: cb15315d19b58bd9cd424084e58ad081 - depends: - - __glibc >=2.17,<3.0.a0 - - cuda-cudart_linux-64 12.9.79 h3f2d84a_0 - - cuda-version >=12.9,<12.10.0a0 - - libgcc >=13 - - libstdcxx >=13 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 23242 - timestamp: 1749218416505 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-13.3.29-hecca717_0.conda - sha256: 3d74819f261d77a410e8f8ddbd973446c312ec76605d60619d9b85113eca9632 - md5: 3fc21c99786b908fd7f32ea279fc9780 - depends: - - __glibc >=2.17,<3.0.a0 - - cuda-cudart_linux-64 13.3.29 h376f20c_0 - - cuda-version >=13.3,<13.4.0a0 - - libgcc >=14 - - libstdcxx >=14 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 24659 - timestamp: 1779898425780 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-12.9.79-h5888daf_0.conda - sha256: 04d8235cb3cb3510c0492c3515a9d1a6053b50ef39be42b60cafb05044b5f4c6 - md5: ba38a7c3b4c14625de45784b773f0c71 - depends: - - __glibc >=2.17,<3.0.a0 - - cuda-cudart 12.9.79 h5888daf_0 - - cuda-cudart-dev_linux-64 12.9.79 h3f2d84a_0 - - cuda-cudart-static 12.9.79 h5888daf_0 - - cuda-version >=12.9,<12.10.0a0 - - libgcc >=13 - - libstdcxx >=13 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: - weak: - - cuda-cudart >=12.9.79,<13.0a0 - size: 23687 - timestamp: 1749218464010 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-13.3.29-hecca717_0.conda - sha256: 050ac942737f501b5dee21c0bbfa77f4617c52269f188ab66a5e2b8b7acd0f22 - md5: e21171cc900f202b2af82f1afddbdfcf - depends: - - __glibc >=2.17,<3.0.a0 - - cuda-cudart 13.3.29 hecca717_0 - - cuda-cudart-dev_linux-64 13.3.29 h376f20c_0 - - cuda-cudart-static 13.3.29 hecca717_0 - - cuda-version >=13.3,<13.4.0a0 - - libgcc >=14 - - libstdcxx >=14 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: - weak: - - cuda-cudart >=13.3.29,<14.0a0 - size: 25129 - timestamp: 1779898446163 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-12.9.79-h5888daf_0.conda - sha256: 6261e1d9af80e1ec308e3e5e2ff825d189ef922d24093beaf6efca12e67ce060 - md5: d3c4ac48f4967f09dd910d9c15d40c81 - depends: - - __glibc >=2.17,<3.0.a0 - - cuda-cudart-static_linux-64 12.9.79 h3f2d84a_0 - - cuda-version >=12.9,<12.10.0a0 - - libgcc >=13 - - libstdcxx >=13 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 23283 - timestamp: 1749218442382 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-13.3.29-hecca717_0.conda - sha256: e2596138baef66e9b7fa08329e944d3ef8cca7c3d2da28d32bc37ff7e4801d1a - md5: 3a99ba2e09c508fd8b8b0eaf6d37a376 - depends: - - __glibc >=2.17,<3.0.a0 - - cuda-cudart-static_linux-64 13.3.29 h376f20c_0 - - cuda-version >=13.3,<13.4.0a0 - - libgcc >=14 - - libstdcxx >=14 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 24626 - timestamp: 1779898435744 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cuobjdump-12.9.82-hffce074_1.conda - sha256: 113c354cb176eee131cc193507214a471bef73e000f5a143f7367c0e48d92959 - md5: 55a83761db33f82d92d7d7a4a61662e5 - depends: - - __glibc >=2.17,<3.0.a0 - - cuda-nvdisasm - - cuda-version >=12.9,<12.10.0a0 - - libgcc >=14 - - libstdcxx >=14 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 245074 - timestamp: 1761107448598 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cuobjdump-13.3.73-hffce074_0.conda - sha256: a65cb1cecf1c10b5788d99c5c0e97878e1bd422e9626d0905a3f62ead1451440 - md5: 0e65be2f6812d0acf74e6c90fedeac7b - depends: - - __glibc >=2.17,<3.0.a0 - - cuda-nvdisasm - - cuda-version >=13.3,<13.4.0a0 - - libgcc >=14 - - libstdcxx >=14 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 311736 - timestamp: 1782782292034 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-12.9.79-h676940d_2.conda - sha256: c6c5ba6456af7ab6580868bc9c25b57fddde819d59458d3dea28b3d9b162a9fd - md5: dcbc9b64f862ad6f92fa15bb9e95cb57 - depends: - - __glibc >=2.28,<3.0.a0 - - cuda-version >=12.9,<12.10.0a0 - - libgcc >=14 - - libstdcxx >=14 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 1854034 - timestamp: 1784664104747 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-13.3.75-h676940d_1.conda - sha256: 74102b8c0b16fdbcf2dbd0979737a39e9bbda91af648a9f02e463a941d3aaa5d - md5: 52cc2a03940221694e9ee60386f5892f - depends: - - __glibc >=2.28,<3.0.a0 - - cuda-version >=13.3,<13.4.0a0 - - libgcc >=14 - - libstdcxx >=14 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 1600177 - timestamp: 1784050032907 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cuxxfilt-12.9.82-hffce074_1.conda - sha256: 54e59c7c802e3491ec901011711e79a0dd65e75a12c3e6178c3948f653ac5a59 - md5: 73204e01a30d7d2783de5acd153f6a1d - depends: - - __glibc >=2.17,<3.0.a0 - - cuda-version >=12.9,<12.10.0a0 - - libgcc >=14 - - libstdcxx >=14 - license: LicenseRef-NVIDIA-End-User-License-Agreement - run_exports: {} - size: 216466 - timestamp: 1761098778582 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-12.9.86-hcdd1206_6.conda - sha256: f7c5de6b1f0f463f73c78cc73439027cdd5cb94fb4ce099116969812973cabcb - md5: 02289b10ac97bac35ad1add086c5072a - depends: - - cuda-nvcc_linux-64 12.9.86.* - - gcc_linux-64 - - gxx_linux-64 - license: LicenseRef-NVIDIA-End-User-License-Agreement - run_exports: {} - size: 25472 - timestamp: 1771619493470 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-impl-12.9.86-h85509e4_2.conda - sha256: 961cf20d411b7685cd744e6c6ed35efea547d095c62151d6f3053d9931bb994d - md5: 67458d2685e7503933efa550f3ee40f3 - depends: - - cuda-cudart >=12.9.79,<13.0a0 - - cuda-cudart-dev - - cuda-nvcc-dev_linux-64 12.9.86 he91c749_2 - - cuda-nvcc-tools 12.9.86 he02047a_2 - - cuda-nvvm-impl 12.9.86 h4bc722e_2 - - cuda-version >=12.9,<12.10.0a0 - - libnvptxcompiler-dev 12.9.86 ha770c72_2 - constrains: - - gcc_impl_linux-64 >=6,<15.0a0 - license: LicenseRef-NVIDIA-End-User-License-Agreement - run_exports: {} - size: 27215 - timestamp: 1753975546846 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-tools-12.9.86-he02047a_2.conda - sha256: 0e849be7b5e4832ca218ec2c48a9ba3a15a984f629e2e54f38a53f4f57220341 - md5: dc256c9864c2e8e9c817fbca1c84a4bc - depends: - - __glibc >=2.17,<3.0.a0 - - cuda-crt-tools 12.9.86 ha770c72_2 - - cuda-nvvm-tools 12.9.86 h4bc722e_2 - - cuda-version >=12.9,<12.10.0a0 - - libgcc >=12 - - libstdcxx >=12 - constrains: - - gcc_impl_linux-64 >=6,<15.0a0 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 27380012 - timestamp: 1753975454194 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-tools-13.3.73-he02047a_0.conda - sha256: 2367b8c3b2b950ae6c3ec2e5353e343ab81d652786f9f4a894d8aec87d8220ec - md5: 5425950025883aab32919f2a42e1274b - depends: - - __glibc >=2.17,<3.0.a0 - - cuda-crt-tools 13.3.73 ha770c72_0 - - cuda-nvvm-tools 13.3.73 h4bc722e_0 - - cuda-version >=13.3,<13.4.0a0 - - libgcc >=12 - - libstdcxx >=12 - constrains: - - gcc_impl_linux-64 >=6,<16.0a0 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 34673506 - timestamp: 1782782957431 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc_linux-64-12.9.86-he0b4e1d_6.conda - sha256: c506221dafb7cfd081f7d12d01d8e8ab9b29adfcc7d69d61fedd3232174e4016 - md5: 359d05bc3ec5d3a467eb558e3844aea2 - depends: - - __glibc >=2.17,<3.0.a0 - - cuda-cudart-dev_linux-64 12.9.* - - cuda-driver-dev_linux-64 12.9.* - - cuda-nvcc-dev_linux-64 12.9.86.* - - cuda-nvcc-impl 12.9.86.* - - cuda-nvcc-tools 12.9.86.* - - sysroot_linux-64 >=2.17,<3.0a0 - license: LicenseRef-NVIDIA-End-User-License-Agreement - run_exports: - strong: - - cuda-version >=12.9,<13 - size: 27575 - timestamp: 1771619492974 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvdisasm-12.9.88-hffce074_1.conda - sha256: 6851de88381f2ea0cbc5d18a91ae8a8ff6e682c6ee58c03c922902a0c25eb1a7 - md5: 5e7845d208a5067cb1461a429ff887e0 - depends: - - __glibc >=2.17,<3.0.a0 - - cuda-version >=12.9,<12.10.0a0 - - libgcc >=14 - - libstdcxx >=14 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 5518360 - timestamp: 1761098730432 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvdisasm-13.3.73-hffce074_0.conda - sha256: b69e14ccc7192729d6b50442401e429d70435f18f365be5e21d658c4de240f76 - md5: 4e6afe47c9930b435ca158beff6e4e96 - depends: - - __glibc >=2.17,<3.0.a0 - - cuda-version >=13.3,<13.4.0a0 - - libgcc >=14 - - libstdcxx >=14 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 4704495 - timestamp: 1782772091030 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvprune-12.9.82-hffce074_1.conda - sha256: 3bf91b1c682e698cfe4af1952b4255303ec8949d499e4a40e88fa6e40d96e1bf - md5: 60ff367b93b5ddb5043487c9a3372f3b - depends: - - __glibc >=2.17,<3.0.a0 - - cuda-version >=12.9,<12.10.0a0 - - libgcc >=14 - - libstdcxx >=14 - license: LicenseRef-NVIDIA-End-User-License-Agreement - run_exports: {} - size: 70948 - timestamp: 1761099226016 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.9.86-hecca717_1.conda - sha256: 68f81268c25befa9b70dc49af469ab0eb131960e3700b9a4edb46a32da343a28 - md5: 53f0062e2243b26e43ddac0b5267c6a3 - depends: - - __glibc >=2.17,<3.0.a0 - - cuda-version >=12.9,<12.10.0a0 - - libgcc >=14 - - libstdcxx >=14 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 67168282 - timestamp: 1760723629347 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-13.3.33-hecca717_0.conda - sha256: a70641e7d81694f57c7df46a17b657594393082dad667532c29df9540b7f99ca - md5: 57124a775cb937bb2bfd10f09a230430 - depends: - - __glibc >=2.17,<3.0.a0 - - cuda-version >=13.3,<13.4.0a0 - - libgcc >=14 - - libstdcxx >=14 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 39254802 - timestamp: 1779897349474 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-dev-12.9.86-hecca717_1.conda - sha256: ae620051c16eabf7720a47c5115634d64f7703d32124555ad0afccfd4b8d7cf4 - md5: 0d28090f4e63410e20397c7975612837 - depends: - - __glibc >=2.17,<3.0.a0 - - cuda-nvrtc 12.9.86 hecca717_1 - - cuda-version >=12.9,<12.10.0a0 - - libgcc >=14 - - libstdcxx >=14 - constrains: - - cuda-nvrtc-static >=12.9.86 - license: LicenseRef-NVIDIA-End-User-License-Agreement - run_exports: - weak: - - cuda-nvrtc >=12.9.86,<13.0a0 - size: 36819 - timestamp: 1760723845601 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-12.9.79-hecca717_1.conda - sha256: b16600e48ef3247366b83d5f195852fcefbc4d52bb245f82a632c7129d1d6283 - md5: b4a3411fa031c409f98cfbd4b2db9ad7 - depends: - - __glibc >=2.17,<3.0.a0 - - cuda-version >=12.9,<12.10.0a0 - - libgcc >=14 - - libstdcxx >=14 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 29436 - timestamp: 1761098820386 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-13.3.29-hecca717_0.conda - sha256: 5af9ccd785d66de9b25907f33c05b3b96fb289b030d041dc106303c0ae10caea - md5: b9ece8f54967d0e38857e6c562273f68 - depends: - - __glibc >=2.17,<3.0.a0 - - cuda-version >=13.3,<13.4.0a0 - - libgcc >=14 - - libstdcxx >=14 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 33852 - timestamp: 1779896656406 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-12.9.86-h4bc722e_2.conda - sha256: f4d34556174e4faa9d374ba2244707082870e1bbc1bb441ad3d9d2cea37da6af - md5: 82125dd3c0c4aa009faa00e2829b93d8 - depends: - - __glibc >=2.17,<3.0.a0 - - cuda-version >=12.9,<12.10.0a0 - - libgcc >=12 - license: LicenseRef-NVIDIA-End-User-License-Agreement - run_exports: {} - size: 21425520 - timestamp: 1753975283188 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-12.9.86-h4bc722e_2.conda - sha256: 45f5e881ed0d973132a5475a0b5c066db6e748ef3a831a14dba8374b252e0067 - md5: f9af26e4079adcd72688a8e8dbecb229 - depends: - - __glibc >=2.17,<3.0.a0 - - cuda-version >=12.9,<12.10.0a0 - - libgcc >=12 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 24246736 - timestamp: 1753975332907 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-13.3.73-h4bc722e_0.conda - sha256: f853f097a67a197608fafc193ab877393c7735b1da2364572172cc9eff262775 - md5: d5c9cf56873f461074420e70970604a9 - depends: - - __glibc >=2.17,<3.0.a0 - - cuda-version >=13.3,<13.4.0a0 - - libgcc >=12 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 29734373 - timestamp: 1782782895477 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cutensor-2.7.0.5-h15eaa2f_1.conda - sha256: 4e22c5cae2a2f4d8b9be509740737b80418a9f1274f4174f871e34fdb89dcc79 - md5: d78b425773f4a367b4f4c2bdc5cf3922 - depends: - - __glibc >=2.28,<3.0.a0 - - cuda-version >=13,<14.0a0 - - libcublas - - libgcc >=14 - - libstdcxx >=14 - license: LicenseRef-cuTENSOR-Software-License-Agreement - purls: [] - run_exports: - weak: - - cutensor >=2.7.0.5,<3.0a0 - size: 224965683 - timestamp: 1782817486396 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cutensor-2.7.0.5-h2d75abc_1.conda - sha256: aa633cbff15ac42cdff4ed979ce33dd904f877af67161cac3471698210453ee4 - md5: c76b59cea362f58e6fc85b3eb86aad21 - depends: - - __glibc >=2.28,<3.0.a0 - - cuda-version >=12,<13.0a0 - - libcublas - - libgcc >=14 - - libstdcxx >=14 - license: LicenseRef-cuTENSOR-Software-License-Agreement - purls: [] - run_exports: - weak: - - cutensor >=2.7.0.5,<3.0a0 - size: 242185870 - timestamp: 1782817485486 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-1.11.0-hfcd1e18_0.conda - sha256: 3fcc97ae3e89c150401a50a4de58794ffc67b1ed0e1851468fcc376980201e25 - md5: 5da8c935dca9186673987f79cef0b2a5 - depends: - - c-compiler 1.11.0 h4d9bdce_0 - - gxx - - gxx_linux-64 14.* - license: BSD-3-Clause - license_family: BSD - run_exports: {} - size: 6635 - timestamp: 1753098722177 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-2.0.0-hdab9b82_0.conda - sha256: 384ab445d260e0d69e701c32eb0ed870d348ec7e3efc78d944823855d4512ca1 - md5: 923dacbfd97122c65c97a35f6e959ab8 - depends: - - gxx 15.* - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: {} - size: 6972 - timestamp: 1786642183694 -- conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.21-py312h8285ef7_0.conda - sha256: b8dbe25820064a099f315bbb8f45f5bac3fddb63e96af3cbf0c93a830733ef34 - md5: e6778419a1851f6e15820558abddfa04 - depends: - - python - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - - python_abi 3.12.* *_cp312 - license: MIT - license_family: MIT - purls: - - pkg:pypi/debugpy?source=hash-mapping - run_exports: {} - size: 2821960 - timestamp: 1780390159181 -- conda: https://conda.anaconda.org/conda-forge/linux-64/elfutils-0.194-h849f50c_0.conda - sha256: f71eae7dc8ff9392d225d2d529691b2db16289b7d8009646eeb1adf0caf3937b - md5: 6da1f998c8ea85ba7692afbb5db72fb9 - depends: - - libgcc >=14 - - libstdcxx >=14 - - __glibc >=2.17,<3.0.a0 - - libzlib >=1.3.1,<2.0a0 - - libsqlite >=3.51.1,<4.0a0 - - libmicrohttpd >=1.0.2,<1.1.0a0 - - libarchive >=3.8.2,<3.9.0a0 - - liblzma >=5.8.1,<6.0a0 - - bzip2 >=1.0.8,<2.0a0 - - zstd >=1.5.7,<1.6.0a0 - - libcurl >=8.17.0,<9.0a0 - license: LGPL-3.0-only - license_family: LGPL - purls: [] - run_exports: - weak: - - elfutils >=0.194,<0.195.0a0 - size: 1289929 - timestamp: 1765447425767 -- conda: https://conda.anaconda.org/conda-forge/linux-64/exchcxx-1.0.0-cpu_h2ebb00f_5.conda - sha256: 81ea84b2228496f83e16a88c53939eeea3d81cdef6783b42669dce3562addd15 - md5: 9b7ac82b00adb4066d568a9f26c71519 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - - libxc-c >=7.1.2,<7.2.0a0 - - libxc-c >=7.1.2,<8.0a0 cpu_* - license: BSD-3-Clause - license_family: BSD - run_exports: - weak: - - exchcxx >=1.0.0,<1.1.0a0 cpu_* - size: 4875290 - timestamp: 1786116228634 -- conda: https://conda.anaconda.org/conda-forge/linux-64/exchcxx-1.0.0-cuda129_h897a41e_5.conda - sha256: 59757bdf2c9aa417398c6f7d15372ac3065666137fd157b98422e55058b6a60c - md5: 54ba314c68d093d00f6b7ba272d86bef - depends: - - __cuda - - __glibc >=2.17,<3.0.a0 - - cuda-cudart >=12.9.79,<13.0a0 - - cuda-version >=12.9,<13 - - libgcc >=14 - - libstdcxx >=14 - - libxc-c >=7.1.2,<7.2.0a0 - - libxc-c >=7.1.2,<8.0a0 cpu_* - license: BSD-3-Clause - license_family: BSD - run_exports: - weak: - - exchcxx >=1.0.0,<1.1.0a0 cuda129_* - size: 362175593 - timestamp: 1786088133977 -- conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda - sha256: 25d14a197601fdd616f2e501431b52887e69b31e7defbc1679381d718357ceb7 - md5: a70bb6d42ad121aef456e0007e92bed6 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - fmt >=12.1.0,<12.2.0a0 - size: 199072 - timestamp: 1785915412102 -- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda - sha256: 5a3eb10b18a97223ab06b3a7f0d7f56658db2f2800e2f2af95836fe3bf55ba63 - md5: 922776b528a470ab5afa81fd42abfa1d - depends: - - __glibc >=2.17,<3.0.a0 - - libexpat >=2.8.1,<3.0a0 - - libfreetype >=2.14.3 - - libfreetype6 >=2.14.3 - - libgcc >=15 - - libuuid >=2.42.2,<3.0a0 - - libzlib >=1.3.2,<2.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - fontconfig >=2.18.3,<3.0a0 - - fonts-conda-ecosystem - size: 296288 - timestamp: 1786667377340 -- conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py311h3778330_0.conda - sha256: ce5004df66a6bf4e3d634850ab43471b98700291065281eb1982eb54b7bf7d85 - md5: 498ede447c05b203be980ae1dceb06f3 - depends: - - __glibc >=2.17,<3.0.a0 - - brotli - - libgcc >=14 - - munkres - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - unicodedata2 >=15.1.0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/fonttools?source=hash-mapping - run_exports: {} - size: 3045399 - timestamp: 1778770357867 -- conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda - sha256: d235ae7075642044ceb3d922ef2a710a82665755ac9bbb7e8dad7daa72bc6d87 - md5: 294fb524171e2a2748cb7fe708aba826 - depends: - - __glibc >=2.17,<3.0.a0 - - brotli - - libgcc >=14 - - munkres - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - unicodedata2 >=15.1.0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/fonttools?source=hash-mapping - run_exports: {} - size: 3007892 - timestamp: 1778770568019 -- conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py313h3dea7bd_0.conda - sha256: e0029a390d7aef29bd6e7c12a3759f5e0b989930b5781e544ca9bac0abcd8442 - md5: ae83c999b4cfc4c171ce88b99c8b43cc - depends: - - __glibc >=2.17,<3.0.a0 - - brotli - - libgcc >=14 - - munkres - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - license: MIT - license_family: MIT - purls: - - pkg:pypi/fonttools?source=hash-mapping - run_exports: {} - size: 2995315 - timestamp: 1778770432258 -- conda: https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-2.0.0-h0f4f740_0.conda - sha256: 7c1439c589983a6d76b5acaafe55437dd942ae21dc970e497ee0a3270fdd8a0d - md5: 7b2f4089fcf4cf6aa43ff932daee8c8b - depends: - - gfortran 15.* - license: BSD-3-Clause - license_family: BSD - run_exports: {} - size: 6970 - timestamp: 1786642183826 -- conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda - sha256: 612a8e0c1a6ecae23da54d81ef395f6ebb5c8e4468ec2611593ebce75876a4e0 - md5: 2d0ea23b23603e07ca47f23f949f67b6 - depends: - - libfreetype 2.14.3 ha770c72_2 - - libfreetype6 2.14.3 h5e6c136_2 - license: GPL-2.0-only OR FTL - purls: [] - run_exports: - weak: - - libfreetype >=2.14.3 - - libfreetype6 >=2.14.3 - size: 175239 - timestamp: 1786641011029 -- conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_1.conda - sha256: 4846a3ca0402f3fe33ad84ed50ab213c6aafde4a0faef3c5002f6bf753e21671 - md5: 1cd10eda5692519d01bb20e086e214c9 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: LGPL-2.1-or-later - purls: [] - run_exports: - weak: - - fribidi >=1.0.16,<2.0a0 - size: 61782 - timestamp: 1785912528684 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gau2grid-2.0.9-hb03c661_0.conda - sha256: 57ac4e23fb9f00a2bfa46b440ce59149cd7a7b9ac087c90fbffe4257bd30670d - md5: ae90ff1c1f7c8926efd50550a2bac5d1 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: BSD-3-Clause - license_family: BSD - run_exports: - weak: - - gau2grid >=2.0.9,<3.0a0 - size: 341855 - timestamp: 1779306560098 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-14.4.0-hc6a0c74_2.conda - sha256: 8e4ff1c338403013c089054b5b30a0fbc514a7e78e1249a9d6589b226d2106db - md5: 12c98c5c7eadc1390e44047c9731fbc3 - depends: - - conda-gcc-specs - - gcc_impl_linux-64 14.4.0 h43a9cce_2 - license: BSD-3-Clause - license_family: BSD - run_exports: {} - size: 29252 - timestamp: 1787165087122 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.3.0-hc6a0c74_2.conda - sha256: 4c11622edb45bc8d2e800855f26889d38a7b4eadb821ac882e6e0c18984ecd70 - md5: 2e8c3ca00c9c575714debbc5be362228 - depends: - - conda-gcc-specs - - gcc_impl_linux-64 15.3.0 hc4b3cbe_2 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: {} - size: 29177 - timestamp: 1787165397247 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.4.0-h43a9cce_2.conda - sha256: 1d2be290396c943c5e3032bf6782aac1ee8b84aa89b0668c397fe558306528b3 - md5: f9a7dc579faf2574f10e8ea8c6f00a2b - depends: - - binutils_impl_linux-64 >=2.46.1 - - libgcc >=14.4.0 - - libgcc-devel_linux-64 14.4.0 hd9a9cd0_102 - - libgomp >=14.4.0 - - libsanitizer 14.4.0 hf39dbba_2 - - libstdcxx >=14.4.0 - - libstdcxx-devel_linux-64 14.4.0 ha5b54cb_102 - - sysroot_linux-64 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - run_exports: {} - size: 79490811 - timestamp: 1787164897978 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.3.0-hc4b3cbe_2.conda - sha256: c382b7b3ddd1a9b27be82f7a797692fc4e475c7877c00eae3f1983ef398a4105 - md5: 2de9eba901339428a9759e341a621b02 - depends: - - binutils_impl_linux-64 >=2.46.1 - - libgcc >=15.3.0 - - libgcc-devel_linux-64 15.3.0 h2b852eb_102 - - libgomp >=15.3.0 - - libsanitizer 15.3.0 h54950a5_2 - - libstdcxx >=15.3.0 - - libstdcxx-devel_linux-64 15.3.0 hb2c5482_102 - - sysroot_linux-64 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - run_exports: {} - size: 82897730 - timestamp: 1787165185363 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.4.0-hc469d41_1.conda - sha256: c0e265a5781bdf88ae6fcf488b0f12d729a09dbf8139e3f42bc5b1fa7d0cdea4 - md5: e166437b6cf4f824d732da823dc70f15 - depends: - - gcc_impl_linux-64 14.4.0.* - - binutils_linux-64 - - sysroot_linux-64 - license: BSD-3-Clause - license_family: BSD - run_exports: - strong: - - libgcc >=14 - size: 29787 - timestamp: 1787166213180 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.3.1-h54a6638_0.conda - sha256: f7026323ac769ef432c747a6c22abd39c583d0d4f6985a7100fb371e2167f214 - md5: 04be12e7dd050aaf364ece2393988e85 - depends: - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - gflags >=2.3.1,<2.4.0a0 - size: 130991 - timestamp: 1785044715896 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-15.3.0-hc6a0c74_2.conda - sha256: 7a920741e867e21273d4f3a25c67fce97994db6f688257c7d41a388a7d151f75 - md5: 424384a4eefff6fa74d1e82a6e362176 - depends: - - conda-gcc-specs - - gcc 15.3.0 hc6a0c74_2 - - gcc_impl_linux-64 15.3.0 hc4b3cbe_2 - - gfortran_impl_linux-64 15.3.0 h27ced10_2 - license: BSD-3-Clause - license_family: BSD - run_exports: {} - size: 28660 - timestamp: 1787165416390 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-15.3.0-h27ced10_2.conda - sha256: 68bc8d6a60824a7f197bfb3a42c3c7e253856484335c6b5c273d77c9d4d57b42 - md5: 8add62141ed67d2e37234a99c7b903cd - depends: - - gcc_impl_linux-64 >=15.3.0 - - libgcc >=15.3.0 - - libgfortran5 >=15.3.0 - - libstdcxx >=15.3.0 - - sysroot_linux-64 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - run_exports: {} - size: 20629333 - timestamp: 1787165326082 -- conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hb7133d2_1.conda - sha256: f24feeda3aeec3a2cbb9fe2e0fabc4785372e70b6cc838c96023e08e17f4bfa0 - md5: 6941f96b8a8056677d79b4f5a2c4aaca - depends: - - __glibc >=2.17,<3.0.a0 - - gflags >=2.3.0,<2.4.0a0 - - libgcc >=14 - - libstdcxx >=14 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - glog >=0.7.1,<0.8.0a0 - size: 149031 - timestamp: 1784094370091 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda - sha256: f36c336efc874f346a53a9011f67e997f9faac505562cc18c13b6d399cfe61c7 - md5: 576e32739f323438bf69ab006c21be7b - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - license: GPL-2.0-or-later OR LGPL-3.0-or-later - purls: [] - run_exports: - weak: - - gmp >=6.3.0,<7.0a0 - size: 493498 - timestamp: 1786629164954 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py311hbc40be8_0.conda - sha256: 0c3fbef9e0f1f3049c2d74c4b3801b135ab95a8ef0b3c421c883e0158f3b07e8 - md5: d9772193877442b8eeb63b56b81882f3 - depends: - - python - - __glibc >=2.17,<3.0.a0 - - libgcc >=15 - - mpc >=1.4.0,<2.0a0 - - gmp >=6.3.0,<7.0a0 - - mpfr >=4.2.2,<5.0a0 - - python_abi 3.11.* *_cp311 - license: LGPL-3.0-or-later - license_family: LGPL - purls: - - pkg:pypi/gmpy2?source=compressed-mapping - run_exports: {} - size: 312441 - timestamp: 1787066347085 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda - sha256: 8f1abde65e50bf2f30292442a5388bf962f8275bb1e23a0fe8fbdc83b8b5a241 - md5: 96a25063461871ac66728ecfa645116c - depends: - - python - - __glibc >=2.17,<3.0.a0 - - libgcc >=15 - - mpfr >=4.2.2,<5.0a0 - - gmp >=6.3.0,<7.0a0 - - python_abi 3.12.* *_cp312 - - mpc >=1.4.0,<2.0a0 - license: LGPL-3.0-or-later - license_family: LGPL - purls: - - pkg:pypi/gmpy2?source=compressed-mapping - run_exports: {} - size: 327022 - timestamp: 1787066358050 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py313ha4a6282_0.conda - sha256: fe8326323cece1ef063541047f7cd98754eaa26f68ab271e07227932f0aa3817 - md5: ab774b6526899f7f9816efeb02372c0f - depends: - - python - - libgcc >=15 - - __glibc >=2.17,<3.0.a0 - - gmp >=6.3.0,<7.0a0 - - mpfr >=4.2.2,<5.0a0 - - mpc >=1.4.0,<2.0a0 - - python_abi 3.13.* *_cp313 - license: LGPL-3.0-or-later - license_family: LGPL - purls: - - pkg:pypi/gmpy2?source=compressed-mapping - run_exports: {} - size: 327580 - timestamp: 1787066358811 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gnutls-3.8.13-h18acefa_0.conda - sha256: dbdbb714064914281c755650bc54e1855412e7e2f4c99ad171b5123ed704b2b1 - md5: 7c3de21891993e89aabdadaa603ed835 - depends: - - __glibc >=2.17,<3.0.a0 - - gmp >=6.3.0,<7.0a0 - - libgcc >=14 - - libidn2 >=2,<3.0a0 - - libstdcxx >=14 - - libtasn1 >=4.21.0,<5.0a0 - - nettle >=3.10.1,<3.11.0a0 - - p11-kit >=0.26.2,<0.27.0a0 - license: LGPL-2.1-or-later - license_family: LGPL - purls: [] - run_exports: - weak: - - gnutls >=3.8.13,<3.9.0a0 - size: 2054535 - timestamp: 1778044634746 -- conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda - sha256: 7fa3b6a9c081fa3e545573152a788d061a0a0ba57df7251cc0f4f75225fc93e7 - md5: f9fe2984587fa8235a6af6004760cd18 - depends: - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - libgcc >=14 - license: LGPL-2.0-or-later - license_family: LGPL - purls: [] - run_exports: - weak: - - graphite2 >=1.3.15,<2.0a0 - size: 102835 - timestamp: 1786118485753 -- conda: https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.5.5-py312h8285ef7_0.conda - sha256: dd501d5a23203ce6d770044270c46e132973c7f8aa515a6dd097a11bb2e5a800 - md5: ddf5a875fe09a244a1f64329272bdc32 - depends: - - python - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - python_abi 3.12.* *_cp312 - license: MIT - license_family: MIT - purls: - - pkg:pypi/greenlet?source=compressed-mapping - run_exports: {} - size: 275998 - timestamp: 1786384044080 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-14.4.0-hc6a0c74_2.conda - sha256: e6d549dd5e7ca6d9ae96bb392d15d8deb59f65abb5941ad428ac0b54df940f40 - md5: caa273a3e6c6307c458ec10c334eac81 - depends: - - conda-gcc-specs - - gcc 14.4.0 hc6a0c74_2 - - gxx_impl_linux-64 14.4.0 hc436dd5_2 - license: BSD-3-Clause - license_family: BSD - run_exports: {} - size: 28602 - timestamp: 1787165125929 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.3.0-hc6a0c74_2.conda - sha256: 4ff389e11dccb2d3878117cfebd81eed3b895f012b6b6f8f76533186856c5843 - md5: 30bd36698068619cc30878a902d510b8 - depends: - - conda-gcc-specs - - gcc 15.3.0 hc6a0c74_2 - - gxx_impl_linux-64 15.3.0 h90d9265_2 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: {} - size: 28680 - timestamp: 1787165434030 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.4.0-hc436dd5_2.conda - sha256: aa2ab28228a0dfd403c0d043d451bcde08bb44606859491d8af39e9cfadedaa4 - md5: fc88a73822f9430a3043f72b9a9eda12 - depends: - - gcc_impl_linux-64 14.4.0 h43a9cce_2 - - libstdcxx-devel_linux-64 14.4.0 ha5b54cb_102 - - sysroot_linux-64 - - tzdata - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - run_exports: {} - size: 15870837 - timestamp: 1787165058619 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.3.0-h90d9265_2.conda - sha256: 7171256b262155d3b5a70e6d9d6ce83e0ee2665541f6264b0caa064d0f852b90 - md5: f70ff80a9fbb8d542f4fb80e1207a771 - depends: - - gcc_impl_linux-64 15.3.0 hc4b3cbe_2 - - libstdcxx-devel_linux-64 15.3.0 hb2c5482_102 - - sysroot_linux-64 - - tzdata - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - run_exports: {} - size: 16251362 - timestamp: 1787165359149 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.4.0-he93183a_1.conda - sha256: cf55c19e7c413dcca673a15c473801528afa61945d01aeecfdb3c498e71e9695 - md5: 6116cf8d0380169c4bf0b9f045577c88 - depends: - - gxx_impl_linux-64 14.4.0.* - - gcc_linux-64 ==14.4.0 hc469d41_1 - - binutils_linux-64 - - sysroot_linux-64 - license: BSD-3-Clause - license_family: BSD - run_exports: - strong: - - libstdcxx >=14 - - libgcc >=14 - size: 28158 - timestamp: 1787166213180 -- conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py312hfaa9938_104.conda - sha256: 64e1d13bc0ec29fa416aeefac77283eea349f3ed2acfcfc513f0cacd30fbcf6d - md5: 9ca94eb30bd0938240f32b6e6398b862 - depends: - - __glibc >=2.17,<3.0.a0 - - cached-property - - hdf5 >=1.14.6,<1.14.7.0a0 - - libgcc >=15 - - numpy >=1.25,<3 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/h5py?source=compressed-mapping - run_exports: {} - size: 1353159 - timestamp: 1787108753979 -- conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_110.conda - sha256: ac57ce3abbda2a82d6192bc36fbd7fe96e867d84c999ef81a3da034dfd01a995 - md5: 9c6e11a83468e1d5decae516077a73fb - depends: - - __glibc >=2.17,<3.0.a0 - - libaec >=1.1.5,<2.0a0 - - libcurl >=8.20.0,<9.0a0 - - libgcc >=14 - - libgfortran - - libgfortran5 >=14.3.0 - - libstdcxx >=14 - - libzlib >=1.3.2,<2.0a0 - - openssl >=3.5.6,<4.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - hdf5 >=1.14.6,<1.14.7.0a0 - size: 3721555 - timestamp: 1780581675871 -- conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.2.0-mpi_openmpi_ha740f27_0.conda - sha256: 47c0fc2ac24fd147cb87f717a6ab65262500b999484da2aebcb10eb23b402e55 - md5: 586bfc3c774ec749364a3664d0f9ae52 - depends: - - __glibc >=2.17,<3.0.a0 - - aws-c-auth >=0.10.4,<0.10.5.0a0 - - aws-c-common >=0.14.3,<0.14.4.0a0 - - aws-c-http >=0.11.0,<0.11.1.0a0 - - aws-c-io >=0.27.5,<0.27.6.0a0 - - aws-c-s3 >=0.13.1,<0.13.2.0a0 - - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 - - libaec >=1.1.5,<2.0a0 - - libcurl >=8.21.0,<9.0a0 - - libgcc >=14 - - libgfortran - - libgfortran5 >=14.4.0 - - libstdcxx >=14 - - libzlib >=1.3.2,<2.0a0 - - openmpi >=5.0.10,<6.0a0 - - openssl >=3.5.7,<4.0a0 - license: BSD-3-Clause - license_family: BSD - run_exports: - weak: - - hdf5 >=2.2.0,<3.0a0 mpi_openmpi_* - size: 4773786 - timestamp: 1786234097711 -- conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.2.0-nompi_hc529623_100.conda - sha256: 786d126bfb33b923dd1341a92c2a3edd0ff5d0a71db8557fca9324ea4e93d677 - md5: 336f7fb9af0c49cc246e2cff0992c3c4 - depends: - - __glibc >=2.17,<3.0.a0 - - aws-c-auth >=0.10.4,<0.10.5.0a0 - - aws-c-common >=0.14.3,<0.14.4.0a0 - - aws-c-http >=0.11.0,<0.11.1.0a0 - - aws-c-io >=0.27.5,<0.27.6.0a0 - - aws-c-s3 >=0.13.1,<0.13.2.0a0 - - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 - - libaec >=1.1.5,<2.0a0 - - libcurl >=8.21.0,<9.0a0 - - libgcc >=14 - - libgfortran - - libgfortran5 >=14.4.0 - - libstdcxx >=14 - - libzlib >=1.3.2,<2.0a0 - - openssl >=3.5.7,<4.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - hdf5 >=2.2.0,<3.0a0 - size: 4250161 - timestamp: 1786233343747 -- conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda - noarch: python - sha256: dffdf5e74cafc6fa4a5cafed0e23f8ae9ff4a76b46b4bb70310ce0695f26c516 - md5: b1d8d3cf1190f6dadb8da304a053e307 - depends: - - python - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - _python_abi3_support 1.* - - cpython >=3.10 - - openssl >=3.5.7,<4.0a0 - constrains: - - __glibc >=2.17 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/hf-xet?source=hash-mapping - run_exports: {} - size: 3536864 - timestamp: 1784665043990 -- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda - sha256: 9f07834f0c546ab14d885ce0366285f61f44e326c0edd1fc63b8294e113ae432 - md5: 72a381cbad04f24b1c2a43ef707f45b4 - depends: - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - libgcc >=14 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - icu >=78.3,<79.0a0 - size: 14459115 - timestamp: 1786545741408 -- conda: https://conda.anaconda.org/conda-forge/linux-64/integratorxx-1.0.0-hb700be7_1.conda - sha256: 3e70c8eb5f9fdf02cc75d9c6005b3285966c7846bf9cc1bf5df8709955d37dc3 - md5: d7311515d0bb563aa093fc62fa9be7ec - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - license: BSD-3-Clause - license_family: BSD - run_exports: - weak: - - integratorxx >=1.0.0,<1.1.0a0 - size: 18630491 - timestamp: 1770929291184 -- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda - sha256: dd053c96dcb0dcfd59422aefea9d2fe937a190167f34fba7893ec1e10a7e8963 - md5: ba55d1b89fd7775e67de8291029b4059 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=15 - license: LGPL-2.1-or-later - purls: [] - run_exports: - weak: - - keyutils >=1.6.3,<2.0a0 - size: 135295 - timestamp: 1786739238128 -- conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py311h724c32c_0.conda - sha256: 3ff7e51c88f53f05e22ca5549e935d1ccb398665f6ec080a9c6a5c9e9b186b79 - md5: 3d82751e8d682068b58f049edc924ce4 - depends: - - python - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - python_abi 3.11.* *_cp311 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/kiwisolver?source=hash-mapping - run_exports: {} - size: 77967 - timestamp: 1773067041763 -- conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py312h0a2e395_0.conda - sha256: eec7654c2d68f06590862c6e845cc70987b6d6559222b6f0e619dea4268f5dd5 - md5: cd74a9525dc74bbbf93cf8aa2fa9eb5b - depends: - - python - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/kiwisolver?source=hash-mapping - run_exports: {} - size: 77120 - timestamp: 1773067050308 -- conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py313hc8edb43_0.conda - sha256: 0447d2901639f295989c5ccba7b1c367ed78b216e0d2705327a8c8a87a31177e - md5: b81883b9dbf5069821c2fb09a8ba1407 - depends: - - python - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - python_abi 3.13.* *_cp313 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/kiwisolver?source=hash-mapping - run_exports: {} - size: 76911 - timestamp: 1773067054809 -- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda - sha256: 2a5c38c85e63df84c4e69ee71439841ce570d259ae3060627bb9a49a938d66f4 - md5: 53318d715316929a574f83591308b1f8 - depends: - - __glibc >=2.17,<3.0.a0 - - keyutils >=1.6.3,<2.0a0 - - libedit >=3.1.20250104,<3.2.0a0 - - libedit >=3.1.20250104,<4.0a0 - - libgcc >=15 - - libstdcxx >=15 - - openssl >=3.5.7,<4.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - krb5 >=1.22.2,<1.23.0a0 - size: 1394333 - timestamp: 1786762112514 -- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_1.conda - sha256: 112b5b9462572d970f4abd2912f76a25ee7db158b1e7260163d91dd8a630db84 - md5: 8b3ce45e929cd8e8e5f4d18586b56d8b - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libjpeg-turbo >=3.1.4.1,<4.0a0 - - libtiff >=4.7.1,<4.8.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - lcms2 >=2.19.1,<3.0a0 - size: 251971 - timestamp: 1780211695895 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - sha256: 27d83f1188cd19bcb7754a078b3fa7f4cfb8527f8eb2fde54dd01fc529d1adec - md5: 449500f2c089da11c40f5c21312e3e07 - depends: - - __glibc >=2.17,<3.0.a0 - - zstd >=1.5.7,<1.6.0a0 - constrains: - - binutils_impl_linux-64 2.46.1 - license: GPL-3.0-only - license_family: GPL - purls: [] - run_exports: {} - size: 745303 - timestamp: 1784214507189 -- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda - sha256: bf9fdebf55d8bc99d83531cdffda00703f4dc5f93a1a956768c147362c72feda - md5: fb9d356b1a57d6d54768be7ebd5fce09 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - license: Apache-2.0 - license_family: Apache - purls: [] - run_exports: - weak: - - lerc >=4.2.0,<5.0a0 - size: 271158 - timestamp: 1785036167977 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda - sha256: 7bb3d495411b7059e85225aae500d84e7846a4bb02ebd77e4450200b20c180f0 - md5: 6983bfe8e09992014b9cf393769c7a84 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - constrains: - - abseil-cpp =20260526.0 - - libabseil-static =20260526.0=cxx17* - license: Apache-2.0 - license_family: Apache - purls: [] - run_exports: - weak: - - libabseil >=20260526.0,<20260527.0a0 - - libabseil =*=cxx17* - size: 1436888 - timestamp: 1787217011773 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda - sha256: 822e4ae421a7e9c04e841323526321185f6659222325e1a9aedec811c686e688 - md5: 86f7414544ae606282352fa1e116b41f - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - license: BSD-2-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libaec >=1.1.5,<2.0a0 - size: 36544 - timestamp: 1769221884824 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.9-gpl_h3152399_101.conda - sha256: bfae027a67d02325cd6b75edd60beb67cf24483af9df0ae9ef74d4438e41c806 - md5: 680520cff78a974d564cd99cdf5ec0b5 - depends: - - __glibc >=2.17,<3.0.a0 - - bzip2 >=1.0.8,<2.0a0 - - libgcc >=15 - - liblzma >=5.8.3,<6.0a0 - - libxml2 - - libxml2-16 >=2.15.3 - - libzlib >=1.3.2,<2.0a0 - - lz4-c >=1.10.0,<1.11.0a0 - - lzo >=2.10,<3.0a0 - - openssl >=3.5.7,<4.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: BSD-2-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libarchive >=3.8.9,<3.9.0a0 - size: 875346 - timestamp: 1787292369121 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-25.0.0-hcc2f0d9_4_cpu.conda - build_number: 4 - sha256: b3b92d94fa20d1d195de702c4b61cd0c3438d26672cbaf6ebbf021114a840a77 - md5: c344b5608c65a09b341f2e784efb4422 - depends: - - __glibc >=2.17,<3.0.a0 - - aws-crt-cpp >=0.40.1,<0.40.2.0a0 - - aws-sdk-cpp >=1.11.833,<1.11.834.0a0 - - azure-core-cpp >=1.16.3,<1.16.4.0a0 - - azure-identity-cpp >=1.13.3,<1.13.4.0a0 - - azure-storage-blobs-cpp >=12.18.0,<12.18.1.0a0 - - azure-storage-files-datalake-cpp >=12.16.0,<12.16.1.0a0 - - bzip2 >=1.0.8,<2.0a0 - - glog >=0.7.1,<0.8.0a0 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libbrotlidec >=1.2.0,<1.3.0a0 - - libbrotlienc >=1.2.0,<1.3.0a0 - - libgcc >=14 - - libgoogle-cloud >=3.8.0,<3.9.0a0 - - libgoogle-cloud-storage >=3.8.0,<3.9.0a0 - - libopentelemetry-cpp >=1.27.0,<1.28.0a0 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libstdcxx >=14 - - libzlib >=1.3.2,<2.0a0 - - lz4-c >=1.10.0,<1.11.0a0 - - orc >=2.3.1,<2.3.2.0a0 - - snappy >=1.2.2,<1.3.0a0 - - zstd >=1.5.7,<1.6.0a0 - constrains: - - apache-arrow-proc =*=cpu - - arrow-cpp <0.0a0 - - parquet-cpp <0.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - libarrow >=25.0.0,<25.1.0a0 - size: 6598422 - timestamp: 1786315080658 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-25.0.0-h635bf11_4_cpu.conda - build_number: 4 - sha256: 886631b6e32f62e04cc314462c0fbbf9d461cfb6625d2384ae0f36b5a8a72890 - md5: 64fad2fca810b34f5bbc9738a6fb298f - depends: - - __glibc >=2.17,<3.0.a0 - - libarrow 25.0.0 hcc2f0d9_4_cpu - - libarrow-compute 25.0.0 h53684a4_4_cpu - - libgcc >=14 - - libstdcxx >=14 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - libarrow-acero >=25.0.0,<25.1.0a0 - size: 590543 - timestamp: 1786315249993 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-25.0.0-h53684a4_4_cpu.conda - build_number: 4 - sha256: ad642502977edceeb4ca385e42f085fb4391c409d8d098866bc4a5e3fda7a04a - md5: 05f6b378ae80d2d06e35dc794412da3a - depends: - - __glibc >=2.17,<3.0.a0 - - libarrow 25.0.0 hcc2f0d9_4_cpu - - libgcc >=14 - - libre2-11 >=2025.11.5 - - libstdcxx >=14 - - libutf8proc >=2.11.3,<2.12.0a0 - - re2 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - libarrow-compute >=25.0.0,<25.1.0a0 - size: 2974934 - timestamp: 1786315141259 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-25.0.0-h635bf11_4_cpu.conda - build_number: 4 - sha256: 6715d36e6aaf00986876e67e97ae8e9b60afb2a7f52ab79b89543c37cd914e28 - md5: 26f7b996f0674217f78d5c6432445b71 - depends: - - __glibc >=2.17,<3.0.a0 - - libarrow 25.0.0 hcc2f0d9_4_cpu - - libarrow-acero 25.0.0 h635bf11_4_cpu - - libarrow-compute 25.0.0 h53684a4_4_cpu - - libgcc >=14 - - libparquet 25.0.0 h7376487_4_cpu - - libstdcxx >=14 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - libarrow-dataset >=25.0.0,<25.1.0a0 - size: 591131 - timestamp: 1786315326056 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-25.0.0-h66fbfdd_4_cpu.conda - build_number: 4 - sha256: 7478e785ad4b7aee72e685921d849b3fb11b0c477dfea76d9e861ee5056b35a6 - md5: 287c5915a8b8bf79613840e0df9dc7b7 - depends: - - __glibc >=2.17,<3.0.a0 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libarrow 25.0.0 hcc2f0d9_4_cpu - - libarrow-acero 25.0.0 h635bf11_4_cpu - - libarrow-dataset 25.0.0 h635bf11_4_cpu - - libgcc >=14 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libstdcxx >=14 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - libarrow-substrait >=25.0.0,<25.1.0a0 - size: 500255 - timestamp: 1786315353425 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-9_h5875eb1_mkl.conda - build_number: 9 - sha256: a8c8b832fb56469221612e1f33c1c01868146c85721966b663a35d4248121e7e - md5: 1c05815b5b3742a5f4398d94fec7aa11 - depends: - - mkl >=2026.1.0,<2027.0a0 - constrains: - - blas 2.309 mkl - - libcblas 3.11.0 9*_mkl - - liblapack 3.11.0 9*_mkl - - liblapacke 3.11.0 9*_mkl - track_features: - - blas_mkl - - blas_mkl_2 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libblas >=3.11.0,<4.0a0 - size: 18489 - timestamp: 1786058995640 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_3.conda - sha256: e5864f257f839ffc27d681659bac95901f524f602b9121e5dcc5e2df18437f2d - md5: 7a2499a177753582fb7ae7e9dc4a908a - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=15 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libbrotlicommon >=1.2.0,<1.3.0a0 - size: 80265 - timestamp: 1786622773969 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_3.conda - sha256: dad31b6d104973deb89710929a35651033aad692d4e7793cdb5b786a9bd54678 - md5: 6ab3315dc56618d652c1da42a648a129 - depends: - - __glibc >=2.17,<3.0.a0 - - libbrotlicommon 1.2.0 h39a168f_3 - - libgcc >=15 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libbrotlidec >=1.2.0,<1.3.0a0 - size: 34828 - timestamp: 1786622783405 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_3.conda - sha256: d37124d0f51816e7d5e3a94bfc9ed3d6174d077f9b4f832d20c5a08b52bebf1f - md5: 2ac965638d4c6b2b38383bb1aebaf543 - depends: - - __glibc >=2.17,<3.0.a0 - - libbrotlicommon 1.2.0 h39a168f_3 - - libgcc >=15 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libbrotlienc >=1.2.0,<1.3.0a0 - size: 298639 - timestamp: 1786622792145 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-h084b8d7_1.conda - sha256: 8cb25174d6b6fac95d31e86cfe41faffc8ee9dacbf2bfd22e6c23377e8f338c1 - md5: 5db514adf5f843126ff846d1510f22a4 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libcap >=2.78,<2.79.0a0 - size: 124306 - timestamp: 1786025967663 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-9_hfef963f_mkl.conda - build_number: 9 - sha256: 8ce1b4cdc6e0feb53c5f8e3cf69b1b2c034f5e2726a4027b2fa6feeb0e7fb93e - md5: cbdd209a7b8cef670cc50830428a3b9d - depends: - - libblas 3.11.0 9_h5875eb1_mkl - constrains: - - blas 2.309 mkl - - liblapack 3.11.0 9*_mkl - - liblapacke 3.11.0 9*_mkl - track_features: - - blas_mkl - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libcblas >=3.11.0,<4.0a0 - size: 18097 - timestamp: 1786059002112 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - sha256: fd1d153962764433fe6233f34a72cdeed5dcf8a883a85769e8295ce940b5b0c5 - md5: c965a5aa0d5c1c37ffc62dff36e28400 - depends: - - libgcc-ng >=9.4.0 - - libstdcxx-ng >=9.4.0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libcrc32c >=1.1.2,<1.2.0a0 - size: 20440 - timestamp: 1633683576494 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-12.9.2.10-h676940d_0.conda - sha256: 16666002786d59dd7d62ddbeffe08c4118d882c986c6bf72443c7f983c24fb0a - md5: 55dfb580a84aea59185586a306bf9605 - depends: - - __glibc >=2.28,<3.0.a0 - - cuda-nvrtc - - cuda-version >=12.9,<12.10.0a0 - - libgcc >=14 - - libstdcxx >=14 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 467672248 - timestamp: 1778771595911 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-13.6.0.2-h676940d_0.conda - sha256: d10ce5ea92af1cccc0ed4640506489762f273f2e40debaf6300be2c866f17e8b - md5: b94086b1a487ca78ec1836dfd4a3efca - depends: - - __glibc >=2.28,<3.0.a0 - - cuda-nvrtc - - cuda-version >=13.3,<13.4.0a0 - - libgcc >=14 - - libstdcxx >=14 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 384624985 - timestamp: 1782782999955 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-dev-12.9.2.10-h676940d_0.conda - sha256: 3a68ef147c0a7fdd59286e49c4dd1a03be9ea6180b12ee5324ecd555c17419bb - md5: 7f35376e196eecc81ffe97f63b2b7e3a - depends: - - __glibc >=2.28,<3.0.a0 - - cuda-crt-dev_linux-64 - - cuda-cudart-dev_linux-64 - - cuda-version >=12.9,<12.10.0a0 - - libcublas 12.9.2.10 h676940d_0 - - libgcc >=14 - - libstdcxx >=14 - constrains: - - libcublas-static >=12.9.2.10 - license: LicenseRef-NVIDIA-End-User-License-Agreement - run_exports: - weak: - - libcublas >=12.9.2.10,<13.0a0 - size: 94143 - timestamp: 1778772159259 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcudnn-9.10.2.21-hf7e9902_0.conda - sha256: dc6b89e874867b2cdf08224059bd1543cbb72ed646da177c1454596469c9a4bb - md5: a178a1f3642521f104ecceeefa138d01 - depends: - - __glibc >=2.28,<3.0.a0 - - cuda-nvrtc - - cuda-version >=12,<13.0a0 - - libcublas - - libgcc >=14 - - libstdcxx >=14 - - libzlib >=1.3.1,<2.0a0 - constrains: - - libcudnn-jit <0a - license: LicenseRef-cuDNN-Software-License-Agreement - purls: [] - run_exports: {} - size: 526823453 - timestamp: 1762823414388 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcudnn-9.25.0.15-ha4b6413_0.conda - sha256: af030c58c1f3c4e0613d56d3a3095e0fb3d1f845ecc0844684b16727b991d95b - md5: da6ca95b4f3a9e2931e05327e0f1736d - depends: - - __glibc >=2.28,<3.0.a0 - - cuda-nvrtc - - cuda-version >=13,<14.0a0 - - libcublas - - libgcc >=14 - - libstdcxx >=14 - - libzlib >=1.3.2,<2.0a0 - constrains: - - libcudnn-jit <0a - license: LicenseRef-cuDNN-Software-License-Agreement - purls: [] - run_exports: {} - size: 440351874 - timestamp: 1784705313152 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcudss-0.8.0.10-h58dd1b1_0.conda - sha256: ad5a8237c14c3c1aba2e6ff9020ff1cd0d031f776b82241f960ed3310d7583a2 - md5: 52613f228d68055019454080df15ee52 - depends: - - __glibc >=2.28,<3.0.a0 - - _openmp_mutex >=4.5 - - cuda-version >=12,<13.0a0 - - libcublas - - libgcc >=14 - - libstdcxx >=14 - constrains: - - libcudss-commlayer-mpi 0.8.0.10 h09b4041_0 - - libcudss0 <0.0.0a0 - - libcudss-commlayer-nccl 0.8.0.10 h1b17935_0 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 89804166 - timestamp: 1780355350170 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcudss-0.8.0.10-h7bcfba5_0.conda - sha256: 05c4f349df99636cae828489ce0f842bbbc7da0006ce4cf37b6d3d7433d06aef - md5: b993006a7f8c1f2d0e4adf1c9ac17201 - depends: - - __glibc >=2.28,<3.0.a0 - - _openmp_mutex >=4.5 - - cuda-version >=13,<14.0a0 - - libcublas - - libgcc >=14 - - libstdcxx >=14 - constrains: - - libcudss-commlayer-nccl 0.8.0.10 h84ff803_0 - - libcudss-commlayer-mpi 0.8.0.10 h6647138_0 - - libcudss0 <0.0.0a0 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 78215168 - timestamp: 1780355336257 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-11.4.1.4-hecca717_1.conda - sha256: 62d4214c182c89cfb02271a42eaac56a41f50bbbea3b0d795a8e33f167a39a4e - md5: 75ae571353ec92c8f34d4cf6ec6ba264 - depends: - - __glibc >=2.17,<3.0.a0 - - cuda-version >=12.9,<12.10.0a0 - - libgcc >=14 - - libstdcxx >=14 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 162080769 - timestamp: 1761098842719 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-12.3.0.29-hecca717_0.conda - sha256: bd69d4b63be28c36e0fa962256666672e3f2eff5dfc06bdd545acef278f83754 - md5: b347b9844eb16238c7f7b62cd2bd1e68 - depends: - - __glibc >=2.17,<3.0.a0 - - cuda-version >=13.3,<13.4.0a0 - - libgcc >=14 - - libstdcxx >=14 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 150951336 - timestamp: 1779897536120 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.14.1.1-hbc026e6_1.conda - sha256: 5fa43e8a8d335fc0c3a6aeb2e7b0debc7d8495b8a60a56ac30f23b0e852ab74a - md5: cab1818eada3952ed09c8dcbb7c26af7 - depends: - - __glibc >=2.17,<3.0.a0 - - cuda-version >=12.9,<12.10.0a0 - - libgcc >=14 - - libstdcxx >=14 - - rdma-core >=59.0 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 969845 - timestamp: 1761098818759 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.18.1.6-h053a66a_0.conda - sha256: 72b9c44d6d33c6d384ddaef755e717c781782cbcb32cfba454a8d8084f02ac55 - md5: 434bbefad502f7a9f7eaf7558c645d75 - depends: - - __glibc >=2.28,<3.0.a0 - - cuda-version >=13.3,<13.4.0a0 - - libgcc >=14 - - libstdcxx >=14 - - rdma-core >=63.0 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 1117538 - timestamp: 1782772352403 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.3.10.19-h676940d_1.conda - sha256: 3d40daf956b220cc367a6306ede1e259446fb844051bcfed87c46539cc1aaf03 - md5: 2a91559a9345bedf09af8b7903deb6e6 - depends: - - __glibc >=2.28,<3.0.a0 - - cuda-version >=12.9,<12.10.0a0 - - libgcc >=14 - - libstdcxx >=14 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 46221876 - timestamp: 1761098855347 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.4.3.29-h676940d_0.conda - sha256: 9a1615a44f0d01fcc23b4f1be4c8f86b2e19e3974481e826180dd261b67dcad6 - md5: 6172124b5a746cc1f3f9fc7fac9f6740 - depends: - - __glibc >=2.28,<3.0.a0 - - cuda-version >=13.3,<13.4.0a0 - - libgcc >=14 - - libstdcxx >=14 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 43805393 - timestamp: 1779897559895 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.21.0-ha042cf0_5.conda - sha256: 0b6cc13e36cf19ae9b764740112fc591682e189c99353be9f72f3d96ccf29d79 - md5: 0ed167049513943d078a6c997df2b4e0 - depends: - - __glibc >=2.17,<3.0.a0 - - krb5 >=1.22.2,<1.23.0a0 - - libgcc >=15 - - libnghttp2 >=1.68.1,<2.0a0 - - libpsl >=0.23.1,<0.24.0a0 - - libssh2 >=1.11.1,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - - openssl >=3.5.7,<4.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: curl - license_family: MIT - purls: [] - run_exports: - weak: - - libcurl >=8.21.0,<9.0a0 - size: 484517 - timestamp: 1787183722915 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-11.7.5.82-h676940d_2.conda - sha256: 8691cf6b1585cf6251663029e00485da5a912f6ca0ff7e5c31a6d8d604b29253 - md5: bb6e31a0daa64ede76fe8d3fff01c06f - depends: - - __glibc >=2.28,<3.0.a0 - - cuda-version >=12.9,<12.10.0a0 - - libcublas >=12.9.1.4,<12.10.0a0 - - libcusparse >=12.5.10.65,<12.6.0a0 - - libgcc >=14 - - libnvjitlink >=12.9.86,<13.0a0 - - libstdcxx >=14 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 205149446 - timestamp: 1761098826989 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-12.2.6.9-h676940d_0.conda - sha256: c72cb48bd4983527ec78972fcb982b197250d3f0144461a4500c4dde2da36af8 - md5: c2b24b3215b808a2b74d5a72f9af66b6 - depends: - - __glibc >=2.28,<3.0.a0 - - cuda-version >=13.3,<13.4.0a0 - - libcublas >=13.6.0.2,<13.7.0a0 - - libcusparse >=12.8.2.51,<12.9.0a0 - - libgcc >=14 - - libnvjitlink >=13.3.33,<14.0a0 - - libstdcxx >=14 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 197068627 - timestamp: 1782788745128 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.5.10.65-hecca717_2.conda - sha256: 7b511549a22df408d36dadbeabdfd9c35b124d9d6f000b29ffcbe4b38b7faeb7 - md5: 890ebfaad48c887d3d82847ec9d6bc79 - depends: - - __glibc >=2.17,<3.0.a0 - - cuda-version >=12.9,<12.10.0a0 - - libgcc >=14 - - libnvjitlink >=12.9.86,<13.0a0 - - libstdcxx >=14 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 208846028 - timestamp: 1761069913328 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.8.2.51-hecca717_0.conda - sha256: 23ed1ae0414d204615fece50c58a80462193c08b4da6f177a4a134447c62efff - md5: 0ee8865db10f700dd542ac18126d0cbb - depends: - - __glibc >=2.17,<3.0.a0 - - cuda-version >=13.3,<13.4.0a0 - - libgcc >=14 - - libnvjitlink >=13.3.33,<14.0a0 - - libstdcxx >=14 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 145373224 - timestamp: 1782772363943 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-dev-12.5.10.65-hecca717_2.conda - sha256: c6d7ec3ccef6dce988c3acc93198973ec9ff5aa9ffe99e07dd953c2d3b409a3b - md5: db94469fbd554c107acc3afd0af5d8ec - depends: - - __glibc >=2.17,<3.0.a0 - - cuda-version >=12.9,<12.10.0a0 - - libcusparse 12.5.10.65 hecca717_2 - - libgcc >=14 - - libnvjitlink >=12.9.86,<13.0a0 - - libstdcxx >=14 - constrains: - - libcusparse-static >=12.5.10.65 - license: LicenseRef-NVIDIA-End-User-License-Agreement - run_exports: - weak: - - libcusparse >=12.5.10.65,<13.0a0 - size: 52779 - timestamp: 1761070300821 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda - sha256: 82e134c8a08b1eed9a2ed8ab578b89aa1730dcde3dea8dd87645ed0637878e54 - md5: 40f9b31aa9cf007789867df0decd0492 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libdeflate >=1.25,<1.26.0a0 - size: 73710 - timestamp: 1785908694612 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda - sha256: 6473eb8caf2aae830f37caa93db9b26dddf7ac84b63229e8bf7fc0e5c3ab95b0 - md5: 50708d3b951d0f8e2d7f2df5b5edc040 - depends: - - ncurses - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - ncurses >=6.6,<7.0a0 - license: BSD-2-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libedit >=3.1.20250104,<3.2.0a0 - size: 135098 - timestamp: 1786616658086 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda - sha256: e4418f68d01a6307c4431b585c71b584f40189877364e542ee87deb777f5e85b - md5: 7bc31538d6e3fb349e897353969237ec - depends: - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - license: BSD-2-Clause OR GPL-2.0-or-later - license_family: GPL - purls: [] - run_exports: - weak: - - libev >=4.33,<4.34.0a0 - size: 43220 - timestamp: 1785917328200 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - sha256: 2e14399d81fb348e9d231a82ca4d816bf855206923759b69ad006ba482764131 - md5: a1cfcc585f0c42bf8d5546bb1dfb668d - depends: - - libgcc-ng >=12 - - openssl >=3.1.1,<4.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libevent >=2.1.12,<2.1.13.0a0 - size: 427426 - timestamp: 1685725977222 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - sha256: 16feffd9ddbbe5b718515d38ee376c685ba95491cd901244e24671d20b952a77 - md5: b24d3c612f71e7aa74158d92106318b2 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - constrains: - - expat 2.8.1.* - license: MIT - license_family: MIT - purls: [] - run_exports: {} - size: 77856 - timestamp: 1781203599810 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libfabric-2.6.0-ha770c72_0.conda - sha256: 45bb0eb92000a3f82555cc948013935aace8a1ea522b79700f58d3906c18e846 - md5: b04e60c49d09399a009f3bb70bb53a23 - depends: - - libfabric1 2.6.0 h6b3ec72_0 - license: BSD-2-Clause OR GPL-2.0-only - license_family: BSD - run_exports: {} - size: 14365 - timestamp: 1782364120544 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libfabric1-2.6.0-h6b3ec72_0.conda - sha256: ba8de6a838bc0727ef8e5a1409c6735465b7b582627a9b4c2704126e53903f43 - md5: 7d8c510157360d0a6fdd84a1d3db8de7 - depends: - - __glibc >=2.28,<3.0.a0 - - libgcc >=14 - - libnl >=3.11.0,<4.0a0 - - rdma-core >=63.0 - license: BSD-2-Clause OR GPL-2.0-only - license_family: BSD - run_exports: {} - size: 734920 - timestamp: 1782364119825 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h3435931_0.conda - sha256: ac38603008bf1e99b8ed379b1a656a67a70e2841f2b6a069c630cdf6316012d2 - md5: 0abe40a9880086ca4d2e5daf09dceff9 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libffi >=3.7.0,<3.8.0a0 - size: 67576 - timestamp: 1783520858222 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda - sha256: fb12ecb46c30d18d928c0e8fc346ab13b5f6fc8a9cacae4f2f4bb188782586f5 - md5: f8054e759d0ddddaf34a5c8fedc900a1 - depends: - - libfreetype6 >=2.14.3 - license: GPL-2.0-only OR FTL - purls: [] - run_exports: {} - size: 8407 - timestamp: 1786641007099 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda - sha256: ec607dd5445dd17ff6bf8b7fe6832e5504c226dd91d3aaea7ba83569808b0ce4 - md5: b72a266a9317036fd0464cb98b027cd0 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=15 - - libpng >=1.6.58,<1.7.0a0 - - libzlib >=1.3.2,<2.0a0 - constrains: - - freetype >=2.14.3 - license: GPL-2.0-only OR FTL - purls: [] - run_exports: {} - size: 387671 - timestamp: 1786641006460 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_2.conda - sha256: 4b733b68027a638fd24a38aaed1ebb05e055bef694970fab745b1c7678ca16f1 - md5: b230041fd4acdd1127ef5870174310ef - depends: - - __glibc >=2.17,<3.0.a0 - - _openmp_mutex >=4.5 - constrains: - - libgcc-ng ==16.1.0=*_2 - - libgomp 16.1.0 he0feb66_2 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - run_exports: {} - size: 1056637 - timestamp: 1787165351282 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.1.0-h69a702a_2.conda - sha256: 23bfa3ade2de6e0b9af4a04cacd0d4d526c80a16686f264498475339f01d17d3 - md5: be5ca38a4a2ddfda85ad7aae7d67238a - depends: - - libgcc 16.1.0 ha9f2e26_2 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - run_exports: - strong: - - libgcc - size: 28293 - timestamp: 1787165356218 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.1.0-h69a702a_2.conda - sha256: f608de89b2579d0e3ffa748476ad50e26ef3f9adf9ebbb619db679663cbf88ac - md5: 85c8f13b26afe335c9df928995f56683 - depends: - - libgfortran5 16.1.0 h79bb938_2 - constrains: - - libgfortran-ng ==16.1.0=*_2 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - run_exports: {} - size: 28257 - timestamp: 1787165383846 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.1.0-h79bb938_2.conda - sha256: 627b865f5ba4da4d5508e90453d9419f28ed8a72f8577086681b589cf9579fab - md5: 60fe1556f159aad832acef6bf8a5102d - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=16.1.0 - constrains: - - libgfortran 16.1.0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - run_exports: {} - size: 2538899 - timestamp: 1787165364214 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-h45c3219_1.conda - sha256: 4499458124bcf0bd45e8bd17576f9f007cb1373cb3b01659105443f522bab45c - md5: 533cb021c1bfeba9f720e669cd863fdf - depends: - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - pcre2 >=10.47,<10.48.0a0 - - libzlib >=1.3.2,<2.0a0 - - libiconv >=1.18,<2.0a0 - - libffi >=3.7.0,<3.8.0a0 - constrains: - - glib >2.66 - license: LGPL-2.1-or-later - purls: [] - run_exports: - weak: - - libglib >=2.88.3,<3.0a0 - size: 4755172 - timestamp: 1786457663614 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_2.conda - sha256: 7d4d1891d5fe5d75a73dd7268e8f2d7c11b7b637dea901a429f8056511960267 - md5: 583bc8fce86ce542fa9a25c5b4d71e80 - depends: - - __glibc >=2.17,<3.0.a0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - run_exports: - strong: - - _openmp_mutex >=4.5 - size: 640468 - timestamp: 1787165281830 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.8.0-hbc29df5_0.conda - sha256: 46126b858d173d6808262e39e3a8aa39946d39aebb5ffb720984dc44f74feafe - md5: 60ff8935e16bf2fd302289ec4f129df8 - depends: - - __glibc >=2.17,<3.0.a0 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libcurl >=8.21.0,<9.0a0 - - libgcc >=14 - - libgrpc >=1.82.1,<1.83.0a0 - - libopentelemetry-cpp >=1.27.0,<1.28.0a0 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libstdcxx >=14 - - openssl >=3.5.7,<4.0a0 - constrains: - - libgoogle-cloud 3.8.0 *_0 - license: Apache-2.0 - license_family: Apache - purls: [] - run_exports: - weak: - - libgoogle-cloud >=3.8.0,<3.9.0a0 - size: 2663465 - timestamp: 1786226759530 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.8.0-hdbdcf42_0.conda - sha256: 03437ce50129f9ca82a0400b7722cd2dd3ee3bfa50dcb557657f55a7de76ab6f - md5: 84a8d5a661792da2127ab908b5ae83ef - depends: - - __glibc >=2.17,<3.0.a0 - - libabseil - - libcrc32c >=1.1.2,<1.2.0a0 - - libcurl - - libgcc >=14 - - libgoogle-cloud 3.8.0 hbc29df5_0 - - libstdcxx >=14 - - libzlib >=1.3.2,<2.0a0 - - openssl - license: Apache-2.0 - license_family: Apache - purls: [] - run_exports: - weak: - - libgoogle-cloud-storage >=3.8.0,<3.9.0a0 - size: 810573 - timestamp: 1786226867433 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.82.1-h792040b_0.conda - sha256: 1e657c1b802c111178bc1845fe06488db5f69a85e34e970ce0989810aa562d45 - md5: aa4571fc3bcf18ad12370429aa991223 - depends: - - __glibc >=2.17,<3.0.a0 - - c-ares >=1.34.6,<2.0a0 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libgcc >=14 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libre2-11 >=2025.11.5 - - libstdcxx >=14 - - libzlib >=1.3.2,<2.0a0 - - openssl >=3.5.7,<4.0a0 - - re2 - constrains: - - grpc-cpp =1.82.1 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - libgrpc >=1.82.1,<1.83.0a0 - size: 6957755 - timestamp: 1783588701960 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.3.1-h23af247_0.conda - sha256: a4eac5a21b84e0fc753b72de01781f634fc9ab70fd32a28d6a40a19700c9188a - md5: 29709e61096dd490fff9e833e4c869f6 - depends: - - __glibc >=2.17,<3.0.a0 - - cairo >=1.18.4,<2.0a0 - - graphite2 >=1.3.15,<2.0a0 - - icu >=78.3,<79.0a0 - - libfreetype >=2.14.3 - - libfreetype6 >=2.14.3 - - libgcc >=15 - - libglib >=2.88.3,<3.0a0 - - libpng >=1.6.58,<1.7.0a0 - - libstdcxx >=15 - - libzlib >=1.3.2,<2.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: {} - size: 1353639 - timestamp: 1786970872936 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda - sha256: 5041d295813dfb84652557839825880aae296222ab725972285c5abe3b6e4288 - md5: c197985b58bc813d26b42881f0021c82 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - - libxml2 - - libxml2-16 >=2.14.6 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libhwloc >=2.13.0,<2.13.1.0a0 - size: 2436378 - timestamp: 1770953868164 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda - sha256: f943117edb9cd4d9c61cc972eee5a34291dc55ea7a6e9e38da104995841cbcb6 - md5: f92233bf33e24a25668bb2119e2c51f9 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=15 - license: LGPL-2.1-only - purls: [] - run_exports: - weak: - - libiconv >=1.18,<2.0a0 - size: 789471 - timestamp: 1787033836207 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.8-hfac485b_1.conda - sha256: cc38c900b9a20fe75e61cbb594e749c57a06d96510722f5ddfa309682062b065 - md5: 842a81de672ddcf476337c8bde3cad33 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libunistring >=0,<1.0a0 - license: LGPL-2.0-only - license_family: LGPL - purls: [] - run_exports: - weak: - - libidn2 >=2,<3.0a0 - size: 139036 - timestamp: 1760385590993 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda - sha256: bba8538e6538ed58a8479b332337b96986561f975d06cfa2039a016c2d246ee4 - md5: 898d1c9793eaa52efc4727bd84d2e39a - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - constrains: - - jpeg <0.0.0a - license: IJG AND BSD-3-Clause AND Zlib - purls: [] - run_exports: - weak: - - libjpeg-turbo >=3.2.0,<4.0a0 - size: 650434 - timestamp: 1785896381946 -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-9_h5e43f62_mkl.conda - build_number: 9 - sha256: 3060d9393e7013a192eb55354def1a522348baa57c3ce4dc9cb904bf392a9ac1 - md5: 255025c2d2df85b72c9ab3105f7611e4 - depends: - - libblas 3.11.0 9_h5875eb1_mkl - constrains: - - blas 2.309 mkl - - libcblas 3.11.0 9*_mkl - - liblapacke 3.11.0 9*_mkl - track_features: - - blas_mkl - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - liblapack >=3.11.0,<3.12.0a0 - size: 18128 - timestamp: 1786059007914 -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda - sha256: 9787df8c22a59c9a70d3e5a10db9ad663485e75e9ccc3f09bd092cb7b95e0dab - md5: 1390b7c5ac0b1d8e447bc5efa6d3c8c2 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - constrains: - - xz 5.8.3.* - license: 0BSD - purls: [] - run_exports: - weak: - - liblzma >=5.8.3,<6.0a0 - size: 112995 - timestamp: 1786348617826 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libmagma-2.10.0-ha7672b3_0.conda - sha256: e324b70b74495c00f582dc89cda6676963b4685ffefca0facfd6e3e8635f8258 - md5: 21cfdc5459decaca16af5e00aa6addb1 - depends: - - __glibc >=2.17,<3.0.a0 - - _openmp_mutex >=4.5 - - cuda-cudart - - cuda-version >=12,<13.0a0 - - libblas >=3.9.0,<4.0a0 - - libcublas - - libcusparse - - libgcc >=14 - - liblapack >=3.9.0,<4.0a0 - - libstdcxx >=14 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: {} - size: 545950720 - timestamp: 1773083369944 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libmagma-2.10.0-hd93470c_0.conda - sha256: 07607cffe1f53a5e405e29c897bfcad800f3c71b2a57ed7502a0ef82a60edc78 - md5: d9e0e4dbf5aff16fb804e6a656fc73bc - depends: - - __glibc >=2.28,<3.0.a0 - - _openmp_mutex >=4.5 - - cuda-cudart - - cuda-version >=13,<14.0a0 - - libblas >=3.9.0,<4.0a0 - - libcublas - - libcusparse - - libgcc >=14 - - liblapack >=3.9.0,<4.0a0 - - libstdcxx >=14 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: {} - size: 272468878 - timestamp: 1773078724253 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libmagma-devel-2.10.0-he75a2d3_0.conda - sha256: 2c50db4aa333248953357e2199f939e2544acba3949bfd6545fef19f7e9f9d00 - md5: a1afafd9341494fe4141ce7b18abc997 - depends: - - __glibc >=2.17,<3.0.a0 - - _openmp_mutex >=4.5 - - cuda-version >=12,<13.0a0 - - libgcc >=14 - - libmagma 2.10.0 ha7672b3_0 - - libmagma_sparse 2.10.0 ha954185_0 - - libstdcxx >=14 - license: BSD-3-Clause - license_family: BSD - run_exports: - weak: - - libmagma >=2.10.0,<2.10.1.0a0 - - libmagma_sparse >=2.10.0,<2.10.1.0a0 - size: 91653 - timestamp: 1773084448607 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libmagma_sparse-2.10.0-ha954185_0.conda - sha256: ecdafdc4386615af7957713e55248eec2accca1bc82dadaa697504ae02380b19 - md5: 2cbf43fa83563cf704dd16d5c763b9fb - depends: - - __glibc >=2.17,<3.0.a0 - - _openmp_mutex >=4.5 - - cuda-cudart - - cuda-version >=12,<13.0a0 - - libcusparse - - libgcc >=14 - - liblapack >=3.9.0,<4.0a0 - - libmagma 2.10.0 ha7672b3_0 - - libstdcxx >=14 - license: BSD-3-Clause - license_family: BSD - run_exports: {} - size: 5775086 - timestamp: 1773084415509 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libmicrohttpd-1.0.10-hc2fc477_0.conda - sha256: 2c27ceb7c159ee3d6ea8b333dfc8d7bede5d8bfd325df677d4c292e24a0dd7dc - md5: 4e01a1886e86ee32a5cbdb354d56d86f - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - gnutls >=3.8.13,<3.9.0a0 - license: LGPL-2.0-or-later - license_family: LGPL - purls: [] - run_exports: - weak: - - libmicrohttpd >=1.0.10,<1.1.0a0 - size: 303021 - timestamp: 1786366467972 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_2.conda - sha256: 46820b4a835e175940ae20bec00fdddaff804cda27a1408ab1b95e77a2196437 - md5: fcfed1dc5053eb1901b66e7b1fc32588 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: BSD-2-Clause - license_family: BSD - purls: [] - run_exports: {} - size: 92759 - timestamp: 1786650399772 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda - sha256: 11a2f54a6f391e25738bce0023e6ef499600147bbcf21c1fa69d2e251b03cc6a - md5: 75d211f04ac87506f1f43420712a69fe - depends: - - __glibc >=2.17,<3.0.a0 - - c-ares >=1.34.8,<2.0a0 - - libev >=4.33,<4.34.0a0 - - libev >=4.33,<5.0a0 - - libgcc >=15 - - libstdcxx >=15 - - libzlib >=1.3.2,<2.0a0 - - openssl >=3.5.7,<4.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libnghttp2 >=1.68.1,<2.0a0 - size: 649974 - timestamp: 1787177490105 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb03c661_1.conda - sha256: d0f2fd77aad83641c11bc3686bac677e99869f1d62b99e5064c9d99af8bfde6a - md5: eeaf53e3c9593d63ffee5ad97182858e - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: LGPL-2.1-or-later - license_family: LGPL - purls: [] - run_exports: - weak: - - libnl >=3.11.0,<4.0a0 - size: 735004 - timestamp: 1787038268022 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - sha256: 927fe72b054277cde6cb82597d0fcf6baf127dcbce2e0a9d8925a68f1265eef5 - md5: d864d34357c3b65a4b731f78c0801dc4 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - license: LGPL-2.1-only - license_family: GPL - purls: [] - run_exports: - weak: - - libnsl >=2.0.1,<2.1.0a0 - size: 33731 - timestamp: 1750274110928 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.9.86-hecca717_2.conda - sha256: 3b1c851f4fc42d347ce1c1606bdd195343a47f121e0fceb7a1f1e5aa1d497da9 - md5: 3461b0f2d5cbb7973d361f9e85241d98 - depends: - - __glibc >=2.17,<3.0.a0 - - cuda-version >=12,<12.10.0a0 - - libgcc >=14 - - libstdcxx >=14 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 30515495 - timestamp: 1760723776293 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-13.3.33-hecca717_0.conda - sha256: f5d0aed3cfb504239fac6e03e994f36c34725acba5382adc516cbfdd6993a959 - md5: 2795538ca415afd5d35aec7c6cd2e385 - depends: - - __glibc >=2.17,<3.0.a0 - - cuda-version >=13,<13.4.0a0 - - libgcc >=14 - - libstdcxx >=14 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 31168008 - timestamp: 1779897778168 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvptxcompiler-dev-12.9.86-ha770c72_2.conda - sha256: 1e7a7b34f8639a5feb75ba864127059e4d83edfe1a516547f0dbb9941e7b8f8b - md5: 3fd926c321c6dbf386aa14bd8b125bfb - depends: - - cuda-version >=12.9,<12.10.0a0 - - libnvptxcompiler-dev_linux-64 12.9.86 ha770c72_2 - license: LicenseRef-NVIDIA-End-User-License-Agreement - run_exports: {} - size: 27046 - timestamp: 1753975516342 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.27.0-h3133023_1.conda - sha256: 8f9281133322e9eb0bd4a5b11330db1c14f3b40c409639dd3805251151ca52e2 - md5: f749f223bede1bac7724e49d686ac598 - depends: - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libcurl >=8.21.0,<9.0a0 - - libgrpc >=1.82.0,<1.83.0a0 - - libopentelemetry-cpp-headers 1.27.0 ha770c72_1 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libzlib >=1.3.2,<2.0a0 - - nlohmann_json - - prometheus-cpp >=1.3.0,<1.4.0a0 - constrains: - - cpp-opentelemetry-sdk =1.27.0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - libopentelemetry-cpp >=1.27.0,<1.28.0a0 - size: 948783 - timestamp: 1783133058845 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.27.0-ha770c72_1.conda - sha256: 31349543e3c59c64f17e24494939a22b0e1d611bdb19d98d115775dba423cbf7 - md5: 6cc68cbbe88746be8beaf027d6c64ad3 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: {} - size: 394726 - timestamp: 1783133038109 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-25.0.0-h7376487_4_cpu.conda - build_number: 4 - sha256: dba948e05d62de3833caa065c1b7de960f921bb0a8a7687b8593df95d2d925a9 - md5: d736a4f89a3b63f9970152923e4c3016 - depends: - - __glibc >=2.17,<3.0.a0 - - libarrow 25.0.0 hcc2f0d9_4_cpu - - libgcc >=14 - - libstdcxx >=14 - - libthrift >=0.22.0,<0.22.1.0a0 - - openssl >=3.5.7,<4.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - libparquet >=25.0.0,<25.1.0a0 - size: 1412634 - timestamp: 1786315223543 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libpmix-5.0.8-h31fc519_4.conda - sha256: 2837759fb832ab8587622602531f8e4b5d5e5ec12ea9b3936be06f384b933800 - md5: bd15ae3916a0cbe005c683bbc33811b7 - depends: - - __glibc >=2.17,<3.0.a0 - - libevent >=2.1.12,<2.1.13.0a0 - - libgcc >=14 - - libhwloc >=2.13.0,<2.13.1.0a0 - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD - run_exports: - weak: - - libpmix >=5.0.8,<6.0a0 - size: 731098 - timestamp: 1770962978877 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda - sha256: c19eefb87d70d9b4b0629fa48414a155a47a1be4f04583ae71ed8c5a9a32fdcb - md5: fcf71c8d979148873f6f8ad4cfc73d86 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=15 - - libzlib >=1.3.2,<2.0a0 - license: zlib-acknowledgement - purls: [] - run_exports: - weak: - - libpng >=1.6.58,<1.7.0a0 - size: 316643 - timestamp: 1786616563127 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h2840a7c_2.conda - sha256: b5ac3938186516c1091b96414c34f90255da2a3bbd736a0712b22bbf4b5ebf02 - md5: 729db8acaadb9a5e5bb2dc3d9ac84ae4 - depends: - - __glibc >=2.17,<3.0.a0 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libgcc >=14 - - libstdcxx >=14 - - libzlib >=1.3.2,<2.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libprotobuf >=7.35.1,<7.35.2.0a0 - size: 3774596 - timestamp: 1783168720126 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda - sha256: 09e8effdc89bc5d021349318d32b85594f5b8d8e3ab8f90a85b81f8fe695a566 - md5: 77be60417aa572afcb48cbe0f967401d - depends: - - libstdcxx >=15 - - libgcc >=15 - - __glibc >=2.17,<3.0.a0 - - icu >=78.3,<79.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libpsl >=0.23.1,<0.24.0a0 - size: 72519 - timestamp: 1786970753847 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda - sha256: ab3ccb9fd5816f76b18ee8974d359cd2605ca87d8ddef55369dc461b9986f95c - md5: 3ac89a48d224409739dbf6200e524373 - depends: - - libgcc >=14 - - __glibc >=2.28,<3.0.a0 - - fribidi >=1.0.16,<2.0a0 - - libfreetype >=2.14.3 - - libfreetype6 >=2.14.3 - - libharfbuzz >=14.2.1 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libraqm >=0.11.0,<0.12.0a0 - size: 33983 - timestamp: 1784850267262 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h60473fc_2.conda - sha256: 43132eb45a569b1f63199b0e7d5874d94227e9be950b327a323e7dcc1f8cd58c - md5: ee5c400d37b79db5d32a69ed1a79fc0b - depends: - - __glibc >=2.17,<3.0.a0 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libgcc >=14 - - libstdcxx >=14 - constrains: - - re2 2025.11.05.* - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libre2-11 >=2025.11.5 - size: 210598 - timestamp: 1781312565737 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.4.0-hf39dbba_2.conda - sha256: 45af2969331b13cc4ecac68eade0d292c0a206a9f77ccdc24688bc776c5a2e78 - md5: 27417f63dafe0bc8cd0ee6605a5d6904 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14.4.0 - - libstdcxx >=14.4.0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - run_exports: - weak: - - libsanitizer 14.4.0 - size: 7990414 - timestamp: 1787164854305 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.3.0-h54950a5_2.conda - sha256: bb52105077f1f33a786553c99a9383d136b3b4107b5b2d4f3acbe4aa421e6ebd - md5: f89a221ad0f43b35353f2454d6e30fa4 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=15.3.0 - - libstdcxx >=15.3.0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - run_exports: - weak: - - libsanitizer 15.3.0 - size: 7711175 - timestamp: 1787165140540 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.22-hebe6cf0_2.conda - sha256: 7454c6a7cf27033757f2895bc5e3941fe27604506edd62cf6bc00e50ab015a43 - md5: 42c585f153c17b790cd01f01553d24a1 - depends: - - libgcc >=15 - - __glibc >=2.17,<3.0.a0 - license: ISC - purls: [] - run_exports: - weak: - - libsodium >=1.0.22,<1.0.23.0a0 - size: 269985 - timestamp: 1787225747011 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda - sha256: f20d70da54e5b31dd4a51fb1efeaafafd5ab6dd8d7ac9d1438eaa2526ac4ed3d - md5: e72bbec309c2b0f37823ee7d4fabfcd3 - depends: - - __glibc >=2.17,<3.0.a0 - - icu >=78.3,<79.0a0 - - libgcc >=15 - - libzlib >=1.3.2,<2.0a0 - license: blessing - purls: [] - run_exports: - weak: - - libsqlite >=3.53.4,<4.0a0 - size: 974348 - timestamp: 1787051145557 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda - sha256: 7e463000fa1cba3f3a6597b776f6ab301d425a96e3bc20d0d9d76a3b9f237aa3 - md5: 5c526561e1d2a2e071941174eae84557 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libzlib >=1.3.2,<2.0a0 - - openssl >=3.5.7,<4.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libssh2 >=1.11.1,<2.0a0 - size: 306045 - timestamp: 1786713107897 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_2.conda - sha256: af96a5fcf1ce0659d257ababc1b8d0bbb698250e8140c6b8352f60d3be075392 - md5: d4883ac53b4074ca17e5c567bb8008f1 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc 16.1.0 ha9f2e26_2 - constrains: - - libstdcxx-ng ==16.1.0=*_2 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - run_exports: {} - size: 6630263 - timestamp: 1787165375778 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.1.0-hdf11a46_2.conda - sha256: f096fb41c6ad3ef41c479ebce001329a531e0862c9a88979203597b610383158 - md5: 8531022ddd724933da9dc3d426a5ad9d - depends: - - libstdcxx 16.1.0 h934c35e_2 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - run_exports: - strong: - - libstdcxx - size: 28339 - timestamp: 1787165409751 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda - sha256: 2293884d59cf0436c37fc0a4bad71011a8de2a6913610d1c701a7703377c1f75 - md5: ea0da9c20bbb221b530810c3c68bbe62 - depends: - - __glibc >=2.17,<3.0.a0 - - libcap >=2.78,<2.79.0a0 - - libgcc >=14 - license: LGPL-2.1-or-later - purls: [] - run_exports: {} - size: 493022 - timestamp: 1780084748140 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libtasn1-4.21.0-hb03c661_1.conda - sha256: 566a9d39a9a89ee0ef7cb8ab36de0ab9f01b74039347cab727179da32fb44168 - md5: e9268f0d59cc7559d0e910b402cd437a - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: LGPL-2.1-or-later - purls: [] - run_exports: - weak: - - libtasn1 >=4.21.0,<5.0a0 - size: 119260 - timestamp: 1785905789773 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda - sha256: af6025aa4a4fc3f4e71334000d2739d927e2f678607b109ec630cc17d716918a - md5: b6e326fbe1e3948da50ec29cee0380db - depends: - - __glibc >=2.17,<3.0.a0 - - libevent >=2.1.12,<2.1.13.0a0 - - libgcc >=14 - - libstdcxx >=14 - - libzlib >=1.3.2,<2.0a0 - - openssl >=3.5.6,<4.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - libthrift >=0.22.0,<0.22.1.0a0 - size: 423861 - timestamp: 1777018957474 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-h9d88235_0.conda - sha256: b31346e1c01ab40a170e91147092ee8fd92b1dee3c66ee47ef025571c879b159 - md5: c1fcb4a88bc15a9f77ad8d27d7af1df9 - depends: - - __glibc >=2.17,<3.0.a0 - - lerc >=4.1.0,<5.0a0 - - libdeflate >=1.25,<1.26.0a0 - - libgcc >=14 - - libjpeg-turbo >=3.1.4.1,<4.0a0 - - liblzma >=5.8.3,<6.0a0 - - libstdcxx >=14 - - libwebp-base >=1.6.0,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: HPND - purls: [] - run_exports: - weak: - - libtiff >=4.7.2,<4.8.0a0 - size: 452337 - timestamp: 1783084902636 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.12.1-cpu_mkl_h4f7e408_100.conda - sha256: 7e3c58fffa49da11b2dd388b0031d7d28632b36591d658881bedf57c69ac93d8 - md5: 00e6cb69159e94d2fc13848ce4453e7e - depends: - - __glibc >=2.17,<3.0.a0 - - _openmp_mutex * *_llvm - - _openmp_mutex >=4.5 - - fmt >=12.1.0,<12.2.0a0 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libblas * *mkl - - libcblas >=3.11.0,<4.0a0 - - libgcc >=14 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libstdcxx >=14 - - libuv >=1.52.1,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - - llvm-openmp >=22.1.8 - - mkl >=2026.0.0,<2027.0a0 - - onednn >=3.12,<4.0a0 - - pybind11-abi 11 - - sleef >=3.9.0,<4.0a0 - constrains: - - pytorch-gpu <0.0a0 - - pytorch 2.12.1 cpu_mkl_*_100 - - pytorch-cpu 2.12.1 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libtorch >=2.12.1,<2.13.0a0 - size: 61888662 - timestamp: 1781832531047 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.12.1-cuda129_mkl_h6b8258c_300.conda - sha256: ae90e59cf0ab0d4122a3f80999f9b2d4e6af79f096e1c216c38b0b9d44822b0c - md5: d1a067294e26b7d467afce8f7502e6c0 - depends: - - __glibc >=2.17,<3.0.a0 - - _openmp_mutex * *_llvm - - _openmp_mutex >=4.5 - - cuda-cudart >=12.9.79,<13.0a0 - - cuda-cupti >=12.9.79,<13.0a0 - - cuda-nvrtc >=12.9.86,<13.0a0 - - cuda-nvtx >=12.9.79,<13.0a0 - - cuda-version >=12.9,<13 - - fmt >=12.1.0,<12.2.0a0 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libblas * *mkl - - libcblas >=3.11.0,<4.0a0 - - libcublas >=12.9.2.10,<13.0a0 - - libcudnn >=9.10.2.21,<10.0a0 - - libcudss >=0.8.0.10,<0.8.1.0a0 - - libcufft >=11.4.1.4,<12.0a0 - - libcufile >=1.14.1.1,<2.0a0 - - libcurand >=10.3.10.19,<11.0a0 - - libcusolver >=11.7.5.82,<12.0a0 - - libcusparse >=12.5.10.65,<13.0a0 - - libgcc >=14 - - libmagma >=2.10.0,<2.10.1.0a0 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libstdcxx >=14 - - libuv >=1.52.1,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - - llvm-openmp >=22.1.8 - - mkl >=2026.0.0,<2027.0a0 - - nccl >=2.28.9.1,<3.0a0 - - onednn >=3.12,<4.0a0 - - pybind11-abi 11 - - sleef >=3.9.0,<4.0a0 - constrains: - - pytorch-cpu <0.0a0 - - pytorch-gpu 2.12.1 - - pytorch 2.12.1 cuda129_mkl_*_300 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libtorch >=2.12.1,<2.13.0a0 - size: 814422440 - timestamp: 1781846404264 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda - sha256: 5c2eecda8a606b5616b724633b395d5adfb1aa5302356a13e36030b6b11fe237 - md5: ade0fe2ec049a598697733b3acff1de5 - depends: - - __glibc >=2.17,<3.0.a0 - - _openmp_mutex * *_llvm - - _openmp_mutex >=4.5 - - fmt >=12.1.0,<12.2.0a0 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libblas * *mkl - - libcblas >=3.11.0,<4.0a0 - - libgcc >=14 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libstdcxx >=14 - - libuv >=1.52.1,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - - llvm-openmp >=22.1.8 - - mkl >=2026.1.0,<2027.0a0 - - onednn >=3.12,<4.0a0 - - pybind11-abi 11 - - sleef >=3.9.0,<4.0a0 - constrains: - - pytorch 2.13.0 cpu_mkl_*_102 - - pytorch-cpu 2.13.0 - - pytorch-gpu <0.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libtorch >=2.13.0,<2.14.0a0 - size: 60881910 - timestamp: 1786374025450 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cuda129_mkl_h546cc0b_302.conda - sha256: a05d4ff057bfe85262d395f8dca895d3c6cdbcb7f3334cb72adda3a0bf101e93 - md5: d1dbed3b67f32b9ed8ed68afa823f0e1 - depends: - - __glibc >=2.17,<3.0.a0 - - _openmp_mutex * *_llvm - - _openmp_mutex >=4.5 - - cuda-cudart >=12.9.79,<13.0a0 - - cuda-cupti >=12.9.79,<13.0a0 - - cuda-nvrtc >=12.9.86,<13.0a0 - - cuda-nvtx >=12.9.79,<13.0a0 - - cuda-version >=12.9,<13 - - fmt >=12.1.0,<12.2.0a0 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libblas * *mkl - - libcblas >=3.11.0,<4.0a0 - - libcublas >=12.9.2.10,<13.0a0 - - libcudnn >=9.10.2.21,<10.0a0 - - libcudss >=0.8.0.10,<0.8.1.0a0 - - libcufft >=11.4.1.4,<12.0a0 - - libcufile >=1.14.1.1,<2.0a0 - - libcurand >=10.3.10.19,<11.0a0 - - libcusolver >=11.7.5.82,<12.0a0 - - libcusparse >=12.5.10.65,<13.0a0 - - libgcc >=14 - - libmagma >=2.10.0,<2.10.1.0a0 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libstdcxx >=14 - - libuv >=1.52.1,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - - llvm-openmp >=22.1.8 - - mkl >=2026.1.0,<2027.0a0 - - nccl >=2.28.9.1,<3.0a0 - - onednn >=3.12,<4.0a0 - - pybind11-abi 11 - - sleef >=3.9.0,<4.0a0 - constrains: - - pytorch 2.13.0 cuda129_mkl_*_302 - - pytorch-cpu <0.0a0 - - pytorch-gpu 2.13.0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libtorch >=2.13.0,<2.14.0a0 - size: 817463992 - timestamp: 1786387590848 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cuda130_mkl_h1ca3d63_302.conda - sha256: d390d36fd6ee32439be5bb1d35aed8b2ca95113026c442bae8a6e2ea747c37b3 - md5: 80e67870a03be265d5836884309719ec - depends: - - __glibc >=2.28,<3.0.a0 - - _openmp_mutex * *_llvm - - _openmp_mutex >=4.5 - - cuda-cudart >=13.0.96,<14.0a0 - - cuda-cupti >=13.0.85,<14.0a0 - - cuda-nvrtc >=13.0.88,<14.0a0 - - cuda-nvtx >=13.0.85,<14.0a0 - - cuda-version >=13.0,<14 - - fmt >=12.1.0,<12.2.0a0 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libblas * *mkl - - libcblas >=3.11.0,<4.0a0 - - libcublas >=13.1.1.3,<14.0a0 - - libcudnn >=9.25.0.15,<10.0a0 - - libcudss >=0.8.0.10,<0.8.1.0a0 - - libcufft >=12.0.0.61,<13.0a0 - - libcufile >=1.15.1.6,<2.0a0 - - libcurand >=10.4.0.35,<11.0a0 - - libcusolver >=12.0.4.66,<13.0a0 - - libcusparse >=12.6.3.3,<13.0a0 - - libgcc >=14 - - libmagma >=2.10.0,<2.10.1.0a0 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libstdcxx >=14 - - libuv >=1.52.1,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - - llvm-openmp >=22.1.8 - - mkl >=2026.1.0,<2027.0a0 - - nccl >=2.30.7.1,<3.0a0 - - onednn >=3.12,<4.0a0 - - pybind11-abi 11 - - sleef >=3.9.0,<4.0a0 - constrains: - - pytorch 2.13.0 cuda130_mkl_*_302 - - pytorch-cpu <0.0a0 - - pytorch-gpu 2.13.0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libtorch >=2.13.0,<2.14.0a0 - size: 479595790 - timestamp: 1786383738092 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda - sha256: 287d05680e49eea51b8145fbf34bc213c0618b04f32e450e9da5d715e5134e38 - md5: 89e5671a076d99516a6acd72a35b1640 - depends: - - __glibc >=2.17,<3.0.a0 - - libcap >=2.78,<2.79.0a0 - - libgcc >=14 - license: LGPL-2.1-or-later - purls: [] - run_exports: {} - size: 145969 - timestamp: 1780084753104 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2 - sha256: e88c45505921db29c08df3439ddb7f771bbff35f95e7d3103bf365d5d6ce2a6d - md5: 7245a044b4a1980ed83196176b78b73a - depends: - - libgcc-ng >=9.3.0 - license: GPL-3.0-only OR LGPL-3.0-only - purls: [] - run_exports: - weak: - - libunistring >=0,<1.0a0 - size: 1433436 - timestamp: 1626955018689 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.8.3-h65a8314_0.conda - sha256: 71c8b9d5c72473752a0bb6e91b01dd209a03916cb71f36cc6a564e3a2a132d7a - md5: e179a69edd30d75c0144d7a380b88f28 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libunwind >=1.8.3,<1.9.0a0 - size: 75995 - timestamp: 1757032240102 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda - sha256: ecbf4b7520296ed580498dc66a72508b8a79da5126e1d6dc650a7087171288f9 - md5: 1247168fe4a0b8912e3336bccdbf98a5 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libutf8proc >=2.11.3,<2.12.0a0 - size: 85969 - timestamp: 1768735071295 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - sha256: 9b1bdce27a7e31f7d241aeecff67a1f3101d52a2b1e33ccc2cdf2613072bf81f - md5: 01bb81d12c957de066ea7362007df642 - depends: - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libuuid >=2.42.2,<3.0a0 - size: 40017 - timestamp: 1781625522462 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda - sha256: 67761d0206f84140047a367eaf9befe03a7e157a29ee25aee0047b40801cc6b6 - md5: 01c4ed87826af55996768af6dbc936b4 - depends: - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libuv >=1.52.1,<2.0a0 - size: 420040 - timestamp: 1785914567661 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda - sha256: 8415001414f488c85b72b9d8cc2071dfb3981a47bc3c8eb56ef91a57d12eae7f - md5: 9332b53d0ea93c5d39e33be03a0c611a - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - constrains: - - libwebp 1.6.0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libwebp-base >=1.6.0,<2.0a0 - size: 428430 - timestamp: 1785954557217 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxc-c-7.1.2-cpu_h75f4f88_1.conda - sha256: b204274eb762cb9aae04b92fe8d20d5ce451362b897f9228565f9198e86924cf - md5: d54b9f01eba491269056eb844126d157 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: MPL-2.0 - license_family: Other - run_exports: - weak: - - libxc-c >=7.1.2,<8.0a0 cpu_* - size: 18978014 - timestamp: 1786132038968 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_1.conda - sha256: ce25a1efa85a78a3ce3b16721d9c36153814adbf2fb004a15f72ec69894b4cb1 - md5: 64e856c420205b009da26471d3ac161d - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=15 - - pthread-stubs - - xorg-libxau >=1.0.12,<2.0a0 - - xorg-libxdmcp >=1.1.5,<2.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libxcb >=1.17.0,<2.0a0 - size: 397355 - timestamp: 1787077466600 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda - sha256: f7e9292dd219a6435bbb1223da9586c3e70d66d169c5a92f08db3f2127df04e9 - md5: f7a7ff5a6ab331e037abd34f379a631d - depends: - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - license: LGPL-2.1-or-later - purls: [] - run_exports: - weak: - - libxcrypt >=4.4.38 - size: 101957 - timestamp: 1785887123445 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda - sha256: 087d4de023f22d6a28b9e1b818961dd41e9bda6e9793590600ff16ca150bf9cb - md5: 20e4d67ec908f0405124f11612c48305 - depends: - - __glibc >=2.17,<3.0.a0 - - icu >=78.3,<79.0a0 - - libgcc >=14 - - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.3,<6.0a0 - - libzlib >=1.3.2,<2.0a0 - constrains: - - libxml2 2.15.3 - license: MIT - license_family: MIT - purls: [] - run_exports: {} - size: 559721 - timestamp: 1787237579170 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda - sha256: a16a576a5844a3a0e1cdfc5e162b9fe9c64dccf6a93f44c293bb42851aebe2b4 - md5: 2d34cdb31014cbc8f1e9384c89ede0a5 - depends: - - __glibc >=2.17,<3.0.a0 - - icu >=78.3,<79.0a0 - - libgcc >=14 - - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.3,<6.0a0 - - libxml2-16 2.15.3 hca6bf5a_1 - - libzlib >=1.3.2,<2.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libxml2 - - libxml2-16 >=2.15.3 - size: 46203 - timestamp: 1787237584107 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - sha256: eb8a0db0aa570124f7d2a93d7c7f596e3390df5e047818d873baad32985fc736 - md5: 0de0122d9570a8ab637c6b73db268389 - depends: - - __glibc >=2.17,<3.0.a0 - constrains: - - zlib 1.3.2 *_3 - license: Zlib - license_family: Other - purls: [] - run_exports: - weak: - - libzlib >=1.3.2,<2.0a0 - size: 63713 - timestamp: 1785362952714 -- conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.8-h3206bd6_1.conda - sha256: cf74ea3b6c8f0c01ae3cea10ff9451e4475eb39ee99a2c0f1f1627630ef888e5 - md5: dc2ace17c0da02fbb8273e139f84e7ce - depends: - - __glibc >=2.17,<3.0.a0 - constrains: - - intel-openmp <0.0a0 - - openmp 22.1.8|22.1.8.* - license: Apache-2.0 WITH LLVM-exception - purls: [] - run_exports: - strong: - - llvm-openmp >=22.1.8 - - _openmp_mutex >=4.5 - - _openmp_mutex * *_llvm - size: 6112252 - timestamp: 1787293213024 -- conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-hee9eb32_2.conda - sha256: b8c0e930183e6b7f83cd35ace102f2b8c2f0faae41dc05255dc72f247dfc556a - md5: e38a3253d72ab07d471483f24947e2a2 - depends: - - libgcc >=15 - - libstdcxx >=15 - - __glibc >=2.17,<3.0.a0 - license: BSD-2-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - lz4-c >=1.10.0,<1.11.0a0 - size: 181812 - timestamp: 1786717122815 -- conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-hebe6cf0_1003.conda - sha256: a0a1400198e5302d8367f2ed53437ee3cc41dbc463cb481921ce765578780b7a - md5: 10e0aa58ed390ba598b728badf9eb1b7 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=15 - license: GPL-2.0-or-later - license_family: GPL - purls: [] - run_exports: - weak: - - lzo >=2.10,<3.0a0 - size: 191573 - timestamp: 1787049167898 -- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py311h3778330_1.conda - sha256: 710e207b2e91308a34bcfe547c60ad86c1fa294827266ba18548c1fe1a9d8333 - md5: f9efdf9b0f3d0cc309d56af6edf2a6b0 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - constrains: - - jinja2 >=3.0.0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/markupsafe?source=hash-mapping - run_exports: {} - size: 26756 - timestamp: 1772445078834 -- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda - sha256: 5f3aad1f3a685ed0b591faad335957dbdb1b73abfd6fc731a0d42718e0653b33 - md5: 93a4752d42b12943a355b682ee43285b - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - constrains: - - jinja2 >=3.0.0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/markupsafe?source=hash-mapping - run_exports: {} - size: 26057 - timestamp: 1772445297924 -- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_1.conda - sha256: 72ed7c0216541d65a17b171bf2eec4a3b81e9158d8ed48e59e1ecd3ae302d263 - md5: aeb9b9da79fd0258b3db091d1fefcd71 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - constrains: - - jinja2 >=3.0.0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/markupsafe?source=hash-mapping - run_exports: {} - size: 26100 - timestamp: 1772445154165 -- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py311he401cf6_2.conda - sha256: f9f48162f2553080d041b061b9f6cfec64d79d7c40df0e6379496f9ad2df738c - md5: f602c096988d0f744f4f017aa0269e30 - depends: - - __glibc >=2.17,<3.0.a0 - - contourpy >=1.0.1 - - cycler >=0.10 - - fonttools >=4.28.2 - - freetype - - kiwisolver >=1.3.1 - - libfreetype >=2.14.3 - - libfreetype6 >=2.14.3 - - libgcc >=14 - - libraqm >=0.11.0,<0.12.0a0 - - libstdcxx >=14 - - numpy >=1.23,<3 - - numpy >=1.25 - - packaging >=20.0 - - pillow >=9 - - pyparsing >=3 - - python >=3.11,<3.12.0a0 - - python-dateutil >=2.7 - - python_abi 3.11.* *_cp311 - - qhull >=2020.2,<2020.3.0a0 - - tk >=8.6.13,<8.7.0a0 - license: PSF-2.0 - license_family: PSF - purls: - - pkg:pypi/matplotlib?source=hash-mapping - run_exports: {} - size: 8925010 - timestamp: 1785211062689 -- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py312h4c94fcb_2.conda - sha256: 8596841a7adf2ff135a7d3a5266727d7a562046f998e8edf9c568a0b20de7ddd - md5: 97eb87f2704fc5212a05b5fb6202ace0 - depends: - - __glibc >=2.17,<3.0.a0 - - contourpy >=1.0.1 - - cycler >=0.10 - - fonttools >=4.28.2 - - freetype - - kiwisolver >=1.3.1 - - libfreetype >=2.14.3 - - libfreetype6 >=2.14.3 - - libgcc >=14 - - libraqm >=0.11.0,<0.12.0a0 - - libstdcxx >=14 - - numpy >=1.25 - - numpy >=1.25,<3 - - packaging >=20.0 - - pillow >=9 - - pyparsing >=3 - - python >=3.12,<3.13.0a0 - - python-dateutil >=2.7 - - python_abi 3.12.* *_cp312 - - qhull >=2020.2,<2020.3.0a0 - - tk >=8.6.13,<8.7.0a0 - license: PSF-2.0 - license_family: PSF - purls: - - pkg:pypi/matplotlib?source=hash-mapping - run_exports: {} - size: 8931979 - timestamp: 1785211134185 -- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py313h134213a_2.conda - sha256: 40e7f144d6a1df2372b7a8b8b42d7f03bcb236dfcb053c32030f9b1635c8f429 - md5: 2c99937357c9476a1f5dc5ecd08d0c75 - depends: - - __glibc >=2.17,<3.0.a0 - - contourpy >=1.0.1 - - cycler >=0.10 - - fonttools >=4.28.2 - - freetype - - kiwisolver >=1.3.1 - - libfreetype >=2.14.3 - - libfreetype6 >=2.14.3 - - libgcc >=14 - - libraqm >=0.11.0,<0.12.0a0 - - libstdcxx >=14 - - numpy >=1.25 - - numpy >=1.25,<3 - - packaging >=20.0 - - pillow >=9 - - pyparsing >=3 - - python >=3.13,<3.14.0a0 - - python-dateutil >=2.7 - - python_abi 3.13.* *_cp313 - - qhull >=2020.2,<2020.3.0a0 - - tk >=8.6.13,<8.7.0a0 - license: PSF-2.0 - license_family: PSF - purls: - - pkg:pypi/matplotlib?source=hash-mapping - run_exports: {} - size: 9005023 - timestamp: 1785211111407 -- conda: https://conda.anaconda.org/conda-forge/linux-64/memray-1.19.3-py312ha9ecdfb_0.conda - sha256: ceca48bd96d989ae2b3694aaece1cde065ec7564a0dfeb5c1adf6369cfeecab9 - md5: bda01f82da732f19e18e8b60638654cd - depends: - - python - - rich >=11.2.0 - - jinja2 - - textual >=0.34.0 - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - python_abi 3.12.* *_cp312 - - lz4-c >=1.10.0,<1.11.0a0 - - libunwind >=1.8.3,<1.9.0a0 - - elfutils >=0.194,<0.195.0a0 - license: Apache-2.0 AND BSD-3-Clause - purls: - - pkg:pypi/memray?source=hash-mapping - run_exports: {} - size: 1839717 - timestamp: 1775683241839 -- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hecca717_244.conda - sha256: 0b903cfa21b1a3396b3468d41b8112d49a5bd7ff6642305791caca3af33fbaf2 - md5: 3575c034d908c0567c53ed6a33e9dfd9 - depends: - - __glibc >=2.17,<3.0.a0 - - _openmp_mutex * *_llvm - - _openmp_mutex >=4.5 - - libgcc >=14 - - libstdcxx >=14 - - llvm-openmp >=22.1.8 - - tbb >=2023.0.0 - license: LicenseRef-IntelSimplifiedSoftwareOct2022 - license_family: Proprietary - purls: [] - run_exports: {} - size: 143113179 - timestamp: 1786085943810 -- conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-he0a73b1_0.conda - sha256: c1fdeebc9f8e4f51df265efca4ea20c7a13911193cc255db73cccb6e422ae486 - md5: 770d00bf57b5599c4544d61b61d8c6c6 - depends: - - __glibc >=2.17,<3.0.a0 - - gmp >=6.3.0,<7.0a0 - - libgcc >=14 - - mpfr >=4.2.2,<5.0a0 - license: LGPL-3.0-or-later - license_family: LGPL - purls: [] - run_exports: - weak: - - mpc >=1.4.0,<2.0a0 - size: 100245 - timestamp: 1774472435333 -- conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda - sha256: 0be79ef2ee536e0c5d3ddb4a52bbae9f26d08560623299f33db2f4c4a17c525a - md5: 7dcc10f6c0bc3596d5519a710a84dfd4 - depends: - - __glibc >=2.17,<3.0.a0 - - gmp >=6.3.0,<7.0a0 - - libgcc >=15 - license: LGPL-3.0-only - license_family: LGPL - purls: [] - run_exports: - weak: - - mpfr >=4.2.2,<5.0a0 - size: 730409 - timestamp: 1787236218159 -- conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-2.3.1-py312h89dfda2_0.conda - sha256: a847cc47340a05221f801c62327e6d75d5745caa6d5a9f922338b9d2177def39 - md5: ff6c8866bb34fa7c26ca9303fc2d5f3b - depends: - - ast-serialize >=0.6.0,<1.0.0 - - mypy_extensions >=1.0.0 - - pathspec >=1.0.0 - - python - - python-librt >=0.13.0 - - typing_extensions >=4.6.0 - - psutil >=4.0 - - libgcc >=15 - - __glibc >=2.17,<3.0.a0 - - python_abi 3.12.* *_cp312 - license: MIT - license_family: MIT - purls: - - pkg:pypi/mypy?source=compressed-mapping - run_exports: {} - size: 23349566 - timestamp: 1786887238291 -- conda: https://conda.anaconda.org/conda-forge/linux-64/nccl-2.30.7.1-h1aa9b5a_0.conda - sha256: f92f617b266c24ce25766750ee45e326cbf572a97af41ca6ccb2d140f6c3859c - md5: d09e75d1fb0481ad255c74a23506696c - depends: - - __glibc >=2.28,<3.0.a0 - - cuda-version >=13,<14.0a0 - - libgcc >=14 - - libstdcxx >=14 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - nccl >=2.30.7.1,<3.0a0 - size: 239421791 - timestamp: 1781141768144 -- conda: https://conda.anaconda.org/conda-forge/linux-64/nccl-2.30.7.1-h4d09622_0.conda - sha256: 91d73a1f332970c69920cd51bd7fcb746ba427aebb5fd24993bb3fb0c32f8edc - md5: 07c134a9fd671b7666b3941b24056ec5 - depends: - - __glibc >=2.28,<3.0.a0 - - cuda-version >=12,<13.0a0 - - libgcc >=14 - - libstdcxx >=14 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - nccl >=2.30.7.1,<3.0a0 - size: 301391100 - timestamp: 1781142767879 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda - sha256: 5d46557214ed184381dafe835b7c94a474a1c3b307a08a250b1ea4779b44ffb3 - md5: ee6c0cd80a60961a1f48aa3e0b91f986 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: X11 AND BSD-3-Clause - purls: [] - run_exports: - weak: - - ncurses >=6.6,<7.0a0 - size: 911196 - timestamp: 1786355078102 -- conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.10.1-h5ef0d04_1.conda - sha256: 9f08df8a8d6660c4c5d8c810da2da2a5b099cd00ca30e1174be6d8df27a82120 - md5: 7b8f8d1226c95f61a51436a657c84770 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - gmp >=6.3.0,<7.0a0 - license: GPL-2.0-or-later OR LGPL-3.0-or-later - purls: [] - run_exports: - weak: - - nettle >=3.10.1,<3.11.0a0 - size: 1052171 - timestamp: 1787065085312 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda - sha256: 2b5f2e865122f9fc0637f520a7cb22e16b9727b2db6761ee16cb5e6404412c81 - md5: 2db7a395d7dc2b6ed5effaf68fb99443 - depends: - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - libgcc >=14 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: {} - size: 186767 - timestamp: 1786713048064 -- conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda - sha256: 8f8b554c74b032b3e63a8828fb0ecc7ae4f5c5a6bd0afcf75423d5ff79290cb0 - md5: fe93be7dd9209e6ae673962e3031ff51 - constrains: - - nlohmann_json-abi ==3.12.0 - license: MIT - license_family: MIT - purls: [] - run_exports: {} - size: 136372 - timestamp: 1785920438981 -- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py311h2e04523_0.conda - sha256: 8e8fb64c1a51282e8940d57d116aec54a4d66da59594973ae9c0b35d419b9a81 - md5: 5d4e35d7097b88c8b1455ef9f6ddf511 - depends: - - python - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - libblas >=3.9.0,<4.0a0 - - python_abi 3.11.* *_cp311 - - liblapack >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - constrains: - - numpy-base <0a0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/numpy?source=hash-mapping - run_exports: - weak: - - numpy >=1.23,<3 - size: 9389525 - timestamp: 1779169198155 -- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda - sha256: dfcbeadb3e7ad0da7a55a0525884ca34c19584154e13cc4159396b305d1bd445 - md5: 6e31d55ee1110fda83b4f4045f4d73ff - depends: - - python - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - liblapack >=3.9.0,<4.0a0 - - libblas >=3.9.0,<4.0a0 - - python_abi 3.12.* *_cp312 - - libcblas >=3.9.0,<4.0a0 - constrains: - - numpy-base <0a0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/numpy?source=hash-mapping - run_exports: - weak: - - numpy >=1.23,<3 - size: 8759520 - timestamp: 1779169200325 -- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py313hf6604e3_0.conda - sha256: 3740c9bc562db9c6f252f8697c5c7948bb48784346856f6d6308aba72ea4f00b - md5: a5fdb80595ec7912e6b1634b2abd4b50 - depends: - - python - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - libcblas >=3.9.0,<4.0a0 - - python_abi 3.13.* *_cp313 - - liblapack >=3.9.0,<4.0a0 - - libblas >=3.9.0,<4.0a0 - constrains: - - numpy-base <0a0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/numpy?source=hash-mapping - run_exports: - weak: - - numpy >=1.23,<3 - size: 8864096 - timestamp: 1779169199037 -- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.5.2-py312h33ff503_0.conda - sha256: 1235aaa0e265d7b0247fe6fb456a55f10f5fddf5349b652727fcdcdff4a26eb4 - md5: 3e15aca2584b6c69dc09ba2aa5ae1503 - depends: - - python - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - libgcc >=14 - - liblapack >=3.9.0,<4.0a0 - - libblas >=3.9.0,<4.0a0 - - python_abi 3.12.* *_cp312 - - libcblas >=3.9.0,<4.0a0 - constrains: - - numpy-base <0a0 - license: BSD-3-Clause - license_family: BSD - run_exports: - weak: - - numpy >=1.25,<3 - size: 8950985 - timestamp: 1786330619159 -- conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda - sha256: 0555c7f54e7192b30412cdb462adcf2151153c03fc9f20c0d6846a9381efea56 - md5: 1edfb47e2c1cce4978bbebc467999977 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - onednn >=3.12,<4.0a0 - size: 13069211 - timestamp: 1779565995400 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda - sha256: 3900f9f2dbbf4129cf3ad6acf4e4b6f7101390b53843591c53b00f034343bc4d - md5: 11b3379b191f63139e29c0d19dee24cd - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libpng >=1.6.50,<1.7.0a0 - - libstdcxx >=14 - - libtiff >=4.7.1,<4.8.0a0 - - libzlib >=1.3.1,<2.0a0 - license: BSD-2-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - openjpeg >=2.5.4,<3.0a0 - size: 355400 - timestamp: 1758489294972 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openmpi-5.0.10-h67ed482_1.conda - sha256: 9d13b09c95f5e9429f295dc89a896dae41a4ca4f77118139b1ff02001ae25127 - md5: afa5d72e0e68fdf2b51b1c80a3d2086b - depends: - - mpi 1.0.* openmpi - - libgcc >=14 - - libgfortran5 >=14.3.0 - - libgfortran - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - libevent >=2.1.12,<2.1.13.0a0 - - libhwloc >=2.13.0,<2.13.1.0a0 - - ucc >=1.6.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - ucx >=1.20.0,<1.21.0a0 - - libfabric - - libfabric1 >=1.14.0 - - libpmix >=5.0.8,<6.0a0 - - libnl >=3.11.0,<4.0a0 - constrains: - - __cuda >=12.0 - - cuda-version >=12.0 - - libprrte ==0.0.0 - license: BSD-3-Clause - license_family: BSD - run_exports: - weak: - - openmpi >=5.0.10,<6.0a0 - size: 3940272 - timestamp: 1772089559619 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_1.conda - sha256: 012096056b97abf1f68c46b7146bd2cbd68c1be762340b4f5dad4fbbe99177bc - md5: c5955c27917ff2234def47f075e71e02 - depends: - - __glibc >=2.17,<3.0.a0 - - ca-certificates - - libgcc >=14 - license: Apache-2.0 - license_family: Apache - purls: [] - run_exports: - weak: - - openssl >=3.6.3,<4.0a0 - size: 3182423 - timestamp: 1785913583650 -- conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py311h5f908af_0.conda - sha256: aa52cc254091a3a26d5cd9ddf658bb969a0dd7a06304b517845ebaaf56d94c1a - md5: 6a9bb0f3e5aeced449b2bc7f3cebc085 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=15 - - libstdcxx >=15 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - typing-extensions >=4.10 - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/optree?source=compressed-mapping - run_exports: {} - size: 574143 - timestamp: 1787285201645 -- conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_0.conda - sha256: a347721f200b28c0d57a4cd2fce11da7f83b349e04afbd0100ee901aeb8bfec9 - md5: 53e34ca3dfb7dc8dd352b522726a00c9 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=15 - - libstdcxx >=15 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - typing-extensions >=4.10 - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/optree?source=compressed-mapping - run_exports: {} - size: 578553 - timestamp: 1787285203388 -- conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py313h6bdb861_0.conda - sha256: a322035d2df5c0eee50e65901d3e1714390bed51da47b5c764f74de6659784bb - md5: 19196c6fb2d1e311ce1938142728d2a5 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=15 - - libstdcxx >=15 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - - typing-extensions >=4.12 - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/optree?source=hash-mapping - run_exports: {} - size: 586170 - timestamp: 1787285211996 -- conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.1-h443056b_0.conda - sha256: ae96bc0895a2279f2ea296879e0475333e838cc88754b0c1a4903dd92a7e1b21 - md5: 1280a5f8270f30b89cc8373ecfe8899d - depends: - - tzdata - - libgcc >=14 - - libstdcxx >=14 - - __glibc >=2.17,<3.0.a0 - - snappy >=1.2.2,<1.3.0a0 - - libabseil >=20260526.0,<20260527.0a0 - - libabseil * cxx17* - - libzlib >=1.3.2,<2.0a0 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - lz4-c >=1.10.0,<1.11.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - orc >=2.3.1,<2.3.2.0a0 - size: 1458252 - timestamp: 1784301236872 -- conda: https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.26.5-h586ad30_1.conda - sha256: 1e7953def8857c0e230d9fb31bbab121db7f6d93154fde6154be8c8b8047d9bc - md5: 1bf419c59c9fbda7d074147bb4bed800 - depends: - - __glibc >=2.17,<3.0.a0 - - libffi >=3.7.0,<3.8.0a0 - - libgcc >=14 - - libtasn1 >=4.21.0,<5.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - p11-kit >=0.26.5,<0.27.0a0 - size: 3904903 - timestamp: 1786920461661 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.5-py312h8ecdadd_1.conda - sha256: 393e529c0574c020a9b790275af10ff35e21cbb4e12740888bd3f214f2f07034 - md5: 85eb29ade84d1bd97be5ec55607efb00 - depends: - - python - - numpy >=1.26.0 - - python-dateutil >=2.8.2 - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - - numpy >=1.23,<3 - - python_abi 3.12.* *_cp312 - constrains: - - adbc-driver-postgresql >=1.2.0 - - adbc-driver-sqlite >=1.2.0 - - beautifulsoup4 >=4.12.3 - - blosc >=1.21.3 - - bottleneck >=1.4.2 - - fastparquet >=2024.11.0 - - fsspec >=2024.10.0 - - gcsfs >=2024.10.0 - - html5lib >=1.1 - - hypothesis >=6.116.0 - - jinja2 >=3.1.5 - - lxml >=5.3.0 - - matplotlib >=3.9.3 - - numba >=0.60.0 - - numexpr >=2.10.2 - - odfpy >=1.4.1 - - openpyxl >=3.1.5 - - psycopg2 >=2.9.10 - - pyarrow >=13.0.0 - - pyiceberg >=0.8.1 - - pymysql >=1.1.1 - - pyqt5 >=5.15.9 - - pyreadstat >=1.2.8 - - pytables >=3.10.1 - - pytest >=8.3.4 - - pytest-xdist >=3.6.1 - - python-calamine >=0.3.0 - - pytz >=2024.2 - - pyxlsb >=1.0.10 - - qtpy >=2.4.2 - - scipy >=1.14.1 - - s3fs >=2024.10.0 - - sqlalchemy >=2.0.36 - - tabulate >=0.9.0 - - xarray >=2024.10.0 - - xlrd >=2.0.1 - - xlsxwriter >=3.2.0 - - zstandard >=0.23.0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/pandas?source=hash-mapping - run_exports: {} - size: 14936796 - timestamp: 1785276227779 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda - sha256: 9ebb10a4eb3be51ae67d85c679f5a7a50cb040ed25c783e6331a225ea09991d4 - md5: 06f6113cf1ff4a54b65f87ead132a5f1 - depends: - - __glibc >=2.17,<3.0.a0 - - bzip2 >=1.0.8,<2.0a0 - - libgcc >=15 - - libzlib >=1.3.2,<2.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - pcre2 >=10.47,<10.48.0a0 - size: 1218833 - timestamp: 1787294571916 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - sha256: 5e6f7d161356fefd981948bea5139c5aa0436767751a6930cb1ca801ebb113ff - md5: 7a3bff861a6583f1889021facefc08b1 - depends: - - __glibc >=2.17,<3.0.a0 - - bzip2 >=1.0.8,<2.0a0 - - libgcc >=14 - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - pcre2 >=10.47,<10.48.0a0 - size: 1222481 - timestamp: 1763655398280 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py311hf88fc01_0.conda - sha256: fc8a6dbcf1f367cc33ae6d505370b8d9d51ca5eae9b53bf1517307f863300d27 - md5: 9782d37ef50862d2c8a9ba58c1725754 - depends: - - python - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - openjpeg >=2.5.4,<3.0a0 - - lcms2 >=2.19.1,<3.0a0 - - libxcb >=1.17.0,<2.0a0 - - libfreetype >=2.14.3 - - libfreetype6 >=2.14.3 - - tk >=8.6.13,<8.7.0a0 - - libjpeg-turbo >=3.1.4.1,<4.0a0 - - libwebp-base >=1.6.0,<2.0a0 - - python_abi 3.11.* *_cp311 - - libtiff >=4.7.1,<4.8.0a0 - - zlib-ng >=2.3.3,<2.4.0a0 - license: HPND - purls: - - pkg:pypi/pillow?source=hash-mapping - run_exports: {} - size: 1081155 - timestamp: 1782912080163 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py312h50c33e8_0.conda - sha256: 76b2e56c7a903a06be1210d35f35c2a8dcdc57912fda5c96b2e68acfd2b281fe - md5: d749d04e1965315078f29320565c595a - depends: - - python - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - libtiff >=4.7.1,<4.8.0a0 - - libxcb >=1.17.0,<2.0a0 - - tk >=8.6.13,<8.7.0a0 - - openjpeg >=2.5.4,<3.0a0 - - zlib-ng >=2.3.3,<2.4.0a0 - - python_abi 3.12.* *_cp312 - - libjpeg-turbo >=3.1.4.1,<4.0a0 - - lcms2 >=2.19.1,<3.0a0 - - libfreetype >=2.14.3 - - libfreetype6 >=2.14.3 - - libwebp-base >=1.6.0,<2.0a0 - license: HPND - purls: - - pkg:pypi/pillow?source=hash-mapping - run_exports: {} - size: 1064129 - timestamp: 1782912080163 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py313h80991f8_0.conda - sha256: cb3e51a639d19e04d0ea197ff6f6805a40eeef92d762642f28fa1cd1d25f672a - md5: 730e462e7e141813192b606cf07ebdd0 - depends: - - python - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - libwebp-base >=1.6.0,<2.0a0 - - lcms2 >=2.19.1,<3.0a0 - - libfreetype >=2.14.3 - - libfreetype6 >=2.14.3 - - tk >=8.6.13,<8.7.0a0 - - libxcb >=1.17.0,<2.0a0 - - zlib-ng >=2.3.3,<2.4.0a0 - - python_abi 3.13.* *_cp313 - - libjpeg-turbo >=3.1.4.1,<4.0a0 - - libtiff >=4.7.1,<4.8.0a0 - - openjpeg >=2.5.4,<3.0a0 - license: HPND - purls: - - pkg:pypi/pillow?source=hash-mapping - run_exports: {} - size: 1077037 - timestamp: 1782912080163 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda - sha256: 829d8288764282de5a9f7b9169acb75cc7dc0b6c3fe2535cfe87dea3436bbc5d - md5: 0ee5bb30034b081a1386c1e2c98ab0a7 - depends: - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - pixman >=0.46.4,<1.0a0 - size: 376704 - timestamp: 1786106621354 -- conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda - sha256: 013669433eb447548f21c3c6b16b2ed64356f726b5f77c1b39d5ba17a8a4b8bc - md5: a83f6a2fdc079e643237887a37460668 - depends: - - __glibc >=2.17,<3.0.a0 - - libcurl >=8.10.1,<9.0a0 - - libgcc >=13 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - - zlib - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - prometheus-cpp >=1.3.0,<1.4.0a0 - size: 199544 - timestamp: 1730769112346 -- conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h5253ce2_0.conda - sha256: d834fd656133c9e4eaf63ffe9a117c7d0917d86d89f7d64073f4e3a0020bd8a7 - md5: dd94c506b119130aef5a9382aed648e7 - depends: - - python - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/psutil?source=hash-mapping - run_exports: {} - size: 225545 - timestamp: 1769678155334 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb03c661_1003.conda - sha256: afc3b27b2cbb0487c1d0e963f96e71181ecfb623a24fb393bb19ff974a6382a1 - md5: df2c27f36bdb0dde779f55b5df76a352 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: MIT - license_family: MIT - purls: [] - run_exports: {} - size: 9115 - timestamp: 1786067714761 -- conda: https://conda.anaconda.org/conda-forge/linux-64/py-spy-0.4.2-hbe0e3b8_1.conda - sha256: cb23242015d1b3fb9d009e98edf673900811b73a1e16a5e3d74104c96eb172dc - md5: a9b890615f46d689cbadb145415d333a - depends: - - libgcc >=15 - - __glibc >=2.17,<3.0.a0 - - libunwind >=1.8.3,<1.9.0a0 - - liblzma >=5.8.3,<6.0a0 - constrains: - - __glibc >=2.17 - license: MIT - license_family: MIT - purls: [] - run_exports: {} - size: 1909369 - timestamp: 1787924738130 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-25.0.0-py312h7900ff3_0.conda - sha256: 9b6c4aed5da2a3b8f649e1b73596e0867a5506bed9c3aa45dbaedfb674822191 - md5: 6f1918b7565c3cc5ed047a97ea510e55 - depends: - - libarrow-acero 25.0.0.* - - libarrow-dataset 25.0.0.* - - libarrow-substrait 25.0.0.* - - libparquet 25.0.0.* - - pyarrow-core 25.0.0 *_0_* - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: {} - size: 26079 - timestamp: 1784258397971 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-25.0.0-py312h2054cf2_0_cpu.conda - sha256: 8b54b732de45d85198e8e9ce5d5b5642c847f4379f917c64a4de48643a3305ee - md5: aff56abfcef5a031603250b7dc23e9d5 - depends: - - __glibc >=2.17,<3.0.a0 - - libarrow 25.0.0.* *cpu - - libarrow-compute 25.0.0.* *cpu - - libgcc >=14 - - libstdcxx >=14 - - libzlib >=1.3.2,<2.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - constrains: - - numpy >=1.23,<3 - - apache-arrow-proc * cpu - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/pyarrow?source=hash-mapping - run_exports: {} - size: 5395858 - timestamp: 1784258391353 -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.15-h8ab3286_2_cpython.conda - build_number: 2 - sha256: b3c9919295379d106bbfb05c159f51354aec45aa9378205d566f57cc18359557 - md5: 3e7d2d695855c9fb76f559d1a3c6a604 - depends: - - __glibc >=2.17,<3.0.a0 - - bzip2 >=1.0.8,<2.0a0 - - ld_impl_linux-64 >=2.36.1 - - libexpat >=2.8.1,<3.0a0 - - libffi >=3.7.0,<3.8.0a0 - - libgcc >=14 - - liblzma >=5.8.3,<6.0a0 - - libnsl >=2.0.1,<2.1.0a0 - - libsqlite >=3.53.4,<4.0a0 - - libuuid >=2.42.2,<3.0a0 - - libxcrypt >=4.4.38 - - libzlib >=1.3.2,<2.0a0 - - ncurses >=6.6,<7.0a0 - - openssl >=3.5.7,<4.0a0 - - readline >=8.3,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - constrains: - - python_abi 3.11.* *_cp311 - license: Python-2.0 - purls: [] - run_exports: - weak: - - python_abi 3.11.* *_cp311 - noarch: - - python - size: 30812346 - timestamp: 1786444926862 -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.13-h8ab3286_1_cpython.conda - build_number: 1 - sha256: df3d1e5f972e79e78b61730c09135c795f6e7aa45b7777835c95f451e85eff0d - md5: c6e02a78e3b6427c633328fea9399534 - depends: - - __glibc >=2.17,<3.0.a0 - - bzip2 >=1.0.8,<2.0a0 - - ld_impl_linux-64 >=2.36.1 - - libexpat >=2.8.1,<3.0a0 - - libffi >=3.7.0,<3.8.0a0 - - libgcc >=14 - - liblzma >=5.8.3,<6.0a0 - - libnsl >=2.0.1,<2.1.0a0 - - libsqlite >=3.53.4,<4.0a0 - - libuuid >=2.42.2,<3.0a0 - - libxcrypt >=4.4.38 - - libzlib >=1.3.2,<2.0a0 - - ncurses >=6.6,<7.0a0 - - openssl >=3.5.7,<4.0a0 - - readline >=8.3,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - constrains: - - python_abi 3.12.* *_cp312 - license: Python-2.0 - purls: [] - run_exports: - weak: - - python_abi 3.12.* *_cp312 - noarch: - - python - size: 31527849 - timestamp: 1786445051525 -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.15-hb101c97_101_cp313.conda - build_number: 101 - sha256: b7c23d7446502a267f341b27e6820d5e2d53e78c61e721f4af713168ee544cb2 - md5: ad58731521aa42f9e70f3fc6c898e134 - depends: - - __glibc >=2.17,<3.0.a0 - - bzip2 >=1.0.8,<2.0a0 - - ld_impl_linux-64 >=2.36.1 - - libexpat >=2.8.1,<3.0a0 - - libffi >=3.7.0,<3.8.0a0 - - libgcc >=14 - - liblzma >=5.8.3,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.53.4,<4.0a0 - - libuuid >=2.42.2,<3.0a0 - - libzlib >=1.3.2,<2.0a0 - - ncurses >=6.6,<7.0a0 - - openssl >=3.5.7,<4.0a0 - - python_abi 3.13.* *_cp313 - - readline >=8.3,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - license: Python-2.0 - purls: [] - run_exports: - weak: - - python_abi 3.13.* *_cp313 - noarch: - - python - size: 37485991 - timestamp: 1786368232136 - python_site_packages_path: lib/python3.13/site-packages -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-librt-0.15.0-py312h5253ce2_0.conda - sha256: 30b780a244bdf0f2c4377fbd72d69894610f0ff59930f6a864cccb59e03a5d38 - md5: e55bf557c514b966494b8c4a033b25c2 - depends: - - python - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - python_abi 3.12.* *_cp312 - license: MIT - license_family: MIT - purls: - - pkg:pypi/librt?source=compressed-mapping - run_exports: {} - size: 164831 - timestamp: 1786328838441 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.12.1-cpu_mkl_py312_h38523ed_100.conda - sha256: 827e69c59252e91a4f15a9b7892d075a73cb4263cbf0faa38f995c6447a267d5 - md5: ebe0e6778530b8073f04ccdae79d6e94 - depends: - - __glibc >=2.17,<3.0.a0 - - _openmp_mutex * *_llvm - - _openmp_mutex >=4.5 - - filelock - - fmt >=12.1.0,<12.2.0a0 - - fsspec - - jinja2 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libblas * *mkl - - libcblas >=3.11.0,<4.0a0 - - libgcc >=14 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libstdcxx >=14 - - libtorch 2.12.1 cpu_mkl_h4f7e408_100 - - libuv >=1.52.1,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - - llvm-openmp >=22.1.8 - - mkl >=2026.0.0,<2027.0a0 - - networkx - - numpy >=1.23,<3 - - onednn >=3.12,<4.0a0 - - optree >=0.13.0 - - pybind11 - - pybind11-abi 11 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - setuptools <82 - - sleef >=3.9.0,<4.0a0 - - sympy >=1.13.3 - - typing_extensions >=4.10.0 - constrains: - - pytorch-gpu <0.0a0 - - pytorch-cpu 2.12.1 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/torch?source=project-defined-mapping - run_exports: - weak: - - pytorch >=2.12.1,<2.13.0a0 - - libtorch >=2.12.1,<2.13.0a0 - size: 25642535 - timestamp: 1781833725178 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.12.1-cuda129_mkl_py312_h51dba9f_300.conda - sha256: 79b36b8aab386faab437f2bd74c02658b292f9e48aab36e19e67c51c943b4357 - md5: d0f357b3f25180c177b85e719cd0d2a2 - depends: - - __cuda - - __glibc >=2.17,<3.0.a0 - - _openmp_mutex * *_llvm - - _openmp_mutex >=4.5 - - cuda-cudart >=12.9.79,<13.0a0 - - cuda-cupti >=12.9.79,<13.0a0 - - cuda-nvrtc >=12.9.86,<13.0a0 - - cuda-nvtx >=12.9.79,<13.0a0 - - cuda-version >=12.9,<13 - - filelock - - fmt >=12.1.0,<12.2.0a0 - - fsspec - - jinja2 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libblas * *mkl - - libcblas >=3.11.0,<4.0a0 - - libcublas >=12.9.2.10,<13.0a0 - - libcudnn >=9.10.2.21,<10.0a0 - - libcudss >=0.8.0.10,<0.8.1.0a0 - - libcufft >=11.4.1.4,<12.0a0 - - libcufile >=1.14.1.1,<2.0a0 - - libcurand >=10.3.10.19,<11.0a0 - - libcusolver >=11.7.5.82,<12.0a0 - - libcusparse >=12.5.10.65,<13.0a0 - - libgcc >=14 - - libmagma >=2.10.0,<2.10.1.0a0 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libstdcxx >=14 - - libtorch 2.12.1 cuda129_mkl_h6b8258c_300 - - libuv >=1.52.1,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - - llvm-openmp >=22.1.8 - - mkl >=2026.0.0,<2027.0a0 - - nccl >=2.28.9.1,<3.0a0 - - networkx - - numpy >=1.23,<3 - - onednn >=3.12,<4.0a0 - - optree >=0.13.0 - - pybind11 - - pybind11-abi 11 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - setuptools <82 - - sleef >=3.9.0,<4.0a0 - - sympy >=1.13.3 - - triton 3.7.1 - - typing_extensions >=4.10.0 - constrains: - - pytorch-cpu <0.0a0 - - pytorch-gpu 2.12.1 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/torch?source=project-defined-mapping - run_exports: - weak: - - pytorch >=2.12.1,<2.13.0a0 - - libtorch >=2.12.1,<2.13.0a0 - size: 25908937 - timestamp: 1781848825426 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py311_h249fa5d_102.conda - sha256: 85d39d440e6893377b5c4d34740b005766b3610c87263322e1d8858c1622b147 - md5: 984900ed34b9ac4a39216a107b3ee802 - depends: - - __glibc >=2.17,<3.0.a0 - - _openmp_mutex * *_llvm - - _openmp_mutex >=4.5 - - filelock - - fmt >=12.1.0,<12.2.0a0 - - fsspec - - jinja2 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libblas * *mkl - - libcblas >=3.11.0,<4.0a0 - - libgcc >=14 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libstdcxx >=14 - - libtorch 2.13.0 cpu_mkl_h40bd1c6_102 - - libuv >=1.52.1,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - - llvm-openmp >=22.1.8 - - mkl >=2026.1.0,<2027.0a0 - - networkx - - numpy >=1.23,<3 - - onednn >=3.12,<4.0a0 - - optree >=0.13.0 - - pybind11 - - pybind11-abi 11 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - setuptools <82 - - sleef >=3.9.0,<4.0a0 - - sympy >=1.13.3 - - typing_extensions >=4.10.0 - constrains: - - pytorch-cpu 2.13.0 - - pytorch-gpu <0.0a0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/torch?source=project-defined-mapping - run_exports: - weak: - - pytorch >=2.13.0,<2.14.0a0 - - libtorch >=2.13.0,<2.14.0a0 - size: 27390828 - timestamp: 1786375884517 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda - sha256: bfddc2821f141a89a2e8ce05a22db4e1dda638297ff3cfd147fbd79ea0401b5c - md5: b139a0a62b1e6ec36a37282f4f3f0fbf - depends: - - __glibc >=2.17,<3.0.a0 - - _openmp_mutex * *_llvm - - _openmp_mutex >=4.5 - - filelock - - fmt >=12.1.0,<12.2.0a0 - - fsspec - - jinja2 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libblas * *mkl - - libcblas >=3.11.0,<4.0a0 - - libgcc >=14 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libstdcxx >=14 - - libtorch 2.13.0 cpu_mkl_h40bd1c6_102 - - libuv >=1.52.1,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - - llvm-openmp >=22.1.8 - - mkl >=2026.1.0,<2027.0a0 - - networkx - - numpy >=1.25,<3 - - onednn >=3.12,<4.0a0 - - optree >=0.13.0 - - pybind11 - - pybind11-abi 11 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - setuptools <82 - - sleef >=3.9.0,<4.0a0 - - sympy >=1.13.3 - - typing_extensions >=4.10.0 - constrains: - - pytorch-cpu 2.13.0 - - pytorch-gpu <0.0a0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/torch?source=project-defined-mapping - run_exports: - weak: - - pytorch >=2.13.0,<2.14.0a0 - - libtorch >=2.13.0,<2.14.0a0 - size: 27182909 - timestamp: 1786375171404 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py313_h80c0f76_102.conda - sha256: 53502d4434ce01df873ed721013ce37fd35c19da107c4405eeb91e9bb1a51501 - md5: 722472ecc10ebaa7780fdc0f5891a65b - depends: - - __glibc >=2.17,<3.0.a0 - - _openmp_mutex * *_llvm - - _openmp_mutex >=4.5 - - filelock - - fmt >=12.1.0,<12.2.0a0 - - fsspec - - jinja2 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libblas * *mkl - - libcblas >=3.11.0,<4.0a0 - - libgcc >=14 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libstdcxx >=14 - - libtorch 2.13.0 cpu_mkl_h40bd1c6_102 - - libuv >=1.52.1,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - - llvm-openmp >=22.1.8 - - mkl >=2026.1.0,<2027.0a0 - - networkx - - numpy >=1.25,<3 - - onednn >=3.12,<4.0a0 - - optree >=0.13.0 - - pybind11 - - pybind11-abi 11 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - - setuptools <82 - - sleef >=3.9.0,<4.0a0 - - sympy >=1.13.3 - - typing_extensions >=4.10.0 - constrains: - - pytorch-cpu 2.13.0 - - pytorch-gpu <0.0a0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/torch?source=project-defined-mapping - run_exports: - weak: - - pytorch >=2.13.0,<2.14.0a0 - - libtorch >=2.13.0,<2.14.0a0 - size: 27603751 - timestamp: 1786374470238 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cuda129_mkl_py312_h0509a7e_302.conda - sha256: 81312b79e5bc26da1314b1f8c5b4eb238ee01b016cd98993ba6f5e365eb056c2 - md5: 69d7f944103891f1dd20f34f0cd164ea - depends: - - __cuda - - __glibc >=2.17,<3.0.a0 - - _openmp_mutex * *_llvm - - _openmp_mutex >=4.5 - - cuda-cudart >=12.9.79,<13.0a0 - - cuda-cupti >=12.9.79,<13.0a0 - - cuda-nvrtc >=12.9.86,<13.0a0 - - cuda-nvtx >=12.9.79,<13.0a0 - - cuda-version >=12.9,<13 - - filelock - - fmt >=12.1.0,<12.2.0a0 - - fsspec - - jinja2 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libblas * *mkl - - libcblas >=3.11.0,<4.0a0 - - libcublas >=12.9.2.10,<13.0a0 - - libcudnn >=9.10.2.21,<10.0a0 - - libcudss >=0.8.0.10,<0.8.1.0a0 - - libcufft >=11.4.1.4,<12.0a0 - - libcufile >=1.14.1.1,<2.0a0 - - libcurand >=10.3.10.19,<11.0a0 - - libcusolver >=11.7.5.82,<12.0a0 - - libcusparse >=12.5.10.65,<13.0a0 - - libgcc >=14 - - libmagma >=2.10.0,<2.10.1.0a0 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libstdcxx >=14 - - libtorch 2.13.0 cuda129_mkl_h546cc0b_302 - - libuv >=1.52.1,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - - llvm-openmp >=22.1.8 - - mkl >=2026.1.0,<2027.0a0 - - nccl >=2.28.9.1,<3.0a0 - - networkx - - numpy >=1.25,<3 - - onednn >=3.12,<4.0a0 - - optree >=0.13.0 - - pybind11 - - pybind11-abi 11 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - setuptools <82 - - sleef >=3.9.0,<4.0a0 - - sympy >=1.13.3 - - triton 3.7.1 - - typing_extensions >=4.10.0 - constrains: - - pytorch-cpu <0.0a0 - - pytorch-gpu 2.13.0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/torch?source=project-defined-mapping - run_exports: - weak: - - pytorch >=2.13.0,<2.14.0a0 - - libtorch >=2.13.0,<2.14.0a0 - size: 27595450 - timestamp: 1786390195428 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cuda130_mkl_py312_hcdc9d04_302.conda - sha256: 432e3a90a75d67725d58e62639d322fbfa9a36024a5daa32b74c0112d475178c - md5: 001eb33662642bf6983329a58e7788d9 - depends: - - __cuda - - __glibc >=2.28,<3.0.a0 - - _openmp_mutex * *_llvm - - _openmp_mutex >=4.5 - - cuda-cudart >=13.0.96,<14.0a0 - - cuda-cupti >=13.0.85,<14.0a0 - - cuda-nvrtc >=13.0.88,<14.0a0 - - cuda-nvtx >=13.0.85,<14.0a0 - - cuda-version >=13.0,<14 - - filelock - - fmt >=12.1.0,<12.2.0a0 - - fsspec - - jinja2 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libblas * *mkl - - libcblas >=3.11.0,<4.0a0 - - libcublas >=13.1.1.3,<14.0a0 - - libcudnn >=9.25.0.15,<10.0a0 - - libcudss >=0.8.0.10,<0.8.1.0a0 - - libcufft >=12.0.0.61,<13.0a0 - - libcufile >=1.15.1.6,<2.0a0 - - libcurand >=10.4.0.35,<11.0a0 - - libcusolver >=12.0.4.66,<13.0a0 - - libcusparse >=12.6.3.3,<13.0a0 - - libgcc >=14 - - libmagma >=2.10.0,<2.10.1.0a0 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libstdcxx >=14 - - libtorch 2.13.0 cuda130_mkl_h1ca3d63_302 - - libuv >=1.52.1,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - - llvm-openmp >=22.1.8 - - mkl >=2026.1.0,<2027.0a0 - - nccl >=2.30.7.1,<3.0a0 - - networkx - - numpy >=1.25,<3 - - onednn >=3.12,<4.0a0 - - optree >=0.13.0 - - pybind11 - - pybind11-abi 11 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - setuptools <82 - - sleef >=3.9.0,<4.0a0 - - sympy >=1.13.3 - - triton 3.7.1 - - typing_extensions >=4.10.0 - constrains: - - pytorch-cpu <0.0a0 - - pytorch-gpu 2.13.0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/torch?source=project-defined-mapping - run_exports: - weak: - - pytorch >=2.13.0,<2.14.0a0 - - libtorch >=2.13.0,<2.14.0a0 - size: 27465325 - timestamp: 1786386129198 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-gpu-2.12.1-cuda129_mkl_h0d04637_300.conda - sha256: 6962557638794695e9368fec8358913138de6ac42263f4106b0b0d289aa8c90f - md5: e0e4cda52c574ebc52a1433de2f64b42 - depends: - - pytorch 2.12.1 cuda*_mkl*300 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/torch?source=project-defined-mapping - run_exports: {} - size: 55687 - timestamp: 1781849857048 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-gpu-2.13.0-cuda129_mkl_h0d04637_302.conda - sha256: ed83a69f74ff4d81eee00fbfea410fd644cd5d4079692d61bd5909a7073f608b - md5: d0f6a948121b879b5151cf088d486309 - depends: - - pytorch 2.13.0 cuda*_mkl*302 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/torch?source=project-defined-mapping - run_exports: {} - size: 57190 - timestamp: 1786391217596 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py311h3778330_1.conda - sha256: c9a6cd2c290d7c3d2b30ea34a0ccda30f770e8ddb2937871f2c404faf60d0050 - md5: a24add9a3bababee946f3bc1c829acfe - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - - yaml >=0.2.5,<0.3.0a0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pyyaml?source=hash-mapping - run_exports: {} - size: 206190 - timestamp: 1770223702917 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda - sha256: cb142bfd92f6e55749365ddc244294fa7b64db6d08c45b018ff1c658907bfcbf - md5: 15878599a87992e44c059731771591cb - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - yaml >=0.2.5,<0.3.0a0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pyyaml?source=hash-mapping - run_exports: {} - size: 198293 - timestamp: 1770223620706 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_1.conda - sha256: ef7df29b38ef04ec67a8888a4aa039973eaa377e8c4b59a7be0a1c50cd7e4ac6 - md5: f256753e840c3cd3766488c9437a8f8b - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - - yaml >=0.2.5,<0.3.0a0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pyyaml?source=hash-mapping - run_exports: {} - size: 201616 - timestamp: 1770223543730 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_3.conda - noarch: python - sha256: 970b2a1d12983d8d1cc05d914ad88a0b6ef1fa14038c9649aa834dd6ebee65d7 - md5: acd216255e1370e9aeab5351b831f07c - depends: - - python - - libgcc >=14 - - libstdcxx >=14 - - __glibc >=2.17,<3.0.a0 - - _python_abi3_support 1.* - - cpython >=3.12 - - zeromq >=4.3.5,<4.4.0a0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/pyzmq?source=hash-mapping - run_exports: {} - size: 210896 - timestamp: 1779483879367 -- conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda - sha256: 776363493bad83308ba30bcb88c2552632581b143e8ee25b1982c8c743e73abc - md5: 353823361b1d27eb3960efb076dfcaf6 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc-ng >=12 - - libstdcxx-ng >=12 - license: LicenseRef-Qhull - purls: [] - run_exports: - weak: - - qhull >=2020.2,<2020.3.0a0 - size: 552937 - timestamp: 1720813982144 -- conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-63.0-h192683f_1.conda - sha256: f0931894c751b22be09d7c976343a2957a14a59cfe0db04d916d1b93bd66ffcf - md5: da47d3251c0f0d16b2801afe5a77b532 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libnl >=3.11.0,<4.0a0 - - libstdcxx >=14 - - libsystemd0 >=257.13 - - libudev1 >=257.13 - license: Linux-OpenIB - license_family: BSD - purls: [] - run_exports: - weak: - - rdma-core >=63.0 - size: 1281605 - timestamp: 1778528449130 -- conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h94463f1_2.conda - sha256: 7279908454f0c87b84ebc4aec6924f02f41a105d88420fb35dfaf5ecd976e0f5 - md5: d83f2ee212d217a6d745a00e5be84671 - depends: - - libre2-11 2025.11.05 h60473fc_2 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libre2-11 >=2025.11.5 - - re2 - size: 27397 - timestamp: 1781312576962 -- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda - sha256: 01b3fe073a66e321970d09e04b388708f8cbdca5cdfbfcb7c9eeb470ad10383d - md5: 69c01c781e7c8190bbdaf79e3848c5ca - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=15 - - ncurses >=6.6,<7.0a0 - license: GPL-3.0-only - license_family: GPL - purls: [] - run_exports: - weak: - - readline >=8.3,<9.0a0 - size: 348899 - timestamp: 1787033801506 -- conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda - sha256: 186a5b225077ad5f4656966da947d43307101950751ef4a239b455588756b4e1 - md5: 007602d697e07c11ff9864964eba5ee3 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - rhash >=1.4.6,<2.0a0 - size: 194994 - timestamp: 1786731436520 -- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-2026.6.3-py312h192e038_0.conda - sha256: 4a190c74b5f3b441820a3142b03a489987c724b65237882ebe87d75892345d17 - md5: 40984fba15f43a366ea4c6dea2b4c8bd - depends: - - python - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - python_abi 3.12.* *_cp312 - constrains: - - __glibc >=2.17 - license: MIT - license_family: MIT - purls: - - pkg:pypi/rpds-py?source=hash-mapping - run_exports: {} - size: 300259 - timestamp: 1782831325201 -- conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.5-h7e3ee7f_1.conda - sha256: 7369ac21f3561e2203f5b1600ef0671270057380783ca4b9e15f679ba25db575 - md5: fa1c00d999e83ec20173c9775f71a1f1 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - openssl >=3.5.7,<4.0a0 - license: Apache-2.0 - license_family: Apache - purls: [] - run_exports: - weak: - - s2n >=1.7.5,<1.7.6.0a0 - size: 392607 - timestamp: 1783164766248 -- conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.6-h7e3ee7f_0.conda - sha256: 1e1ccc56fdf3fe82150b4eac1d626c806e612af208fbf40ce3abfe9a2eb2a626 - md5: e112cadcd79412d81496e784884bddf0 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - openssl >=3.5.7,<4.0a0 - license: Apache-2.0 - license_family: Apache - purls: [] - run_exports: - weak: - - s2n >=1.7.6,<1.7.7.0a0 - size: 393680 - timestamp: 1784674401024 -- conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py311hbe70eeb_1.conda - sha256: 3ae2ff1d1cc5930de2ca6ac03216118bdf13b2af6098e28e827f1ba25bfcbc4e - md5: 089de2ee37e4e19885c985a4fe4aaf14 - depends: - - __glibc >=2.17,<3.0.a0 - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libgcc >=14 - - libgfortran - - libgfortran5 >=14.3.0 - - liblapack >=3.9.0,<4.0a0 - - libstdcxx >=14 - - numpy <2.7 - - numpy >=1.23,<3 - - numpy >=1.25.2 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/scipy?source=hash-mapping - run_exports: {} - size: 17303931 - timestamp: 1779874783665 -- conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py312h54fa4ab_0.conda - sha256: c304dfb0bbf0d824d3706623f6437237d7bfc83941bb7b18f80e05abb10ec79e - md5: f8d242c552b0f7f682451ce95879af5e - depends: - - __glibc >=2.17,<3.0.a0 - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libgcc >=14 - - libgfortran - - libgfortran5 >=14.3.0 - - liblapack >=3.9.0,<4.0a0 - - libstdcxx >=14 - - numpy <2.7 - - numpy >=1.23,<3 - - numpy >=2.0.0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/scipy?source=hash-mapping - run_exports: {} - size: 17104066 - timestamp: 1781912972195 -- conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py313h4b8bb8b_0.conda - sha256: 3ffdca726208a7394b2aa9989e5b1718e28a6285329bbc10bea4e92066e14f49 - md5: a32f88181ff9a3451c71be1f17a7c799 - depends: - - __glibc >=2.17,<3.0.a0 - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libgcc >=14 - - libgfortran - - libgfortran5 >=14.3.0 - - liblapack >=3.9.0,<4.0a0 - - libstdcxx >=14 - - numpy <2.7 - - numpy >=1.23,<3 - - numpy >=2.0.0 - - python >=3.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/scipy?source=hash-mapping - run_exports: {} - size: 17171066 - timestamp: 1781912954186 -- conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda - sha256: 57afc2ab5bdb24cf979964018dddbc5dfaee130b415e6863765e45aed2175ee4 - md5: e8a0b4f5e82ecacffaa5e805020473cb - depends: - - __glibc >=2.17,<3.0.a0 - - _openmp_mutex >=4.5 - - libgcc >=14 - - libstdcxx >=14 - license: BSL-1.0 - purls: [] - run_exports: - weak: - - sleef >=3.9.0,<4.0a0 - size: 1951720 - timestamp: 1756274576844 -- conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda - sha256: 48f3f6a76c34b2cfe80de9ce7f2283ecb55d5ed47367ba91e8bb8104e12b8f11 - md5: 98b6c9dc80eb87b2519b97bcf7e578dd - depends: - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - libgcc >=14 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - snappy >=1.2.2,<1.3.0a0 - size: 45829 - timestamp: 1762948049098 -- conda: https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.52-py312h5253ce2_0.conda - sha256: c6677580087354e02e98fe3d356ca3de3d6f0521da831ea949b7a42e52bfd60d - md5: 3d301c6754633aacf499ac6ee63bd2b8 - depends: - - python - - greenlet !=0.4.17 - - typing-extensions >=4.6.0 - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - python_abi 3.12.* *_cp312 - license: MIT - license_family: MIT - purls: - - pkg:pypi/sqlalchemy?source=compressed-mapping - run_exports: {} - size: 3721699 - timestamp: 1786535232010 -- conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda - sha256: 30cb9355c2fefc20ff1a3d6566b9714d5614086a2524c07721fc344eb20515ae - md5: 7073b15f9364ebc118998601ac6ca6a6 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libhwloc >=2.13.0,<2.13.1.0a0 - - libstdcxx >=14 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: {} - size: 182331 - timestamp: 1778673758649 -- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda - build_number: 104 - sha256: a1a241d172c1ccab067ba245206dd048bc3c2d1b84504b53c9468e99adfc16a1 - md5: 676a2f9b1c4fcf57b70aa5c65f6c60d0 - depends: - - libgcc >=15 - - __glibc >=2.17,<3.0.a0 - - libzlib >=1.3.2,<2.0a0 - constrains: - - xorg-libx11 >=1.8.13,<2.0a0 - license: TCL - purls: [] - run_exports: - weak: - - tk >=8.6.13,<8.7.0a0 - size: 3566806 - timestamp: 1787272857910 -- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.8-py312h4c3975b_0.conda - sha256: 2ea8f8b10e869b675d2fba157b387eaf4eed1696bfc924bb7b28e67d7aa0a947 - md5: 5423c2b8f82d60320e65b9ff30babbdf - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/tornado?source=compressed-mapping - run_exports: {} - size: 869730 - timestamp: 1786226754702 -- conda: https://conda.anaconda.org/conda-forge/linux-64/triton-3.7.1-cuda129py312h811769c_1.conda - sha256: f6057dfe20a473f0b1ab7e1a231ebce774ba934a3c54176efb58bf1133aaa44b - md5: b32d0cc6a3091264c0b61db49ecc8718 - depends: - - python - - setuptools - - cuda-nvcc-tools - - cuda-cuobjdump - - cuda-cudart - - cuda-cupti - - libstdcxx >=14 - - libgcc >=14 - - cuda-version >=12.9,<13 - - __glibc >=2.17,<3.0.a0 - - zstd >=1.5.7,<1.6.0a0 - - cuda-cupti >=12.9.79,<13.0a0 - - python_abi 3.12.* *_cp312 - - libzlib >=1.3.2,<2.0a0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/triton?source=hash-mapping - run_exports: {} - size: 40337080 - timestamp: 1781881966422 -- conda: https://conda.anaconda.org/conda-forge/linux-64/triton-3.7.1-cuda130py312hc6dca4b_1.conda - sha256: eb2c1eb649d262cbe880741bfff47e1755339d285d3c5317ea00621414c73798 - md5: aed2cbe1dbc1e8651787aad24fff18f9 - depends: - - python - - setuptools - - cuda-nvcc-tools - - cuda-cuobjdump - - cuda-cudart - - cuda-cupti - - cuda-version >=13.0,<14 - - __glibc >=2.28,<3.0.a0 - - libstdcxx >=14 - - libgcc >=14 - - python_abi 3.12.* *_cp312 - - libzlib >=1.3.2,<2.0a0 - - zstd >=1.5.7,<1.6.0a0 - - cuda-cupti >=13.0.85,<14.0a0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/triton?source=hash-mapping - run_exports: {} - size: 40340701 - timestamp: 1781881962924 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ucc-1.8.0-hcedbda0_0.conda - sha256: 4b2f9ef4cb98e308d73aee46a2e8a674d7c8d4561a7b4aec55a9badaea6d1081 - md5: 8ab70c9879672507da23e13aaada0918 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - - rdma-core >=63.0 - - ucx >=1.20.1,<1.20.2.0a0 - constrains: - - cuda-version >=12,<13.0a0 - - cuda-cudart - - nccl >=2.30.4.1,<3.0a0 - license: BSD-3-Clause - license_family: BSD - run_exports: - weak: - - ucc >=1.8.0,<2.0a0 - size: 12787949 - timestamp: 1781051199217 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ucx-1.20.1-hbe80e26_0.conda - sha256: 8f0ac4a92e4674eb4c87cdfc59d2fc7c2d0d1696689202eeb62ef715d82ce711 - md5: 7d06bc10996e75c90b8cd7631b5dcf6c - depends: - - __glibc >=2.17,<3.0.a0 - - _openmp_mutex >=4.5 - - libgcc >=14 - - libstdcxx >=14 - - rdma-core >=61.0 - constrains: - - cuda-version >=12,<13.0a0 - - cuda-cudart - license: BSD-3-Clause - license_family: BSD - run_exports: - weak: - - ucx >=1.20.1,<1.21.0a0 - size: 7841432 - timestamp: 1779828197486 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py312hd9148b4_0.conda - sha256: c975070ac28fe23a5bbb2b8aeca5976b06630eb2de2dc149782f74018bf07ae8 - md5: 55fd03988b1b1bc6faabbfb5b481ecd7 - depends: - - __glibc >=2.17,<3.0.a0 - - cffi - - libgcc >=14 - - libstdcxx >=14 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: MIT - license_family: MIT - purls: - - pkg:pypi/ukkonen?source=hash-mapping - run_exports: {} - size: 14882 - timestamp: 1769438717830 -- conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py311h49ec1c0_0.conda - sha256: 2bd8ee058dc98e614003591eb221a8b08449768b13aebe76dad8528bf0f5f88b - md5: 2889f0c0b6a6d7a37bd64ec60f4cc210 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/unicodedata2?source=hash-mapping - run_exports: {} - size: 409682 - timestamp: 1770909108616 -- conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda - sha256: 895bbfe9ee25c98c922799de901387d842d7c01cae45c346879865c6a907f229 - md5: 0b6c506ec1f272b685240e70a29261b8 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/unicodedata2?source=hash-mapping - run_exports: {} - size: 410641 - timestamp: 1770909099497 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda - sha256: 49b532d1df875c6749d9078b56a76f3f5db49a5abe0ca620b593ed474ef0ebf1 - md5: 85c9442aec283b4e464fa9ecc484a2f3 - depends: - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - xorg-libice >=1.1.2,<2.0a0 - size: 62517 - timestamp: 1786474410404 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda - sha256: ef907caee0665cf3b0f775602cc50e388e3bade8ce22ecade0873ff26604b2fd - md5: aa7459ed9ad086ba11dda843d764b33d - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - xorg-libice >=1.1.2,<2.0a0 - - libuuid >=2.42.2,<3.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - xorg-libsm >=1.2.6,<2.0a0 - size: 30739 - timestamp: 1786545374265 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda - sha256: 68053eebfa9f0d91666786c8fb5839d989aa9b869add92cb8815228bb2d7302c - md5: 8c282bbe4808a3cc80a5c98e9aec1cfc - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libxcb >=1.17.0,<2.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - xorg-libx11 >=1.8.13,<2.0a0 - size: 839578 - timestamp: 1787087012372 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda - sha256: cbf891f6cc1a859347680af1c8562bc6b033bf182a2a3bb536016932be3206de - md5: f06ef439c280a5f90b8bf62355008dbc - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - xorg-libxau >=1.0.12,<2.0a0 - size: 16419 - timestamp: 1786381001122 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda - sha256: c50a16c05ccd7fe7dd6d6cfb539f4e9a491d50f9ed7a5c902fec638f7d0d27be - md5: 2e66c929f3d879708335b6ea4557c838 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - xorg-libxdmcp >=1.1.5,<2.0a0 - size: 21120 - timestamp: 1786381006369 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda - sha256: aa9bbe8b278aacc194e280ff5037f9f9a1f2c5b33ed97de8e7f01cfbe90dda43 - md5: e5b6b28536b81b3f4cb20db4668a4642 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=15 - - xorg-libx11 >=1.8.13,<2.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - xorg-libxext >=1.3.7,<2.0a0 - size: 53124 - timestamp: 1787100841900 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda - sha256: 6901f91d398811e4ec89d7e20a69abac02a7bfebfaf073338b7ea3d1a99685b7 - md5: e470d224a7a5be1b1d021bded7abb536 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - xorg-libx11 >=1.8.13,<2.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - xorg-libxrender >=0.9.12,<0.10.0a0 - size: 34645 - timestamp: 1787100191192 -- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda - sha256: d164dfa75ecd538f6fd68765defcc06aa875bc697b9b215362d79a2a73125dd0 - md5: e741576fb8f89821ac7c1c537322a33d - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=15 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - yaml >=0.2.5,<0.3.0a0 - size: 84936 - timestamp: 1787228426393 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h09e67af_11.conda - sha256: dc9f28dedcb5f35a127fad2d847674d2833369dd616d294e423b8997df31d8a8 - md5: 96b08867e21d4694fa5c2c226e6581b0 - depends: - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - krb5 >=1.22.2,<1.23.0a0 - - libsodium >=1.0.22,<1.0.23.0a0 - license: MPL-2.0 - license_family: MOZILLA - purls: [] - run_exports: - weak: - - zeromq >=4.3.5,<4.4.0a0 - size: 311184 - timestamp: 1779123989774 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_3.conda - sha256: 16080a1c7724f7d25727cdc23c7658e0cec2db52448c1dc0c33467ee2c6e1c62 - md5: 6acb86426229f96f93e5468d1df3a5e8 - depends: - - __glibc >=2.17,<3.0.a0 - - libzlib 1.3.2 h25fd6f3_3 - license: Zlib - license_family: Other - purls: [] - run_exports: - weak: - - libzlib >=1.3.2,<2.0a0 - size: 96132 - timestamp: 1785362957588 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda - sha256: 8b786bb4380fa69a718b08a400040b865bc9207eda337e0a1955717c3c3a9403 - md5: 1726acec19beeed1c764385cd8622405 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=15 - - libstdcxx >=15 - license: Zlib - license_family: Other - purls: [] - run_exports: - weak: - - zlib-ng >=2.3.3,<2.4.0a0 - size: 123959 - timestamp: 1786736890973 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda - sha256: 47d682b9f6d6ec9eb1a6e6c3e75ea6273e899e78fb7fc59f81d39745009fbc60 - md5: aa459086047c0e5e27023ab19f8cb86a - depends: - - __glibc >=2.17,<3.0.a0 - - libzlib >=1.3.2,<2.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - zstd >=1.5.7,<1.6.0a0 - size: 601301 - timestamp: 1786599621503 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-7_kmp_llvm.conda - build_number: 7 - sha256: 3a5dfcf315e59dff4130e033b0f9de8c38fa5f65009d2d82452a3f57f5fcb39f - md5: ebcfdf7d6198fdb6f31f0e72efb15a26 - depends: - - llvm-openmp >=9.0.1 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - _openmp_mutex >=4.5 - size: 8293 - timestamp: 1764092286102 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ast-serialize-0.8.0-py310h8c58d24_0.conda - noarch: python - sha256: c5ab5a656da6dcde59600507f37032b86fd9b619de8497661d11da663dbc9331 - md5: 05e66d3480c37aeccc0fbe8f3d18dccb - depends: - - python >=3.10 - - libgcc >=14 - - _python_abi3_support 1.* - - cpython >=3.10 - constrains: - - __glibc >=2.17 - license: MIT - license_family: MIT - purls: - - pkg:pypi/ast-serialize?source=hash-mapping - run_exports: {} - size: 1094436 - timestamp: 1786328963498 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.10.4-h03961ac_1.conda - sha256: 6d9fe5b1e2335e7f0364da18a7467e9bea66184b189b1f3e4a103bd7ce74eee5 - md5: 3d7c8f2150a3ae6238f82a03e72771c7 - depends: - - libgcc >=14 - - aws-c-http >=0.11.0,<0.11.1.0a0 - - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 - - aws-c-cal >=0.9.14,<0.9.15.0a0 - - aws-c-io >=0.27.3,<0.27.4.0a0 - - aws-c-common >=0.14.2,<0.14.3.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-c-auth >=0.10.4,<0.10.5.0a0 - size: 144598 - timestamp: 1784086854605 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.9.14-h6c1c863_4.conda - sha256: ea92667f514ec66e9e9b46a405185a4b36747c9e9c98bb2ecaa585e2ea6b4d76 - md5: 4aa7ed2c75a8d91a34b5be26fee04447 - depends: - - aws-c-common >=0.14.2,<0.14.3.0a0 - - libgcc >=14 - - openssl >=3.5.7,<4.0a0 - license: Apache-2.0 - license_family: Apache - purls: [] - run_exports: - weak: - - aws-c-cal >=0.9.14,<0.9.15.0a0 - size: 60395 - timestamp: 1784043425321 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.14.2-he30d5cf_0.conda - sha256: 415574b4d4e78257bb3f03a5deb3791fe9ac3ce8e452dd29957d1cb08d0932e2 - md5: ef1cf9bbfb175c8f30b15c0a045807fd - depends: - - libgcc >=14 - license: Apache-2.0 - license_family: Apache - purls: [] - run_exports: - weak: - - aws-c-common >=0.14.2,<0.14.3.0a0 - size: 269577 - timestamp: 1783637251921 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.3.2-hbf34bff_4.conda - sha256: 160b9e94ef5e3edb1c3013e0d47e6eeeebd29197a980e5a03285c414c07ca87b - md5: ccc9c3160d95486f2de5d5efdb08a0a6 - depends: - - libgcc >=14 - - aws-c-common >=0.14.2,<0.14.3.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-c-compression >=0.3.2,<0.3.3.0a0 - size: 23533 - timestamp: 1784042870708 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.7.1-h423fd5f_4.conda - sha256: 849f96172d9e9da8c9f4913193f383581fce715722e825fbcaebeb43a610e3bc - md5: 0d359b84eeae657d590354b4bf13f804 - depends: - - libstdcxx >=14 - - libgcc >=14 - - aws-c-io >=0.27.3,<0.27.4.0a0 - - aws-c-common >=0.14.2,<0.14.3.0a0 - - aws-checksums >=0.2.10,<0.2.11.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-c-event-stream >=0.7.1,<0.7.2.0a0 - size: 62837 - timestamp: 1784075715343 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.11.0-hb2c4768_4.conda - sha256: 27958eb16db0931da2cbeb238fa6dafa85a844df43ddd2f2aaba33423a620879 - md5: 8e5a8a7f923a502699da9122857f6da9 - depends: - - libgcc >=14 - - aws-c-common >=0.14.2,<0.14.3.0a0 - - aws-c-io >=0.27.3,<0.27.4.0a0 - - aws-c-cal >=0.9.14,<0.9.15.0a0 - - aws-c-compression >=0.3.2,<0.3.3.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-c-http >=0.11.0,<0.11.1.0a0 - size: 220610 - timestamp: 1784075707703 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.27.3-hc846123_1.conda - sha256: f0c6a11599605b2ba91beee54a76324994e1b9b3fe0bcfda9176312497d94fad - md5: e45dc7a3367a5cc5279ac6109453a6c7 - depends: - - libgcc >=14 - - s2n >=1.7.5,<1.7.6.0a0 - - aws-c-cal >=0.9.14,<0.9.15.0a0 - - aws-c-common >=0.14.2,<0.14.3.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-c-io >=0.27.3,<0.27.4.0a0 - size: 188979 - timestamp: 1784054849410 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.16.0-hf64e385_2.conda - sha256: 2f0ab01210a1573235283eebb6ef43fc4540c78c9b12536723a99f2c35ba243e - md5: 95ef1f416e1c4a303e99d42882168ca9 - depends: - - libgcc >=14 - - aws-c-common >=0.14.2,<0.14.3.0a0 - - aws-c-io >=0.27.3,<0.27.4.0a0 - - aws-c-http >=0.11.0,<0.11.1.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-c-mqtt >=0.16.0,<0.16.1.0a0 - size: 200289 - timestamp: 1784087579018 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.12.8-h681413d_1.conda - sha256: 2e52c4584c1a1db45dab865b7616ad80a5924ff1343f91724416f2189b4eb111 - md5: da4fba448cece5e841abcc238e47ba9f - depends: - - libgcc >=14 - - aws-c-http >=0.11.0,<0.11.1.0a0 - - aws-c-common >=0.14.2,<0.14.3.0a0 - - openssl >=3.5.7,<4.0a0 - - aws-c-io >=0.27.3,<0.27.4.0a0 - - aws-c-auth >=0.10.4,<0.10.5.0a0 - - aws-checksums >=0.2.10,<0.2.11.0a0 - - aws-c-cal >=0.9.14,<0.9.15.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-c-s3 >=0.12.8,<0.12.9.0a0 - size: 163135 - timestamp: 1784100999745 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.2.7-hbf34bff_2.conda - sha256: 23900fef809514756bdb6ecabf57ba885043e6b529e8f54cff54c6a686b2df3e - md5: 66caa7d5a2d03be07581008af67ca7a9 - depends: - - libgcc >=14 - - aws-c-common >=0.14.2,<0.14.3.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 - size: 72345 - timestamp: 1784044274788 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.2.10-hbf34bff_4.conda - sha256: 0ce7c2234ca5220f455e7c12ad10fe99c74d50b692d932548665cbada323db40 - md5: a6ca00a2a9e89bd1963395337e94bf30 - depends: - - libgcc >=14 - - aws-c-common >=0.14.2,<0.14.3.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-checksums >=0.2.10,<0.2.11.0a0 - size: 99946 - timestamp: 1784044256016 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.40.1-h18900c3_3.conda - sha256: 4fa8fa029b442a5499f65bb68c1ac52f87b8e6d9f429eb9a95214d59cfd0d32c - md5: 163e781b8820eff4f86e28d5310a9318 - depends: - - libgcc >=14 - - libstdcxx >=14 - - aws-c-auth >=0.10.4,<0.10.5.0a0 - - aws-c-io >=0.27.3,<0.27.4.0a0 - - aws-c-cal >=0.9.14,<0.9.15.0a0 - - aws-c-common >=0.14.2,<0.14.3.0a0 - - aws-c-event-stream >=0.7.1,<0.7.2.0a0 - - aws-c-http >=0.11.0,<0.11.1.0a0 - - aws-c-mqtt >=0.16.0,<0.16.1.0a0 - - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 - - aws-c-s3 >=0.12.8,<0.12.9.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-crt-cpp >=0.40.1,<0.40.2.0a0 - size: 333899 - timestamp: 1784113243926 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.833-h1131a43_9.conda - sha256: 9d377157e9021e583d4b4e17aee05ea7c417d5516aaaaeb5a51ed7ac9675d058 - md5: 2fea7699a12af3e193214e0d820128ec - depends: - - libgcc >=14 - - libstdcxx >=14 - - aws-crt-cpp >=0.40.1,<0.40.2.0a0 - - aws-c-event-stream >=0.7.1,<0.7.2.0a0 - - libzlib >=1.3.2,<2.0a0 - - aws-c-common >=0.14.2,<0.14.3.0a0 - - libcurl >=8.21.0,<9.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-sdk-cpp >=1.11.833,<1.11.834.0a0 - size: 3343033 - timestamp: 1784137273922 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-core-cpp-1.16.3-h412bcfc_0.conda - sha256: 5ba7676afdda3b325068e4da6192561acf4d11ce6352e86c20811043d71d5974 - md5: eb4544865559667708a887e635b8f472 - depends: - - libcurl >=8.19.0,<9.0a0 - - libgcc >=14 - - libstdcxx >=14 - - openssl >=3.5.5,<4.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - azure-core-cpp >=1.16.3,<1.16.4.0a0 - size: 340347 - timestamp: 1775240498957 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-identity-cpp-1.13.3-hd0001b6_2.conda - sha256: cec5f8f1b866eae6f02110c5b4f2530c5ede3095b5e59431349f7352c8c1b1fb - md5: c30d9e466e546970b50fbbcd335b60a0 - depends: - - azure-core-cpp >=1.16.3,<1.16.4.0a0 - - libgcc >=14 - - libstdcxx >=14 - - openssl >=3.5.7,<4.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - azure-identity-cpp >=1.13.3,<1.13.4.0a0 - size: 231030 - timestamp: 1781269704268 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-blobs-cpp-12.18.0-h2e50874_1.conda - sha256: f9b95610e8432c8d419080d71038d396d50188dfa330e0e7d1402ff3dbd1cd87 - md5: 8de9d169d8ab02da10afbd2e2175282e - depends: - - azure-core-cpp >=1.16.3,<1.16.4.0a0 - - azure-storage-common-cpp >=12.14.0,<12.14.1.0a0 - - libgcc >=14 - - libstdcxx >=14 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - azure-storage-blobs-cpp >=12.18.0,<12.18.1.0a0 - size: 531661 - timestamp: 1781285567956 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-common-cpp-12.14.0-hacd5e5f_1.conda - sha256: af2eb1e58bdfeaf1fded35625d20b5076191357d55350671ef7c18b34e44e277 - md5: 40cef89c86e33d5d58822827bd9e82a6 - depends: - - azure-core-cpp >=1.16.3,<1.16.4.0a0 - - libgcc >=14 - - libstdcxx >=14 - - libxml2 - - libxml2-16 >=2.14.6 - - openssl >=3.5.7,<4.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - azure-storage-common-cpp >=12.14.0,<12.14.1.0a0 - size: 150668 - timestamp: 1781269527467 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-files-datalake-cpp-12.16.0-hde34f15_1.conda - sha256: 10f09615e3c893f6848a8047a6f6644a6f0cab954a60337fbe96f8104aadc134 - md5: e8a075a1e6067cc8e59d7e408c284851 - depends: - - azure-core-cpp >=1.16.3,<1.16.4.0a0 - - azure-storage-blobs-cpp >=12.18.0,<12.18.1.0a0 - - azure-storage-common-cpp >=12.14.0,<12.14.1.0a0 - - libgcc >=14 - - libstdcxx >=14 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - azure-storage-files-datalake-cpp >=12.16.0,<12.16.1.0a0 - size: 275540 - timestamp: 1781541799749 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-1.2.0-h52fc18c_3.conda - sha256: 82fac3d274aa4b5da63712a2c204e72a816b80977f2810c758055c68a3d5a07b - md5: b1f4ee87d0d9c03e4a4c3578f5dc35a2 - depends: - - brotli-bin 1.2.0 hdc3483e_3 - - libbrotlidec 1.2.0 h011f0d3_3 - - libbrotlienc 1.2.0 hb247b97_3 - - libgcc >=15 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libbrotlicommon >=1.2.0,<1.3.0a0 - - libbrotlienc >=1.2.0,<1.3.0a0 - - libbrotlidec >=1.2.0,<1.3.0a0 - size: 20738 - timestamp: 1786622750556 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-bin-1.2.0-hdc3483e_3.conda - sha256: 2d1125cb009edcf038096ae8d3fb5a45d0236752bf96e05211f74abc036cb93a - md5: 16f1289d41808093c73b3c98a014676b - depends: - - libbrotlidec 1.2.0 h011f0d3_3 - - libbrotlienc 1.2.0 hb247b97_3 - - libgcc >=15 - license: MIT - license_family: MIT - purls: [] - run_exports: {} - size: 21173 - timestamp: 1786622742942 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_10.conda - sha256: 24eacc8a20fd7c4616566178562bef7f9344eb4a8700cfc3180fa75a6ff9d39f - md5: fd544ef1c672d645bf78e5819cbb8f91 - depends: - - libgcc >=14 - license: bzip2-1.0.6 - license_family: BSD - purls: [] - run_exports: - weak: - - bzip2 >=1.0.8,<2.0a0 - size: 194694 - timestamp: 1785906301397 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.8-h29ee22c_2.conda - sha256: 3838d10a78c206a1a4ec7ff041880b4f9b8ecde3520c911daae9e06baeb8858e - md5: eb80eb38625b8552a099aa88f8ba5db7 - depends: - - libgcc >=15 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - c-ares >=1.34.8,<2.0a0 - size: 241210 - timestamp: 1787169968125 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-h0b6afd8_1.conda - sha256: 675db823f3d6fb6bf747fab3b0170ba99b269a07cf6df1e49fff2f9972be9cd1 - md5: 043c13ed3a18396994be9b4fab6572ad - depends: - - fontconfig >=2.15.0,<3.0a0 - - fonts-conda-ecosystem - - icu >=78.1,<79.0a0 - - libexpat >=2.7.3,<3.0a0 - - libfreetype >=2.14.1 - - libfreetype6 >=2.14.1 - - libgcc >=14 - - libglib >=2.86.3,<3.0a0 - - libpng >=1.6.53,<1.7.0a0 - - libstdcxx >=14 - - libxcb >=1.17.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - pixman >=0.46.4,<1.0a0 - - xorg-libice >=1.1.2,<2.0a0 - - xorg-libsm >=1.2.6,<2.0a0 - - xorg-libx11 >=1.8.12,<2.0a0 - - xorg-libxext >=1.3.6,<2.0a0 - - xorg-libxrender >=0.9.12,<0.10.0a0 - license: LGPL-2.1-only or MPL-1.1 - purls: [] - run_exports: - weak: - - cairo >=1.18.4,<2.0a0 - size: 927045 - timestamp: 1766416003626 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-2.1.1-py312h563f9cf_2.conda - sha256: d00c40b16fa582c949f2add3bad6f9f2784f6eeb7c2c2d0ffdafede892883862 - md5: 1f2fb9b290f5e5d65619eeaa213f9a06 - depends: - - libffi >=3.7.0,<3.8.0a0 - - libgcc >=15 - - pycparser - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: MIT - license_family: MIT - purls: - - pkg:pypi/cffi?source=hash-mapping - run_exports: {} - size: 324384 - timestamp: 1786775066660 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/contourpy-1.3.3-py312hf18b547_4.conda - sha256: 9c1b308fb3fb3bfd9ed3acbf1373f6f73254b71a5f9373a56f09099c4a93a9e7 - md5: 5527a172fc63ae2916c2aaf50fbef1a5 - depends: - - numpy >=1.25 - - python - - python 3.12.* *_cpython - - libstdcxx >=14 - - libgcc >=14 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/contourpy?source=hash-mapping - run_exports: {} - size: 339097 - timestamp: 1769155976173 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/coverage-7.15.4-py312h2b0bcae_1.conda - sha256: 0f21bdb0dba52ceb321f7fbcda9ac7258dc9d342d631c6db2d3fe6ca4c640f3a - md5: f7dc46cc06806d57164855c280b14251 - depends: - - python - - tomli - - libgcc >=14 - - python_abi 3.12.* *_cp312 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/coverage?source=hash-mapping - run_exports: {} - size: 415794 - timestamp: 1786293593352 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fmt-12.1.0-h166da81_1.conda - sha256: 9576231133ef25127cf8855492a6e34a3189e3a8986cc69ebfef6516670d4822 - md5: 2ba56bd59c36644d783ef8a8086ec0e4 - depends: - - libgcc >=14 - - libstdcxx >=14 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - fmt >=12.1.0,<12.2.0a0 - size: 197306 - timestamp: 1785915387774 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.18.3-ha4b22b4_1.conda - sha256: 5f7801b6044ff233943e68f5156d4987fe8447d1be9378fb5c67f7aa009a33e7 - md5: bb629904b3e9326efaa5c39c956f2b63 - depends: - - libexpat >=2.8.1,<3.0a0 - - libfreetype >=2.14.3 - - libfreetype6 >=2.14.3 - - libgcc >=15 - - libuuid >=2.42.2,<3.0a0 - - libzlib >=1.3.2,<2.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - fontconfig >=2.18.3,<3.0a0 - - fonts-conda-ecosystem - size: 304159 - timestamp: 1786667327378 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fonttools-4.63.0-py312ha4530ae_0.conda - sha256: e1c4ef9d5d34ac12b2139d9ca2bec9675bb5b6266894d819951b5b333452bb83 - md5: 4922a18cb643859aba71e808609cce6c - depends: - - brotli - - libgcc >=14 - - munkres - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - unicodedata2 >=15.1.0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/fonttools?source=hash-mapping - run_exports: {} - size: 2952221 - timestamp: 1778770458588 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.14.3-h8af1aa0_2.conda - sha256: 7af9e368efdaf59e0709ae89c2e7f0ce0e1067a857958f367318ff3c27209a64 - md5: f5d76071be867597bab18a0e45d588e1 - depends: - - libfreetype 2.14.3 h8af1aa0_2 - - libfreetype6 2.14.3 h9cc7050_2 - license: GPL-2.0-only OR FTL - purls: [] - run_exports: - weak: - - libfreetype >=2.14.3 - - libfreetype6 >=2.14.3 - size: 174712 - timestamp: 1786640946309 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fribidi-1.0.16-he30d5cf_1.conda - sha256: 0b11eca89f8143a1eed1cb64876c2015aaccc1e794394706dae2978dfdee148e - md5: a53fb4bfd0bc371eab779e79152fea74 - depends: - - libgcc >=14 - license: LGPL-2.1-or-later - purls: [] - run_exports: - weak: - - fribidi >=1.0.16,<2.0a0 - size: 63507 - timestamp: 1785912512987 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.3.1-h7ac5ae9_0.conda - sha256: ac0c8ebb2e11e638245b1a26cb168468fd4aafc36dd12df8a009f11355360a73 - md5: 3f18cea95a75c9ea2b27315c282579e3 - depends: - - libgcc >=14 - - libstdcxx >=14 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - gflags >=2.3.1,<2.4.0a0 - size: 118758 - timestamp: 1785044710617 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glog-0.7.1-ha2f5727_1.conda - sha256: 007ae9f5f8afc76c9e6cf9fbb00259aa7b9b104cc238bc81f5da405ca80ffff4 - md5: 344bfac751a4186c645dd13458653518 - depends: - - gflags >=2.3.0,<2.4.0a0 - - libgcc >=14 - - libstdcxx >=14 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - glog >=0.7.1,<0.8.0a0 - size: 153402 - timestamp: 1784094413832 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gmp-6.3.0-h4d6b352_3.conda - sha256: ab165962a7316f269a7bde936aa442bf69f0fed97a497e63ec28f366b4999037 - md5: ce2326e31df1913341036653e1c07baa - depends: - - libstdcxx >=14 - - libgcc >=14 - license: GPL-2.0-or-later OR LGPL-3.0-or-later - purls: [] - run_exports: - weak: - - gmp >=6.3.0,<7.0a0 - size: 457444 - timestamp: 1786629160018 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gmpy2-2.3.1-py312h70c4b35_0.conda - sha256: eb1fe54ab3f7169a051853371a6d61d0cb1ccbf60c8ef08eba7d09a1c2a48e19 - md5: 7277537570c041312f29d00530cf07e8 - depends: - - python - - libgcc >=15 - - mpc >=1.4.0,<2.0a0 - - gmp >=6.3.0,<7.0a0 - - python_abi 3.12.* *_cp312 - - mpfr >=4.2.2,<5.0a0 - license: LGPL-3.0-or-later - license_family: LGPL - purls: - - pkg:pypi/gmpy2?source=hash-mapping - run_exports: {} - size: 320932 - timestamp: 1787066342583 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.15-h7ac5ae9_1.conda - sha256: 5be01914b445dfbde85a4751b1d12b331740e7af68a86e4ef6313ab38a870fdd - md5: c5835ff5788e0d772d67a97bd5fe001b - depends: - - libstdcxx >=14 - - libgcc >=14 - license: LGPL-2.0-or-later - license_family: LGPL - purls: [] - run_exports: - weak: - - graphite2 >=1.3.15,<2.0a0 - size: 119414 - timestamp: 1786118514013 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/h5py-3.16.0-nompi_py312h613db53_104.conda - sha256: 480885e23228159c8b91b24d23a86a84a4e559e1770fbe01dfc91f9a5dbe1829 - md5: d3f8adeaea41a0e0e12233440f9ea144 - depends: - - cached-property - - hdf5 >=1.14.6,<1.14.7.0a0 - - libgcc >=15 - - numpy >=1.25,<3 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/h5py?source=compressed-mapping - run_exports: {} - size: 1328367 - timestamp: 1787108803031 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/hdf5-1.14.6-nompi_hf95b8e7_110.conda - sha256: 067be3219adcaf06f9d17fc81f70f4d2f6d27ac8b879c7585a93eb490f67aa88 - md5: 0e424b413cc5968a67eb384cc02f49ee - depends: - - libaec >=1.1.5,<2.0a0 - - libcurl >=8.20.0,<9.0a0 - - libgcc >=14 - - libgfortran - - libgfortran5 >=14.3.0 - - libstdcxx >=14 - - libzlib >=1.3.2,<2.0a0 - - openssl >=3.5.6,<4.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - hdf5 >=1.14.6,<1.14.7.0a0 - size: 3915784 - timestamp: 1780589303795 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/hf-xet-1.5.2-py310h160093b_2.conda - noarch: python - sha256: 04dd3253fa1e0d6c47b27886cdc42bbed711b1bf7c2c0be58fe0d56efb825085 - md5: 934e4366e1486e2c75a3dbd58250ef56 - depends: - - python - - libgcc >=14 - - _python_abi3_support 1.* - - cpython >=3.10 - - openssl >=3.5.7,<4.0a0 - constrains: - - __glibc >=2.17 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/hf-xet?source=hash-mapping - run_exports: {} - size: 3460726 - timestamp: 1784665055005 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-py311h3512406_2.conda - sha256: 54d921defd947adb58a90e10203d3bfe6c1f209f5f1a1ad2c6a9f7617f2fb59e - md5: b35bbb1b957440ed742f35fb96eb7f1c - depends: - - libgcc >=14 - - libstdcxx >=14 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - icu >=78.3,<79.0a0 - size: 14688525 - timestamp: 1786545779464 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h5bc82ec_1.conda - sha256: 3999b1472f1e549a0b766428e2823abf20626aac5314b474c9b76bf6eb679def - md5: 6d9be306ecb8dfc9ff46f02cb367d5c2 - depends: - - libgcc >=15 - license: LGPL-2.1-or-later - purls: [] - run_exports: - weak: - - keyutils >=1.6.3,<2.0a0 - size: 129546 - timestamp: 1786739205968 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/kiwisolver-1.5.0-py312h1683e8e_0.conda - sha256: 778a04854b5eb635216839f4ae7b3f312d306b6554b0296c745fd47d8859fe8c - md5: f72640fdd363b16da4c2972236c80035 - depends: - - python - - libstdcxx >=14 - - libgcc >=14 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/kiwisolver?source=hash-mapping - run_exports: {} - size: 82439 - timestamp: 1773067307369 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-h095d8e5_2.conda - sha256: 601d79af94d9562ba70e2d4947034ba159aae293a3c860855335a7c76c14400e - md5: a4d0da122ba952abf76981e76d0d283c - depends: - - keyutils >=1.6.3,<2.0a0 - - libedit >=3.1.20250104,<3.2.0a0 - - libedit >=3.1.20250104,<4.0a0 - - libgcc >=15 - - libstdcxx >=15 - - openssl >=3.5.7,<4.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - krb5 >=1.22.2,<1.23.0a0 - size: 1538590 - timestamp: 1786762058856 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.19.1-h9d5b58d_1.conda - sha256: ed213207bbf11663181941e0931caa9ce748f0544688e8e0fbcf330bca279389 - md5: 9183fda4be2b4ee5760cdb8e540439c8 - depends: - - libgcc >=14 - - libjpeg-turbo >=3.1.4.1,<4.0a0 - - libtiff >=4.7.1,<4.8.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - lcms2 >=2.19.1,<3.0a0 - size: 296564 - timestamp: 1780211834883 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda - sha256: 2c4901f4227b0850328ed0c69f958b30ad2cd18982f7a31c7c1f911827004d08 - md5: 489444d0acb2a579d2a002d85a08c059 - depends: - - zstd >=1.5.7,<1.6.0a0 - constrains: - - binutils_impl_linux-aarch64 2.46.1 - license: GPL-3.0-only - license_family: GPL - purls: [] - run_exports: {} - size: 905305 - timestamp: 1784214534868 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.2.0-h52b7260_0.conda - sha256: 0176a71d64fcb5aec43c9e8ab4ae72faa6c6b0b1cda8f40b65e19429ce13c84d - md5: 9fcfe6be4f752b72be7abc69842ca396 - depends: - - libgcc >=14 - - libstdcxx >=14 - license: Apache-2.0 - license_family: Apache - purls: [] - run_exports: - weak: - - lerc >=4.2.0,<5.0a0 - size: 244850 - timestamp: 1785038308130 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20260526.0-cxx17_hc5e897d_2.conda - sha256: 2f21286b1c8c978c629cf2fd18c6715f15c5c57fa6d9283587b8f66290bfbfc3 - md5: 46a7ae7c040e95909dd43808414747fb - depends: - - libgcc >=14 - - libstdcxx >=14 - constrains: - - abseil-cpp =20260526.0 - - libabseil-static =20260526.0=cxx17* - license: Apache-2.0 - license_family: Apache - purls: [] - run_exports: - weak: - - libabseil >=20260526.0,<20260527.0a0 - - libabseil =*=cxx17* - size: 1460594 - timestamp: 1787216970549 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libaec-1.1.5-hff7e48a_0.conda - sha256: 8b74acb52cda5f4ba91f59c85132f582de5db9dceff4e252f49c2525d14c600c - md5: 345c7bf559743adb5375ee3603911065 - depends: - - libgcc >=14 - - libstdcxx >=14 - license: BSD-2-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libaec >=1.1.5,<2.0a0 - size: 37745 - timestamp: 1769221878827 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-25.0.0-hf28620a_4_cpu.conda - build_number: 4 - sha256: 715b8b36fd21709d5e73efa129672a98de4777963ea6b17b8b981364d2adcc71 - md5: ddb826d1d56e1ab7fe1cd906a8072a63 - depends: - - aws-crt-cpp >=0.40.1,<0.40.2.0a0 - - aws-sdk-cpp >=1.11.833,<1.11.834.0a0 - - azure-core-cpp >=1.16.3,<1.16.4.0a0 - - azure-identity-cpp >=1.13.3,<1.13.4.0a0 - - azure-storage-blobs-cpp >=12.18.0,<12.18.1.0a0 - - azure-storage-files-datalake-cpp >=12.16.0,<12.16.1.0a0 - - bzip2 >=1.0.8,<2.0a0 - - glog >=0.7.1,<0.8.0a0 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libbrotlidec >=1.2.0,<1.3.0a0 - - libbrotlienc >=1.2.0,<1.3.0a0 - - libgcc >=14 - - libgoogle-cloud >=3.8.0,<3.9.0a0 - - libgoogle-cloud-storage >=3.8.0,<3.9.0a0 - - libopentelemetry-cpp >=1.27.0,<1.28.0a0 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libstdcxx >=14 - - libzlib >=1.3.2,<2.0a0 - - lz4-c >=1.10.0,<1.11.0a0 - - orc >=2.3.1,<2.3.2.0a0 - - snappy >=1.2.2,<1.3.0a0 - - zstd >=1.5.7,<1.6.0a0 - constrains: - - apache-arrow-proc =*=cpu - - arrow-cpp <0.0a0 - - parquet-cpp <0.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - libarrow >=25.0.0,<25.1.0a0 - size: 6135363 - timestamp: 1786313502797 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-25.0.0-hb326ee9_4_cpu.conda - build_number: 4 - sha256: c34750d3ebbe94be004a90f292bc89011bbfc721277eadf97b4222aeee128afd - md5: 9cb586c768b6eb486d1a356334629bef - depends: - - libarrow 25.0.0 hf28620a_4_cpu - - libarrow-compute 25.0.0 hdd99842_4_cpu - - libgcc >=14 - - libstdcxx >=14 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - libarrow-acero >=25.0.0,<25.1.0a0 - size: 550216 - timestamp: 1786313662950 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-compute-25.0.0-hdd99842_4_cpu.conda - build_number: 4 - sha256: 7b88d6f9a5e386ab20d6d229f7edc7c971631c91f195cf0557bcb75ad5f151b0 - md5: 3afdcc262669ce23e9759369ddbbc0e4 - depends: - - libarrow 25.0.0 hf28620a_4_cpu - - libgcc >=14 - - libre2-11 >=2025.11.5 - - libstdcxx >=14 - - libutf8proc >=2.11.3,<2.12.0a0 - - re2 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - libarrow-compute >=25.0.0,<25.1.0a0 - size: 2544166 - timestamp: 1786313597505 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-25.0.0-hb326ee9_4_cpu.conda - build_number: 4 - sha256: c1824a6419f5faa4024df86b86905922c56e1465abbac8848d0cd37fa6167420 - md5: 575e14ddd055857ac2fd7bc96a7ae37b - depends: - - libarrow 25.0.0 hf28620a_4_cpu - - libarrow-acero 25.0.0 hb326ee9_4_cpu - - libarrow-compute 25.0.0 hdd99842_4_cpu - - libgcc >=14 - - libparquet 25.0.0 h87079af_4_cpu - - libstdcxx >=14 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - libarrow-dataset >=25.0.0,<25.1.0a0 - size: 552071 - timestamp: 1786313705958 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-25.0.0-hd99807d_4_cpu.conda - build_number: 4 - sha256: 90f33030625092ff97102836e12177a78e53bf1cb42c7588cd8ad09df7a1548e - md5: bd635208b4fc2d8198d803da4197f962 - depends: - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libarrow 25.0.0 hf28620a_4_cpu - - libarrow-acero 25.0.0 hb326ee9_4_cpu - - libarrow-dataset 25.0.0 hb326ee9_4_cpu - - libgcc >=14 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libstdcxx >=14 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - libarrow-substrait >=25.0.0,<25.1.0a0 - size: 465996 - timestamp: 1786313723004 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-9_haddc8a3_openblas.conda - build_number: 9 - sha256: 5ad8fda537086a842379b7eb8d67770674e3c3afa66b09690ed62b54439fc227 - md5: c2d360534e0377666eaf8f86e605511c - depends: - - libopenblas >=0.3.34,<0.3.35.0a0 - - libopenblas >=0.3.34,<1.0a0 - constrains: - - blas 2.309 openblas - - libcblas 3.11.0 9*_openblas - - liblapack 3.11.0 9*_openblas - - liblapacke 3.11.0 9*_openblas - - mkl <2027 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libblas >=3.11.0,<4.0a0 - size: 18024 - timestamp: 1786058936290 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.2.0-h384ecca_3.conda - sha256: e81f38af3387620c4afb3769e668ecfb5bf9426bd9fd9db8a70d071ca4477b1f - md5: d0d4029ed32776dce412334e0f1c6160 - depends: - - libgcc >=15 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libbrotlicommon >=1.2.0,<1.3.0a0 - size: 80692 - timestamp: 1786622718545 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.2.0-h011f0d3_3.conda - sha256: a2e41f51d4f05bd96b1148c35882a880e85f2b316f238a32d657d908b928aae6 - md5: 8c25aeafcbf1629c1e39ee7c03e77c93 - depends: - - libbrotlicommon 1.2.0 h384ecca_3 - - libgcc >=15 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libbrotlidec >=1.2.0,<1.3.0a0 - size: 33949 - timestamp: 1786622726640 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.2.0-hb247b97_3.conda - sha256: 4173e5c4d42bf08a9fc751914122acb87f6a565563cc11e8e896f2fa0dcd2ce9 - md5: 35f63f9c1202a85c121dbe40657612af - depends: - - libbrotlicommon 1.2.0 h384ecca_3 - - libgcc >=15 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libbrotlienc >=1.2.0,<1.3.0a0 - size: 348164 - timestamp: 1786622734798 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-9_hd72aa62_openblas.conda - build_number: 9 - sha256: 9e83c59429296818e7111a9f80f29c2c8a1e5ab9ae2d59aec8e67af9b87ac923 - md5: 1ff91e2252ca15db87a27b7b3ff280ae - depends: - - libblas 3.11.0 9_haddc8a3_openblas - constrains: - - blas 2.309 openblas - - liblapack 3.11.0 9*_openblas - - liblapacke 3.11.0 9*_openblas - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libcblas >=3.11.0,<4.0a0 - size: 17977 - timestamp: 1786058941306 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 - sha256: b8b8c57a87da86b3ea24280fd6aa8efaf92f4e684b606bf2db5d3cb06ffbe2ea - md5: 268ee639c17ada0002fb04dd21816cc2 - depends: - - libgcc-ng >=9.4.0 - - libstdcxx-ng >=9.4.0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libcrc32c >=1.1.2,<1.2.0a0 - size: 18669 - timestamp: 1633683724891 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.21.0-h86273da_5.conda - sha256: d7bc660680aee2ce4011779bdfc00b3f8d0c98acf503aa2982874d81b075ff66 - md5: c2c977033fa833d7f1f83bb34dd52717 - depends: - - krb5 >=1.22.2,<1.23.0a0 - - libgcc >=15 - - libnghttp2 >=1.68.1,<2.0a0 - - libpsl >=0.23.1,<0.24.0a0 - - libssh2 >=1.11.1,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - - openssl >=3.5.7,<4.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: curl - license_family: MIT - purls: [] - run_exports: - weak: - - libcurl >=8.21.0,<9.0a0 - size: 508109 - timestamp: 1787183657716 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-hfa851ae_1.conda - sha256: 4cb3da1d4ce7540604219d2a016253777da66c1a710c41557bc708aae7f54a75 - md5: 8cdf7f7e4908c9b2cf50c58966f2ff64 - depends: - - libgcc >=14 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libdeflate >=1.25,<1.26.0a0 - size: 71628 - timestamp: 1785908730449 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321hc48eb74_1.conda - sha256: 2d7218da06f1121619335bff25a2669df810dee90d2eb65b17f8b2e6b1c0d372 - md5: 6e06eb2c9fda76721699bcdd759b9c60 - depends: - - ncurses - - libgcc >=14 - - ncurses >=6.6,<7.0a0 - license: BSD-2-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libedit >=3.1.20250104,<3.2.0a0 - size: 149007 - timestamp: 1786616643904 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h80f16a2_3.conda - sha256: 4475f79a020e9ff2a5a0308c48cb2970a25d55c3dd724a97ab28bfac3be6cd49 - md5: f679b30a53d410d0b5ae0cb8f5b7397e - depends: - - libgcc >=14 - license: BSD-2-Clause OR GPL-2.0-or-later - license_family: GPL - purls: [] - run_exports: - weak: - - libev >=4.33,<4.34.0a0 - size: 45746 - timestamp: 1785917328690 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda - sha256: 01333cc7d6e6985dd5700b43660d90e9e58049182017fd24862088ecbe1458e4 - md5: 96ae6083cd1ac9f6bc81631ac835b317 - depends: - - libgcc-ng >=12 - - openssl >=3.1.1,<4.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libevent >=2.1.12,<2.1.13.0a0 - size: 438992 - timestamp: 1685726046519 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.1-hfae3067_1.conda - sha256: 20a5726bc8705d91437c9e6ef83b30da64a1719b869656d20a1ee818333ea5ac - md5: fac3b65a605cd253037fdf3daf2de8d9 - depends: - - libgcc >=14 - constrains: - - expat 2.8.1.* - license: MIT - license_family: MIT - purls: [] - run_exports: {} - size: 77649 - timestamp: 1781203572523 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.7.0-h376a255_0.conda - sha256: c95b5b5fc13c8d7af2a9908e6c64844f48787a7631f8abcde1813dc21b3b079e - md5: 81aedbde3ea118c602e8b289bf565ac5 - depends: - - libgcc >=14 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libffi >=3.7.0,<3.8.0a0 - size: 63746 - timestamp: 1783520889209 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_2.conda - sha256: 1e6ba895a397ee4fc1646f21000903ad13d93e9e6d9a7fb4dcef1baa837970bf - md5: 9d7e520ae06d08185ef2d500ff116d30 - depends: - - libfreetype6 >=2.14.3 - license: GPL-2.0-only OR FTL - purls: [] - run_exports: {} - size: 8409 - timestamp: 1786640943558 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-h9cc7050_2.conda - sha256: d29eac57042f2362d4e45c63a4a78d64a30e5284b1da29b99e0c1526671dd4c3 - md5: f7ee9de31f98281a3e451e496fbee3b5 - depends: - - libgcc >=15 - - libpng >=1.6.58,<1.7.0a0 - - libzlib >=1.3.2,<2.0a0 - constrains: - - freetype >=2.14.3 - license: GPL-2.0-only OR FTL - purls: [] - run_exports: {} - size: 445035 - timestamp: 1786640942903 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_2.conda - sha256: 8f67a9b2ca7814b9480907bc9875f9643e0880e1a190bede54db88a02eeac76c - md5: 73685f300c39141946aa83a3b283c238 - depends: - - _openmp_mutex >=4.5 - constrains: - - libgcc-ng ==16.1.0=*_2 - - libgomp 16.1.0 h8acb6b2_2 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - run_exports: {} - size: 627721 - timestamp: 1787164430390 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-16.1.0-he9431aa_2.conda - sha256: b02d2865d2021e9bf1e945e9e7f3159c6c6e435e2f931e0834c18107941d7e7a - md5: dbfad493f04404a02f6e67370483d17e - depends: - - libgcc 16.1.0 h205dda4_2 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - run_exports: - strong: - - libgcc - size: 28219 - timestamp: 1787164434239 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-16.1.0-he9431aa_2.conda - sha256: 82e0e0a77afb7c2fe1eef9128e2b2fc9ce1d23f6ce3340685610d468f222cae8 - md5: 3b93b41efc143168edf2946f146ce11d - depends: - - libgfortran5 16.1.0 h47adacf_2 - constrains: - - libgfortran-ng ==16.1.0=*_2 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - run_exports: {} - size: 28172 - timestamp: 1787164456115 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-16.1.0-h47adacf_2.conda - sha256: 34b76bdabf1e75032802ab28b222226c630b5bb33cbcf37f019e89d805837e78 - md5: 10bf62128b3a5bd7388fa2b0749de565 - depends: - - libgcc >=16.1.0 - constrains: - - libgfortran 16.1.0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - run_exports: {} - size: 1495125 - timestamp: 1787164440512 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.88.3-had1c41b_1.conda - sha256: 0f8a6e2346540a7cbbd3bfb41395385190821247b9f8003859089ea3c2b623c2 - md5: 11f141ce3aca0b2a07cd5bc07e6072f6 - depends: - - libgcc >=14 - - libffi >=3.7.0,<3.8.0a0 - - libiconv >=1.18,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - - pcre2 >=10.47,<10.48.0a0 - constrains: - - glib >2.66 - license: LGPL-2.1-or-later - purls: [] - run_exports: - weak: - - libglib >=2.88.3,<3.0a0 - size: 4945329 - timestamp: 1786457675064 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-3.8.0-h2efc11c_0.conda - sha256: 28999fda2990fecd2b7b86da99fa997c2f4bcbe89576e362b8bab4559687ac69 - md5: a20e63a2f4a5639b3cbfcc33ef4d9555 - depends: - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libcurl >=8.21.0,<9.0a0 - - libgcc >=14 - - libgrpc >=1.82.1,<1.83.0a0 - - libopentelemetry-cpp >=1.27.0,<1.28.0a0 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libstdcxx >=14 - - openssl >=3.5.7,<4.0a0 - constrains: - - libgoogle-cloud 3.8.0 *_0 - license: Apache-2.0 - license_family: Apache - purls: [] - run_exports: - weak: - - libgoogle-cloud >=3.8.0,<3.9.0a0 - size: 2629226 - timestamp: 1786225828150 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-3.8.0-h66d5b86_0.conda - sha256: 52951ccafc8c7d747c53b0178b15f23f630976ef05050c4ed90dcc233825becf - md5: cb08cd8e8e0a333ba40e9ceb6e1f33b8 - depends: - - libabseil - - libcrc32c >=1.1.2,<1.2.0a0 - - libcurl - - libgcc >=14 - - libgoogle-cloud 3.8.0 h2efc11c_0 - - libstdcxx >=14 - - libzlib >=1.3.2,<2.0a0 - - openssl - license: Apache-2.0 - license_family: Apache - purls: [] - run_exports: - weak: - - libgoogle-cloud-storage >=3.8.0,<3.9.0a0 - size: 761080 - timestamp: 1786225923718 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgrpc-1.82.1-h05b84e8_0.conda - sha256: 094845d7f466d30e2bb6545a3930b5ec687754839fc2fa0b96543ded54059f29 - md5: 611f046154e9ffa8be2961b1d6180377 - depends: - - c-ares >=1.34.6,<2.0a0 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libgcc >=14 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libre2-11 >=2025.11.5 - - libstdcxx >=14 - - libzlib >=1.3.2,<2.0a0 - - openssl >=3.5.7,<4.0a0 - - re2 - constrains: - - grpc-cpp =1.82.1 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - libgrpc >=1.82.1,<1.83.0a0 - size: 6940885 - timestamp: 1783587003357 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libharfbuzz-14.3.1-h8f7ccb3_0.conda - sha256: 7bd39d90363ac1b1f51a48510eb624bd053520ba0fefa656e717388bae3c6a7c - md5: ea9294a2b068d982e9e8ef4e7c48f7ac - depends: - - cairo >=1.18.4,<2.0a0 - - graphite2 >=1.3.15,<2.0a0 - - icu >=78.3,<79.0a0 - - libfreetype >=2.14.3 - - libfreetype6 >=2.14.3 - - libgcc >=15 - - libglib >=2.88.3,<3.0a0 - - libpng >=1.6.58,<1.7.0a0 - - libstdcxx >=15 - - libzlib >=1.3.2,<2.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: {} - size: 1407242 - timestamp: 1786970801231 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h1ea5142_3.conda - sha256: d22c666eb887afd2119aac2110e23a0e817e9391bda99293421f7c46dab1564c - md5: 951b54a36388613a99820b33b997f690 - depends: - - libgcc >=15 - license: LGPL-2.1-only - purls: [] - run_exports: - weak: - - libiconv >=1.18,<2.0a0 - size: 785924 - timestamp: 1787033793216 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.2.0-he30d5cf_1.conda - sha256: c5626ea672be2e59784f9be20dc8ceb7961b8ab0053651ded2dffec64e4b8245 - md5: 8730e25aa7eab80ca86dfb9a6bedf1ba - depends: - - libgcc >=14 - constrains: - - jpeg <0.0.0a - license: IJG AND BSD-3-Clause AND Zlib - purls: [] - run_exports: - weak: - - libjpeg-turbo >=3.2.0,<4.0a0 - size: 716519 - timestamp: 1785896318334 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-9_h88aeb00_openblas.conda - build_number: 9 - sha256: 562077bf38f962f6b80ec4e021bd2328f603ce0b112d3045b3f3b37f1a110f73 - md5: c560d88ddee90ba4120ac63eda69fbee - depends: - - libblas 3.11.0 9_haddc8a3_openblas - constrains: - - blas 2.309 openblas - - libcblas 3.11.0 9*_openblas - - liblapacke 3.11.0 9*_openblas - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - liblapack >=3.11.0,<3.12.0a0 - size: 18007 - timestamp: 1786058945578 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_1.conda - sha256: f760669fd1cea27f689f411c0d5488e26ce50e382c9b63e4ad348f959850124a - md5: e0e6411a60d00186eec7c73f4118ab67 - depends: - - libgcc >=14 - constrains: - - xz 5.8.3.* - license: 0BSD - purls: [] - run_exports: - weak: - - liblzma >=5.8.3,<6.0a0 - size: 125578 - timestamp: 1786348561649 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.68.1-ha4b982d_1.conda - sha256: 0c28d734512fa2c66a232b2f3968eae7124dbd6ad42c594c752f1d08dfb86195 - md5: ff4b2b7c169c438bf648fb14f369c3b9 - depends: - - c-ares >=1.34.8,<2.0a0 - - libev >=4.33,<4.34.0a0 - - libev >=4.33,<5.0a0 - - libgcc >=15 - - libstdcxx >=15 - - libzlib >=1.3.2,<2.0a0 - - openssl >=3.5.7,<4.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libnghttp2 >=1.68.1,<2.0a0 - size: 734829 - timestamp: 1787177407983 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda - sha256: c0dc4d84198e3eef1f37321299e48e2754ca83fd12e6284754e3cb231357c3a5 - md5: d5d58b2dc3e57073fe22303f5fed4db7 - depends: - - libgcc >=13 - license: LGPL-2.1-only - license_family: GPL - purls: [] - run_exports: - weak: - - libnsl >=2.0.1,<2.1.0a0 - size: 34831 - timestamp: 1750274211000 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.34-openmp_h1a8b088_0.conda - sha256: 7a73d07bc0e17899d058fd16e06ed10e165b19eb345b7ab3cbddd4f9165204c0 - md5: 96178e161c75040a5f4b83fcf65a0ce7 - depends: - - _openmp_mutex * *_llvm - - _openmp_mutex >=4.5 - - libgcc >=14 - - libgfortran - - libgfortran5 >=14.3.0 - - llvm-openmp >=22.1.8 - constrains: - - openblas >=0.3.34,<0.3.35.0a0 - track_features: - - openblas_threading_openmp - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libopenblas >=0.3.34,<1.0a0 - size: 5344515 - timestamp: 1784287377347 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-1.27.0-hbe47268_1.conda - sha256: 2f906b3c7e56b37fe190dffec64505b81c1a5792ec4e54405ce965b1e3e4e0e5 - md5: a781792f4c25debefa5250a0dbde0d5d - depends: - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libcurl >=8.21.0,<9.0a0 - - libgrpc >=1.82.0,<1.83.0a0 - - libopentelemetry-cpp-headers 1.27.0 h8af1aa0_1 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libzlib >=1.3.2,<2.0a0 - - nlohmann_json - - prometheus-cpp >=1.3.0,<1.4.0a0 - constrains: - - cpp-opentelemetry-sdk =1.27.0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - libopentelemetry-cpp >=1.27.0,<1.28.0a0 - size: 938402 - timestamp: 1783133113967 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-headers-1.27.0-h8af1aa0_1.conda - sha256: cc6ad5ecff94772866c24165b0e2b03b5e92f8135446b85a569184b2de8bdd68 - md5: d5a83a188f936ac5b975f0b615359509 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: {} - size: 394189 - timestamp: 1783133095691 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-25.0.0-h87079af_4_cpu.conda - build_number: 4 - sha256: b74676715864b0722d1d571503f45dc865e0c1b2c0f7da5b6ff1b1fd69dcea6a - md5: 757d3d2ec299ae9058326a96aaaec7a0 - depends: - - libarrow 25.0.0 hf28620a_4_cpu - - libgcc >=14 - - libstdcxx >=14 - - libthrift >=0.22.0,<0.22.1.0a0 - - openssl >=3.5.7,<4.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - libparquet >=25.0.0,<25.1.0a0 - size: 1294290 - timestamp: 1786313648018 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.58-hf9b7768_1.conda - sha256: bd6e423b08342969689d8893c965aad78244b29724da2168aef3634fa0e1ebd7 - md5: 308ecb7ad60637dc5e95558ab583c5ba - depends: - - libgcc >=15 - - libzlib >=1.3.2,<2.0a0 - license: zlib-acknowledgement - purls: [] - run_exports: - weak: - - libpng >=1.6.58,<1.7.0a0 - size: 333238 - timestamp: 1786616546810 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-7.35.1-h30ec8a2_2.conda - sha256: df3cd7057c4a1d229bff2c9060c03425a42fb12d7d7e7fe985f63907c9e88922 - md5: b9c3b50124bf5fd1ff3ed97ee55f6266 - depends: - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libgcc >=14 - - libstdcxx >=14 - - libzlib >=1.3.2,<2.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libprotobuf >=7.35.1,<7.35.2.0a0 - size: 3597785 - timestamp: 1783168080031 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpsl-0.23.1-hb8431ed_1.conda - sha256: 757f79c182ac3080cf416acd91c7643b8074b8b2e5c1eba0ffc5a16897feb84b - md5: 5ab41e5e70b78eb00ef62cdaa35cd86f - depends: - - libgcc >=15 - - libstdcxx >=15 - - icu >=78.3,<79.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libpsl >=0.23.1,<0.24.0a0 - size: 73118 - timestamp: 1786970733378 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libraqm-0.11.0-hd2f8911_0.conda - sha256: 03dbcf07e62d7fcb8b810636df1cc88d2c6d6f3cfe72a9b25bca9512708f9091 - md5: b193aa5a8bd7595c537c6e1916b7298d - depends: - - libgcc >=14 - - __glibc >=2.28,<3.0.a0 - - libharfbuzz >=14.2.1 - - libfreetype >=2.14.3 - - libfreetype6 >=2.14.3 - - fribidi >=1.0.16,<2.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libraqm >=0.11.0,<0.12.0a0 - size: 34049 - timestamp: 1784850270528 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2025.11.05-h149037f_2.conda - sha256: f50695291bfaf2aebe8795caae5e341af9ad3ff6d945c026cf01ca697a6620f4 - md5: f2ff51cd816045533d79c157acaf8e51 - depends: - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libgcc >=14 - - libstdcxx >=14 - constrains: - - re2 2025.11.05.* - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libre2-11 >=2025.11.5 - size: 206553 - timestamp: 1781312515801 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.4-h399dd60_1.conda - sha256: fae75e68e9dbc3c90dcf93d4bae6315f1330c95aaf1404a721e8468266c23475 - md5: 27e16aa1f45c787aa181549be6f209f4 - depends: - - icu >=78.3,<79.0a0 - - libgcc >=15 - - libzlib >=1.3.2,<2.0a0 - license: blessing - purls: [] - run_exports: - weak: - - libsqlite >=3.53.4,<4.0a0 - size: 972932 - timestamp: 1787051100646 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-h7572e3e_1.conda - sha256: f6fef76c1c8899d7976030871b8cd8016b0a306d2b8519834cd6491d6a42fb82 - md5: 833be3f226277d894df3c7a7131d9532 - depends: - - libgcc >=14 - - libzlib >=1.3.2,<2.0a0 - - openssl >=3.5.7,<4.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libssh2 >=1.11.1,<2.0a0 - size: 315682 - timestamp: 1786713068743 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_2.conda - sha256: ebe8a5794162ec1603c43eadc23f0feaaf4894bcc52e9061c4d452237a6b3c99 - md5: b1ff3987d440eed553b5015ee18e0d58 - depends: - - libgcc 16.1.0 h205dda4_2 - constrains: - - libstdcxx-ng ==16.1.0=*_2 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - run_exports: {} - size: 6260013 - timestamp: 1787164448776 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-16.1.0-hdbbeba8_2.conda - sha256: cd0919277f81f783ecd113692a6e0a13000d847c2e4591b316a942a5d8a4b98b - md5: 2f75cf9611149a0a1b33c619d5555411 - depends: - - libstdcxx 16.1.0 hef695bb_2 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - run_exports: - strong: - - libstdcxx - size: 28262 - timestamp: 1787164477642 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libthrift-0.22.0-ha522d1d_2.conda - sha256: c43ccf2e53750a84962c2440359ec54fed01b36838d0a08e36f4b294c7d837a6 - md5: 6ecb1ee3cbccd5c3b9ba044e24515153 - depends: - - libevent >=2.1.12,<2.1.13.0a0 - - libgcc >=14 - - libstdcxx >=14 - - libzlib >=1.3.2,<2.0a0 - - openssl >=3.5.6,<4.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - libthrift >=0.22.0,<0.22.1.0a0 - size: 414117 - timestamp: 1777018976584 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.2-hdb009f0_0.conda - sha256: ef1006578ef7e3f7c420e89d87846213ceb3fdcef2626af2558cbede53d36839 - md5: 20166e2297c1cac346b544d5f6197440 - depends: - - lerc >=4.1.0,<5.0a0 - - libdeflate >=1.25,<1.26.0a0 - - libgcc >=14 - - libjpeg-turbo >=3.1.4.1,<4.0a0 - - liblzma >=5.8.3,<6.0a0 - - libstdcxx >=14 - - libwebp-base >=1.6.0,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: HPND - purls: [] - run_exports: - weak: - - libtiff >=4.7.2,<4.8.0a0 - size: 508982 - timestamp: 1783084925965 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtorch-2.12.1-cpu_generic_hb12a5ee_0.conda - sha256: 39c971c0993784e217d43d987cb5f797e03a41e249505e1e5771fba1fdf01c0a - md5: c79c0f29047c71cb69cb43a8074b66cd - depends: - - _openmp_mutex * *_llvm - - _openmp_mutex >=4.5 - - fmt >=12.1.0,<12.2.0a0 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libgcc >=14 - - liblapack >=3.9.0,<4.0a0 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libstdcxx >=14 - - libuv >=1.52.1,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - - llvm-openmp >=22.1.8 - - onednn >=3.12,<4.0a0 - - pybind11-abi 11 - - sleef >=3.9.0,<4.0a0 - constrains: - - pytorch-gpu <0.0a0 - - openblas * openmp_* - - libopenblas * openmp_* - - pytorch-cpu 2.12.1 - - pytorch 2.12.1 cpu_generic_*_0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libtorch >=2.12.1,<2.13.0a0 - size: 48248444 - timestamp: 1781832373151 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtorch-2.13.0-cpu_generic_hf6f405e_2.conda - sha256: f28321403d4e8412aa1fa188aa94029cca879e946f6df60fc6da1194aad51189 - md5: 7449dce583fa5c3240bffe1b5978145b - depends: - - _openmp_mutex * *_llvm - - _openmp_mutex >=4.5 - - fmt >=12.1.0,<12.2.0a0 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libgcc >=14 - - liblapack >=3.9.0,<4.0a0 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libstdcxx >=14 - - libuv >=1.52.1,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - - llvm-openmp >=22.1.8 - - onednn >=3.12,<4.0a0 - - pybind11-abi 11 - - sleef >=3.9.0,<4.0a0 - constrains: - - libopenblas * openmp_* - - openblas * openmp_* - - pytorch 2.13.0 cpu_generic_*_2 - - pytorch-cpu 2.13.0 - - pytorch-gpu <0.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libtorch >=2.13.0,<2.14.0a0 - size: 49998352 - timestamp: 1786374014531 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.11.3-hec6f9f7_0.conda - sha256: a67e1c2355f98befb280bc91990504500ba28a82d5441c9fb9e10015abfd3b14 - md5: afc02d5958046be06b176058e9d630d7 - depends: - - libgcc >=14 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libutf8proc >=2.11.3,<2.12.0a0 - size: 86509 - timestamp: 1768735090367 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42.2-h1022ec0_0.conda - sha256: 7663489f97c104ae3814db10f384932c74b439f3c1fd4247e4fe3599830c090a - md5: 58fa42bc4bc71fc329889497ec15effb - depends: - - libgcc >=14 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libuuid >=2.42.2,<3.0a0 - size: 43248 - timestamp: 1781625528371 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.52.1-h80f16a2_1.conda - sha256: 52f4bc6e340bde53bfe38e45f6cb1080a2d5f8891da9a647087f7cc6a6edfc22 - md5: 8e2136432f02841b9d8b848045f66d7d - depends: - - libgcc >=14 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libuv >=1.52.1,<2.0a0 - size: 457209 - timestamp: 1785914582944 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_1.conda - sha256: 4c64e6843d64876d054a28ecbab70abdf145da3c2cbdaa4a43db26cdf0fd760b - md5: 548943c39851543734ce0d20eeb469b0 - depends: - - libgcc >=14 - constrains: - - libwebp 1.6.0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libwebp-base >=1.6.0,<2.0a0 - size: 357551 - timestamp: 1785956962809 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h3f04742_1.conda - sha256: 5e804b6221d22732826091c9da062acaaae6cd45a2458be29fe4e55c47510212 - md5: caa24d7637c6df83b4c8203f5680266e - depends: - - libgcc >=15 - - pthread-stubs - - xorg-libxau >=1.0.12,<2.0a0 - - xorg-libxdmcp >=1.1.5,<2.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libxcb >=1.17.0,<2.0a0 - size: 401513 - timestamp: 1787077419191 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.38-h80f16a2_0.conda - sha256: d3514900e2121972e435f7803763c1843dad6709e48aa02a2b47c4d481f83be7 - md5: b1a5cb7ff2d8f5911ba1fb6897176098 - depends: - - libgcc >=14 - license: LGPL-2.1-or-later - purls: [] - run_exports: - weak: - - libxcrypt >=4.4.38 - size: 133882 - timestamp: 1785887114864 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-16-2.15.3-h79dcc73_1.conda - sha256: ddc4e8200b34b6d308f7f7060b326086085ddbc6c003ab8539dd48b3917b1f18 - md5: 0678aa203ef38d165a611bd81d5ca8f2 - depends: - - icu >=78.3,<79.0a0 - - libgcc >=14 - - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.3,<6.0a0 - - libzlib >=1.3.2,<2.0a0 - constrains: - - libxml2 2.15.3 - license: MIT - license_family: MIT - purls: [] - run_exports: {} - size: 605581 - timestamp: 1787237544809 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.15.3-h869d058_1.conda - sha256: 8d6c8037f5e0b6cb474f98f876c027b4c3c08a002d2639896a2775acb893f729 - md5: da311b13a2af5209b926397cd426f27d - depends: - - icu >=78.3,<79.0a0 - - libgcc >=14 - - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.3,<6.0a0 - - libxml2-16 2.15.3 h79dcc73_1 - - libzlib >=1.3.2,<2.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libxml2 - - libxml2-16 >=2.15.3 - size: 48679 - timestamp: 1787237549589 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_3.conda - sha256: 76efa6cc9d7e6f5ee3bbca0939f64054af2bdfb3c3632531f8e633cf6c2ea41e - md5: bd534c2fbe56d8c2ea3b2d8f5e12bca8 - constrains: - - zlib 1.3.2 *_3 - license: Zlib - license_family: Other - purls: [] - run_exports: - weak: - - libzlib >=1.3.2,<2.0a0 - size: 70108 - timestamp: 1785276540870 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/llvm-openmp-22.1.8-hfdfeb53_1.conda - sha256: 5e9827c237c5d42e0df0e613e8d365a5bb2be702ed67a03d05e3af030fdbaf61 - md5: 87d85972e51250d168a9d597d03071c0 - constrains: - - intel-openmp <0.0a0 - - openmp 22.1.8|22.1.8.* - license: Apache-2.0 WITH LLVM-exception - purls: [] - run_exports: - strong: - - llvm-openmp >=22.1.8 - - _openmp_mutex >=4.5 - - _openmp_mutex * *_llvm - size: 5833219 - timestamp: 1787293109148 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-hfb11796_2.conda - sha256: e8392843a18954fef038f2721fde65c4dbe7693fcd07677e5e74fca85b1a690c - md5: 36a6fab65bc51cf71761eb5339d8ea04 - depends: - - libgcc >=15 - - libstdcxx >=15 - license: BSD-2-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - lz4-c >=1.10.0,<1.11.0a0 - size: 218765 - timestamp: 1786717160600 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py312hd077ced_1.conda - sha256: 5919bf53e9f74ee1c6ce35ce13a7cd92741d45385c2d0b3eae48b01c0f11f41a - md5: 1fecdd103b37427ba6041b9b03d657ea - depends: - - libgcc >=14 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - constrains: - - jinja2 >=3.0.0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/markupsafe?source=hash-mapping - run_exports: {} - size: 26305 - timestamp: 1772446326927 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-base-3.11.1-py312h0683553_2.conda - sha256: 2a6447ea4551d94a09a0cf6665c2b7402f29ebc2a1df13e6bbfe7be7fc33b596 - md5: 381100cdfe0a7b585d7cc6477b7461f8 - depends: - - contourpy >=1.0.1 - - cycler >=0.10 - - fonttools >=4.28.2 - - freetype - - kiwisolver >=1.3.1 - - libfreetype >=2.14.3 - - libfreetype6 >=2.14.3 - - libgcc >=14 - - libraqm >=0.11.0,<0.12.0a0 - - libstdcxx >=14 - - numpy >=1.25 - - numpy >=1.25,<3 - - packaging >=20.0 - - pillow >=9 - - pyparsing >=3 - - python >=3.12,<3.13.0a0 - - python-dateutil >=2.7 - - python_abi 3.12.* *_cp312 - - qhull >=2020.2,<2020.3.0a0 - - tk >=8.6.13,<8.7.0a0 - license: PSF-2.0 - license_family: PSF - purls: - - pkg:pypi/matplotlib?source=hash-mapping - run_exports: {} - size: 8779090 - timestamp: 1785211047525 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpc-1.4.0-he6dc3fb_0.conda - sha256: 69f25e0c9ce2827097549a74a83f2c31c9c40fa4a668a4db96462e5a7eeb9634 - md5: b3aa59caa59a7b0288a21b097f8b6bc4 - depends: - - gmp >=6.3.0,<7.0a0 - - libgcc >=14 - - mpfr >=4.2.2,<5.0a0 - license: LGPL-3.0-or-later - license_family: LGPL - purls: [] - run_exports: - weak: - - mpc >=1.4.0,<2.0a0 - size: 121080 - timestamp: 1774472380541 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpfr-4.2.2-h4b21e80_1.conda - sha256: f5ada0dadb169f77a1b71393486f4e39986ed8fe3db3f749d20d1fe1d48a1add - md5: df5830aa74e0c5c354ca2f800796493b - depends: - - gmp >=6.3.0,<7.0a0 - - libgcc >=15 - license: LGPL-3.0-only - license_family: LGPL - purls: [] - run_exports: - weak: - - mpfr >=4.2.2,<5.0a0 - size: 1945817 - timestamp: 1787236127178 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-2.3.1-py312hd0d9aba_0.conda - sha256: b724ee08e33497e51a5c2cd9bc6a90e72d581ecdca0991c9a6cb4b9c5fb13d62 - md5: 3d397a5391bb1e3084fd83c74c76fea7 - depends: - - ast-serialize >=0.6.0,<1.0.0 - - mypy_extensions >=1.0.0 - - pathspec >=1.0.0 - - python - - python-librt >=0.13.0 - - typing_extensions >=4.6.0 - - psutil >=4.0 - - libgcc >=15 - - python_abi 3.12.* *_cp312 - license: MIT - license_family: MIT - purls: - - pkg:pypi/mypy?source=hash-mapping - run_exports: {} - size: 22068389 - timestamp: 1786887143775 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-h2b6f883_1.conda - sha256: d69a04914139627f0a6bfd19412d6c7f1e37edc896af84a6011e07e8bc1e69fa - md5: c3b4349171ca987ff33a1de61f7b3f96 - depends: - - libgcc >=14 - license: X11 AND BSD-3-Clause - purls: [] - run_exports: - weak: - - ncurses >=6.6,<7.0a0 - size: 955422 - timestamp: 1786355019431 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nlohmann_json-3.12.0-h7ac5ae9_2.conda - sha256: e441cbcffb6a3b0c6c9071a14a2cd08bd175d95dde16c5413e8a678f875baab0 - md5: d246583ab3e0b8d3968fc5abf7592e17 - constrains: - - nlohmann_json-abi ==3.12.0 - license: MIT - license_family: MIT - purls: [] - run_exports: {} - size: 137086 - timestamp: 1785920446447 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.6-py312hce9e0af_0.conda - sha256: 4facc6fe76540d7e6e77b802602f7b1b3aa574a5fa6f406e0d21960858f1f539 - md5: 84ad95777b2f6bc736a6e08e5f02c04e - depends: - - python - - libstdcxx >=14 - - libgcc >=14 - - python_abi 3.12.* *_cp312 - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - liblapack >=3.9.0,<4.0a0 - constrains: - - numpy-base <0a0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/numpy?source=hash-mapping - run_exports: - weak: - - numpy >=1.23,<3 - size: 7839794 - timestamp: 1779169203525 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/onednn-3.12-omp_h605b386_0.conda - sha256: ff6c1d53eaa1221a46bb77ac871dc8eea8ef070fb975ce9810329a28d65b523e - md5: 365b9ebd06388b4c7647b4b477cde089 - depends: - - libgcc >=14 - - libstdcxx >=14 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - onednn >=3.12,<4.0a0 - size: 7480320 - timestamp: 1779566014380 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.4-h5da879a_0.conda - sha256: bd1bc8bdde5e6c5cbac42d462b939694e40b59be6d0698f668515908640c77b8 - md5: cea962410e327262346d48d01f05936c - depends: - - libgcc >=14 - - libpng >=1.6.50,<1.7.0a0 - - libstdcxx >=14 - - libtiff >=4.7.1,<4.8.0a0 - - libzlib >=1.3.1,<2.0a0 - license: BSD-2-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - openjpeg >=2.5.4,<3.0a0 - size: 392636 - timestamp: 1758489353577 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.3-h546c87b_1.conda - sha256: c89e748e8a008e8ca6f25e102362f33319db0c98cc29d98ddada92842f636327 - md5: 1600dfde78c5adba306f8571af62a323 - depends: - - ca-certificates - - libgcc >=14 - license: Apache-2.0 - license_family: Apache - purls: [] - run_exports: - weak: - - openssl >=3.6.3,<4.0a0 - size: 3719270 - timestamp: 1785913554920 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/optree-0.20.0-py312h579b322_0.conda - sha256: 29fb48ab3d690a781702f2a56067a9a8bd5ed4d08d5b98460a3acc55ef09ee1f - md5: 71dfcc6c39528d11f87c8267110dfdd5 - depends: - - libgcc >=15 - - libstdcxx >=15 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - typing-extensions >=4.10 - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/optree?source=hash-mapping - run_exports: {} - size: 539320 - timestamp: 1787285199307 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orc-2.3.1-h1fb4f23_0.conda - sha256: ae94758d3a59924e809788c442b2946f329ae36d4573089d1590c4218f8dc0f7 - md5: e7ad9dc0d832f29a19e2852cd6de00a3 - depends: - - tzdata - - libgcc >=14 - - libstdcxx >=14 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libabseil >=20260526.0,<20260527.0a0 - - libabseil * cxx17* - - libzlib >=1.3.2,<2.0a0 - - snappy >=1.2.2,<1.3.0a0 - - zstd >=1.5.7,<1.6.0a0 - - lz4-c >=1.10.0,<1.11.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - orc >=2.3.1,<2.3.2.0a0 - size: 1440426 - timestamp: 1784301242846 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-3.0.5-py312hf55c4e8_1.conda - sha256: 3c7f80bb9d5637649c48d87a6d53651f77e736ab43624933c95383999fbbb588 - md5: d9efaea64f2bb0b9444ce32bc4a9cb61 - depends: - - python - - numpy >=1.26.0 - - python-dateutil >=2.8.2 - - python 3.12.* *_cpython - - libstdcxx >=14 - - libgcc >=14 - - numpy >=1.23,<3 - - python_abi 3.12.* *_cp312 - constrains: - - adbc-driver-postgresql >=1.2.0 - - adbc-driver-sqlite >=1.2.0 - - beautifulsoup4 >=4.12.3 - - blosc >=1.21.3 - - bottleneck >=1.4.2 - - fastparquet >=2024.11.0 - - fsspec >=2024.10.0 - - gcsfs >=2024.10.0 - - html5lib >=1.1 - - hypothesis >=6.116.0 - - jinja2 >=3.1.5 - - lxml >=5.3.0 - - matplotlib >=3.9.3 - - numba >=0.60.0 - - numexpr >=2.10.2 - - odfpy >=1.4.1 - - openpyxl >=3.1.5 - - psycopg2 >=2.9.10 - - pyarrow >=13.0.0 - - pyiceberg >=0.8.1 - - pymysql >=1.1.1 - - pyqt5 >=5.15.9 - - pyreadstat >=1.2.8 - - pytables >=3.10.1 - - pytest >=8.3.4 - - pytest-xdist >=3.6.1 - - python-calamine >=0.3.0 - - pytz >=2024.2 - - pyxlsb >=1.0.10 - - qtpy >=2.4.2 - - scipy >=1.14.1 - - s3fs >=2024.10.0 - - sqlalchemy >=2.0.36 - - tabulate >=0.9.0 - - xarray >=2024.10.0 - - xlrd >=2.0.1 - - xlsxwriter >=3.2.0 - - zstandard >=0.23.0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/pandas?source=hash-mapping - run_exports: {} - size: 14736673 - timestamp: 1785276234887 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-he574923_1.conda - sha256: 16e5bee11686028d60a495004f99a10c613ada44cc27e330bee18a1b67fb184c - md5: c98763518d0a4c9895e515190afb7dec - depends: - - bzip2 >=1.0.8,<2.0a0 - - libgcc >=15 - - libzlib >=1.3.2,<2.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - pcre2 >=10.47,<10.48.0a0 - size: 1199286 - timestamp: 1787294520352 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda - sha256: 04df2cee95feba440387f33f878e9f655521e69f4be33a0cd637f07d3d81f0f9 - md5: 1a30c42e32ca0ea216bd0bfe6f842f0b - depends: - - bzip2 >=1.0.8,<2.0a0 - - libgcc >=14 - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - pcre2 >=10.47,<10.48.0a0 - size: 1166552 - timestamp: 1763655534263 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-12.3.0-py312h3b21937_0.conda - sha256: 5fc1b4b2f59a8716fc8dc68265a4a1db4d01d2faff0eb81c27493a5efe605bb7 - md5: 980abd80ba1e6932a8fda28012f655a3 - depends: - - python - - libgcc >=14 - - python 3.12.* *_cpython - - libtiff >=4.7.1,<4.8.0a0 - - libfreetype >=2.14.3 - - libfreetype6 >=2.14.3 - - openjpeg >=2.5.4,<3.0a0 - - tk >=8.6.13,<8.7.0a0 - - python_abi 3.12.* *_cp312 - - libxcb >=1.17.0,<2.0a0 - - libjpeg-turbo >=3.1.4.1,<4.0a0 - - zlib-ng >=2.3.3,<2.4.0a0 - - lcms2 >=2.19.1,<3.0a0 - - libwebp-base >=1.6.0,<2.0a0 - license: HPND - purls: - - pkg:pypi/pillow?source=hash-mapping - run_exports: {} - size: 1035171 - timestamp: 1782912107475 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.46.4-h7ac5ae9_3.conda - sha256: ed718d35c744ceef33063b5686f27b4b8d30d4065485e24efafb248658ee83b5 - md5: c5f34596fc05afb9ccc2782c42bcfcc5 - depends: - - libstdcxx >=14 - - libgcc >=14 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - pixman >=0.46.4,<1.0a0 - size: 304657 - timestamp: 1786106625126 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/prometheus-cpp-1.3.0-h7938499_0.conda - sha256: 9350d7bbc3982a732ff13a7fd17b585509e3b7d0191ac7b810cc3224868e3648 - md5: 10f4301290e51c49979ff98d1bdf2556 - depends: - - libcurl >=8.10.1,<9.0a0 - - libgcc >=13 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - - zlib - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - prometheus-cpp >=1.3.0,<1.4.0a0 - size: 211335 - timestamp: 1730769181127 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-7.2.2-py312hd41f8a7_0.conda - sha256: ea2f332dde5f428c506816d39063705c40767a350f54c22fde89b74aac878355 - md5: 4efa924b35ea429f3ded10ddae9d5fb3 - depends: - - python - - python 3.12.* *_cpython - - libgcc >=14 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/psutil?source=hash-mapping - run_exports: {} - size: 230283 - timestamp: 1769678159757 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-he30d5cf_1003.conda - sha256: 6138ca8729e6af8658c7e184c38370bec9b0b7840272deff79a3d0c1090f07e4 - md5: 75ad6624c7f795b828227672ca4b5f0b - depends: - - libgcc >=14 - license: MIT - license_family: MIT - purls: [] - run_exports: {} - size: 9235 - timestamp: 1786069420166 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-25.0.0-py312h8025657_0.conda - sha256: 3063ef395335ebe9252a79388461f81f216c663975b4000e8a2ce63edfd7d890 - md5: cb3e4257aeb188eddda9120a3182fc05 - depends: - - libarrow-acero 25.0.0.* - - libarrow-dataset 25.0.0.* - - libarrow-substrait 25.0.0.* - - libparquet 25.0.0.* - - pyarrow-core 25.0.0 *_0_* - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: {} - size: 26128 - timestamp: 1784258307013 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-core-25.0.0-py312h2cce741_0_cpu.conda - sha256: f376caedaa352b323450852ddd493fdca0fa4096448fce921ab8d8075c1f5285 - md5: b2b528ddd26dbfb87eb27cde096449db - depends: - - libarrow 25.0.0.* *cpu - - libarrow-compute 25.0.0.* *cpu - - libgcc >=14 - - libstdcxx >=14 - - libzlib >=1.3.2,<2.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - constrains: - - numpy >=1.23,<3 - - apache-arrow-proc * cpu - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/pyarrow?source=hash-mapping - run_exports: {} - size: 5185507 - timestamp: 1784258298673 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.13-ha505bbe_1_cpython.conda - build_number: 1 - sha256: d06c06da903b39bffc460c1626ab4fdd932bea5a2444ffac3132a3758b0d549c - md5: 93e063173a66ab5e0f89455cef04ffb0 - depends: - - bzip2 >=1.0.8,<2.0a0 - - ld_impl_linux-aarch64 >=2.36.1 - - libexpat >=2.8.1,<3.0a0 - - libffi >=3.7.0,<3.8.0a0 - - libgcc >=14 - - liblzma >=5.8.3,<6.0a0 - - libnsl >=2.0.1,<2.1.0a0 - - libsqlite >=3.53.4,<4.0a0 - - libuuid >=2.42.2,<3.0a0 - - libxcrypt >=4.4.38 - - libzlib >=1.3.2,<2.0a0 - - ncurses >=6.6,<7.0a0 - - openssl >=3.5.7,<4.0a0 - - readline >=8.3,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - constrains: - - python_abi 3.12.* *_cp312 - license: Python-2.0 - purls: [] - run_exports: - weak: - - python_abi 3.12.* *_cp312 - noarch: - - python - size: 13798396 - timestamp: 1786443483173 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-librt-0.15.0-py312hd41f8a7_0.conda - sha256: 52f674203b53fc5b2502b40f5b3e1d3000f297cccbed180f08bf49dc0601099c - md5: ea26dd52e5783b5e6c06f7674968ef4d - depends: - - python - - python 3.12.* *_cpython - - libgcc >=14 - - python_abi 3.12.* *_cp312 - license: MIT - license_family: MIT - purls: - - pkg:pypi/librt?source=hash-mapping - run_exports: {} - size: 164280 - timestamp: 1786328864306 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pytorch-2.12.1-cpu_generic_py312_h9dd5f13_0.conda - sha256: 8956bf3e04eaed1056dd011714dcb50d8c2804aeb7ec40ff6e8a739b5d6abdb2 - md5: 452a1b67f47bc4ff7bd6c48ad0f20667 - depends: - - _openmp_mutex * *_llvm - - _openmp_mutex >=4.5 - - filelock - - fmt >=12.1.0,<12.2.0a0 - - fsspec - - jinja2 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libcblas >=3.9.0,<4.0a0 - - libgcc >=14 - - liblapack >=3.9.0,<4.0a0 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libstdcxx >=14 - - libtorch 2.12.1 cpu_generic_hb12a5ee_0 - - libuv >=1.52.1,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - - llvm-openmp >=22.1.8 - - networkx - - nomkl - - numpy >=1.23,<3 - - onednn >=3.12,<4.0a0 - - optree >=0.13.0 - - pybind11 - - pybind11-abi 11 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - setuptools <82 - - sleef >=3.9.0,<4.0a0 - - sympy >=1.13.3 - - typing_extensions >=4.10.0 - constrains: - - pytorch-cpu 2.12.1 - - pytorch-gpu <0.0a0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/torch?source=project-defined-mapping - run_exports: - weak: - - pytorch >=2.12.1,<2.13.0a0 - - libtorch >=2.12.1,<2.13.0a0 - size: 25373883 - timestamp: 1781834386179 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pytorch-2.13.0-cpu_generic_py312_h556be23_2.conda - sha256: 7f9a4aa81af02f0bc1b051fb49b1c29f7320b61eb42f8e106195795146f338af - md5: 30008330591a50cd186b5fe661d34866 - depends: - - _openmp_mutex * *_llvm - - _openmp_mutex >=4.5 - - filelock - - fmt >=12.1.0,<12.2.0a0 - - fsspec - - jinja2 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libcblas >=3.9.0,<4.0a0 - - libgcc >=14 - - liblapack >=3.9.0,<4.0a0 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libstdcxx >=14 - - libtorch 2.13.0 cpu_generic_hf6f405e_2 - - libuv >=1.52.1,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - - llvm-openmp >=22.1.8 - - networkx - - nomkl - - numpy >=1.25,<3 - - onednn >=3.12,<4.0a0 - - optree >=0.13.0 - - pybind11 - - pybind11-abi 11 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - setuptools <82 - - sleef >=3.9.0,<4.0a0 - - sympy >=1.13.3 - - typing_extensions >=4.10.0 - constrains: - - pytorch-cpu 2.13.0 - - pytorch-gpu <0.0a0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/torch?source=project-defined-mapping - run_exports: - weak: - - pytorch >=2.13.0,<2.14.0a0 - - libtorch >=2.13.0,<2.14.0a0 - size: 26918719 - timestamp: 1786374844301 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py312ha4530ae_1.conda - sha256: 0ba02720b470150a8c6261a86ea4db01dcf121e16a3e3978a84e965d3fe9c39a - md5: 47018c13dbb26186b577fd8bd1823a44 - depends: - - libgcc >=14 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - yaml >=0.2.5,<0.3.0a0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pyyaml?source=hash-mapping - run_exports: {} - size: 192182 - timestamp: 1770223431156 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/qhull-2020.2-h70be974_5.conda - sha256: 49f777bdf3c5e030a8c7b24c58cdfe9486b51d6ae0001841079a3228bdf9fb51 - md5: bb138086d938e2b64f5f364945793ebf - depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - license: LicenseRef-Qhull - purls: [] - run_exports: - weak: - - qhull >=2020.2,<2020.3.0a0 - size: 554571 - timestamp: 1720813941183 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/re2-2025.11.05-hfb2350b_2.conda - sha256: ac1763c911f34c861c3b2c8de26434d86cd5b85e9fea3fefb70cba94b6a8c010 - md5: 072c6ce4efe84fe0bd51b4af4aa35fc6 - depends: - - libre2-11 2025.11.05 h149037f_2 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libre2-11 >=2025.11.5 - - re2 - size: 27430 - timestamp: 1781312525166 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-ha7194a6_1.conda - sha256: 80167dcf73a96b6d0c1bb2298d7b8b9bc21b27cc5bf56979f9c548b49a4d1722 - md5: 5b399a7afa10098f2a6b02263181426e - depends: - - libgcc >=15 - - ncurses >=6.6,<7.0a0 - license: GPL-3.0-only - license_family: GPL - purls: [] - run_exports: - weak: - - readline >=8.3,<9.0a0 - size: 364344 - timestamp: 1787033761576 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.7.5-h61cb6f2_1.conda - sha256: 5d2d07970e83b069a9155e68f56ef32af2563aad01f61ce697f062d8076f928e - md5: b38fcd3d4d7bffca304425358189726f - depends: - - libgcc >=14 - - openssl >=3.5.7,<4.0a0 - license: Apache-2.0 - license_family: Apache - purls: [] - run_exports: - weak: - - s2n >=1.7.5,<1.7.6.0a0 - size: 359993 - timestamp: 1783164798072 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/scipy-1.18.0-py312ha7f05e0_0.conda - sha256: 79343875bcc5cce28a54001844b221395b883a3d28fd8d9125dd38a4afab825b - md5: c957cde07f79a2cf5c7e9cdab39fa90b - depends: - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libgcc >=14 - - libgfortran - - libgfortran5 >=14.3.0 - - liblapack >=3.9.0,<4.0a0 - - libstdcxx >=14 - - numpy <2.7 - - numpy >=1.23,<3 - - numpy >=2.0.0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/scipy?source=hash-mapping - run_exports: {} - size: 17170333 - timestamp: 1781912658149 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sleef-3.9.0-h5bb93e2_0.conda - sha256: 8292f6d40541d136fe3c525062db5f2ec584e442e4c8b60296b630bbe85cadce - md5: b90e82764e7de5a291e263ead7950ad4 - depends: - - _openmp_mutex >=4.5 - - libgcc >=14 - - libstdcxx >=14 - license: BSL-1.0 - purls: [] - run_exports: - weak: - - sleef >=3.9.0,<4.0a0 - size: 1190849 - timestamp: 1756276271706 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.2-he774c54_1.conda - sha256: a8a79c53852fb07286407907402caa5a96b6e22b518c4f010be40647f9ee3726 - md5: 3dec912091fb88614afa0af2712c1362 - depends: - - libgcc >=14 - - libstdcxx >=14 - - libgcc >=14 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - snappy >=1.2.2,<1.3.0a0 - size: 47096 - timestamp: 1762948094646 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_hf03c496_4.conda - build_number: 104 - sha256: a1aa0d0f0b3d539644ff992e6dd0facf950c79df58fc37590ce5be84ff5e3f22 - md5: ebaded4b4b74c2cc43a754ded4eed76f - depends: - - libgcc >=15 - - libzlib >=1.3.2,<2.0a0 - constrains: - - xorg-libx11 >=1.8.13,<2.0a0 - license: TCL - purls: [] - run_exports: - weak: - - tk >=8.6.13,<8.7.0a0 - size: 3664220 - timestamp: 1787272859143 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ukkonen-1.1.0-py312h4f740d2_0.conda - sha256: 782101cc2266b2126c44771e4c03658d0c55d933f34b91523d0bdd38ad2f3e10 - md5: 9d8284ec3764a95eff0cde0e70772315 - depends: - - cffi - - libgcc >=14 - - libstdcxx >=14 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - license: MIT - license_family: MIT - purls: - - pkg:pypi/ukkonen?source=hash-mapping - run_exports: {} - size: 15682 - timestamp: 1769438785443 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/unicodedata2-17.0.1-py312hcd1a082_0.conda - sha256: c4bd27513664fb76665526e7f7c14ab103ede07558941d7631d9980fa92ab8df - md5: c72e6a7950d859966ae790cc844fcfdf - depends: - - libgcc >=14 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/unicodedata2?source=hash-mapping - run_exports: {} - size: 409407 - timestamp: 1770909146204 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libice-1.1.2-h80f16a2_0.conda - sha256: e56bb636aefe3503a53520a0b7f3737f3a26fe0accf0befffc24d1c0ddd27008 - md5: 0566e37830f85911b141524635939941 - depends: - - libgcc >=14 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - xorg-libice >=1.1.2,<2.0a0 - size: 63847 - timestamp: 1786474771090 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libsm-1.2.6-hf23e593_1.conda - sha256: 4978f89a764b54dc8be7a115b2d57f570f793243f3227653232742ce0946101b - md5: f5f4a1233da463827499fb4e5e1f0172 - depends: - - libgcc >=14 - - xorg-libice >=1.1.2,<2.0a0 - - libuuid >=2.42.2,<3.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - xorg-libsm >=1.2.6,<2.0a0 - size: 31476 - timestamp: 1786546266048 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libx11-1.8.13-h63a1b12_1.conda - sha256: 9ff59d55cbf85561833be3604a8c0a5497b0f13cdf122e8bb490e9cf3138d116 - md5: 8e873e9efc395329b914ee44e305b624 - depends: - - libgcc >=14 - - libxcb >=1.17.0,<2.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - xorg-libx11 >=1.8.13,<2.0a0 - size: 875768 - timestamp: 1787087025456 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_2.conda - sha256: 0822f3a8eb2a54bb41e1133f010e09d4a3242f8f12a372dfff7ad7248c5dbd29 - md5: b03af9d9dfe7aec9e27db74fc41a4ba9 - depends: - - libgcc >=14 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - xorg-libxau >=1.0.12,<2.0a0 - size: 17413 - timestamp: 1786382929588 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_2.conda - sha256: 681465a02be4ac256c05cd5b32ce9812da1563b75be1bfc8884d991454194df3 - md5: 044c398bf4b3b9c01741d8afe4ce1c3e - depends: - - libgcc >=14 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - xorg-libxdmcp >=1.1.5,<2.0a0 - size: 21558 - timestamp: 1786383120543 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxext-1.3.7-h5bc82ec_1.conda - sha256: e2cc4ba2b5291710f9ae3e88d917d778ce7911262450e673ba8a597a5d43490a - md5: 32734d534d08a853f22bdef1d43223b7 - depends: - - libgcc >=15 - - xorg-libx11 >=1.8.13,<2.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - xorg-libxext >=1.3.7,<2.0a0 - size: 53801 - timestamp: 1787103097310 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrender-0.9.12-he30d5cf_1.conda - sha256: 3cbac6f69e4a8634ba6b60cf283cba92606c8c74caa1369b799325f96b2f0cbf - md5: 1bcdaa1fc263291e6f42ff061666f3ae - depends: - - libgcc >=14 - - xorg-libx11 >=1.8.13,<2.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - xorg-libxrender >=0.9.12,<0.10.0a0 - size: 35814 - timestamp: 1787100239228 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h29ee22c_3.conda - sha256: 97e0fbe447c8f8bb1789047f37448062ebecda29bd264fcdf6129b8d08f174c9 - md5: 6c97c1f44a81be1b4d5ba15a06153256 - depends: - - libgcc >=15 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - yaml >=0.2.5,<0.3.0a0 - size: 88597 - timestamp: 1787228457350 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.2-hdc9db2a_3.conda - sha256: 3f3c296477cf26474660942f4d8ec104a8eee2cb1abc7c5bfec9ac1102c66451 - md5: 254c54ac18eca7bf4f865e661306dc43 - depends: - - libzlib 1.3.2 hdc9db2a_3 - license: Zlib - license_family: Other - purls: [] - run_exports: - weak: - - libzlib >=1.3.2,<2.0a0 - size: 100332 - timestamp: 1785276566528 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-ng-2.3.3-h1024f78_1.conda - sha256: a37f07056ac10c7e901cb54241e67af93205c25b84566ad1bce3b19a8088fd69 - md5: 09f81cb51dfb56946193f30225976b70 - depends: - - libgcc >=15 - - libstdcxx >=15 - license: Zlib - license_family: Other - purls: [] - run_exports: - weak: - - zlib-ng >=2.3.3,<2.4.0a0 - size: 125444 - timestamp: 1786736924421 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h9d15635_7.conda - sha256: 427fd14bcb3b8659796fecc682716617409350fb5a98e5b7b47558a10d1a2fc7 - md5: d942e34ac3920ba83f8b2d0169570187 - depends: - - libzlib >=1.3.2,<2.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - zstd >=1.5.7,<1.6.0a0 - size: 615477 - timestamp: 1786599613561 -- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda - sha256: 2a7204314663eeda5dec482a956f0e2eaf289bd5b9953eaaaad0e81aa64638f2 - md5: 3845f3d75991bae0fb90884662f4327c - depends: - - cpython - - python-gil - license: MIT - license_family: MIT - purls: [] - run_exports: {} - size: 8144 - timestamp: 1784221492234 -- conda: https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda - sha256: 1307719f0d8ee694fc923579a39c0621c23fdaa14ccdf9278a5aac5665ac58e9 - md5: 74ac5069774cdbc53910ec4d631a3999 - depends: - - pygments - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/accessible-pygments?source=hash-mapping - run_exports: {} - size: 1326096 - timestamp: 1734956217254 -- conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda - sha256: 6c4456a138919dae9edd3ac1a74b6fbe5fd66c05675f54df2f8ab8c8d0cc6cea - md5: 1fd9696649f65fd6611fcdb4ffec738a - depends: - - python >=3.10 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/alabaster?source=hash-mapping - run_exports: {} - size: 18684 - timestamp: 1733750512696 -- conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.14.2-pyhcf101f3_0.conda - sha256: e36998c5e860e26b22e5dbcd5726dd0c4eabad949c84d383cad8512757bbf6a1 - md5: fb568fbae6908ba86a090a85a089d11f - depends: - - exceptiongroup >=1.0.2 - - idna >=2.8 - - python >=3.10 - - typing_extensions >=4.5 - - python - constrains: - - trio >=0.32.0 - - uvloop >=0.22.1 - - winloop >=0.2.3 - license: MIT - license_family: MIT - purls: - - pkg:pypi/anyio?source=hash-mapping - run_exports: {} - size: 164465 - timestamp: 1783889660383 -- conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda - sha256: 287dbf2b1b20a5caaa0021887aeba5c7fde20c89879338a4ab84115d972ee76b - md5: aa59c152ba5bcaf269e6782dc1cbd5a7 - depends: - - matplotlib-base - - numpy - - python >=3.10 - - scipy - - typing_extensions - license: LGPL-2.1-or-later - purls: - - pkg:pypi/ase?source=hash-mapping - run_exports: {} - size: 1967089 - timestamp: 1782119236327 -- conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.2-pyhd8ed1ab_0.conda - sha256: fbbd8ce60cbd5c16f3fe559eb644551f94285caff30985ea961ff851c1cf25ac - md5: 89d495168582cb00428dad699d149624 - depends: - - python >=3.10 - constrains: - - astroid >=2,<5 - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/asttokens?source=hash-mapping - run_exports: {} - size: 34639 - timestamp: 1783975742052 -- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - sha256: 1b6124230bb4e571b1b9401537ecff575b7b109cc3a21ee019f65e083b8399ab - md5: c6b0543676ecb1fb2d7643941fe375f2 - depends: - - python >=3.10 - - python - license: MIT - license_family: MIT - purls: - - pkg:pypi/attrs?source=hash-mapping - run_exports: {} - size: 64927 - timestamp: 1773935801332 -- conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - sha256: a14a9ad02101aab25570543a59c5193043b73dc311a25650134ed9e6cb691770 - md5: f1976ce927373500cc19d3c0b2c85177 - depends: - - python >=3.10 - - python - constrains: - - pytz >=2015.7 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/babel?source=hash-mapping - run_exports: {} - size: 7684321 - timestamp: 1772555330347 -- conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.15.0-pyha770c72_0.conda - sha256: aed4b9dcf68ec2a75e5645fed14d77fd884d38d2e52bfa6ef4b278d90cd88781 - md5: 3b261da3fe9b4168738712832410b022 - depends: - - python >=3.10 - - soupsieve >=1.2 - - typing-extensions - license: MIT - license_family: MIT - purls: - - pkg:pypi/beautifulsoup4?source=hash-mapping - run_exports: {} - size: 92704 - timestamp: 1780853175566 -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - sha256: 0a0544cf95f64394fe4959286f5c71f5444ad58feb0602e53becb27448d24da6 - md5: 0f51e2391ade309db462a55611263e9c - depends: - - __unix - license: ISC - purls: [] - run_exports: {} - size: 131780 - timestamp: 1784754889428 -- conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_2.conda - noarch: python - sha256: 0d00dd61cb91b1bd1536600c64c9db4f94f3c699fec42864d0a2f4bc2ad8c3e8 - md5: 1990eb3f49022846fbc7fc9624a0ee43 - depends: - - cached_property >=1.5.2,<1.5.3.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: {} - size: 6836 - timestamp: 1783242914545 -- conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_2.conda - sha256: b1808a7811b5688d045b204425bb7ee824b340b40025b4ad0a39b4db1f4f1c98 - md5: f71e6840332854fd2eac6c3229768a9c - depends: - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/cached-property?source=hash-mapping - run_exports: {} - size: 14752 - timestamp: 1783242913845 -- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda - sha256: fb167de4388e64e52aa3907ed099afab944c1fa6e5f74b281a312dae1bcf7f3b - md5: 37e13edbe3b48f1095a9d085ef9cd83b - depends: - - python >=3.10 - license: ISC - purls: - - pkg:pypi/certifi?source=hash-mapping - run_exports: {} - size: 137015 - timestamp: 1784717699092 -- conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda - sha256: aa589352e61bb221351a79e5946d56916e3c595783994884accdb3b97fe9d449 - md5: 381bd45fb7aa032691f3063aff47e3a1 - depends: - - python >=3.10 - license: MIT - license_family: MIT - purls: - - pkg:pypi/cfgv?source=hash-mapping - run_exports: {} - size: 13589 - timestamp: 1763607964133 -- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.5.1-pyhd8ed1ab_0.conda - sha256: cb60ef3e0631c8bacb4f7057196dee4496091a22baa3bb4b9bccb12c7e1c921b - md5: e0ac3accc64e23e40969d660e5f58ac8 - depends: - - python >=3.10 - license: MIT - license_family: MIT - purls: - - pkg:pypi/charset-normalizer?source=compressed-mapping - run_exports: {} - size: 64487 - timestamp: 1786835648298 -- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda - sha256: ccc4787f511964f9a1f2d2d2859c91c5d571fb60f7f09d4c4e092c9b7a94e671 - md5: 2c4bd6aeb90bb157456841c3270a0d92 - depends: - - __unix - - python - - python >=3.10 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/click?source=hash-mapping - run_exports: {} - size: 107155 - timestamp: 1783085363526 -- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 - md5: 962b9857ee8e7018c22f2776ffa0b2d7 - depends: - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/colorama?source=hash-mapping - run_exports: {} - size: 27011 - timestamp: 1733218222191 -- conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda - sha256: 576a44729314ad9e4e5ebe055fbf48beb8116b60e58f9070278985b2b634f212 - md5: 2da13f2b299d8e1995bafbbe9689a2f7 - depends: - - python >=3.9 - - python - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/comm?source=hash-mapping - run_exports: {} - size: 14690 - timestamp: 1753453984907 -- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.11.15-py311hd8ed1ab_2.conda - noarch: generic - sha256: ebcf3f3f9c4933cc8738fa6e7ebb38ea86db91af6aabe3a2de7a1306402ddfc5 - md5: 9c12c19759f7588ef3ffa6e372cd5e9f - depends: - - python >=3.11,<3.12.0a0 - - python_abi * *_cp311 - license: Python-2.0 - purls: [] - run_exports: {} - size: 48434 - timestamp: 1786443481697 -- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_1.conda - noarch: generic - sha256: b7ea8ebc1b2059159cbd49e0c9d1815713c73c4a55156b060c28dd61cfbdf9c2 - md5: 171d0cc7f621a0371ea273a05abdb46c - depends: - - python >=3.12,<3.13.0a0 - - python_abi * *_cp312 - license: Python-2.0 - purls: [] - run_exports: {} - size: 45930 - timestamp: 1786443506006 -- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.15-py313hd8ed1ab_101.conda - noarch: generic - sha256: 1015448e0fb319fa8bb23148dd6ea34181cbcdc8f1880df61626db1999533a99 - md5: 128ab71e26d605b5d93e058dc7d563cc - depends: - - python >=3.13,<3.14.0a0 - - python_abi * *_cp313 - license: Python-2.0 - purls: [] - run_exports: {} - size: 48329 - timestamp: 1786366745175 -- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-12.9.27-ha770c72_0.conda - sha256: 2ee3b9564ca326226e5cda41d11b251482df8e7c757e333d28ec75213c75d126 - md5: 87ff6381e33b76e5b9b179a2cdd005ec - depends: - - cuda-version >=12.9,<12.10.0a0 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 1150650 - timestamp: 1746189825236 -- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-13.3.3.4.1-ha770c72_1.conda - sha256: fa44586fc308d0089fb5f014d5b53cbea19a2e83cd7bbd1e19c79140293be9a3 - md5: 199a317645eac1a18745d05dc551ab6e - depends: - - cuda-version >=13.3,<13.4.0a0 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 1486700 - timestamp: 1785874560026 -- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-compiler-12.9.2-hbad6d8a_0.conda - sha256: 94eeda2d8c7580a980fc0126bb90eb7d802a9cac9d48de86bad79987bfa9fc9c - md5: 03ecb59bb24bed699de7a48f0c3c4cb3 - depends: - - __linux - - c-compiler - - cuda-cuobjdump 12.9.82.* - - cuda-cuxxfilt 12.9.82.* - - cuda-nvcc 12.9.86.* - - cuda-nvprune 12.9.82.* - - cxx-compiler - license: LicenseRef-NVIDIA-End-User-License-Agreement - run_exports: {} - size: 21132 - timestamp: 1778770556551 -- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-12.9.86-ha770c72_2.conda - sha256: e6257534c4b4b6b8a1192f84191c34906ab9968c92680fa09f639e7846a87304 - md5: 79d280de61e18010df5997daea4743df - depends: - - cuda-version >=12.9,<12.10.0a0 - license: LicenseRef-NVIDIA-End-User-License-Agreement - run_exports: {} - size: 94239 - timestamp: 1753975242354 -- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-12.9.79-h3f2d84a_0.conda - sha256: ffe86ed0144315b276f18020d836c8ef05bf971054cf7c3eb167af92494080d5 - md5: 86e40eb67d83f1a58bdafdd44e5a77c6 - depends: - - cuda-cccl_linux-64 - - cuda-cudart-static_linux-64 - - cuda-cudart_linux-64 - - cuda-version >=12.9,<12.10.0a0 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: - weak: - - cuda-cudart >=12.9.79,<13.0a0 - size: 389140 - timestamp: 1749218427266 -- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-13.3.29-h376f20c_0.conda - sha256: d95f1b404119e3f72edb7ac5dbd4443e2d7d040f7d68c3905c0dd7ad78f11311 - md5: 4165013e8d24dd61774458e6f2e36c32 - depends: - - cuda-cccl_linux-64 - - cuda-cudart-static_linux-64 - - cuda-cudart_linux-64 - - cuda-version >=13.3,<13.4.0a0 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: - weak: - - cuda-cudart >=13.3.29,<14.0a0 - size: 405020 - timestamp: 1779898430134 -- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-12.9.79-h3f2d84a_0.conda - sha256: d435f8a19b59b52ce460ee3a6bfd877288a0d1d645119a6ba60f1c3627dc5032 - md5: b87bf315d81218dd63eb46cc1eaef775 - depends: - - cuda-version >=12.9,<12.10.0a0 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 1148889 - timestamp: 1749218381225 -- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-13.3.29-h376f20c_0.conda - sha256: fa920f2c2154ea2ace2d55457e43af8e7bfc2c94fa5ec7276792ad411d1011d1 - md5: 7d4fe2a79d971522b3ad68b772c197eb - depends: - - cuda-version >=13.3,<13.4.0a0 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 1126340 - timestamp: 1779898412056 -- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.9.79-h3f2d84a_0.conda - sha256: 6cde0ace2b995b49d0db2eefb7bc30bf00ffc06bb98ef7113632dec8f8907475 - md5: 64508631775fbbf9eca83c84b1df0cae - depends: - - cuda-version >=12.9,<12.10.0a0 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 197249 - timestamp: 1749218394213 -- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-13.3.29-h376f20c_0.conda - sha256: a86028f94acf37b17ca2280734ae9dcc407cdf68a9c400102d323a3b15e52f0b - md5: 10949c6dfe9157fedb19170bd6e0b835 - depends: - - cuda-version >=13.3,<13.4.0a0 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 206064 - timestamp: 1779898416941 -- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-driver-dev_linux-64-12.9.79-h3f2d84a_0.conda - sha256: a15574d966e73135a79d5e6570c87e13accdb44bd432449b5deea71644ad442c - md5: d411828daa36ac84eab210ba3bbe5a64 - depends: - - cuda-version >=12.9,<12.10.0a0 - license: LicenseRef-NVIDIA-End-User-License-Agreement - run_exports: {} - size: 37714 - timestamp: 1749218405324 -- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvcc-dev_linux-64-12.9.86-he91c749_2.conda - sha256: a1672a34439a72869de9e011e935d41b62fc8dfb1a2700e85ed8a7a129b79981 - md5: 19d4e090217f0ea89d30bedb7461c048 - depends: - - cuda-crt-dev_linux-64 12.9.86 ha770c72_2 - - cuda-nvvm-dev_linux-64 12.9.86 ha770c72_2 - - cuda-version >=12.9,<12.10.0a0 - - libgcc >=6 - - libnvptxcompiler-dev_linux-64 12.9.86 ha770c72_2 - constrains: - - gcc_impl_linux-64 >=6,<15.0a0 - license: LicenseRef-NVIDIA-End-User-License-Agreement - run_exports: {} - size: 28121 - timestamp: 1753975535813 -- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-12.9.86-ha770c72_2.conda - sha256: 522722dcaffd133e0c7500c69dc70e21ac34d6762dcbaabfe847439f944028f0 - md5: 7b386291414c7eea113d25ac28a33772 - depends: - - cuda-version >=12.9,<12.10.0a0 - license: LicenseRef-NVIDIA-End-User-License-Agreement - run_exports: {} - size: 27096 - timestamp: 1753975261562 -- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda - sha256: 5f5f428031933f117ff9f7fcc650e6ea1b3fef5936cf84aa24af79167513b656 - md5: b6d5d7f1c171cbd228ea06b556cfa859 - constrains: - - cudatoolkit 12.9|12.9.* - - __cuda >=12 - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 21578 - timestamp: 1746134436166 -- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda - sha256: bd8ee668f416bdd0f6548b2413550ae83d3834665a5be869a2daf99233ec526e - md5: 0fd72afdcc74560b80eb74b78767c454 - constrains: - - __cuda >=13 - - cudatoolkit 13.3|13.3.* - license: LicenseRef-NVIDIA-End-User-License-Agreement - purls: [] - run_exports: {} - size: 22083 - timestamp: 1779891651771 -- conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - sha256: bb47aec5338695ff8efbddbc669064a3b10fe34ad881fb8ad5d64fbfa6910ed1 - md5: 4c2a8fef270f6c69591889b93f9f55c1 - depends: - - python >=3.10 - - python - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/cycler?source=hash-mapping - run_exports: {} - size: 14778 - timestamp: 1764466758386 -- conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.3-pyhcf101f3_0.conda - sha256: e2753997b8bd34205f42be01b8bab8037423dc30c02a1ec12de23e5b4c0b0a2e - md5: 58638f77697c4f6726753eb8be34818b - depends: - - python >=3.10 - - python - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/distlib?source=hash-mapping - run_exports: {} - size: 303705 - timestamp: 1781320269259 -- conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda - sha256: 0d605569a77350fb681f9ed8d357cc71649b59a304099dc9d09fbeec5e84a65e - md5: d6bd3cd217e62bbd7efe67ff224cd667 - depends: - - python >=3.10 - license: CC-PDDC AND BSD-3-Clause AND BSD-2-Clause AND ZPL-2.1 - purls: - - pkg:pypi/docutils?source=hash-mapping - run_exports: {} - size: 438002 - timestamp: 1766092633160 -- conda: https://conda.anaconda.org/conda-forge/noarch/e3nn-0.6.0-pyhcf101f3_1.conda - sha256: 6f0b58e8427e8399094a8e8fb9b0a74008a73bd82c562842b086ffa7dec7b981 - md5: ff4d702b7a86d1906ab0b35f8420383e - depends: - - opt_einsum_fx >=0.1.4 - - python >=3.10 - - scipy - - sympy - - pytorch >=1.8.0 - - python - license: MIT - license_family: MIT - purls: - - pkg:pypi/e3nn?source=hash-mapping - run_exports: {} - size: 391463 - timestamp: 1777474663095 -- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - sha256: ee6cf346d017d954255bbcbdb424cddea4d14e4ed7e9813e429db1d795d01144 - md5: 8e662bd460bda79b1ea39194e3c4c9ab - depends: - - python >=3.10 - - typing_extensions >=4.6.0 - license: MIT and PSF-2.0 - purls: - - pkg:pypi/exceptiongroup?source=hash-mapping - run_exports: {} - size: 21333 - timestamp: 1763918099466 -- conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - sha256: 210c8165a58fdbf16e626aac93cc4c14dbd551a01d1516be5ecad795d2422cad - md5: ff9efb7f7469aed3c4a8106ffa29593c - depends: - - python >=3.10 - license: MIT - license_family: MIT - purls: - - pkg:pypi/executing?source=hash-mapping - run_exports: {} - size: 30753 - timestamp: 1756729456476 -- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda - sha256: 43832e6442c59af5d65c6a5afa5a4a5160f6a45c8cc25f5275a9454161c40bfd - md5: 1ef717bcf73da3edcaaf7bf12a1e846c - depends: - - python >=3.10 - license: Unlicense - purls: - - pkg:pypi/filelock?source=compressed-mapping - run_exports: {} - size: 78106 - timestamp: 1786669915951 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b - md5: 0c96522c6bdaed4b1566d11387caaf45 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: {} - size: 397370 - timestamp: 1566932522327 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c - md5: 34893075a5c9e55cdafac56607368fc6 - license: OFL-1.1 - license_family: Other - purls: [] - run_exports: {} - size: 96530 - timestamp: 1620479909603 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 - md5: 4d59c254e01d9cde7957100457e2d5fb - license: OFL-1.1 - license_family: Other - purls: [] - run_exports: {} - size: 700814 - timestamp: 1620479612257 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 - md5: 49023d73832ef61042f6a237cb2687e7 - license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 - license_family: Other - purls: [] - run_exports: {} - size: 1620504 - timestamp: 1727511233259 -- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 - md5: fee5683a3f04bd15cbd8318b096a27ab - depends: - - fonts-conda-forge - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: {} - size: 3667 - timestamp: 1566974674465 -- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 - md5: a7970cd949a077b7cb9696379d338681 - depends: - - font-ttf-ubuntu - - font-ttf-inconsolata - - font-ttf-dejavu-sans-mono - - font-ttf-source-code-pro - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: {} - size: 4059 - timestamp: 1762351264405 -- conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda - sha256: 3cd1c985695d8114bdba2a4a38c87e86d633fadd7cfe7a6733ebb3fe807fdc86 - md5: b9176565976c773a0739bd83deaf06cc - depends: - - python >=3.10 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/fsspec?source=hash-mapping - run_exports: {} - size: 151868 - timestamp: 1785325238671 -- conda: https://conda.anaconda.org/conda-forge/noarch/future-1.0.0-pyhd8ed1ab_2.conda - sha256: 45dfd037889b7075c5eb46394f93172de0be0b1624c7f802dd3ecc94b814d8e0 - md5: 1054c53c95d85e35b88143a3eda66373 - depends: - - python >=3.9 - license: MIT - license_family: MIT - purls: - - pkg:pypi/future?source=hash-mapping - run_exports: {} - size: 364561 - timestamp: 1738926525117 -- conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - sha256: 96cac6573fd35ae151f4d6979bab6fbc90cb6b1fb99054ba19eb075da9822fcb - md5: b8993c19b0c32a2f7b66cbb58ca27069 - depends: - - python >=3.10 - - typing_extensions - - python - license: MIT - license_family: MIT - purls: - - pkg:pypi/h11?source=hash-mapping - run_exports: {} - size: 39069 - timestamp: 1767729720872 -- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda - sha256: 307dd6ec90140c3cf4171071b0e5e870abec314f4565c1edd5bc433e942cdcc0 - md5: e652ac7756069c456d0da2a922cd7df5 - depends: - - python >=3.10 - - hyperframe >=6.1,<7 - - hpack >=4.2,<5 - - python - license: MIT - license_family: MIT - purls: - - pkg:pypi/h2?source=hash-mapping - run_exports: {} - size: 100789 - timestamp: 1785796355216 -- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda - sha256: fdcea5d7cb314485d3907192ef024c704311548c5b0cbeb390cd1951051e29d2 - md5: b395909221b9bd1df066e5930e18855b - depends: - - python >=3.10 - license: MIT - license_family: MIT - purls: - - pkg:pypi/hpack?source=hash-mapping - run_exports: {} - size: 32884 - timestamp: 1782283986153 -- conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - sha256: 04d49cb3c42714ce533a8553986e1642d0549a05dc5cc48e0d43ff5be6679a5b - md5: 4f14640d58e2cc0aa0819d9d8ba125bb - depends: - - python >=3.9 - - h11 >=0.16 - - h2 >=3,<5 - - sniffio 1.* - - anyio >=4.0,<5.0 - - certifi - - python - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/httpcore?source=hash-mapping - run_exports: {} - size: 49483 - timestamp: 1745602916758 -- conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - sha256: cd0f1de3697b252df95f98383e9edb1d00386bfdd03fdf607fa42fe5fcb09950 - md5: d6989ead454181f4f9bc987d3dc4e285 - depends: - - anyio - - certifi - - httpcore 1.* - - idna - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/httpx?source=hash-mapping - run_exports: {} - size: 63082 - timestamp: 1733663449209 -- conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.28.0-pyhcf101f3_0.conda - sha256: 4472980f8afbfcdd2ac4b23c64992cf83addcc80923b9b1a3c79a75ae4bf4f78 - md5: c5a90c5c38ec7cb4fc010ae70c859c97 - depends: - - python >=3.10 - - click >=8.4.2,<9.0.0 - - filelock >=3.10.0 - - fsspec >=2023.5.0 - - hf-xet >=1.5.2,<2.0.0 - - httpx >=0.23.0,<1 - - packaging >=20.9 - - pyyaml >=5.1 - - tqdm >=4.42.1 - - typing_extensions >=4.1.0 - - python - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/huggingface-hub?source=hash-mapping - run_exports: {} - size: 541831 - timestamp: 1787059786165 -- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 - md5: 8e6923fc12f1fe8f8c4e5c9f343256ac - depends: - - python >=3.9 - license: MIT - license_family: MIT - purls: - - pkg:pypi/hyperframe?source=hash-mapping - run_exports: {} - size: 17397 - timestamp: 1737618427549 -- conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda - sha256: 381cedccf0866babfc135d65ee40b778bd20e927d2a5ec810f750c5860a7c5b8 - md5: 84a3233b709a289a4ddd7a2fd27dd988 - depends: - - python >=3.10 - - ukkonen - license: MIT - license_family: MIT - purls: - - pkg:pypi/identify?source=hash-mapping - run_exports: {} - size: 79757 - timestamp: 1776455344188 -- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda - sha256: 1c35a59c1545ad0fdaddf1fbde7bcfa6ef41a8d68c3a2b0b4a291be00676163e - md5: a39ae05027e9b707742e41b30d296b75 - depends: - - python >=3.10 - - python - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/idna?source=compressed-mapping - run_exports: {} - size: 177433 - timestamp: 1787059857580 -- conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda - sha256: 5a047f9eac290e679b4e6f6f4cbfcc5acdfbf031a4f06824d4ddb590cdbb850b - md5: 92617c2ba2847cca7a6ed813b6f4ab79 - depends: - - python >=3.10 - license: MIT - license_family: MIT - purls: - - pkg:pypi/imagesize?source=hash-mapping - run_exports: {} - size: 15729 - timestamp: 1773752188889 -- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda - sha256: 43e2a5497cad1598ff88a3e69f69bc88b7b8f141fa63c60eab5db296317318b8 - md5: ffc17e785d64e12fc311af9184221839 - depends: - - python >=3.10 - - zipp >=3.20 - - python - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/importlib-metadata?source=hash-mapping - run_exports: {} - size: 34766 - timestamp: 1779714582554 -- conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - sha256: e1a9e3b1c8fe62dc3932a616c284b5d8cbe3124bbfbedcf4ce5c828cb166ee19 - md5: 9614359868482abba1bd15ce465e3c42 - depends: - - python >=3.10 - license: MIT - license_family: MIT - purls: - - pkg:pypi/iniconfig?source=hash-mapping - run_exports: {} - size: 13387 - timestamp: 1760831448842 -- conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.3.0-pyha191276_0.conda - sha256: 305ad9226363ff5f259c404dd9a7508183a2e150739b2adc43db7d817234da66 - md5: 2b47a10e4d98334f8171ff60aea05ff3 - depends: - - __linux - - comm >=0.1.1 - - debugpy >=1.6.5 - - ipython >=7.23.1 - - jupyter_client >=8.9.0 - - jupyter_core >=5.1,!=6.0.* - - matplotlib-inline >=0.1 - - nest-asyncio2 >=1.7.0 - - packaging >=22 - - psutil >=5.7 - - python >=3.10 - - pyzmq >=25 - - tornado >=6.4.1 - - traitlets >=5.4.0 - - python - constrains: - - appnope >=0.1.2 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/ipykernel?source=hash-mapping - run_exports: {} - size: 138635 - timestamp: 1781101665847 -- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.16.1-pyh53cf698_0.conda - sha256: 8470648b5e790d1881c09c02068d53e1bf0126f020db02a6dc2e73400cf1eeeb - md5: 23564ed27c9c7714905be96ac5786500 - depends: - - __unix - - ipython_pygments_lexers >=1.0.0 - - jedi >=0.18.2 - - matplotlib-inline >=0.1.6 - - prompt-toolkit >=3.0.41,<3.1.0 - - psutil >=7 - - pygments >=2.14.0 - - python >=3.11 - - stack_data >=0.6.0 - - traitlets >=5.13.0 - - typing_extensions >=4.6 - - pexpect >4.6 - - python - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/ipython?source=hash-mapping - run_exports: {} - size: 716078 - timestamp: 1785754203352 -- conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - sha256: 894682a42a7d659ae12878dbcb274516a7031bbea9104e92f8e88c1f2765a104 - md5: bd80ba060603cc228d9d81c257093119 - depends: - - pygments - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/ipython-pygments-lexers?source=hash-mapping - run_exports: {} - size: 13993 - timestamp: 1737123723464 -- conda: https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.9-pyhd8ed1ab_0.conda - sha256: c391fe12c24fce4f8380f44ebdfb62a5ecdbf0ee168e7db7ea9baf3527eec003 - md5: 1efaf89bb5d9a6ff2ce5f84d25678f53 - depends: - - comm >=0.1.3 - - ipython >=6.1.0 - - jupyterlab_widgets >=3.0.17,<3.1.0 - - python >=3.10 - - traitlets >=4.3.1 - - widgetsnbextension >=4.0.16,<4.1.0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/ipywidgets?source=compressed-mapping - run_exports: {} - size: 115707 - timestamp: 1787052940568 -- conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.20.0-pyhcf101f3_0.conda - sha256: 744143551c1c7b528b82533fb641b9d7db20b2203abc4c2635c387fa6c089fc3 - md5: c2b3d37aa1411031126036ee76a8a861 - depends: - - python >=3.10 - - parso >=0.8.6,<0.9.0 - - python - license: Apache-2.0 AND MIT - purls: - - pkg:pypi/jedi?source=hash-mapping - run_exports: {} - size: 2715215 - timestamp: 1782251948616 -- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - sha256: fc9ca7348a4f25fed2079f2153ecdcf5f9cf2a0bc36c4172420ca09e1849df7b - md5: 04558c96691bed63104678757beb4f8d - depends: - - markupsafe >=2.0 - - python >=3.10 - - python - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/jinja2?source=hash-mapping - run_exports: {} - size: 120685 - timestamp: 1764517220861 -- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda - sha256: db973a37d75db8e19b5f44bbbdaead0c68dde745407f281e2a7fe4db74ec51d7 - md5: ada41c863af263cc4c5fcbaff7c3e4dc - depends: - - attrs >=22.2.0 - - jsonschema-specifications >=2023.3.6 - - python >=3.10 - - referencing >=0.28.4 - - rpds-py >=0.25.0 - - python - license: MIT - license_family: MIT - purls: - - pkg:pypi/jsonschema?source=hash-mapping - run_exports: {} - size: 82356 - timestamp: 1767839954256 -- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda - sha256: 0a4f3b132f0faca10c89fdf3b60e15abb62ded6fa80aebfc007d05965192aa04 - md5: 439cd0f567d697b20a8f45cb70a1005a - depends: - - python >=3.10 - - referencing >=0.31.0 - - python - license: MIT - license_family: MIT - purls: - - pkg:pypi/jsonschema-specifications?source=hash-mapping - run_exports: {} - size: 19236 - timestamp: 1757335715225 -- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-cache-1.0.1-pyhff2d567_0.conda - sha256: 054d397dd45ed08bffb0976702e553dfb0d0b0a477da9cff36e2ea702e928f48 - md5: b0ee650829b8974202a7abe7f8b81e5a - depends: - - attrs - - click - - importlib-metadata - - nbclient >=0.2 - - nbformat - - python >=3.9 - - pyyaml - - sqlalchemy >=1.3.12,<3 - - tabulate - license: MIT - license_family: MIT - purls: - - pkg:pypi/jupyter-cache?source=hash-mapping - run_exports: {} - size: 31236 - timestamp: 1731777189586 -- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.9.1-pyhcf101f3_0.conda - sha256: 48b18974cc93b2c0d2681563237034e521f51d1878f0bbc6a5a67ca31b1608a6 - md5: 49440e66df843bee2273937e8032ec43 - depends: - - jupyter_core >=5.1 - - python >=3.10 - - python-dateutil >=2.8.2 - - pyzmq >=25.0 - - tornado >=6.4.1 - - traitlets >=5.3 - - typing_extensions >=4.13.0 - - python - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/jupyter-client?source=hash-mapping - run_exports: {} - size: 117954 - timestamp: 1781019994076 -- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda - sha256: 1d34b80e5bfcd5323f104dbf99a2aafc0e5d823019d626d0dce5d3d356a2a52a - md5: b38fe4e78ee75def7e599843ef4c1ab0 - depends: - - __unix - - python - - platformdirs >=2.5 - - python >=3.10 - - traitlets >=5.3 - - python - constrains: - - pywin32 >=300 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/jupyter-core?source=hash-mapping - run_exports: {} - size: 65503 - timestamp: 1760643864586 -- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.17-pyhcf101f3_0.conda - sha256: 697c4a5b4771e8fbd5a9bbb614899982c7e586eafaf123c210f9d1794436f00a - md5: 1fb3f0d175d6e92f56139fb46a17aa2d - depends: - - python >=3.10 - - python - constrains: - - jupyterlab >=4,<5 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/jupyterlab-widgets?source=compressed-mapping - run_exports: {} - size: 219589 - timestamp: 1787045328396 -- conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - sha256: 41557eeadf641de6aeae49486cef30d02a6912d8da98585d687894afd65b356a - md5: 86d9cba083cd041bfbf242a01a7a1999 - constrains: - - sysroot_linux-64 ==2.28 - license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later - license_family: GPL - purls: [] - run_exports: {} - size: 1278712 - timestamp: 1765578681495 -- conda: https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2 - sha256: 5210d31c8f2402dd1ad1b3edcf7a53292b9da5de20cd14d9c243dbf9278b1c4f - md5: 8d67904973263afd2985ba56aa2d6bb4 - depends: - - python - - six - license: MIT - license_family: MIT - purls: - - pkg:pypi/latexcodec?source=hash-mapping - run_exports: {} - size: 18212 - timestamp: 1592937373647 -- conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.4.0-hd9a9cd0_102.conda - sha256: 89fccb8a86c6ca550790e05cd5fa8a3488fe28823bdb7fd949c92dd17a9d0140 - md5: 278e78b39f895bd887de3787b19763a6 - depends: - - __unix - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - run_exports: {} - size: 3082404 - timestamp: 1787164740495 -- conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.3.0-h2b852eb_102.conda - sha256: c3ecac0bf8aadab7f69e06ee80b4e6fac65be904c6d549f9330698f293684394 - md5: 54856e0baa687b9905d312fc2d764859 - depends: - - __unix - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - run_exports: {} - size: 3094985 - timestamp: 1787165024194 -- conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_linux-64-12.9.86-ha770c72_2.conda - sha256: 17952c32eac197a59c119fdf3fb6f08c6a29c225a80bae141ac904ad212b87dd - md5: a66a909acf08924aced622903832a937 - depends: - - cuda-version >=12.9,<12.10.0a0 - license: LicenseRef-NVIDIA-End-User-License-Agreement - run_exports: {} - size: 14422867 - timestamp: 1753975387297 -- conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.4.0-ha5b54cb_102.conda - sha256: a904b423a26bfeeb4e52479e6eedc76ee56014f4ccccf00beebeddeb687486d0 - md5: 8002d010ad2ffa6ea6e7b49c0f84bda8 - depends: - - __unix - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - run_exports: {} - size: 20103632 - timestamp: 1787164763275 -- conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.3.0-hb2c5482_102.conda - sha256: 90ca7d7fc76649f537cada161c7c1594bbad14d89a8388d0b09c9c154ba51a37 - md5: 25a808f5db20dbb073cb07c3d1bbc080 - depends: - - __unix - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - run_exports: {} - size: 20626743 - timestamp: 1787165047665 -- conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.1.0-pyhcf101f3_0.conda - sha256: 991a82fbb64aba6d10719a017ce354e28df02ea5df1d9c7b0221da573c168d27 - md5: 1005e1f39083adad2384772e8e384e43 - depends: - - python >=3.10 - - uc-micro-py - license: MIT - license_family: MIT - purls: - - pkg:pypi/linkify-it-py?source=hash-mapping - run_exports: {} - size: 26062 - timestamp: 1772476821244 -- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda - sha256: 0c4c35376fe920714390d46e4b8d31c876d65f18e1655899e0763ec25f2a902f - md5: 6d03368f2b2b0a5fb6839df53b2eb5e0 - depends: - - mdurl >=0.1,<1 - - python >=3.10 - license: MIT - license_family: MIT - purls: - - pkg:pypi/markdown-it-py?source=hash-mapping - run_exports: {} - size: 69017 - timestamp: 1778169663339 -- conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda - sha256: 35b43d7343f74452307fd018a1cca92b8f68961ff8e2ab6a81ce0a703c9a3764 - md5: 9acc1c385be401d533ff70ef5b50dae6 - depends: - - python >=3.10 - - traitlets - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/matplotlib-inline?source=hash-mapping - run_exports: {} - size: 15725 - timestamp: 1778264403247 -- conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda - sha256: 49db23cbfb1c1d414a14d7540195208b994ebd747beba0f15c903f3a0a2dc446 - md5: ad6821df7a98510117db06e9a833281f - depends: - - markdown-it-py >=2.0.0,<5.0.0 - - python >=3.10 - license: MIT - license_family: MIT - purls: - - pkg:pypi/mdit-py-plugins?source=hash-mapping - run_exports: {} - size: 50460 - timestamp: 1778692223625 -- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 - md5: 592132998493b3ff25fd7479396e8351 - depends: - - python >=3.9 - license: MIT - license_family: MIT - purls: - - pkg:pypi/mdurl?source=hash-mapping - run_exports: {} - size: 14465 - timestamp: 1733255681319 -- conda: https://conda.anaconda.org/conda-forge/noarch/mpi-1.0.1-openmpi.conda - sha256: e1698675ec83a2139c0b02165f47eaf0701bcab043443d9008fc0f8867b07798 - md5: 78b827d2852c67c68cd5b2c55f31e376 - license: BSD-3-Clause - license_family: BSD - run_exports: {} - size: 6571 - timestamp: 1727683130230 -- conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda - sha256: 5bbf2f8179ec43d34d67ca8e4989d216c1bdb4b749fe6cb40e86ebf88c1b5300 - md5: 2e81b32b805f406d23ba61938a184081 - depends: - - python >=3.10 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/mpmath?source=hash-mapping - run_exports: {} - size: 464918 - timestamp: 1773662068273 -- conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - sha256: d09c47c2cf456de5c09fa66d2c3c5035aa1fa228a1983a433c47b876aa16ce90 - md5: 37293a85a0f4f77bbd9cf7aaefc62609 - depends: - - python >=3.9 - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/munkres?source=hash-mapping - run_exports: {} - size: 15851 - timestamp: 1749895533014 -- conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - sha256: 6ed158e4e5dd8f6a10ad9e525631e35cee8557718f83de7a4e3966b1f772c4b1 - md5: e9c622e0d00fa24a6292279af3ab6d06 - depends: - - python >=3.9 - license: MIT - license_family: MIT - purls: - - pkg:pypi/mypy-extensions?source=hash-mapping - run_exports: {} - size: 11766 - timestamp: 1745776666688 -- conda: https://conda.anaconda.org/conda-forge/noarch/myst-nb-1.4.0-pyhcf101f3_0.conda - sha256: c81d0c8c74c3da66808f8da09d8e48f2af2d173d357d45239defaf466838edba - md5: da07c7b1588ad0a44118d28aeb31b6a6 - depends: - - importlib-metadata - - ipykernel - - ipython - - jupyter-cache >=0.5 - - myst-parser >=1.0.0 - - nbclient - - nbformat >=5.0 - - python >=3.10 - - pyyaml - - sphinx >=5 - - typing_extensions - - python - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/myst-nb?source=hash-mapping - run_exports: {} - size: 68766 - timestamp: 1772587444587 -- conda: https://conda.anaconda.org/conda-forge/noarch/myst-parser-5.1.0-pyhd8ed1ab_0.conda - sha256: 94235bc1f769cf35029942ecb2ca796f18e730c1bf5aeef95e72680ebcfacfef - md5: 580615e59fc7c07741e4d2ab052cfc8b - depends: - - docutils >=0.20,<0.23 - - jinja2 - - markdown-it-py >=4.2.0,<4.3.0 - - mdit-py-plugins >=0.6.1,<0.7 - - python >=3.11 - - pyyaml - - sphinx >=8,<10 - license: MIT - license_family: MIT - purls: - - pkg:pypi/myst-parser?source=hash-mapping - run_exports: {} - size: 74888 - timestamp: 1778696564508 -- conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.11.0-pyhd8ed1ab_0.conda - sha256: eceb424236fbbb9b337a857fe5448307b57a2a3fb2db389ae37e7a8b8cdca2ab - md5: cf01a81d7960ad9c829bf2e794fcee9a - depends: - - jupyter_client >=7.0.0 - - jupyter_core >=5.4 - - nbformat >=5.2.0 - - python >=3.10 - - traitlets >=5.13 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/nbclient?source=hash-mapping - run_exports: {} - size: 29138 - timestamp: 1780661039538 -- conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.11.1-pyhcf101f3_0.conda - sha256: d85d76827ff732e1639f50f45e4d7d3387a27abd857b194dcbb5bb4166c2a7c2 - md5: 2fbbf92e1173ae024f0b12759c1e64a1 - depends: - - jsonschema >=2.6 - - jupyter_core >=4.12,!=5.0.* - - python >=3.10 - - python-fastjsonschema >=2.15 - - traitlets >=5.1 - - python - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/nbformat?source=compressed-mapping - run_exports: {} - size: 107750 - timestamp: 1787133512599 -- conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio2-1.7.2-pyhcf101f3_0.conda - sha256: e6768ceef038f4d7e083de7e393f5dd7d672b937e2bda570b740f6399b686689 - md5: fcd832bfd4749e9b246112b6894f97fc - depends: - - python >=3.10 - - python - license: BSD-2-Clause - license_family: BSD - purls: - - pkg:pypi/nest-asyncio2?source=hash-mapping - run_exports: {} - size: 15903 - timestamp: 1770973502283 -- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - sha256: f6a82172afc50e54741f6f84527ef10424326611503c64e359e25a19a8e4c1c6 - md5: a2c1eeadae7a309daed9d62c96012a2b - depends: - - python >=3.11 - - python - constrains: - - numpy >=1.25 - - scipy >=1.11.2 - - matplotlib-base >=3.8 - - pandas >=2.0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/networkx?source=hash-mapping - run_exports: {} - size: 1587439 - timestamp: 1765215107045 -- conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda - sha256: 4fa40e3e13fc6ea0a93f67dfc76c96190afd7ea4ffc1bac2612d954b42cdc3ee - md5: eb52d14a901e23c39e9e7b4a1a5c015f - depends: - - python >=3.10 - - setuptools - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/nodeenv?source=hash-mapping - run_exports: {} - size: 40866 - timestamp: 1766261270149 -- conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 - sha256: d38542a151a90417065c1a234866f97fd1ea82a81de75ecb725955ab78f88b4b - md5: 9a66894dfd07c4510beb6b3f9672ccc0 - constrains: - - mkl <0.a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: {} - size: 3843 - timestamp: 1582593857545 -- conda: https://conda.anaconda.org/conda-forge/noarch/opt-einsum-3.4.0-hd8ed1ab_1.conda - sha256: 8db3d841c72f184de69e1237b900a2d79c742e30e8378973814543bf987b6bc6 - md5: b94f689d8b1ce7dd212946e0331037ad - depends: - - opt_einsum >=3.4.0,<3.4.1.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: {} - size: 6558 - timestamp: 1733688054327 -- conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda - sha256: af71aabb2bfa4b2c89b7b06403e5cec23b418452cae9f9772bd7ac3f9ea1ff44 - md5: 52919815cd35c4e1a0298af658ccda04 - depends: - - python >=3.9 - license: MIT - license_family: MIT - purls: - - pkg:pypi/opt-einsum?source=hash-mapping - run_exports: {} - size: 62479 - timestamp: 1733688053334 -- conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum_fx-0.1.4-pyhd8ed1ab_1.conda - sha256: ce86179c307c19643655d2e171c782b006c9eb35dbd501bcb197c4944dad2bda - md5: 00e15f6b5740a25b86dabf22483b002c - depends: - - opt-einsum - - packaging - - python >=3.9 - - pytorch >=1.8.0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/opt-einsum-fx?source=hash-mapping - run_exports: {} - size: 17532 - timestamp: 1734789249385 -- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda - sha256: c432626b16768b8dab228bfb706f7060c2d462a21c516d240f68f2f902b5a044 - md5: 936687ed80f295a1f5dbcf8bd34c252c - depends: - - python >=3.9 - - python - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/packaging?source=hash-mapping - run_exports: {} - size: 116363 - timestamp: 1785888127370 -- conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda - sha256: 611882f7944b467281c46644ffde6c5145d1a7730388bcde26e7e86819b0998e - md5: 39894c952938276405a1bd30e4ce2caf - depends: - - python >=3.10 - - python - license: MIT - license_family: MIT - purls: - - pkg:pypi/parso?source=hash-mapping - run_exports: {} - size: 82472 - timestamp: 1777722955579 -- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda - sha256: 6eaee417d33f298db79bc7185ab1208604c0e6cf51dade34cd513c6f9db9c6f3 - md5: 11adc78451c998c0fd162584abfa3559 - depends: - - python >=3.10 - license: MPL-2.0 - license_family: MOZILLA - purls: - - pkg:pypi/pathspec?source=hash-mapping - run_exports: {} - size: 56559 - timestamp: 1777271601895 -- conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - sha256: 202af1de83b585d36445dc1fda94266697341994d1a3328fabde4989e1b3d07a - md5: d0d408b1f18883a944376da5cf8101ea - depends: - - ptyprocess >=0.5 - - python >=3.9 - license: ISC - purls: - - pkg:pypi/pexpect?source=hash-mapping - run_exports: {} - size: 53561 - timestamp: 1733302019362 -- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.11.3-pyhcf101f3_0.conda - sha256: 810511c90649ca59fa0174958a210fd5051c0a7848cfbd42c87054a6836726b5 - md5: 31474b00d0ca5accac14eda09ba11216 - depends: - - python >=3.10 - - python - license: MIT - license_family: MIT - purls: - - pkg:pypi/platformdirs?source=compressed-mapping - run_exports: {} - size: 26956 - timestamp: 1786708411066 -- conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - sha256: e14aafa63efa0528ca99ba568eaf506eb55a0371d12e6250aaaa61718d2eb62e - md5: d7585b6550ad04c8c5e21097ada2888e - depends: - - python >=3.9 - - python - license: MIT - license_family: MIT - purls: - - pkg:pypi/pluggy?source=hash-mapping - run_exports: {} - size: 25877 - timestamp: 1764896838868 -- conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.2-pyha770c72_0.conda - sha256: fc0a0620a8f829c46787a9a13ddbae8b6049f2e77da353a8a2adaa01af0da7e2 - md5: c36b88db560b4e74f294380613f1a239 - depends: - - cfgv >=2.0.0 - - identify >=1.0.0 - - nodeenv >=0.11.1 - - python >=3.10 - - pyyaml >=5.1 - - virtualenv >=20.10.0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pre-commit?source=compressed-mapping - run_exports: {} - size: 201879 - timestamp: 1786408353117 -- conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.53-pyha770c72_0.conda - sha256: efe8def2c93aa34cd8d3c9af1dc4c7d312791cf769d8b2b615e32733e6df6051 - md5: 39c92a39517316e5001d645ae63d9ab9 - depends: - - python >=3.10 - - wcwidth - constrains: - - prompt_toolkit 3.0.53 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/prompt-toolkit?source=hash-mapping - run_exports: {} - size: 276081 - timestamp: 1785160613307 -- conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda - sha256: a7713dfe30faf17508ec359e0bc7e0983f5d94682492469bd462cdaae9c64d83 - md5: 7d9daffbb8d8e0af0f769dbbcd173a54 - depends: - - python >=3.9 - license: ISC - purls: - - pkg:pypi/ptyprocess?source=hash-mapping - run_exports: {} - size: 19457 - timestamp: 1733302371990 -- conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - sha256: 71bd24600d14bb171a6321d523486f6a06f855e75e547fa0cb2a0953b02047f0 - md5: 3bfdfb8dbcdc4af1ae3f9a8eb3948f04 - depends: - - python >=3.9 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pure-eval?source=hash-mapping - run_exports: {} - size: 16668 - timestamp: 1733569518868 -- conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda - sha256: 6d8f03c13d085a569fde931892cded813474acbef2e03381a1a87f420c7da035 - md5: 46830ee16925d5ed250850503b5dc3a8 - depends: - - python >=3.9 - license: MIT - license_family: MIT - purls: - - pkg:pypi/py-cpuinfo?source=hash-mapping - run_exports: {} - size: 25766 - timestamp: 1733236452235 -- conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.1-pyh7a1b43c_0.conda - sha256: 2558727093f13d4c30e124724566d16badd7de532fd8ee7483628977117d02be - md5: 70ece62498c769280f791e836ac53fff - depends: - - python >=3.8 - - pybind11-global ==3.0.1 *_0 - - python - constrains: - - pybind11-abi ==11 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/pybind11?source=hash-mapping - run_exports: {} - size: 232875 - timestamp: 1755953378112 -- conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda - sha256: f213f735f0c2b9bfcc1358c8bdeb0dfcf3614bf2c47aad68227dabea99b0e0d7 - md5: 2e57132f130bffcb5a8b17092b2871bc - depends: - - python >=3.8 - - pybind11-global ==3.0.4 *_0 - - python - constrains: - - pybind11-abi ==11 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/pybind11?source=compressed-mapping - run_exports: {} - size: 251088 - timestamp: 1786199539429 -- conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - sha256: 9e7fe12f727acd2787fb5816b2049cef4604b7a00ad3e408c5e709c298ce8bf1 - md5: f0599959a2447c1e544e216bddf393fa - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - pybind11-abi ==11 - size: 14671 - timestamp: 1752769938071 -- conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.1-pyhc7ab6ef_0.conda - sha256: f11a5903879fe3a24e0d28329cb2b1945127e85a4cdb444b45545cf079f99e2d - md5: fe10b422ce8b5af5dab3740e4084c3f9 - depends: - - python >=3.8 - - __unix - - python - constrains: - - pybind11-abi ==11 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/pybind11-global?source=hash-mapping - run_exports: {} - size: 228871 - timestamp: 1755953338243 -- conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda - sha256: 25e887672e68188a5fa899efdc116acb01d689989493342aac05781ec1f09b81 - md5: e594cb485091100204e0b77cb5709896 - depends: - - python >=3.8 - - __unix - - python - constrains: - - pybind11-abi ==11 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/pybind11-global?source=compressed-mapping - run_exports: {} - size: 244363 - timestamp: 1786199539429 -- conda: https://conda.anaconda.org/conda-forge/noarch/pybtex-0.26.1-pyhcf101f3_0.conda - sha256: fd9b0a389b21dc2ccb11925db83a5e9e32652e87971f93c23358d51c3632d96d - md5: b0969b1326b5b9d6094dd1831eb48919 - depends: - - python >=3.10 - - pyyaml >=3.1 - - latexcodec >=1.0.4 - - importlib-metadata - - python - license: MIT - license_family: MIT - purls: - - pkg:pypi/pybtex?source=hash-mapping - run_exports: {} - size: 78091 - timestamp: 1775231969598 -- conda: https://conda.anaconda.org/conda-forge/noarch/pybtex-docutils-1.0.3-pyhcf101f3_4.conda - sha256: a0397b8fc65eabd773fe33affb726fe9d16c8f0a8ab7c3493d80c412ef2539a6 - md5: 75f19dd4b0b95ce928286e18c561cb13 - depends: - - python >=3.10 - - setuptools - - docutils >=0.14 - - pybtex >=0.16 - - python - license: MIT - license_family: MIT - purls: - - pkg:pypi/pybtex-docutils?source=hash-mapping - run_exports: {} - size: 14980 - timestamp: 1765317730499 -- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda - sha256: e27e0473fc6723311a0bd48b89b616fa1b996a2f7a2b555338cbbcfb9c640568 - md5: 9c5491066224083c41b6d5635ed7107b - depends: - - python >=3.10 - - python - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/pycparser?source=hash-mapping - run_exports: {} - size: 55886 - timestamp: 1779293633166 -- conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.20.0-pyhc364b38_0.conda - sha256: 40664599ee4b5667d31b38538a06a9daad97594d4d2af8084e80cfc35ac86d6d - md5: 4539a6224d84b50aea1bcdcc01ee9802 - depends: - - accessible-pygments - - babel - - beautifulsoup4 - - docutils !=0.17.0 - - jinja2 - - pygments >=2.7 - - python >=3.11 - - requests - - sphinx >=8.2 - - python - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/pydata-sphinx-theme?source=hash-mapping - run_exports: {} - size: 1312216 - timestamp: 1783604241703 -- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda - sha256: f5f015ff1bc3e1b7fc08eee096b1865234189ae0b82bebdb86a5369116e42fa0 - md5: 2882dee445dfa45b0c5afce3ffb7730a - depends: - - python >=3.10 - - python - license: BSD-2-Clause - license_family: BSD - purls: - - pkg:pypi/pygments?source=compressed-mapping - run_exports: {} - size: 959376 - timestamp: 1786995678795 -- conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda - sha256: 417fba4783e528ee732afa82999300859b065dc59927344b4859c64aae7182de - md5: 3687cc0b82a8b4c17e1f0eb7e47163d5 - depends: - - python >=3.10 - - python - license: MIT - license_family: MIT - purls: - - pkg:pypi/pyparsing?source=hash-mapping - run_exports: {} - size: 110893 - timestamp: 1769003998136 -- conda: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - sha256: 065ac44591da9abf1ff740feb25929554b920b00d09287a551fcced2c9791092 - md5: d4582021af437c931d7d77ec39007845 - depends: - - python >=3.9 - - tomli >=1.1.0 - license: MIT - license_family: MIT - run_exports: {} - size: 15528 - timestamp: 1733710122949 -- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 - md5: 461219d1a5bd61342293efa2c0c90eac - depends: - - __unix - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/pysocks?source=hash-mapping - run_exports: {} - size: 21085 - timestamp: 1733217331982 -- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda - sha256: 430051d80765207a7d782b2b188230ba1489d35c6e75fd9903f76cb9fda4af16 - md5: 64c98a12c4e23eb238bf66bbecafdf3c - depends: - - colorama - - pygments >=2.7.2 - - python >=3.10 - - iniconfig >=1.0.1 - - packaging >=22 - - pluggy >=1.5,<2 - - tomli >=1 - - exceptiongroup >=1 - - python - constrains: - - pytest-faulthandler >=2 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pytest?source=hash-mapping - run_exports: {} - size: 306724 - timestamp: 1782127176429 -- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.2.3-pyhd8ed1ab_0.conda - sha256: 2f2229415a6e5387c1faaedf442ea8c07471cb2bf5ad1007b9cfb83ea85ca29a - md5: 0e7294ed4af8b833fcd2c101d647c3da - depends: - - py-cpuinfo - - pytest >=8.1 - - python >=3.10 - license: BSD-2-Clause - license_family: BSD - purls: - - pkg:pypi/pytest-benchmark?source=hash-mapping - run_exports: {} - size: 43976 - timestamp: 1762716480208 -- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - sha256: 44e42919397bd00bfaa47358a6ca93d4c21493a8c18600176212ec21a8d25ca5 - md5: 67d1790eefa81ed305b89d8e314c7923 - depends: - - coverage >=7.10.6 - - pluggy >=1.2 - - pytest >=7 - - python >=3.10 - - python - license: MIT - license_family: MIT - purls: - - pkg:pypi/pytest-cov?source=hash-mapping - run_exports: {} - size: 29559 - timestamp: 1774139250481 -- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda - sha256: c292d7060f043577569b9c257cbef99446a356e1b1f90482e1058c111d5e374b - md5: b869f743e0e40024d14b22e3f6268fe4 - depends: - - pytest - - python >=3.10 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pytest-randomly?source=hash-mapping - run_exports: {} - size: 15440 - timestamp: 1785269179302 -- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda - sha256: 25afa7d9387f2aa151b45eb6adf05f9e9e3f58c8de2bc09be7e85c114118eeb9 - md5: 52a50ca8ea1b3496fbd3261bea8c5722 - depends: - - pytest >=7.0.0 - - python >=3.9 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pytest-timeout?source=hash-mapping - run_exports: {} - size: 20137 - timestamp: 1746533140824 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.5.0-pyhc364b38_0.conda - sha256: eb8d5e44fddee9033eb7cfdd5ea584b7594b50e31c7602bef553af0fd4ee9266 - md5: fa587158c0d768127faa1a3b4df01e5d - depends: - - python >=3.10 - - colorama - - importlib-metadata >=4.6 - - packaging >=24.0 - - pyproject_hooks - - tomli >=1.1.0 - - python - constrains: - - build <0 - license: MIT - license_family: MIT - run_exports: {} - size: 28946 - timestamp: 1778048948266 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664 - md5: 5b8d21249ff20967101ffa321cab24e8 - depends: - - python >=3.9 - - six >=1.5 - - python - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/python-dateutil?source=hash-mapping - run_exports: {} - size: 233310 - timestamp: 1751104122689 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.5.2-pyhcf101f3_0.conda - sha256: daa3b1eed88a9d41d83b5baa62767b7cedf874560c4c26ce88c24b62b4272606 - md5: 091d37a8a1c31e3ca540f828451d09e5 - depends: - - python >=3.10 - - filelock >=3.15.4 - - platformdirs <5,>=4.3.6 - - python - license: MIT - license_family: MIT - purls: - - pkg:pypi/python-discovery?source=compressed-mapping - run_exports: {} - size: 38785 - timestamp: 1786705670745 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.22.2-pyhcf101f3_0.conda - sha256: fc4a704822df22defce49d0fb811fdc036a1fd3b579aeaa601228e9cfd198b3d - md5: aa75b7f096d17621bc307b3025b29461 - depends: - - python >=3.10 - - python - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/fastjsonschema?source=compressed-mapping - run_exports: {} - size: 254446 - timestamp: 1786892280524 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.11.15-hd8ed1ab_2.conda - sha256: 12106edf10986f30c4c66e3acee30fb86121eeb472226a8530b007d13c544ac0 - md5: c2c62649cd6eae7937a5ed64766a43de - depends: - - cpython 3.11.15.* - - python_abi * *_cp311 - license: Python-2.0 - purls: [] - run_exports: {} - size: 48414 - timestamp: 1786443499770 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_1.conda - sha256: cf0972372c4469881e13e9342ab51aed8b25d0d5dff45fcd0fe847b3dd11f97c - md5: 87225cc6af32ec67528efa39c4945aaf - depends: - - cpython 3.12.13.* - - python_abi * *_cp312 - license: Python-2.0 - purls: [] - run_exports: {} - size: 45874 - timestamp: 1786443525835 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.15-h4df99d1_101.conda - sha256: bc9fcc5c7bf80a382fc2b38a22db3549b39dc5ae114537c32fe610be005d16ba - md5: c5e565a020c31fd7aba0a87dc2fc29d0 - depends: - - cpython 3.13.15.* - - python_abi * *_cp313 - license: Python-2.0 - purls: [] - run_exports: {} - size: 48362 - timestamp: 1786366765154 -- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda - build_number: 8 - sha256: fddf123692aa4b1fc48f0471e346400d9852d96eeed77dbfdd746fa50a8ff894 - md5: 8fcb6b0e2161850556231336dae58358 - constrains: - - python 3.11.* *_cpython - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: {} - size: 7003 - timestamp: 1752805919375 -- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - build_number: 8 - sha256: 80677180dd3c22deb7426ca89d6203f1c7f1f256f2d5a94dc210f6e758229809 - md5: c3efd25ac4d74b1584d2f7a57195ddf1 - constrains: - - python 3.12.* *_cpython - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: {} - size: 6958 - timestamp: 1752805918820 -- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-8_cp313.conda - build_number: 8 - sha256: 210bffe7b121e651419cb196a2a63687b087497595c9be9d20ebe97dd06060a7 - md5: 94305520c52a4aa3f6c2b1ff6008d9f8 - constrains: - - python 3.13.* *_cp313 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: {} - size: 7002 - timestamp: 1752805902938 -- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - sha256: 0577eedfb347ff94d0f2fa6c052c502989b028216996b45c7f21236f25864414 - md5: 870293df500ca7e18bedefa5838a22ab - depends: - - attrs >=22.2.0 - - python >=3.10 - - rpds-py >=0.7.0 - - typing_extensions >=4.4.0 - - python - license: MIT - license_family: MIT - purls: - - pkg:pypi/referencing?source=hash-mapping - run_exports: {} - size: 51788 - timestamp: 1760379115194 -- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda - sha256: 1715246b19c9f85ee022933b4845f2fc14ac9184981b7b7d9b728bec8e9588da - md5: 4a85203c1d80c1059086ae860836ffb9 - depends: - - python >=3.10 - - certifi >=2023.5.7 - - charset-normalizer >=2,<4 - - idna >=2.5,<4 - - urllib3 >=1.26,<3 - - python - constrains: - - chardet >=3.0.2,<8 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/requests?source=hash-mapping - run_exports: {} - size: 68709 - timestamp: 1778851103479 -- conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda - sha256: 3d6ba2c0fcdac3196ba2f0615b4104e532525ffa1335b50a2878be5ff488814a - md5: 0242025a3c804966bf71aa04eee82f66 - depends: - - markdown-it-py >=2.2.0 - - pygments >=2.13.0,<3.0.0 - - python >=3.10 - - typing_extensions >=4.0.0,<5.0.0 - - python - license: MIT - license_family: MIT - purls: - - pkg:pypi/rich?source=hash-mapping - run_exports: {} - size: 208577 - timestamp: 1775991661559 -- conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - sha256: 30f3c04fcfb64c44d821d392a4a0b8915650dbd900c8befc20ade8fde8ec6aa2 - md5: 0dc48b4b570931adc8641e55c6c17fe4 - depends: - - python >=3.10 - license: 0BSD OR CC0-1.0 - purls: - - pkg:pypi/roman-numerals?source=hash-mapping - run_exports: {} - size: 13814 - timestamp: 1766003022813 -- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda - sha256: 6ecf738d5590bf228f09c4ecd1ea91d811f8e0bd9acdef341bc4d6c36beb13a3 - md5: d629a398d7bf872f9ed7b27ab959de15 - depends: - - python >=3.10 - license: MIT - license_family: MIT - purls: - - pkg:pypi/setuptools?source=hash-mapping - run_exports: {} - size: 676888 - timestamp: 1770456470072 -- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d - md5: 3339e3b65d58accf4ca4fb8748ab16b3 - depends: - - python >=3.9 - - python - license: MIT - license_family: MIT - purls: - - pkg:pypi/six?source=hash-mapping - run_exports: {} - size: 18455 - timestamp: 1753199211006 -- conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - sha256: dce518f45e24cd03f401cb0616917773159a210c19d601c5f2d4e0e5879d30ad - md5: 03fe290994c5e4ec17293cfb6bdce520 - depends: - - python >=3.10 - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/sniffio?source=hash-mapping - run_exports: {} - size: 15698 - timestamp: 1762941572482 -- conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.1.1-pyhd8ed1ab_0.conda - sha256: ad89284ea94821c20ff87e64b948e4afc690cf5202d14c009355b0594cf23aea - md5: 46b6abe31482f6bca064b965696ae807 - depends: - - python >=3.10 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/snowballstemmer?source=hash-mapping - run_exports: {} - size: 74456 - timestamp: 1780468201547 -- conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.9.2-pyhd8ed1ab_0.conda - sha256: 056d7a2e91e303a9ee37e580f6dde0511fc3fb72476581cc337aacf2cc747613 - md5: ba33e6c8a46ee373fdf6dd8665212778 - depends: - - python >=3.10 - license: MIT - license_family: MIT - purls: - - pkg:pypi/soupsieve?source=compressed-mapping - run_exports: {} - size: 39439 - timestamp: 1786202135509 -- conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda - sha256: 035ca4b17afca3d53650380dd94c564555b7ec2b4f8818111f98c15c7a991b7b - md5: aabfbc2813712b71ba8beb217a978498 - depends: - - alabaster >=0.7.14 - - babel >=2.13 - - colorama >=0.4.6 - - docutils >=0.21,<0.23 - - imagesize >=1.3 - - jinja2 >=3.1 - - packaging >=23.0 - - pygments >=2.17 - - python >=3.12 - - requests >=2.30.0 - - roman-numerals >=1.0.0 - - snowballstemmer >=2.2 - - sphinxcontrib-applehelp >=1.0.7 - - sphinxcontrib-devhelp >=1.0.6 - - sphinxcontrib-htmlhelp >=2.0.6 - - sphinxcontrib-jsmath >=1.0.1 - - sphinxcontrib-qthelp >=1.0.6 - - sphinxcontrib-serializinghtml >=1.1.9 - license: BSD-2-Clause - license_family: BSD - purls: - - pkg:pypi/sphinx?source=hash-mapping - run_exports: {} - size: 1584836 - timestamp: 1767271941650 -- conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-book-theme-1.4.0-pyhc364b38_0.conda - sha256: a26e651497288a79d27562a43b89eddd276a49bb4d87f6b5687d4036726ba410 - md5: e307ff5cc407bb90cf4cbaed1f611fa6 - depends: - - pydata-sphinx-theme ==0.20.0 - - python >=3.11 - - sphinx >=8.2 - - python - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/sphinx-book-theme?source=hash-mapping - run_exports: {} - size: 258939 - timestamp: 1784555033283 -- conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.7.0-pyhd8ed1ab_0.conda - sha256: 7f8437a97e6311bebf230cfd2ae3c5bdb2230e681c41daebdb894280bf8b4ab6 - md5: 28eddfb8b9ecdd044a6f609f985398a7 - depends: - - python >=3.11 - - sphinx >=7,<10 - license: MIT - license_family: MIT - purls: - - pkg:pypi/sphinx-design?source=hash-mapping - run_exports: {} - size: 931118 - timestamp: 1769032711360 -- conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-fortran-1.1.1-pyhd8ed1ab_1.conda - sha256: cc06e110e831bd9646a4533b377e24cb8737577f841f036ca086132fb485d181 - md5: 400e6ccb8d3c434c28c766f0ee45f554 - depends: - - future - - numpy >=1.0 - - python >=3.9 - - six - - sphinx >=1.0 - license: CECILL-2.1 - purls: - - pkg:pypi/sphinx-fortran?source=hash-mapping - run_exports: {} - size: 37962 - timestamp: 1735719868930 -- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda - sha256: d7433a344a9ad32a680b881c81b0034bc61618d12c39dd6e3309abeffa9577ba - md5: 16e3f039c0aa6446513e94ab18a8784b - depends: - - python >=3.9 - - sphinx >=5 - license: BSD-2-Clause - license_family: BSD - purls: - - pkg:pypi/sphinxcontrib-applehelp?source=hash-mapping - run_exports: {} - size: 29752 - timestamp: 1733754216334 -- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-bibtex-2.7.0-pyhd8ed1ab_0.conda - sha256: 3b9c6273f95302df966a48a267b33ddf78ed6e662c7d578d3e129e259e049314 - md5: 7f562e153eedbdc92f1c3adb019a8792 - depends: - - docutils >=0.20 - - pybtex >=0.25 - - pybtex-docutils >=1.0.2 - - python >=3.10 - - sphinx >=7.4 - license: BSD-2-Clause - license_family: BSD - purls: - - pkg:pypi/sphinxcontrib-bibtex?source=hash-mapping - run_exports: {} - size: 33489 - timestamp: 1778364472446 -- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - sha256: 55d5076005d20b84b20bee7844e686b7e60eb9f683af04492e598a622b12d53d - md5: 910f28a05c178feba832f842155cbfff - depends: - - python >=3.9 - - sphinx >=5 - license: BSD-2-Clause - license_family: BSD - purls: - - pkg:pypi/sphinxcontrib-devhelp?source=hash-mapping - run_exports: {} - size: 24536 - timestamp: 1733754232002 -- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda - sha256: c1492c0262ccf16694bdcd3bb62aa4627878ea8782d5cd3876614ffeb62b3996 - md5: e9fb3fe8a5b758b4aff187d434f94f03 - depends: - - python >=3.9 - - sphinx >=5 - license: BSD-2-Clause - license_family: BSD - purls: - - pkg:pypi/sphinxcontrib-htmlhelp?source=hash-mapping - run_exports: {} - size: 32895 - timestamp: 1733754385092 -- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda - sha256: 578bef5ec630e5b2b8810d898bbbf79b9ae66d49b7938bcc3efc364e679f2a62 - md5: fa839b5ff59e192f411ccc7dae6588bb - depends: - - python >=3.9 - license: BSD-2-Clause - license_family: BSD - purls: - - pkg:pypi/sphinxcontrib-jsmath?source=hash-mapping - run_exports: {} - size: 10462 - timestamp: 1733753857224 -- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-moderncmakedomain-3.29.0-pyhd8ed1ab_0.conda - sha256: 3173b761c767852166153055b3a44a463d878a9646ab101a4b7eaba088bd92ce - md5: 345d2c008b7619237630651d74eeb879 - depends: - - python >=3.10 - - sphinx >=2 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/sphinxcontrib-moderncmakedomain?source=hash-mapping - run_exports: {} - size: 19256 - timestamp: 1772451038096 -- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda - sha256: c664fefae4acdb5fae973bdde25836faf451f41d04342b64a358f9a7753c92ca - md5: 00534ebcc0375929b45c3039b5ba7636 - depends: - - python >=3.9 - - sphinx >=5 - license: BSD-2-Clause - license_family: BSD - purls: - - pkg:pypi/sphinxcontrib-qthelp?source=hash-mapping - run_exports: {} - size: 26959 - timestamp: 1733753505008 -- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-2.0.0-pyhd8ed1ab_0.conda - sha256: 20b49741065fd7d3fabf98caf6d19b6436badb06b6d41f66b58f1fc2b52f37a1 - md5: f77df1fcf9af03b7287342638befca77 - depends: - - python >=3.10 - - sphinx >=5 - license: BSD-2-Clause - license_family: BSD - purls: - - pkg:pypi/sphinxcontrib-serializinghtml?source=hash-mapping - run_exports: {} - size: 30640 - timestamp: 1781260357443 -- conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda - sha256: 570da295d421661af487f1595045760526964f41471021056e993e73089e9c41 - md5: b1b505328da7a6b246787df4b5a49fbc - depends: - - asttokens - - executing - - pure_eval - - python >=3.9 - license: MIT - license_family: MIT - purls: - - pkg:pypi/stack-data?source=hash-mapping - run_exports: {} - size: 26988 - timestamp: 1733569565672 -- conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda - sha256: 1c8057e6875eba958aa8b3c1a072dc9a75d013f209c26fd8125a5ebd3abbec0c - md5: 32d866e43b25275f61566b9391ccb7b5 - depends: - - __unix - - cpython - - gmpy2 >=2.0.8 - - mpmath >=1.1.0,<1.5 - - python >=3.10 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/sympy?source=hash-mapping - run_exports: {} - size: 4661767 - timestamp: 1771952371059 -- conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - sha256: c47299fe37aebb0fcf674b3be588e67e4afb86225be4b0d452c7eb75c086b851 - md5: 13dc3adbc692664cd3beabd216434749 - depends: - - __glibc >=2.28 - - kernel-headers_linux-64 4.18.0 he073ed8_9 - - tzdata - license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later - license_family: GPL - purls: [] - run_exports: - strong: - - __glibc >=2.28,<3.0.a0 - size: 24008591 - timestamp: 1765578833462 -- conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.10.0-pyhcf101f3_0.conda - sha256: 3f661e98a09f976775a494488beb3d35ebb00f535b169c6bd891f2e280d55783 - md5: 3b887b7b3468b0f494b4fad40178b043 - depends: - - python >=3.10 - - python - license: MIT - license_family: MIT - purls: - - pkg:pypi/tabulate?source=hash-mapping - run_exports: {} - size: 43964 - timestamp: 1772732795746 -- conda: https://conda.anaconda.org/conda-forge/noarch/textual-8.2.8-pyhcf101f3_0.conda - sha256: 88997e493c8b74b05d8f9bc48133d297d4b5412809c2a2a041e5b40204fdff02 - md5: 89f2b015d7ee36ceaaf03fe687d1bd61 - depends: - - pygments >=2.19.2,<3.0.0 - - typing_extensions >=4.4.0,<5.0.0 - - platformdirs >=3.6.0,<5 - - python >=3.10,<4.0.0 - - markdown-it-py >=2.1.0 - - linkify-it-py >=1,<3 - - mdit-py-plugins - - rich >=14.2.0 - - python - constrains: - - tree_sitter >=0.25.0 - - tree_sitter_languages 1.10.2.* - license: MIT - license_family: MIT - purls: - - pkg:pypi/textual?source=hash-mapping - run_exports: {} - size: 538351 - timestamp: 1782808451993 -- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - sha256: 91cafdb64268e43e0e10d30bd1bef5af392e69f00edd34dfaf909f69ab2da6bd - md5: b5325cf06a000c5b14970462ff5e4d58 - depends: - - python >=3.10 - - python - license: MIT - license_family: MIT - purls: - - pkg:pypi/tomli?source=hash-mapping - run_exports: {} - size: 21561 - timestamp: 1774492402955 -- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda - sha256: a4d9e9da15b13f1ab047e7db412e2ed564bc615832e80213cf129b973c3abf4a - md5: 00953c3b729e03b0ae21f49fdf3441bb - depends: - - python >=3.10 - - __unix - - python - constrains: - - envwrap >=0.2 - - ipywidgets >=6.0 - license: MPL-2.0 and MIT - purls: - - pkg:pypi/tqdm?source=hash-mapping - run_exports: {} - size: 98184 - timestamp: 1785172528905 -- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.16.1-pyhcf101f3_0.conda - sha256: 03dba5917f944c6684ab44c81daacac1624cd148e4b2cae215dcec594a210c48 - md5: a79bf97561232a31447b6246c2153ab5 - depends: - - python >=3.10 - - python - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/traitlets?source=hash-mapping - run_exports: {} - size: 116935 - timestamp: 1785761789772 -- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda - sha256: b141933ece3518f6d7b75dfb59451e2f26b405a44c18e2518a83e9a02e09315c - md5: c680b5747e8c4c8f23dca0bb7042a8fc - depends: - - typing_extensions ==4.16.0 pyhcf101f3_0 - license: PSF-2.0 - license_family: PSF - purls: [] - run_exports: {} - size: 94080 - timestamp: 1783002732887 -- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda - sha256: 2d888f90af0686044882c74193ec80a90ec1943145d94a7b1b048958acda1848 - md5: c70ad746c22219b9700931707482992c - depends: - - python >=3.10 - - python - license: PSF-2.0 - license_family: PSF - purls: - - pkg:pypi/typing-extensions?source=hash-mapping - run_exports: {} - size: 52631 - timestamp: 1783002732887 -- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - sha256: b928c30ddcb0e3f544c6eade8352737e6e610e263276b90232db6a578ef899d8 - md5: fcb489df604d100968b737f2cb6076c6 - license: LicenseRef-Public-Domain - purls: [] - run_exports: {} - size: 118849 - timestamp: 1784250406640 -- conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda - sha256: 9e5a0e70e876fca50de075b1cc6641cdc009a16c18f4d52ab03edb777729a1bc - md5: 4fdd327852ffefc83173a7c029690d0c - depends: - - python >=3.10 - license: MIT - license_family: MIT - purls: - - pkg:pypi/uc-micro-py?source=hash-mapping - run_exports: {} - size: 13378 - timestamp: 1772479008776 -- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda - sha256: feff959a816f7988a0893201aa9727bbb7ee1e9cec2c4f0428269b489eb93fb4 - md5: cbb88288f74dbe6ada1c6c7d0a97223e - depends: - - backports.zstd >=1.0.0 - - brotli-python >=1.2.0 - - h2 >=4,<5 - - pysocks >=1.5.6,<2.0,!=1.5.7 - - python >=3.10 - license: MIT - license_family: MIT - purls: - - pkg:pypi/urllib3?source=hash-mapping - run_exports: {} - size: 103560 - timestamp: 1778188657149 -- conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.7.4-pyhcf101f3_0.conda - sha256: 27c96f147dd74c713b3d4696a53c0c5adf890f2fb3fa512419728cb0026461e7 - md5: 90a05eca97a7d9a34a055b3d12be08ad - depends: - - python >=3.10 - - distlib >=0.3.7,<1 - - filelock <4,>=3.24.2 - - importlib-metadata >=6.6 - - platformdirs >=3.9.1,<5 - - python-discovery >=1.4.2 - - typing_extensions >=4.13.2 - - python - license: MIT - license_family: MIT - purls: - - pkg:pypi/virtualenv?source=compressed-mapping - run_exports: {} - size: 3894937 - timestamp: 1786427893830 -- conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.8.2-pyhd8ed1ab_0.conda - sha256: 4acf845da404e84cef1acccc66cc0156af1b83a5b5d7077b2ca19b705c561e57 - md5: 99f7755ec8648a042b0dbe906234f888 - depends: - - python >=3.10 - license: MIT - license_family: MIT - purls: - - pkg:pypi/wcwidth?source=hash-mapping - run_exports: {} - size: 132415 - timestamp: 1782771807703 -- conda: https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.16-pyhd8ed1ab_0.conda - sha256: bd909d9845ff269f5487a83654d6b8fe220c73148c47d602f4ee9e1283829212 - md5: 4e3aff9f40afb392477584e6a1a45b6f - depends: - - python >=3.10 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/widgetsnbextension?source=compressed-mapping - run_exports: {} - size: 901988 - timestamp: 1787044664327 -- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda - sha256: 210bd31c22bb88f5e2a167df24c95bb5f152b2ada7502f9b8c49d1f5366db423 - md5: ba3dcdc8584155c97c648ae9c044b7a3 - depends: - - python >=3.10 - - python - license: MIT - license_family: MIT - purls: - - pkg:pypi/zipp?source=hash-mapping - run_exports: {} - size: 24190 - timestamp: 1779159948016 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda - build_number: 7 - sha256: 7acaa2e0782cad032bdaf756b536874346ac1375745fb250e9bdd6a48a7ab3cd - md5: a44032f282e7d2acdeb1c240308052dd - depends: - - llvm-openmp >=9.0.1 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - _openmp_mutex >=4.5 - size: 8325 - timestamp: 1764092507920 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ast-serialize-0.8.0-py310h3b8a9b8_0.conda - noarch: python - sha256: 51c8a631b36bf2eb2f27d49c0a0df9e269a76b91a447da7e75f9d0854cabb4a7 - md5: 5ce8b03801df5eff0088bdc85a19d09a - depends: - - python >=3.10 - - __osx >=11.0 - - _python_abi3_support 1.* - - cpython >=3.10 - constrains: - - __osx >=11.0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/ast-serialize?source=compressed-mapping - run_exports: {} - size: 1085485 - timestamp: 1786328966627 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.4-h0f08c97_1.conda - sha256: 8e503ab875683720c4ddcce216ad2aa96c32b90bc59e9a692c694e07ba4e5d8d - md5: c5d9f5796fb392f0984def10b26f1175 - depends: - - __osx >=11.0 - - aws-c-http >=0.11.0,<0.11.1.0a0 - - aws-c-common >=0.14.2,<0.14.3.0a0 - - aws-c-cal >=0.9.14,<0.9.15.0a0 - - aws-c-io >=0.27.3,<0.27.4.0a0 - - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-c-auth >=0.10.4,<0.10.5.0a0 - size: 117350 - timestamp: 1784086893887 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.14-hb9ed60c_4.conda - sha256: 9760cd6c5cc16ecd989866e86fea1fbe23bff3279831ce6f13b83afb6f6f2075 - md5: 5f5ba0cd72e15095ede1ad38e8907f5f - depends: - - __osx >=11.0 - - aws-c-common >=0.14.2,<0.14.3.0a0 - license: Apache-2.0 - license_family: Apache - purls: [] - run_exports: - weak: - - aws-c-cal >=0.9.14,<0.9.15.0a0 - size: 45835 - timestamp: 1784043800544 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.14.2-h84a0fba_0.conda - sha256: 0cc9a2a36387975a643cc33d7b60db894650efa707ff73a85e93f80f03904c97 - md5: 35d52f06a5eaaa66c62dd37a4d82d780 - depends: - - __osx >=11.0 - license: Apache-2.0 - license_family: Apache - purls: [] - run_exports: - weak: - - aws-c-common >=0.14.2,<0.14.3.0a0 - size: 228084 - timestamp: 1783637822478 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-hf0b4b85_4.conda - sha256: 8363308db46a84c5d7e9a309aaca8a18541f46f3b6e7b7027479a95ab910e19a - md5: 6e0883cca4143f456e019f751d0b9f3b - depends: - - __osx >=11.0 - - aws-c-common >=0.14.2,<0.14.3.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-c-compression >=0.3.2,<0.3.3.0a0 - size: 21774 - timestamp: 1784042939907 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.7.1-ha581b6a_4.conda - sha256: d1742afa3329b3ea892b5f0a75b36b4217a7c3eb43250e827c56f122343e9317 - md5: 4ce3e032bfa6d72114e481c2dc99e2e2 - depends: - - libcxx >=19 - - __osx >=11.0 - - aws-checksums >=0.2.10,<0.2.11.0a0 - - aws-c-common >=0.14.2,<0.14.3.0a0 - - aws-c-io >=0.27.3,<0.27.4.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-c-event-stream >=0.7.1,<0.7.2.0a0 - size: 54275 - timestamp: 1784075773654 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.11.0-h27f0cb5_4.conda - sha256: 851a01b9e6f0078107549ec1d1545cd27a50a073e4e9599d6f8f4ba69a8cba30 - md5: 9e435c44eafb6aba85f0133f4c579d1c - depends: - - __osx >=11.0 - - aws-c-io >=0.27.3,<0.27.4.0a0 - - aws-c-common >=0.14.2,<0.14.3.0a0 - - aws-c-compression >=0.3.2,<0.3.3.0a0 - - aws-c-cal >=0.9.14,<0.9.15.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-c-http >=0.11.0,<0.11.1.0a0 - size: 177761 - timestamp: 1784075780838 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.27.3-ha24efe8_1.conda - sha256: 2b127f1ccd9f022c945363e1e8eb6fd4a5fbc89677ac678abde6dc022ba26765 - md5: c4d73dc09e972a895d5a3dc7ce158be9 - depends: - - __osx >=11.0 - - s2n >=1.7.5,<1.7.6.0a0 - - aws-c-cal >=0.9.14,<0.9.15.0a0 - - aws-c-common >=0.14.2,<0.14.3.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-c-io >=0.27.3,<0.27.4.0a0 - size: 189938 - timestamp: 1784054954272 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.16.0-hf1a914d_2.conda - sha256: b352abb6f7cd42bdbbdef647409cf0d94f6edc841151dc3405bf3023b761e65b - md5: 742911742b564828dbaaffaa0f1a21eb - depends: - - __osx >=11.0 - - aws-c-common >=0.14.2,<0.14.3.0a0 - - aws-c-io >=0.27.3,<0.27.4.0a0 - - aws-c-http >=0.11.0,<0.11.1.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-c-mqtt >=0.16.0,<0.16.1.0a0 - size: 158513 - timestamp: 1784087664452 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.12.8-hdc61527_1.conda - sha256: f56014c02923a32cb3387eab782420ff40c9aae68c95cf08bfd2143a5c3c2cdd - md5: ea0e1e78de6375004530dd9f49d7ae46 - depends: - - __osx >=11.0 - - aws-c-http >=0.11.0,<0.11.1.0a0 - - aws-c-common >=0.14.2,<0.14.3.0a0 - - aws-c-io >=0.27.3,<0.27.4.0a0 - - aws-c-auth >=0.10.4,<0.10.5.0a0 - - aws-c-cal >=0.9.14,<0.9.15.0a0 - - aws-checksums >=0.2.10,<0.2.11.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-c-s3 >=0.12.8,<0.12.9.0a0 - size: 133754 - timestamp: 1784101134287 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.7-hf0b4b85_2.conda - sha256: 3ee2dcefcd45283508a3049bd4f5b508a46c16af906a0c3d351d0f9d81738464 - md5: de81e53b45b103470d3be61984dcc292 - depends: - - __osx >=11.0 - - aws-c-common >=0.14.2,<0.14.3.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 - size: 60771 - timestamp: 1784044312402 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-hf0b4b85_4.conda - sha256: 13313afb01bf4f1c328695724d5b16263810f84d7572f6cb0b4d12f877d7f1d6 - md5: 99cd08b2a8261083e4ad9414cbe737df - depends: - - __osx >=11.0 - - aws-c-common >=0.14.2,<0.14.3.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-checksums >=0.2.10,<0.2.11.0a0 - size: 92225 - timestamp: 1784044297006 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.40.1-h5b5d287_3.conda - sha256: aa4d21bdc3c891d2dca32121ef543aa7f2d8d83868b347207f04ebf65dd5d65d - md5: e850d4d6e349471c50fbed1f55fd3069 - depends: - - libcxx >=19 - - __osx >=11.0 - - aws-c-s3 >=0.12.8,<0.12.9.0a0 - - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 - - aws-c-io >=0.27.3,<0.27.4.0a0 - - aws-c-common >=0.14.2,<0.14.3.0a0 - - aws-c-event-stream >=0.7.1,<0.7.2.0a0 - - aws-c-auth >=0.10.4,<0.10.5.0a0 - - aws-c-http >=0.11.0,<0.11.1.0a0 - - aws-c-mqtt >=0.16.0,<0.16.1.0a0 - - aws-c-cal >=0.9.14,<0.9.15.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-crt-cpp >=0.40.1,<0.40.2.0a0 - size: 275833 - timestamp: 1784113326407 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.833-haa98fb3_9.conda - sha256: 215efb2e64b92094c3229c7d43177873068d0a088d7e94ff2c1447360f17a6c8 - md5: 1748ae5f4015e2fec7009ff36cbfafa0 - depends: - - libcxx >=19 - - __osx >=11.0 - - libcurl >=8.21.0,<9.0a0 - - aws-crt-cpp >=0.40.1,<0.40.2.0a0 - - libzlib >=1.3.2,<2.0a0 - - aws-c-event-stream >=0.7.1,<0.7.2.0a0 - - aws-c-common >=0.14.2,<0.14.3.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - aws-sdk-cpp >=1.11.833,<1.11.834.0a0 - size: 2834544 - timestamp: 1784137336612 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.3-he5ae378_0.conda - sha256: 9645073c4682ad3a334a2b06c5fc0ddc57fc9f0f537cc3123053634c92c28625 - md5: 4f42d997f42a8d34ff74cb677cf0c828 - depends: - - __osx >=11.0 - - libcurl >=8.19.0,<9.0a0 - - libcxx >=19 - - openssl >=3.5.5,<4.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - azure-core-cpp >=1.16.3,<1.16.4.0a0 - size: 290309 - timestamp: 1775239330289 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.3-h05177fb_2.conda - sha256: d950fb513311a15cd4ae663cdacb2c035122f609a9c790973661b38e0882e40e - md5: e1701f6b2ce6f47aeb6cbfab132403d8 - depends: - - __osx >=11.0 - - azure-core-cpp >=1.16.3,<1.16.4.0a0 - - libcxx >=19 - - openssl >=3.5.7,<4.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - azure-identity-cpp >=1.13.3,<1.13.4.0a0 - size: 168032 - timestamp: 1781268747743 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.18.0-h409340b_1.conda - sha256: 3f096d7cd6fd7788d57887c3d3e48be1ebc5c3a971666ddc0dd8a3493a5b7cb5 - md5: 0948246cb8e514e4ae1cfe7dbb4046c7 - depends: - - __osx >=11.0 - - azure-core-cpp >=1.16.3,<1.16.4.0a0 - - azure-storage-common-cpp >=12.14.0,<12.14.1.0a0 - - libcxx >=19 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - azure-storage-blobs-cpp >=12.18.0,<12.18.1.0a0 - size: 436462 - timestamp: 1781284116423 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.14.0-h7cba3ab_1.conda - sha256: 9a1b6e5284f1f242330dfa1e21408ffd823a76df424108d8c319c2a46df61dba - md5: 2af5d1b5365c4a3de8ed8ec8438fe6ec - depends: - - __osx >=11.0 - - azure-core-cpp >=1.16.3,<1.16.4.0a0 - - libcxx >=19 - - libxml2 - - libxml2-16 >=2.14.6 - - openssl >=3.5.7,<4.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - azure-storage-common-cpp >=12.14.0,<12.14.1.0a0 - size: 128710 - timestamp: 1781268693348 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.16.0-h16bb3af_1.conda - sha256: fb210d8d068df72a68c5fa655cf1f816792e278da3041c485478e7924d6e80eb - md5: 06ba52b8a66fd041f4910b547e3f3da1 - depends: - - __osx >=11.0 - - azure-core-cpp >=1.16.3,<1.16.4.0a0 - - azure-storage-blobs-cpp >=12.18.0,<12.18.1.0a0 - - azure-storage-common-cpp >=12.14.0,<12.14.1.0a0 - - libcxx >=19 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - azure-storage-files-datalake-cpp >=12.16.0,<12.16.1.0a0 - size: 206698 - timestamp: 1781541197750 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.2.0-hf00d406_3.conda - sha256: 7050e1b11876219bd0df375ef3d83fd00f94fb4e13c1ffb21dede0c506893079 - md5: aa7df8174ee3b34a5ad8a3160429db68 - depends: - - __osx >=11.0 - - brotli-bin 1.2.0 he4a93e4_3 - - libbrotlidec 1.2.0 h5295a6a_3 - - libbrotlienc 1.2.0 h2ddc9cb_3 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libbrotlicommon >=1.2.0,<1.3.0a0 - - libbrotlienc >=1.2.0,<1.3.0a0 - - libbrotlidec >=1.2.0,<1.3.0a0 - size: 20767 - timestamp: 1786622887445 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.2.0-he4a93e4_3.conda - sha256: 1e92cea587c2eaab169e45dae01c149b9889a8249eda296b8b6db39aee708531 - md5: d9de6c0ad7e008afdf62fb2ffd450b4a - depends: - - __osx >=11.0 - - libbrotlidec 1.2.0 h5295a6a_3 - - libbrotlienc 1.2.0 h2ddc9cb_3 - license: MIT - license_family: MIT - purls: [] - run_exports: {} - size: 18962 - timestamp: 1786622878369 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h4e30115_10.conda - sha256: 8ec22f0ba25cbfc2e64d70cf29459eccd7ffdf6436f6a6ff15bbfef799f7d4f6 - md5: b50612e7d190b8061ab4e7dc119cf4d5 - depends: - - __osx >=11.0 - license: bzip2-1.0.6 - license_family: BSD - purls: [] - run_exports: - weak: - - bzip2 >=1.0.8,<2.0a0 - size: 124965 - timestamp: 1785906749812 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.8-h74c22ad_2.conda - sha256: 82bdd5a3fcada6afef6255a9bf41172f07b362f36e04a354dc2abc0a29bfb756 - md5: 4cc01a374215de38387d45e19c8c5c9c - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - c-ares >=1.34.8,<2.0a0 - size: 197819 - timestamp: 1787169996553 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.4-he0f2337_1.conda - sha256: cde9b79ee206fe3ba6ca2dc5906593fb7a1350515f85b2a1135a4ce8ec1539e3 - md5: 36200ecfbbfbcb82063c87725434161f - depends: - - __osx >=11.0 - - fontconfig >=2.15.0,<3.0a0 - - fonts-conda-ecosystem - - icu >=78.1,<79.0a0 - - libcxx >=19 - - libexpat >=2.7.3,<3.0a0 - - libfreetype >=2.14.1 - - libfreetype6 >=2.14.1 - - libglib >=2.86.3,<3.0a0 - - libpng >=1.6.53,<1.7.0a0 - - libzlib >=1.3.1,<2.0a0 - - pixman >=0.46.4,<1.0a0 - license: LGPL-2.1-only or MPL-1.1 - purls: [] - run_exports: - weak: - - cairo >=1.18.4,<2.0a0 - size: 900035 - timestamp: 1766416416791 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.1.1-py312hc892d8b_2.conda - sha256: e2f5e72590b5cea4fce92278194d48493c1d9e14234fc7ca6dc840a53a37c32c - md5: c303ee33bf6d58dd5b0832c0d6ebad40 - depends: - - __osx >=11.0 - - libffi >=3.7.0,<3.8.0a0 - - pycparser - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: MIT - license_family: MIT - purls: - - pkg:pypi/cffi?source=hash-mapping - run_exports: {} - size: 288187 - timestamp: 1786775145970 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py312h3093aea_4.conda - sha256: fa1b3967c644c1ffaf8beba3d7aee2301a8db32c0e9a56649a0e496cf3abd27c - md5: f9cce0bc86b46533489a994a47d3c7d2 - depends: - - numpy >=1.25 - - python - - python 3.12.* *_cpython - - __osx >=11.0 - - libcxx >=19 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/contourpy?source=hash-mapping - run_exports: {} - size: 286084 - timestamp: 1769156157865 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.15.4-py312hada1361_1.conda - sha256: cfd35d503a8ecd3bae48de15e159d3de0388ee9e49be4737861f6ff5f5955f5b - md5: cb5551916b37a1303beef72626752db0 - depends: - - python - - tomli - - __osx >=11.0 - - python_abi 3.12.* *_cp312 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/coverage?source=compressed-mapping - run_exports: {} - size: 414190 - timestamp: 1786292802679 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/dftd3-python-1.5.0-py312h2bbb03f_0.conda - sha256: aa3061f264d2028806047e85eea31cb8ddd5ba2d934bad86dbddf99399e27f66 - md5: fcc98382e0757c6bafff88f21ddfdd3a - depends: - - __osx >=11.0 - - cffi - - numpy - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - simple-dftd3 >=1.5.0,<1.6.0a0 - license: LGPL-3.0-or-later - license_family: LGPL - purls: - - pkg:pypi/dftd3?source=project-defined-mapping - run_exports: {} - size: 109786 - timestamp: 1786428336899 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/fmt-12.1.0-h99e4e11_1.conda - sha256: ca42427b99ff92228e907bed5f10a1df868180997571d29c230faad2c38e35fd - md5: 891b1202d7b835f215e26a4db685ec7c - depends: - - __osx >=11.0 - - libcxx >=19 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - fmt >=12.1.0,<12.2.0a0 - size: 181008 - timestamp: 1785915450316 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.18.3-h81aa574_1.conda - sha256: 004570d35fb0eff73ce3ae49b209a47622d0c2e580dd0dc4c61d59626b386a09 - md5: 8ac8cc3fe744b484de4387703134d8b2 - depends: - - __osx >=11.0 - - libexpat >=2.8.1,<3.0a0 - - libfreetype >=2.14.3 - - libfreetype6 >=2.14.3 - - libintl >=0.25.1,<1.0a0 - - libzlib >=1.3.2,<2.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - fontconfig >=2.18.3,<3.0a0 - - fonts-conda-ecosystem - size: 265659 - timestamp: 1786667932256 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.63.0-py312h04c11ed_0.conda - sha256: b78cc8df0d93ac0f0d59cb91cf54cc91effa6c124a78c8d2e8afc8011d9fb320 - md5: 77e64a600d8426c3863942f67491f5fb - depends: - - __osx >=11.0 - - brotli - - munkres - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - unicodedata2 >=15.1.0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/fonttools?source=hash-mapping - run_exports: {} - size: 2904377 - timestamp: 1778771054844 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.3-hce30654_2.conda - sha256: 90681f1d0658cb2fd49a074f644eb4774272499290487a4bebb1c4df01d6997b - md5: 2f4cc7dc2e6622591735c49dda1b92aa - depends: - - libfreetype 2.14.3 hce30654_2 - - libfreetype6 2.14.3 h2ed5691_2 - license: GPL-2.0-only OR FTL - purls: [] - run_exports: - weak: - - libfreetype >=2.14.3 - - libfreetype6 >=2.14.3 - size: 175388 - timestamp: 1786641016583 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-h84a0fba_1.conda - sha256: 6dd18694340b84290bb1906cc1359502b974aada6a8476cfe6dec3ce0e860af8 - md5: 2bb7d7dd91116b8c85e805b0e08cc67b - depends: - - __osx >=11.0 - license: LGPL-2.1-or-later - purls: [] - run_exports: - weak: - - fribidi >=1.0.16,<2.0a0 - size: 60230 - timestamp: 1785912572097 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.3.1-h784d473_0.conda - sha256: 3028f8f857d438444d3fb56c9c74d46699cb04e676c6575747cf3ad8d9a308b1 - md5: 96aea99abfaf8d1e7731c03e3f70fb02 - depends: - - libcxx >=19 - - __osx >=11.0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - gflags >=2.3.1,<2.4.0a0 - size: 93701 - timestamp: 1785044718935 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-h6f9ecc1_1.conda - sha256: 1ac5991fd354de81baf3892fee0ad09438623698fcad73758521dfe90711ed44 - md5: 68937f90f7930d49e106b94e95d4536c - depends: - - __osx >=11.0 - - gflags >=2.3.0,<2.4.0a0 - - libcxx >=19 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - glog >=0.7.1,<0.8.0a0 - size: 112670 - timestamp: 1784094909098 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-hf5e55b1_3.conda - sha256: 980cb1bbc3656d6f923d44297a2c4ab75f20482b8930c70537fd7f1ef2378894 - md5: bbfa5bd261b68536ddcda39e03d3407f - depends: - - libcxx >=19 - - __osx >=11.0 - license: GPL-2.0-or-later OR LGPL-3.0-or-later - purls: [] - run_exports: - weak: - - gmp >=6.3.0,<7.0a0 - size: 399307 - timestamp: 1786629210135 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.3.1-py312h1af6244_0.conda - sha256: c243b2223294d3527b2ac5104097c0a7c0497c4f50bcfb9845ff7c678c93e615 - md5: 3956cc08242f88c9275ff6962143b2fd - depends: - - python - - __osx >=11.0 - - gmp >=6.3.0,<7.0a0 - - mpfr >=4.2.2,<5.0a0 - - python_abi 3.12.* *_cp312 - - mpc >=1.4.0,<2.0a0 - license: LGPL-3.0-or-later - license_family: LGPL - purls: - - pkg:pypi/gmpy2?source=hash-mapping - run_exports: {} - size: 253256 - timestamp: 1787066495677 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.15-h784d473_1.conda - sha256: 471f34a187fdb4f2df33e26f2e471b16c239a5b277903f643d9c3a8c9a9f44ec - md5: 0c7b78d9ffff4f5a6ca28d346f734d8f - depends: - - libcxx >=19 - - __osx >=11.0 - license: LGPL-2.0-or-later - license_family: LGPL - purls: [] - run_exports: - weak: - - graphite2 >=1.3.15,<2.0a0 - size: 86493 - timestamp: 1786118637573 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.16.0-nompi_py312h3cfd1a2_104.conda - sha256: 3b54ad1fa52e4b2f0e6108e902f21ae3250b9fecf773013f276bc7ffee3b5a71 - md5: 10a45e9c6959baeda6ee1b08620db390 - depends: - - __osx >=11.0 - - cached-property - - hdf5 >=1.14.6,<1.14.7.0a0 - - numpy >=1.25,<3 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/h5py?source=compressed-mapping - run_exports: {} - size: 1140532 - timestamp: 1787108753682 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.6-nompi_had3affe_110.conda - sha256: 6964fee3d3a4a59c85d2589eb5e8c8bff7dde9721854f493cc7b9aca5cd7d4be - md5: 65797138355b90a8e219afcf7e77b273 - depends: - - __osx >=11.0 - - libaec >=1.1.5,<2.0a0 - - libcurl >=8.20.0,<9.0a0 - - libcxx >=19 - - libgfortran - - libgfortran5 >=14.3.0 - - libzlib >=1.3.2,<2.0a0 - - openssl >=3.5.6,<4.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - hdf5 >=1.14.6,<1.14.7.0a0 - size: 3290207 - timestamp: 1780581564967 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/hf-xet-1.5.2-py310he76dbf2_2.conda - noarch: python - sha256: 1c91ef5a784a75a274bd55716d6f999d847f18aa976212c10759249f2b92a2c8 - md5: 78730d3fd4b577ac4740add532b5aaec - depends: - - python - - __osx >=11.0 - - _python_abi3_support 1.* - - cpython >=3.10 - - openssl >=3.5.7,<4.0a0 - constrains: - - __osx >=11.0 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/hf-xet?source=hash-mapping - run_exports: {} - size: 3346802 - timestamp: 1784665280334 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-py310h579977c_2.conda - sha256: 6cdb5dee54c72e56ab189fb3ad33cb28533553d42590e7e831160248f4416a43 - md5: a5efc0b42bb8b42e97d0a29ae3e3c187 - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - icu >=78.3,<79.0a0 - size: 14070242 - timestamp: 1786545847761 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/jonquil-0.3.2-gfortran_h04795c8_0.conda - sha256: 0a7da05cf55fcfbec807f555a09f1c85d3bbf4a6f8bfc7b822734f853d7af846 - md5: 003ddfb69a316636d6694a76cf624b4a - depends: - - __osx >=11.0 - - libgfortran - - libgfortran5 >=14.3.0 - - toml-f >=0.5.1,<0.6.0a0 gfortran_* - license: Apache-2.0 OR MIT - purls: [] - run_exports: - weak: - - jonquil >=0.3.2,<0.4.0a0 - size: 114901 - timestamp: 1782316564315 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.5.0-py312h3093aea_0.conda - sha256: 8de440f0e33ab6895e81f2c47c51e59d177349a832087a0367e8e259c97f4833 - md5: 58261af35f0d33fd28e2257b208a1be0 - depends: - - python - - __osx >=11.0 - - libcxx >=19 - - python 3.12.* *_cpython - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/kiwisolver?source=hash-mapping - run_exports: {} - size: 68490 - timestamp: 1773067215781 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h34f8a20_2.conda - sha256: aaea1d42b07769920db2af7471ece9399d2613448863da64ad8272998db5db34 - md5: 15235dd10450d67bc25ccafd5b46d2bc - depends: - - __osx >=11.0 - - libcxx >=21 - - libedit >=3.1.20250104,<3.2.0a0 - - libedit >=3.1.20250104,<4.0a0 - - openssl >=3.5.7,<4.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - krb5 >=1.22.2,<1.23.0a0 - size: 1165740 - timestamp: 1786762145768 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.19.1-hdfa7624_1.conda - sha256: ccb5598fad3694e79bf54f0eb812e3b3c3dd63d1497e631f5978800eadb9bcc4 - md5: d2f2c7c10e2957647d45589b7701a453 - depends: - - __osx >=11.0 - - libjpeg-turbo >=3.1.4.1,<4.0a0 - - libtiff >=4.7.1,<4.8.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - lcms2 >=2.19.1,<3.0a0 - size: 213747 - timestamp: 1780212240694 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.2.0-h1eee2c3_0.conda - sha256: c97aa17d16d2ac332ba9f184e82ce8f72dcb10e9a10c5f299030be2d44e191b9 - md5: e429aec4037d5cb8fd34ded9f5dadd39 - depends: - - __osx >=11.0 - - libcxx >=19 - license: Apache-2.0 - license_family: Apache - purls: [] - run_exports: - weak: - - lerc >=4.2.0,<5.0a0 - size: 166477 - timestamp: 1785036480092 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260526.0-cxx17_h4c27e2a_2.conda - sha256: d9c62dae9d8f5bebadf72fcf369c00cc353183cb2521f9fffbf4c2f70b58bef9 - md5: 2aa5e7dc7b5d218908effd2a8c70a8a8 - depends: - - __osx >=11.0 - - libcxx >=19 - constrains: - - abseil-cpp =20260526.0 - - libabseil-static =20260526.0=cxx17* - license: Apache-2.0 - license_family: Apache - purls: [] - run_exports: - weak: - - libabseil >=20260526.0,<20260527.0a0 - - libabseil =*=cxx17* - size: 1277537 - timestamp: 1787217005681 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.5-h8664d51_0.conda - sha256: af9cd8db11eb719e38a3340c88bb4882cf19b5b4237d93845224489fc2a13b46 - md5: 13e6d9ae0efbc9d2e9a01a91f4372b41 - depends: - - __osx >=11.0 - - libcxx >=19 - license: BSD-2-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libaec >=1.1.5,<2.0a0 - size: 30390 - timestamp: 1769222133373 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-25.0.0-haaed7fe_4_cpu.conda - build_number: 4 - sha256: 3c289bab2a8c4be0ef86363c97c5532dbcc289708b8523d6a3cfef35a2dd0b9b - md5: 6c06263450ab8f5f4580effead8b2ca4 - depends: - - __osx >=12.0 - - aws-crt-cpp >=0.40.1,<0.40.2.0a0 - - aws-sdk-cpp >=1.11.833,<1.11.834.0a0 - - azure-core-cpp >=1.16.3,<1.16.4.0a0 - - azure-identity-cpp >=1.13.3,<1.13.4.0a0 - - azure-storage-blobs-cpp >=12.18.0,<12.18.1.0a0 - - azure-storage-files-datalake-cpp >=12.16.0,<12.16.1.0a0 - - bzip2 >=1.0.8,<2.0a0 - - glog >=0.7.1,<0.8.0a0 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libbrotlidec >=1.2.0,<1.3.0a0 - - libbrotlienc >=1.2.0,<1.3.0a0 - - libcxx >=21 - - libgoogle-cloud >=3.8.0,<3.9.0a0 - - libgoogle-cloud-storage >=3.8.0,<3.9.0a0 - - libopentelemetry-cpp >=1.27.0,<1.28.0a0 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libzlib >=1.3.2,<2.0a0 - - lz4-c >=1.10.0,<1.11.0a0 - - orc >=2.3.1,<2.3.2.0a0 - - snappy >=1.2.2,<1.3.0a0 - - zstd >=1.5.7,<1.6.0a0 - constrains: - - apache-arrow-proc =*=cpu - - arrow-cpp <0.0a0 - - parquet-cpp <0.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - libarrow >=25.0.0,<25.1.0a0 - size: 4294348 - timestamp: 1786315141730 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-25.0.0-heaff1e6_4_cpu.conda - build_number: 4 - sha256: 154feae16991d0e50d4b4d45291904cfbf1c8c97955237f71a84975b363cdd04 - md5: 5810871245167355126d623aa5ae1096 - depends: - - __osx >=12.0 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libarrow 25.0.0 haaed7fe_4_cpu - - libarrow-compute 25.0.0 h93a2d87_4_cpu - - libcxx >=21 - - libopentelemetry-cpp >=1.27.0,<1.28.0a0 - - libprotobuf >=7.35.1,<7.35.2.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - libarrow-acero >=25.0.0,<25.1.0a0 - size: 519885 - timestamp: 1786315467845 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-25.0.0-h93a2d87_4_cpu.conda - build_number: 4 - sha256: 5b725a3048bd53e9e2cee2577a26724467b35a956cc1207f5bde0321d128dbaf - md5: 1f47858e8a29295f723b63cd318a31c4 - depends: - - __osx >=12.0 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libarrow 25.0.0 haaed7fe_4_cpu - - libcxx >=21 - - libopentelemetry-cpp >=1.27.0,<1.28.0a0 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libre2-11 >=2025.11.5 - - libutf8proc >=2.11.3,<2.12.0a0 - - re2 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - libarrow-compute >=25.0.0,<25.1.0a0 - size: 2228808 - timestamp: 1786315247988 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-25.0.0-heaff1e6_4_cpu.conda - build_number: 4 - sha256: 580382aae415669e2ff4af670db9381462d5d966ecde7d35f041356344b77dd1 - md5: 5d2b0865a12a8a380c4ad11eae754f30 - depends: - - __osx >=12.0 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libarrow 25.0.0 haaed7fe_4_cpu - - libarrow-acero 25.0.0 heaff1e6_4_cpu - - libarrow-compute 25.0.0 h93a2d87_4_cpu - - libcxx >=21 - - libopentelemetry-cpp >=1.27.0,<1.28.0a0 - - libparquet 25.0.0 h0de02aa_4_cpu - - libprotobuf >=7.35.1,<7.35.2.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - libarrow-dataset >=25.0.0,<25.1.0a0 - size: 519748 - timestamp: 1786315616734 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-25.0.0-h2208e57_4_cpu.conda - build_number: 4 - sha256: 4f5d1e1e1ecead58d80472e2965143a4d4daf37d401a527334116caf5b5cff9b - md5: e8627e23ad2343bdd0765b49ad7795df - depends: - - __osx >=12.0 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libarrow 25.0.0 haaed7fe_4_cpu - - libarrow-acero 25.0.0 heaff1e6_4_cpu - - libarrow-dataset 25.0.0 heaff1e6_4_cpu - - libcxx >=21 - - libprotobuf >=7.35.1,<7.35.2.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - libarrow-substrait >=25.0.0,<25.1.0a0 - size: 455505 - timestamp: 1786315676110 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-9_h51639a9_openblas.conda - build_number: 9 - sha256: 0437866fe43b4c911470d3e7ddea18d78390bd7062d9563ce6d38c8ba5798405 - md5: cb1f85be9d88af453fcda3dfba995099 - depends: - - libopenblas >=0.3.34,<0.3.35.0a0 - - libopenblas >=0.3.34,<1.0a0 - constrains: - - blas 2.309 openblas - - libcblas 3.11.0 9*_openblas - - liblapack 3.11.0 9*_openblas - - liblapacke 3.11.0 9*_openblas - - mkl <2027 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libblas >=3.11.0,<4.0a0 - size: 18162 - timestamp: 1786058887392 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-h1dcdb26_3.conda - sha256: 5e62b856b2e77ce98db44133bacab1281b42c1040dcbd69dbacfb80890cff5b0 - md5: b457450ba3f27c4749783c0204bd17b0 - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libbrotlicommon >=1.2.0,<1.3.0a0 - size: 80027 - timestamp: 1786622846050 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-h5295a6a_3.conda - sha256: 510c9fce0d9ffcf41741dd96fc05db381672109d5665ef002c2e58f0d4ca0118 - md5: e07a99c6fdd984f4d588060f2f936bf4 - depends: - - __osx >=11.0 - - libbrotlicommon 1.2.0 h1dcdb26_3 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libbrotlidec >=1.2.0,<1.3.0a0 - size: 29935 - timestamp: 1786622857695 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-h2ddc9cb_3.conda - sha256: eac412417eee2e93c62e9d53559f1f9c14f40b6c41e2c432af8b517596898dd1 - md5: 954c78a9f591bfb12c79beaff7338ec8 - depends: - - __osx >=11.0 - - libbrotlicommon 1.2.0 h1dcdb26_3 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libbrotlienc >=1.2.0,<1.3.0a0 - size: 295650 - timestamp: 1786622868044 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-9_hb0561ab_openblas.conda - build_number: 9 - sha256: c4c71f20fdb20c86bf6f61c8c31bb349e4055bb4d19928e8580bb5615039cb4b - md5: a7b6ba94e3ca58bc7d4e1ae4ff95c215 - depends: - - libblas 3.11.0 9_h51639a9_openblas - constrains: - - blas 2.309 openblas - - liblapack 3.11.0 9*_openblas - - liblapacke 3.11.0 9*_openblas - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libcblas >=3.11.0,<4.0a0 - size: 18110 - timestamp: 1786058893756 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - sha256: 58477b67cc719060b5b069ba57161e20ba69b8695d154a719cb4b60caf577929 - md5: 32bd82a6a625ea6ce090a81c3d34edeb - depends: - - libcxx >=11.1.0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libcrc32c >=1.1.2,<1.2.0a0 - size: 18765 - timestamp: 1633683992603 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.21.0-h6651222_5.conda - sha256: 59dd850def9473e7f63ed72afc750bba9670316f279c0bd409572cd47569ed5f - md5: 5ae67c128838b686894b4a3aef015c29 - depends: - - __osx >=11.0 - - krb5 >=1.22.2,<1.23.0a0 - - libnghttp2 >=1.68.1,<2.0a0 - - libpsl >=0.23.1,<0.24.0a0 - - libssh2 >=1.11.1,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - - openssl >=3.5.7,<4.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: curl - license_family: MIT - purls: [] - run_exports: - weak: - - libcurl >=8.21.0,<9.0a0 - size: 409852 - timestamp: 1787183686192 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.8-h55c6f16_0.conda - sha256: a2e7abab5add9750fab064c024394de48e49f97631c605ad5db5c8ac3fc769ef - md5: 89f76a2a21a3ec3ec983b5eb237c4113 - depends: - - __osx >=11.0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - purls: [] - run_exports: {} - size: 569349 - timestamp: 1781670209146 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-he7e0567_1.conda - sha256: d896f4aa4ce4c590c2838678cb1917356fdb461d2a189991c0280c818c362172 - md5: 78650d671cb56909bb3e5c13bce310f9 - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libdeflate >=1.25,<1.26.0a0 - size: 55727 - timestamp: 1785909153744 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321h26f1114_1.conda - sha256: 257c926f19e32bdb981fc674c76966049b6fc73f706bae58e9fed8757ad1da70 - md5: 843ef89082f368cb889305084d3b483c - depends: - - ncurses - - __osx >=11.0 - - ncurses >=6.6,<7.0a0 - license: BSD-2-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libedit >=3.1.20250104,<3.2.0a0 - size: 107742 - timestamp: 1786616721640 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h1a92334_3.conda - sha256: c0100064506ae8abb432c5a506d474f10af2cf48c33d62bc221fb28b6d6ff6ac - md5: 19e86c8a6a47e92bb2e70ca12e758c5c - depends: - - __osx >=11.0 - license: BSD-2-Clause OR GPL-2.0-or-later - license_family: GPL - purls: [] - run_exports: - weak: - - libev >=4.33,<4.34.0a0 - size: 39991 - timestamp: 1785917376956 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda - sha256: 8c136d7586259bb5c0d2b913aaadc5b9737787ae4f40e3ad1beaf96c80b919b7 - md5: 1a109764bff3bdc7bdd84088347d71dc - depends: - - openssl >=3.1.1,<4.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libevent >=2.1.12,<2.1.13.0a0 - size: 368167 - timestamp: 1685726248899 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_1.conda - sha256: 5af74261101e3c777399c6294b2b5d290e508153268eb2e9ff99c4d69834612f - md5: a915151d5d3c5bf039f5ccc8402a436f - depends: - - __osx >=11.0 - constrains: - - expat 2.8.1.* - license: MIT - license_family: MIT - purls: [] - run_exports: {} - size: 69362 - timestamp: 1781203631990 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.7.0-hcf2aa1b_0.conda - sha256: 2c6ac9a6cd65af89b2bd448518bb1e13b44a2e48c0d469398e37bcfc0092e832 - md5: 92e8690d170d46d768c32553458c0105 - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libffi >=3.7.0,<3.8.0a0 - size: 43734 - timestamp: 1783521647536 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_2.conda - sha256: 19ce8bd320414cb6b9889ecbf48a3ded848b0d1068b76ff6bea099bd7387d6f3 - md5: ee1fc5bba400ff0cae27fbf141a1ae0c - depends: - - libfreetype6 >=2.14.3 - license: GPL-2.0-only OR FTL - purls: [] - run_exports: {} - size: 8367 - timestamp: 1786641013393 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-h2ed5691_2.conda - sha256: d9b203d6484ad491b5b5f33d49a9d7a91189d776a9adae53d2b63af18ec11e6a - md5: 881cfb44ea02cc9849f612725a959660 - depends: - - __osx >=11.0 - - libpng >=1.6.58,<1.7.0a0 - - libzlib >=1.3.2,<2.0a0 - constrains: - - freetype >=2.14.3 - license: GPL-2.0-only OR FTL - purls: [] - run_exports: {} - size: 340923 - timestamp: 1786641012794 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-16.1.0-h3cf6597_2.conda - sha256: 72ad51807f267a409ed4ef82b701b23e8dc13989a873c0b9ae4995ca41365a12 - md5: 66681fa4c888def48bcec00e7f4a4a5b - depends: - - _openmp_mutex - constrains: - - libgcc-ng ==16.1.0=*_2 - - libgomp 16.1.0 2 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - run_exports: {} - size: 363865 - timestamp: 1787164250817 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-16.1.0-h07b0088_2.conda - sha256: 31d471423a1d09727778756e0846c2ec928d2cf38d3801be35d5c2487808549c - md5: be6243e0464580e5ef89d61f314c8393 - depends: - - libgfortran5 16.1.0 h32cdfcc_2 - constrains: - - libgfortran-ng ==16.1.0=*_2 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - run_exports: {} - size: 98565 - timestamp: 1787164344964 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-16.1.0-h32cdfcc_2.conda - sha256: a55a80209042b8d052cca044ba0a65b100af4f757bdb2eec249d5813b8e456e6 - md5: c2b2f4052071315e542c5dd9e3e541aa - depends: - - libgcc >=16.1.0 - constrains: - - libgfortran 16.1.0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - run_exports: {} - size: 556436 - timestamp: 1787164256762 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.3-ha531971_1.conda - sha256: c9f7273bbe06d1693ff3a2b6f8b49b74e2ef6cbac2cead7aae767f2f5191b7aa - md5: 70a6bcf13dc0dd00fe3fe91190d38771 - depends: - - __osx >=11.0 - - pcre2 >=10.47,<10.48.0a0 - - libffi >=3.7.0,<3.8.0a0 - - libintl >=0.25.1,<1.0a0 - - libiconv >=1.18,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - constrains: - - glib >2.66 - license: LGPL-2.1-or-later - purls: [] - run_exports: - weak: - - libglib >=2.88.3,<3.0a0 - size: 4447961 - timestamp: 1786457780347 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-3.8.0-ha595bda_0.conda - sha256: a48050bcf3827e0fc10de5a7d251760b8b84011f3aeea23ae18b5e0ce25aff19 - md5: 4f34ca73f16b37fae583ce16c48b5492 - depends: - - __osx >=12.0 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libcurl >=8.21.0,<9.0a0 - - libcxx >=19 - - libgrpc >=1.82.1,<1.83.0a0 - - libopentelemetry-cpp >=1.27.0,<1.28.0a0 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - openssl >=3.5.7,<4.0a0 - constrains: - - libgoogle-cloud 3.8.0 *_0 - license: Apache-2.0 - license_family: Apache - purls: [] - run_exports: - weak: - - libgoogle-cloud >=3.8.0,<3.9.0a0 - size: 1804429 - timestamp: 1786225612587 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-3.8.0-hc8aed40_0.conda - sha256: 13251d6a72028a13a9d142815b23818a56f6f88a67f9dd5f19a881eb2fcf5636 - md5: 36ba29b4cf02ed97ce269939b750961a - depends: - - __osx >=12.0 - - libabseil - - libcrc32c >=1.1.2,<1.2.0a0 - - libcurl - - libcxx >=19 - - libgoogle-cloud 3.8.0 ha595bda_0 - - libzlib >=1.3.2,<2.0a0 - - openssl - license: Apache-2.0 - license_family: Apache - purls: [] - run_exports: - weak: - - libgoogle-cloud-storage >=3.8.0,<3.9.0a0 - size: 541527 - timestamp: 1786225749476 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.82.1-hf3e839d_0.conda - sha256: b9d0f510488074e889ca3cecd2b7490e8e830f7a60e2e91809a90355bf4d1a57 - md5: 5f7f645a15eedc24da7f271dc2086bcf - depends: - - __osx >=12.0 - - c-ares >=1.34.6,<2.0a0 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libcxx >=19 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libre2-11 >=2025.11.5 - - libzlib >=1.3.2,<2.0a0 - - openssl >=3.5.7,<4.0a0 - - re2 - constrains: - - grpc-cpp =1.82.1 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - libgrpc >=1.82.1,<1.83.0a0 - size: 4898235 - timestamp: 1783587327477 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libharfbuzz-14.3.1-hcda0f7c_0.conda - sha256: 67af14f8fbf9b9725890f728179d933ac35a95a6b50f37b7b568a11bfa8a4c1d - md5: 1631ca9ffe7d368850904baa1df1abf4 - depends: - - __osx >=11.0 - - cairo >=1.18.4,<2.0a0 - - graphite2 >=1.3.15,<2.0a0 - - icu >=78.3,<79.0a0 - - libcxx >=21 - - libfreetype >=2.14.3 - - libfreetype6 >=2.14.3 - - libglib >=2.88.3,<3.0a0 - - libpng >=1.6.58,<1.7.0a0 - - libzlib >=1.3.2,<2.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: {} - size: 953252 - timestamp: 1786970947180 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-he4c29f2_3.conda - sha256: 689a14968267f2f97c07112fca5636e7d756036b9aee969911267c20bd3eea1f - md5: 17f4744c0873e9f77ac9b5cd0a27c187 - depends: - - __osx >=11.0 - license: LGPL-2.1-only - purls: [] - run_exports: - weak: - - libiconv >=1.18,<2.0a0 - size: 750816 - timestamp: 1787033961086 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - sha256: 99d2cebcd8f84961b86784451b010f5f0a795ed1c08f1e7c76fbb3c22abf021a - md5: 5103f6a6b210a3912faf8d7db516918c - depends: - - __osx >=11.0 - - libiconv >=1.18,<2.0a0 - license: LGPL-2.1-or-later - purls: [] - run_exports: - weak: - - libintl >=0.25.1,<1.0a0 - size: 90957 - timestamp: 1751558394144 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.2.0-h84a0fba_1.conda - sha256: 05006418f9392c9b723e8428808db106de0350a497832f95f921b85ff1072310 - md5: b2f8c8e5a7651a1d7c05404c3a159517 - depends: - - __osx >=11.0 - constrains: - - jpeg <0.0.0a - license: IJG AND BSD-3-Clause AND Zlib - purls: [] - run_exports: - weak: - - libjpeg-turbo >=3.2.0,<4.0a0 - size: 558459 - timestamp: 1785896382474 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-9_hd9741b5_openblas.conda - build_number: 9 - sha256: db09e8e6a58415da1d866221cf518e53e84c6766a4500faae716cfa204f696ff - md5: ecc87ca1e25bd94a08c82904eb4e6846 - depends: - - libblas 3.11.0 9_h51639a9_openblas - constrains: - - blas 2.309 openblas - - libcblas 3.11.0 9*_openblas - - liblapacke 3.11.0 9*_openblas - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - liblapack >=3.11.0,<3.12.0a0 - size: 18144 - timestamp: 1786058899889 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_1.conda - sha256: 23d0630046a3e8b164d8f80f2b74ed2605af2e7050ab9913018056402fae4311 - md5: 8ab10323068b107661a4b9a4af84f3b5 - depends: - - __osx >=11.0 - constrains: - - xz 5.8.3.* - license: 0BSD - purls: [] - run_exports: - weak: - - liblzma >=5.8.3,<6.0a0 - size: 91720 - timestamp: 1786348695846 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h435687b_1.conda - sha256: 445440d8cccccb6585f71d1eb7c949d64a2af2ced5481d924621424ff3b6a398 - md5: ac9902dcbe0417f50cf95ab2bde062fa - depends: - - __osx >=11.0 - - c-ares >=1.34.8,<2.0a0 - - libcxx >=21 - - libev >=4.33,<4.34.0a0 - - libev >=4.33,<5.0a0 - - libzlib >=1.3.2,<2.0a0 - - openssl >=3.5.7,<4.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libnghttp2 >=1.68.1,<2.0a0 - size: 567024 - timestamp: 1787177422467 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.34-openmp_he657e61_0.conda - sha256: bcf1967f12f1b1cc769dcc77b255fb1b27aaceb2f185450e9596d137bc6ede76 - md5: 89d28fb841cf16211318524fa985e384 - depends: - - __osx >=11.0 - - libgfortran - - libgfortran5 >=14.3.0 - - llvm-openmp >=19.1.7 - constrains: - - openblas >=0.3.34,<0.3.35.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libopenblas >=0.3.34,<1.0a0 - size: 4318474 - timestamp: 1784288246205 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.27.0-h46c1d2a_1.conda - sha256: 9c1840af12f31643723a7ea7f6bde6a3a394783ced6aa65b75a9fc3ecb84f39f - md5: a6c2fc0c5ddf105b3d3e353c1383a492 - depends: - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libcurl >=8.21.0,<9.0a0 - - libgrpc >=1.82.0,<1.83.0a0 - - libopentelemetry-cpp-headers 1.27.0 hce30654_1 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libzlib >=1.3.2,<2.0a0 - - nlohmann_json - - prometheus-cpp >=1.3.0,<1.4.0a0 - constrains: - - cpp-opentelemetry-sdk =1.27.0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - libopentelemetry-cpp >=1.27.0,<1.28.0a0 - size: 564868 - timestamp: 1783133075023 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.27.0-hce30654_1.conda - sha256: 01caeebb19f70563f4ab1b97fcdf06af13be8637e9776619c8840b49070b287c - md5: 7f61001d82fd50385d4f9fb57f936e95 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: {} - size: 394664 - timestamp: 1783133038717 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-25.0.0-h0de02aa_4_cpu.conda - build_number: 4 - sha256: 318412a665f7637598aef088a9dbc30c2a52614eebe1bde6e75be76708875271 - md5: ebf0d32466e8875bf91749744b97165a - depends: - - __osx >=12.0 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libarrow 25.0.0 haaed7fe_4_cpu - - libcxx >=21 - - libopentelemetry-cpp >=1.27.0,<1.28.0a0 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libthrift >=0.22.0,<0.22.1.0a0 - - openssl >=3.5.7,<4.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - libparquet >=25.0.0,<25.1.0a0 - size: 1096341 - timestamp: 1786315419506 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-hf5e6511_1.conda - sha256: f88da60b348ee1f3e1a9c20fe02142fdafe889f08da0b1cc33c1f3f14460239d - md5: e0466c58fd07db190b9a81b5e58539f2 - depends: - - __osx >=11.0 - - libzlib >=1.3.2,<2.0a0 - license: zlib-acknowledgement - purls: [] - run_exports: - weak: - - libpng >=1.6.58,<1.7.0a0 - size: 290219 - timestamp: 1786616561185 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-7.35.1-h8daa630_2.conda - sha256: 782d30325e61249e3240979e0f76d9dbf67867b1f38424cfdb1abb3a0f2cfa95 - md5: 7f77d9a99dd9e79e1f5be50d6632f675 - depends: - - __osx >=12.0 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libcxx >=19 - - libzlib >=1.3.2,<2.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libprotobuf >=7.35.1,<7.35.2.0a0 - size: 2900719 - timestamp: 1783168180812 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpsl-0.23.1-hdb0c161_1.conda - sha256: c8c3153df39abedf3413483f672151ad70f1adb0c06c192bdf7ec432c3616b07 - md5: 5d270f716a2b4bc13df9af8612071b17 - depends: - - __osx >=11.0 - - libcxx >=21 - - icu >=78.3,<79.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libpsl >=0.23.1,<0.24.0a0 - size: 72673 - timestamp: 1786970928205 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libraqm-0.11.0-h45af499_0.conda - sha256: b110f7f9b2cec61ea793c521950414e00cd64826e18aeb4ab40369acf05c0039 - md5: 46ea0eb4e71bffa35ab7070678bcb053 - depends: - - __osx >=11.0 - - libfreetype >=2.14.3 - - libfreetype6 >=2.14.3 - - libharfbuzz >=14.2.1 - - fribidi >=1.0.16,<2.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libraqm >=0.11.0,<0.12.0a0 - size: 31333 - timestamp: 1784850348342 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h5d15848_2.conda - sha256: 06f49291605c379467987989ff08d44b470a23afeb690d7e078517871969bff7 - md5: b750c4f83563c7528634bdcfd28622ce - depends: - - __osx >=11.0 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libcxx >=19 - constrains: - - re2 2025.11.05.* - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libre2-11 >=2025.11.5 - size: 166043 - timestamp: 1781312641918 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.4-hca69786_1.conda - sha256: 839b31d4830e896b4d315b551d27f2bb08026bc946df04bcc360d8627c3ba2cd - md5: fde96d40ebe9a9cb34e4122380189ddb - depends: - - __osx >=11.0 - - icu >=78.3,<79.0a0 - - libzlib >=1.3.2,<2.0a0 - license: blessing - purls: [] - run_exports: - weak: - - libsqlite >=3.53.4,<4.0a0 - size: 942754 - timestamp: 1787051243846 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-hbf2880b_1.conda - sha256: a056e518c3d2d09fbb1778cea80c0c95338fb24adf1a817bbf90fb484850a304 - md5: d957a8eda98c49b073e8dcfd677c127a - depends: - - libzlib >=1.3.2,<2.0a0 - - openssl >=3.5.7,<4.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libssh2 >=1.11.1,<2.0a0 - size: 280492 - timestamp: 1786714226814 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h1fb9c8a_2.conda - sha256: 568bb23db02b050c3903bec05edbcab84960c8c7e5a1710dac3109df997ac7f1 - md5: d006875f9a58a44f92aec9a7ebeb7150 - depends: - - __osx >=11.0 - - libcxx >=19 - - libevent >=2.1.12,<2.1.13.0a0 - - libzlib >=1.3.2,<2.0a0 - - openssl >=3.5.6,<4.0a0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - libthrift >=0.22.0,<0.22.1.0a0 - size: 323017 - timestamp: 1777019893083 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.2-h282da08_0.conda - sha256: 253153cabf9469170e02b21a6bc9aa598048e7c34966b1103af52d27d2a708a4 - md5: 6fa87106b3c041ad6d965a9411e79b94 - depends: - - __osx >=11.0 - - lerc >=4.1.0,<5.0a0 - - libcxx >=19 - - libdeflate >=1.25,<1.26.0a0 - - libjpeg-turbo >=3.1.4.1,<4.0a0 - - liblzma >=5.8.3,<6.0a0 - - libwebp-base >=1.6.0,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: HPND - purls: [] - run_exports: - weak: - - libtiff >=4.7.2,<4.8.0a0 - size: 387825 - timestamp: 1783085754081 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtorch-2.12.1-cpu_generic_h931913c_0.conda - sha256: cc8c74ff5a4d6af96cb67858caa389d81bd6a5fa1c2e3ea65cb3934a5acd3adc - md5: bbb527a3355132af7b08a64893477afc - depends: - - __osx >=12.0 - - fmt >=12.1.0,<12.2.0a0 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libcxx >=19 - - liblapack >=3.9.0,<4.0a0 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libuv >=1.52.1,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - - llvm-openmp >=19.1.7 - - onednn >=3.12,<4.0a0 - - pybind11-abi 11 - - sleef >=3.9.0,<4.0a0 - constrains: - - libopenblas * openmp_* - - pytorch-cpu 2.12.1 - - pytorch-gpu <0.0a0 - - openblas * openmp_* - - pytorch 2.12.1 cpu_generic_*_0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libtorch >=2.12.1,<2.13.0a0 - size: 32193556 - timestamp: 1781831663606 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtorch-2.13.0-cpu_generic_hf893bd3_2.conda - sha256: 6f644ec2d951d59865aa842cd6081df065c2c61939f61b96ff6cfdddba7cef0c - md5: 2c90ca159b2cd70e9defc68f244d1285 - depends: - - __osx >=12.0 - - fmt >=12.1.0,<12.2.0a0 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libcxx >=19 - - liblapack >=3.9.0,<4.0a0 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libuv >=1.52.1,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - - llvm-openmp >=19.1.7 - - onednn >=3.12,<4.0a0 - - pybind11-abi 11 - - sleef >=3.9.0,<4.0a0 - constrains: - - libopenblas * openmp_* - - openblas * openmp_* - - pytorch 2.13.0 cpu_generic_*_2 - - pytorch-cpu 2.13.0 - - pytorch-gpu <0.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libtorch >=2.13.0,<2.14.0a0 - size: 33905275 - timestamp: 1786373050531 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.3-h2431656_0.conda - sha256: ae1a82e62cd4e3c18e005ae7ff4358ed72b2bfbfe990d5a6a5587f81e9a100dc - md5: 2255add2f6ae77d0a96624a5cbde6d45 - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libutf8proc >=2.11.3,<2.12.0a0 - size: 87916 - timestamp: 1768735311947 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.52.1-h1a92334_1.conda - sha256: 4f47de9de1990efd998edbbd6793f89c8f02ffde987ae8120b1c006acefd2a04 - md5: de09bd0f175611e94f21b28f8c708e80 - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libuv >=1.52.1,<2.0a0 - size: 122729 - timestamp: 1785914645797 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h202fb40_1.conda - sha256: 0ff54650d470c7e54cbeffdd53a8c063e055a7bcf784388c0385ce5c4741b0f4 - md5: 168a13e329259710b28277abc1395b8e - depends: - - __osx >=11.0 - constrains: - - libwebp 1.6.0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libwebp-base >=1.6.0,<2.0a0 - size: 294522 - timestamp: 1785955350410 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hbffa61f_1.conda - sha256: 81f9b4fb64d977c19474d1b5616974757aaac21d55401ea105f21022b386bd28 - md5: 923bf656578743d064f352f0b56ee658 - depends: - - __osx >=11.0 - - pthread-stubs - - xorg-libxau >=1.0.12,<2.0a0 - - xorg-libxdmcp >=1.1.5,<2.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libxcb >=1.17.0,<2.0a0 - size: 324264 - timestamp: 1787077544793 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_1.conda - sha256: 2ca61d8287339c726b151fa612e83d2afa1418b89fa17694c873dc231bc9b077 - md5: f86c0b8ac5c866049717b55df1049c2c - depends: - - __osx >=11.0 - - icu >=78.3,<79.0a0 - - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.3,<6.0a0 - - libzlib >=1.3.2,<2.0a0 - constrains: - - libxml2 2.15.3 - license: MIT - license_family: MIT - purls: [] - run_exports: {} - size: 466188 - timestamp: 1787237580766 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-h5654f7c_1.conda - sha256: ff1b70683ccb82f8aa7f3eda53405a2036d849daba4e4e622f330dcd49d37700 - md5: 06a3f8eb5cdde56b2d10b49ae3337954 - depends: - - __osx >=11.0 - - icu >=78.3,<79.0a0 - - libiconv >=1.18,<2.0a0 - - liblzma >=5.8.3,<6.0a0 - - libxml2-16 2.15.3 h5ef1a60_1 - - libzlib >=1.3.2,<2.0a0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - libxml2 - - libxml2-16 >=2.15.3 - size: 41264 - timestamp: 1787237585903 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_3.conda - sha256: a18fa5d5bac452401459f966cf0d872224e8080c4ff93c77e168d43ab42ef9d7 - md5: f39288f0ea63ae962e1a2e4f355a0d75 - depends: - - __osx >=11.0 - constrains: - - zlib 1.3.2 *_3 - license: Zlib - license_family: Other - purls: [] - run_exports: - weak: - - libzlib >=1.3.2,<2.0a0 - size: 47822 - timestamp: 1785277049190 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.8-hc225544_1.conda - sha256: aa95fe355ec9fbf5d9816e155b9678cc98b749d3245bff56ca02f2a01239f5ac - md5: 4d317ff37f520b0d25d634cb996823cd - depends: - - __osx >=11.0 - constrains: - - intel-openmp <0.0a0 - - openmp 22.1.8|22.1.8.* - license: Apache-2.0 WITH LLVM-exception - purls: [] - run_exports: - strong: - - llvm-openmp >=22.1.8 - size: 287782 - timestamp: 1787293144681 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-hdca3b7d_2.conda - sha256: 1887867b393eb3c2b336deaffcf228574821ea1e0dcb9ef7bf6c9f59cec40f03 - md5: d47f7f3481c6f2fcc4ed22802f61c6dd - depends: - - __osx >=11.0 - - libcxx >=21 - license: BSD-2-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - lz4-c >=1.10.0,<1.11.0a0 - size: 171838 - timestamp: 1786717209785 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py312h04c11ed_1.conda - sha256: 330394fb9140995b29ae215a19fad46fcc6691bdd1b7654513d55a19aaa091c1 - md5: 11d95ab83ef0a82cc2de12c1e0b47fe4 - depends: - - __osx >=11.0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - constrains: - - jinja2 >=3.0.0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/markupsafe?source=hash-mapping - run_exports: {} - size: 25564 - timestamp: 1772445846939 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.11.1-py312h07c8dfe_2.conda - sha256: 43c6f6494d183a3214c9acca05f6c477ace507f48785719c7c315aca4b0654a0 - md5: 6aecfe9840c1b1f5e613792c4720957a - depends: - - __osx >=11.0 - - contourpy >=1.0.1 - - cycler >=0.10 - - fonttools >=4.28.2 - - freetype - - kiwisolver >=1.3.1 - - libcxx >=19 - - libfreetype >=2.14.3 - - libfreetype6 >=2.14.3 - - libraqm >=0.11.0,<0.12.0a0 - - numpy >=1.25 - - numpy >=1.25,<3 - - packaging >=20.0 - - pillow >=9 - - pyparsing >=3 - - python >=3.12,<3.13.0a0 - - python-dateutil >=2.7 - - python_abi 3.12.* *_cp312 - - qhull >=2020.2,<2020.3.0a0 - license: PSF-2.0 - license_family: PSF - purls: - - pkg:pypi/matplotlib?source=hash-mapping - run_exports: {} - size: 8512237 - timestamp: 1785211085233 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mctc-lib-0.5.2-gfortran_h0230218_0.conda - sha256: cfcacb3a72e14b2273e545a4a836a9bf11e0745f80a23a93b2d28b9e2e83bc00 - md5: 598c2c0357e09faba1afb7281309b3f9 - depends: - - __osx >=11.0 - - jonquil >=0.3.0,<0.4.0a0 gfortran_* - - libgfortran - - libgfortran5 >=14.3.0 - - llvm-openmp >=19.1.7 - - toml-f >=0.5.0,<0.6.0a0 gfortran_* - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - mctc-lib >=0.5.2,<0.6.0a0 - size: 695023 - timestamp: 1781337704317 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.4.0-h169892a_0.conda - sha256: a9774664adea222e4165efddcd902641c03c7d08fda3a83a5b0885e675ead309 - md5: 2845c3a1d0d8da1db92aba8323892475 - depends: - - __osx >=11.0 - - gmp >=6.3.0,<7.0a0 - - mpfr >=4.2.2,<5.0a0 - license: LGPL-3.0-or-later - license_family: LGPL - purls: [] - run_exports: - weak: - - mpc >=1.4.0,<2.0a0 - size: 86181 - timestamp: 1774472395307 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.2-h72846b0_1.conda - sha256: 6a86fe9c09d708d71508c601dec53fb7a4fbfb23e6f57a590ef832afdca738c4 - md5: 6c990c07502330c3876dfc67d7bb6917 - depends: - - __osx >=11.0 - - gmp >=6.3.0,<7.0a0 - license: LGPL-3.0-only - license_family: LGPL - purls: [] - run_exports: - weak: - - mpfr >=4.2.2,<5.0a0 - size: 350536 - timestamp: 1787236978744 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-2.3.1-py312h9b6eb38_0.conda - sha256: 65d01830ece31e2a95ab94fb54db0c14d1701fe7c25e27a2b0a127a9c5bee4e6 - md5: 1d26314be01dd7c445760a581623ea15 - depends: - - ast-serialize >=0.6.0,<1.0.0 - - mypy_extensions >=1.0.0 - - pathspec >=1.0.0 - - python - - python-librt >=0.13.0 - - typing_extensions >=4.6.0 - - psutil >=4.0 - - __osx >=11.0 - - python_abi 3.12.* *_cp312 - license: MIT - license_family: MIT - purls: - - pkg:pypi/mypy?source=compressed-mapping - run_exports: {} - size: 13041510 - timestamp: 1786887301117 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-he64c551_1.conda - sha256: 7024a48c8c0d0114ed4ab53c76bf9275d50e91ba7cea367a9aead638d3c29c68 - md5: 3dfa0d0316dc246cd44937a557de4501 - depends: - - __osx >=11.0 - license: X11 AND BSD-3-Clause - purls: [] - run_exports: - weak: - - ncurses >=6.6,<7.0a0 - size: 804298 - timestamp: 1786355189145 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.12.0-h784d473_2.conda - sha256: 3c7235b1574907737d09b46b3a0f7f0f5fcafc2380f2c8d02fc55aa23ce47c3c - md5: 0debf38c50bb3ea6f712c87310a00289 - constrains: - - nlohmann_json-abi ==3.12.0 - license: MIT - license_family: MIT - purls: [] - run_exports: {} - size: 137984 - timestamp: 1785920576349 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.6-py312ha003a3f_0.conda - sha256: b09e03dace335a6f303352fc4e167243e04d7026d55008546fa643d224fb0bad - md5: 9f554fdfa902971390975b489e678c03 - depends: - - python - - __osx >=11.0 - - libcxx >=19 - - python_abi 3.12.* *_cp312 - - liblapack >=3.9.0,<4.0a0 - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - constrains: - - numpy-base <0a0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/numpy?source=hash-mapping - run_exports: - weak: - - numpy >=1.23,<3 - size: 6843172 - timestamp: 1779169213435 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/onednn-3.12-omp_h95bb4b2_0.conda - sha256: dc6d6eeea55ccf0c5b34b73f5fa966ae8f8fbeb27632225bb4836d14185b397d - md5: ab54feaf0b7ff7f981615a8e012b191c - depends: - - llvm-openmp >=19.1.7 - - libcxx >=19 - - __osx >=11.0 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - onednn >=3.12,<4.0a0 - size: 5754719 - timestamp: 1779566196336 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hd9e9057_0.conda - sha256: 60aca8b9f94d06b852b296c276b3cf0efba5a6eb9f25feb8708570d3a74f00e4 - md5: 4b5d3a91320976eec71678fad1e3569b - depends: - - __osx >=11.0 - - libcxx >=19 - - libpng >=1.6.55,<1.7.0a0 - - libtiff >=4.7.1,<4.8.0a0 - - libzlib >=1.3.1,<2.0a0 - license: BSD-2-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - openjpeg >=2.5.4,<3.0a0 - size: 319697 - timestamp: 1772625397692 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_1.conda - sha256: 66be2283b5b37dcda1332b5e74c1782a8cb14fd2e62e0d38017c2d35bf73c119 - md5: 65d1906712b85d1679263c518d011b5b - depends: - - __osx >=11.0 - - ca-certificates - license: Apache-2.0 - license_family: Apache - purls: [] - run_exports: - weak: - - openssl >=3.6.3,<4.0a0 - size: 3109132 - timestamp: 1785913735357 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/optree-0.20.0-py312h42f75bc_0.conda - sha256: a1f60a88edfa5f2a3ffa2c5bec67cedfa756e6755337a92c1f4c763dcb8fa349 - md5: 04d65ac871e52dd45194e161e8c79935 - depends: - - __osx >=11.0 - - libcxx >=21 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - typing-extensions >=4.10 - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/optree?source=compressed-mapping - run_exports: {} - size: 499579 - timestamp: 1787285770202 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.3.1-hef2a647_0.conda - sha256: 11b8e71ecdf9d50c9c5249e009b9f7d13d6df68091bd70fe202f3c3c16d0e3d8 - md5: d5626f645bea2fb646e12910c181fc79 - depends: - - tzdata - - __osx >=12.0 - - libcxx >=19 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - zstd >=1.5.7,<1.6.0a0 - - lz4-c >=1.10.0,<1.11.0a0 - - snappy >=1.2.2,<1.3.0a0 - - libzlib >=1.3.2,<2.0a0 - - libabseil >=20260526.0,<20260527.0a0 - - libabseil * cxx17* - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: - weak: - - orc >=2.3.1,<2.3.2.0a0 - size: 513679 - timestamp: 1784301269750 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-3.0.5-py312h6510ced_1.conda - sha256: 2cef45eb539621fb181b9682d960157a476729b61094046e44bb8ac167cf3779 - md5: 49c93ebce99da3235ba5bd1a24f7153a - depends: - - python - - numpy >=1.26.0 - - python-dateutil >=2.8.2 - - libcxx >=19 - - python 3.12.* *_cpython - - __osx >=11.0 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - constrains: - - adbc-driver-postgresql >=1.2.0 - - adbc-driver-sqlite >=1.2.0 - - beautifulsoup4 >=4.12.3 - - blosc >=1.21.3 - - bottleneck >=1.4.2 - - fastparquet >=2024.11.0 - - fsspec >=2024.10.0 - - gcsfs >=2024.10.0 - - html5lib >=1.1 - - hypothesis >=6.116.0 - - jinja2 >=3.1.5 - - lxml >=5.3.0 - - matplotlib >=3.9.3 - - numba >=0.60.0 - - numexpr >=2.10.2 - - odfpy >=1.4.1 - - openpyxl >=3.1.5 - - psycopg2 >=2.9.10 - - pyarrow >=13.0.0 - - pyiceberg >=0.8.1 - - pymysql >=1.1.1 - - pyqt5 >=5.15.9 - - pyreadstat >=1.2.8 - - pytables >=3.10.1 - - pytest >=8.3.4 - - pytest-xdist >=3.6.1 - - python-calamine >=0.3.0 - - pytz >=2024.2 - - pyxlsb >=1.0.10 - - qtpy >=2.4.2 - - scipy >=1.14.1 - - s3fs >=2024.10.0 - - sqlalchemy >=2.0.36 - - tabulate >=0.9.0 - - xarray >=2024.10.0 - - xlrd >=2.0.1 - - xlsxwriter >=3.2.0 - - zstandard >=0.23.0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/pandas?source=hash-mapping - run_exports: {} - size: 13962363 - timestamp: 1785276448997 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - sha256: 5e2e443f796f2fd92adf7978286a525fb768c34e12b1ee9ded4000a41b2894ba - md5: 9b4190c4055435ca3502070186eba53a - depends: - - __osx >=11.0 - - bzip2 >=1.0.8,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - pcre2 >=10.47,<10.48.0a0 - size: 850231 - timestamp: 1763655726735 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-he63d830_1.conda - sha256: f8c415329b542e1fca1ff2917b80e687c18302dfa0353530668b90cb225b494f - md5: 5ab90033816cbe4097e8a297e5179f67 - depends: - - __osx >=11.0 - - bzip2 >=1.0.8,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - pcre2 >=10.47,<10.48.0a0 - size: 851704 - timestamp: 1787294559157 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.3.0-py312h4e908a4_0.conda - sha256: 0867f0996be43d59afd9abf20a8374c2b33da88fe7a0c42fc98921b73a946426 - md5: 8c6be4560fc7cded72c7d17ddbe9cea4 - depends: - - python - - python 3.12.* *_cpython - - __osx >=11.0 - - libxcb >=1.17.0,<2.0a0 - - libfreetype >=2.14.3 - - libfreetype6 >=2.14.3 - - libjpeg-turbo >=3.1.4.1,<4.0a0 - - lcms2 >=2.19.1,<3.0a0 - - libtiff >=4.7.1,<4.8.0a0 - - tk >=8.6.13,<8.7.0a0 - - zlib-ng >=2.3.3,<2.4.0a0 - - libwebp-base >=1.6.0,<2.0a0 - - openjpeg >=2.5.4,<3.0a0 - - python_abi 3.12.* *_cp312 - license: HPND - purls: - - pkg:pypi/pillow?source=hash-mapping - run_exports: {} - size: 977597 - timestamp: 1782912213683 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h784d473_3.conda - sha256: 4779cd57231ce2e96fac643fcbdd4a6f51a57986264545445574e9c4acf526d3 - md5: 9a99c0b60efe41c194d01c182d000733 - depends: - - __osx >=11.0 - - libcxx >=19 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - pixman >=0.46.4,<1.0a0 - size: 198717 - timestamp: 1786106922508 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda - sha256: 851a77ae1a8e90db9b9f3c4466abea7afb52713c3d98ceb0d37ba6ff27df2eff - md5: 7172339b49c94275ba42fec3eaeda34f - depends: - - __osx >=11.0 - - libcurl >=8.10.1,<9.0a0 - - libcxx >=18 - - libzlib >=1.3.1,<2.0a0 - - zlib - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - prometheus-cpp >=1.3.0,<1.4.0a0 - size: 173220 - timestamp: 1730769371051 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.2.2-py312hb3ab3e3_0.conda - sha256: 6d0e21c76436374635c074208cfeee62a94d3c37d0527ad67fd8a7615e546a05 - md5: fd856899666759403b3c16dcba2f56ff - depends: - - python - - __osx >=11.0 - - python 3.12.* *_cpython - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/psutil?source=hash-mapping - run_exports: {} - size: 239031 - timestamp: 1769678393511 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-h84a0fba_1003.conda - sha256: 1c2338b9b0486af86883b9593d2f3e2845bbf216ea453dfe5d9a228e8dbe4057 - md5: d4852e6054b74645cf49ca10f6349191 - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - purls: [] - run_exports: {} - size: 9238 - timestamp: 1786068031100 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-25.0.0-py312h1f38498_0.conda - sha256: 6dc62ae41f925b968e8e5c9879f77dee3db89fdb94f6ba49f884f0ad2bb945e6 - md5: e936d3c2f56d36ded597eeea76aeed23 - depends: - - libarrow-acero 25.0.0.* - - libarrow-dataset 25.0.0.* - - libarrow-substrait 25.0.0.* - - libparquet 25.0.0.* - - pyarrow-core 25.0.0 *_0_* - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: {} - size: 25882 - timestamp: 1784258390841 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-25.0.0-py312h7d9569a_0_cpu.conda - sha256: 3c7ec6354bf8878f8045af7dd97a170300a9cae9ed430de3beb2ce18e8274bef - md5: 34596f53aa0ba292df864cff850e95fb - depends: - - __osx >=11.0 - - libarrow 25.0.0.* *cpu - - libarrow-compute 25.0.0.* *cpu - - libcxx >=21 - - libzlib >=1.3.2,<2.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - constrains: - - apache-arrow-proc * cpu - - numpy >=1.23,<3 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/pyarrow?source=hash-mapping - run_exports: {} - size: 4371556 - timestamp: 1784258363255 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.13-hd1323d7_1_cpython.conda - build_number: 1 - sha256: b375287c4fa8737c0a44af917d4c2b2cb9cd79e85d224733cd2b46165e9988b1 - md5: c83039bc99cd4b90204ca5c96f7fddda - depends: - - __osx >=11.0 - - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.8.1,<3.0a0 - - libffi >=3.7.0,<3.8.0a0 - - liblzma >=5.8.3,<6.0a0 - - libsqlite >=3.53.4,<4.0a0 - - libzlib >=1.3.2,<2.0a0 - - ncurses >=6.6,<7.0a0 - - openssl >=3.5.7,<4.0a0 - - readline >=8.3,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - constrains: - - python_abi 3.12.* *_cp312 - license: Python-2.0 - purls: [] - run_exports: - weak: - - python_abi 3.12.* *_cp312 - noarch: - - python - size: 13473493 - timestamp: 1786444752563 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-librt-0.15.0-py312hb3ab3e3_0.conda - sha256: a5c239da4d61c2ac48bd19a78e942bdc641ce45e81d44fca14e38c0e004103bf - md5: e25e6dd89dc14c6d1dc82238e77aca41 - depends: - - python - - __osx >=11.0 - - python 3.12.* *_cpython - - python_abi 3.12.* *_cp312 - license: MIT - license_family: MIT - purls: - - pkg:pypi/librt?source=hash-mapping - run_exports: {} - size: 134477 - timestamp: 1786328889869 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pytorch-2.12.1-cpu_generic_py312_h7a5249f_0.conda - sha256: 538726375bf71a9f7d776eeba3964ff049fa888c79ed93d76319127e2a02559d - md5: 93c511e326295c67ccd7864983a5e87a - depends: - - __osx >=12.0 - - filelock - - fmt >=12.1.0,<12.2.0a0 - - fsspec - - jinja2 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libcblas >=3.9.0,<4.0a0 - - libcxx >=19 - - liblapack >=3.9.0,<4.0a0 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libtorch 2.12.1 cpu_generic_h931913c_0 - - libuv >=1.52.1,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - - llvm-openmp >=19.1.7 - - networkx - - nomkl - - numpy >=1.23,<3 - - onednn >=3.12,<4.0a0 - - optree >=0.13.0 - - pybind11 - - pybind11-abi 11 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - setuptools <82 - - sleef >=3.9.0,<4.0a0 - - sympy >=1.13.3 - - typing_extensions >=4.10.0 - constrains: - - pytorch-gpu <0.0a0 - - pytorch-cpu 2.12.1 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/torch?source=project-defined-mapping - run_exports: - weak: - - pytorch >=2.12.1,<2.13.0a0 - - libtorch >=2.12.1,<2.13.0a0 - size: 24290214 - timestamp: 1781831799489 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pytorch-2.13.0-cpu_generic_py312_ha1580ae_2.conda - sha256: d12e7e69b9d67f848d387d3d14b036183758ac295884665770aa4f51779d9d81 - md5: 7cec7dceb9d00ac152786a4c1ad2ec56 - depends: - - __osx >=12.0 - - filelock - - fmt >=12.1.0,<12.2.0a0 - - fsspec - - jinja2 - - libabseil * cxx17* - - libabseil >=20260526.0,<20260527.0a0 - - libcblas >=3.9.0,<4.0a0 - - libcxx >=19 - - liblapack >=3.9.0,<4.0a0 - - libprotobuf >=7.35.1,<7.35.2.0a0 - - libtorch 2.13.0 cpu_generic_hf893bd3_2 - - libuv >=1.52.1,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - - llvm-openmp >=19.1.7 - - networkx - - nomkl - - numpy >=1.25,<3 - - onednn >=3.12,<4.0a0 - - optree >=0.13.0 - - pybind11 - - pybind11-abi 11 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - setuptools <82 - - sleef >=3.9.0,<4.0a0 - - sympy >=1.13.3 - - typing_extensions >=4.10.0 - constrains: - - pytorch-cpu 2.13.0 - - pytorch-gpu <0.0a0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/torch?source=project-defined-mapping - run_exports: - weak: - - pytorch >=2.13.0,<2.14.0a0 - - libtorch >=2.13.0,<2.14.0a0 - size: 25803147 - timestamp: 1786373185693 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py312h04c11ed_1.conda - sha256: 737959262d03c9c305618f2d48c7f1691fb996f14ae420bfd05932635c99f873 - md5: 95a5f0831b5e0b1075bbd80fcffc52ac - depends: - - __osx >=11.0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - yaml >=0.2.5,<0.3.0a0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pyyaml?source=hash-mapping - run_exports: {} - size: 187278 - timestamp: 1770223990452 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda - sha256: 873ac689484262a51fd79bc6103c1a1bedbf524924d7f0088fb80703042805e4 - md5: 6483b1f59526e05d7d894e466b5b6924 - depends: - - __osx >=11.0 - - libcxx >=16 - license: LicenseRef-Qhull - purls: [] - run_exports: - weak: - - qhull >=2020.2,<2020.3.0a0 - size: 516376 - timestamp: 1720814307311 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-h5d60da5_2.conda - sha256: ba1154085d70e8e8f94cfc38a018a13d1a734ff1bcc2ab384e4fc3e532b23066 - md5: a2578dc92c16ab5b6b183cfcdc8e8b79 - depends: - - libre2-11 2025.11.05 h5d15848_2 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - libre2-11 >=2025.11.5 - - re2 - size: 27372 - timestamp: 1781312662146 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h8b90a29_1.conda - sha256: d6782b430e6dce4fe8c7ac118cd988d5a193eb4a7f60741edfaede58016b6110 - md5: 9347fd56a002e6b58946831d48fe62f6 - depends: - - __osx >=11.0 - - ncurses >=6.6,<7.0a0 - license: GPL-3.0-only - license_family: GPL - purls: [] - run_exports: - weak: - - readline >=8.3,<9.0a0 - size: 314395 - timestamp: 1787033878899 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/s2n-1.7.5-h1b28cb6_1.conda - sha256: 47ec36bdd05117c974853a8dbaa9d89605a5f70b592d47c7d198b20252ddf1f4 - md5: 94b3b302cd6c07c5ec68648b25c8c525 - depends: - - __osx >=11.0 - - openssl >=3.5.7,<4.0a0 - license: Apache-2.0 - license_family: Apache - purls: [] - run_exports: - weak: - - s2n >=1.7.5,<1.7.6.0a0 - size: 276705 - timestamp: 1783165153651 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.18.0-py312h4519d97_0.conda - sha256: 708f27ae8ccf62cf714dc5c6f728ae733dc14315c842e935ed7f491d214df2b0 - md5: 5a352ca7e4f49ca6585dd30a4812bd20 - depends: - - __osx >=11.0 - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - libcxx >=19 - - libgfortran - - libgfortran5 >=14.3.0 - - liblapack >=3.9.0,<4.0a0 - - numpy <2.7 - - numpy >=1.23,<3 - - numpy >=2.0.0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/scipy?source=hash-mapping - run_exports: {} - size: 14165071 - timestamp: 1781912652942 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/simple-dftd3-1.5.0-gfortran_h0230218_0.conda - sha256: 28fb2b9eee56960bb1a92c36fc293f6dcdf1d02cca5b92b3dc8c20f3e6dd0249 - md5: 90b058e13bdd4ed0b4f34c99bfe3637d - depends: - - __osx >=11.0 - - libgfortran - - libgfortran5 >=14.4.0 - - llvm-openmp >=19.1.7 - - mctc-lib >=0.5.2,<0.6.0a0 gfortran_* - - toml-f >=0.5.2,<0.6.0a0 gfortran_* - license: LGPL-3.0-or-later - license_family: LGPL - purls: [] - run_exports: - weak: - - simple-dftd3 >=1.5.0,<1.6.0a0 - size: 1070138 - timestamp: 1786373743699 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sleef-3.9.0-hb028509_0.conda - sha256: 799d0578369e67b6d0d6ecdacada411c259629fc4a500b99703c5e85d0a68686 - md5: 68f833178f171cfffdd18854c0e9b7f9 - depends: - - __osx >=11.0 - - libcxx >=19 - - llvm-openmp >=19.1.7 - license: BSL-1.0 - purls: [] - run_exports: - weak: - - sleef >=3.9.0,<4.0a0 - size: 587027 - timestamp: 1756274982526 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.2-hada39a4_1.conda - sha256: cb9305ede19584115f43baecdf09a3866bfcd5bcca0d9e527bd76d9a1dbe2d8d - md5: fca4a2222994acd7f691e57f94b750c5 - depends: - - libcxx >=19 - - __osx >=11.0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - snappy >=1.2.2,<1.3.0a0 - size: 38883 - timestamp: 1762948066818 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-hbeba79b_4.conda - sha256: 857d89087ae7f2c328cf256728affcb7343031a148b4af847334d248a9cf564c - md5: 90a01bf394d1c594e0eb9258f967d828 - depends: - - __osx >=11.0 - - libzlib >=1.3.2,<2.0a0 - license: TCL - purls: [] - run_exports: - weak: - - tk >=8.6.13,<8.7.0a0 - size: 3342183 - timestamp: 1787272852357 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/toml-f-0.5.2-gfortran_h04795c8_0.conda - sha256: 6bf87f425e8aa8e2e429483576ebe4b9355555af4595835f0dd2e8ea7350ea6d - md5: b3ae81fad58ce6929d8d4762d6ed5d04 - depends: - - __osx >=11.0 - - libgfortran - - libgfortran5 >=14.3.0 - license: Apache-2.0 OR MIT - purls: [] - run_exports: - weak: - - toml-f >=0.5.2,<0.6.0a0 - size: 450876 - timestamp: 1782552470226 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.1.0-py312h766f71e_0.conda - sha256: 4d047b1d6e0f4bdd8c43e1b772665de9a10c0649a7f158df8193a3a6e7df714f - md5: e80504aa921f5ab11456f27bd9ef5d25 - depends: - - __osx >=11.0 - - cffi - - libcxx >=19 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - license: MIT - license_family: MIT - purls: - - pkg:pypi/ukkonen?source=hash-mapping - run_exports: {} - size: 14733 - timestamp: 1769439379176 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-17.0.1-py312h2bbb03f_0.conda - sha256: e935d0c11581e31e89ce4899a28b16f924d1a3c1af89f18f8a2c5f5728b3107f - md5: 45b836f333fd3e282c16fff7dc82994e - depends: - - __osx >=11.0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/unicodedata2?source=hash-mapping - run_exports: {} - size: 415828 - timestamp: 1770909782683 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h84a0fba_2.conda - sha256: 5c5ea38ceec008e4ff40111fc166b04086fca310b0aa9e5bd46f65e6b0dcb71d - md5: 31d71ce1b056f69b6ec67ee0712bdf97 - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - xorg-libxau >=1.0.12,<2.0a0 - size: 15124 - timestamp: 1786381585975 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-h84a0fba_2.conda - sha256: 2f6915f0897ace4a1b5d66d0463079f7bc9819b0048c03677e47764f0a743499 - md5: f51e9414bf1b7bb556aac1a0b74a75fe - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - xorg-libxdmcp >=1.1.5,<2.0a0 - size: 19486 - timestamp: 1786381546642 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h74c22ad_3.conda - sha256: 3e78c43207502418fc5fb2317bbbefe5df8b6fc1051d90bdcd1c881c76bb4193 - md5: 31cf6dcc138abe673c9440cd6fe6c6fe - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - purls: [] - run_exports: - weak: - - yaml >=0.2.5,<0.3.0a0 - size: 77530 - timestamp: 1787228556857 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.2-h8088a28_3.conda - sha256: ab46d85e4fcffff1b1c5cac517afa40b7ae784cf76fc9da1f55f6a6934291eb6 - md5: 2c966485853aa27985fbec7e3fcc4e77 - depends: - - __osx >=11.0 - - libzlib 1.3.2 h8088a28_3 - license: Zlib - license_family: Other - purls: [] - run_exports: - weak: - - libzlib >=1.3.2,<2.0a0 - size: 81744 - timestamp: 1785277062753 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.3-h31dac16_1.conda - sha256: 489a29915a3e1b425cff4df10a448f55bbaaf29d777a0f8a9e381444e6a284f1 - md5: 4621ded2fd5b36f51454d5f81bff4ec1 - depends: - - __osx >=11.0 - - libcxx >=21 - license: Zlib - license_family: Other - purls: [] - run_exports: - weak: - - zlib-ng >=2.3.3,<2.4.0a0 - size: 95857 - timestamp: 1786737243497 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hf451053_7.conda - sha256: da867f5092eb0cb746d353694f0098031fd9817a4ce7d5743121209ae0f406ca - md5: 4ec2684c73812cc2c3d78379384a39cc - depends: - - __osx >=11.0 - - libzlib >=1.3.2,<2.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - run_exports: - weak: - - zstd >=1.5.7,<1.6.0a0 - size: 433687 - timestamp: 1786599629846 -- pypi: ./benchmark - name: skala-benchmark - requires_dist: - - jinja2 - - markdown-it-py - - markupsafe - - numpy - - pandas - - pyarrow - - pyscf>=2.14,<2.15 - - pyyaml - - scipy - - skala>=2026.9,<2027 - - torch>=2.12,<2.14 - requires_python: '>=3.11,<3.14' -- pypi: ./model - name: skala-model - requires_dist: - - e3nn - - opt-einsum-fx - - skala>=2026.9,<2027 - - torch>=2.12,<2.14 - requires_python: '>=3.11,<3.14' -- pypi: ./skala - name: skala - requires_dist: - - ase - - huggingface-hub - - numpy - - pyscf>=2.14,<2.15 - - pyscf-dispersion>=1.5 ; sys_platform == 'linux' - - dftd3>=1.5,<2 ; sys_platform == 'darwin' - - torch>=2.12,<2.14 - requires_python: '>=3.11,<3.14' -- pypi: https://files.pythonhosted.org/packages/08/52/eefeba09be4ef2a1eb989eb92934561e8e502a6ee3c32654996e4be7e399/types_pyyaml-6.0.12.20260815-py3-none-any.whl - name: types-pyyaml - version: 6.0.12.20260815 - sha256: 6f332212b7e191f3afd5016a713c510b6340593b7ebec573c7d5d20aa5386d3b - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/0a/9b/9053d2a5a6276352b883d57192ce0bed68b1bc2415b35824ea6942c2c999/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - name: pyscf-dispersion - version: 1.5.0 - sha256: 0b246142cadc752c54700564e15dadb22c006be51ac946601c59ddca21235067 - requires_dist: - - pyscf -- pypi: https://files.pythonhosted.org/packages/2f/d4/c6a2b043e33f0dd012486dcebe0593585588d400175d22aad42049c88321/optype-0.17.1-py3-none-any.whl - name: optype - version: 0.17.1 - sha256: 82f2508ca31cb21e53a41648482d890fe1f5c6cb153720551af41161555adaf1 - requires_dist: - - typing-extensions>=4.10 ; python_full_version < '3.13' - - numpy>=1.26,<2.7 ; extra == 'numpy' - - numpy-typing-compat>=20250818.1.25,<20251207 ; extra == 'numpy' - requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - name: pyscf-dispersion - version: 1.5.0 - sha256: c65aa46f24005794bf8198205a0d83f3431a23333868fbafff43bd82efc2294d - requires_dist: - - pyscf -- pypi: https://files.pythonhosted.org/packages/48/ed/bb4aeb728505b4ce7edd55e9b2e35bcbd99ad0b0cae5c45b59e48b9ed62d/pyscf-2.14.0-py3-none-macosx_11_0_arm64.whl - name: pyscf - version: 2.14.0 - sha256: a4bdc6f4155e258d78c90b4de0c88ab9260a45801264d6c471c3beec83a4da4c - requires_dist: - - numpy>=1.13,!=1.16,!=1.17 - - scipy>=1.6.0 - - h5py>=2.7 - - setuptools - - psutil ; sys_platform == 'win32' - - pyscf-forge ; extra == 'forge' - - pyberny>=0.6.2 ; extra == 'geomopt' - - geometric>=0.9.7.2 ; extra == 'geomopt' - - pyscf-qsdopt ; extra == 'geomopt' - - pyscf-doci ; extra == 'doci' - - pyscf-properties ; extra == 'properties' - - pyscf-semiempirical ; extra == 'semiempirical' - - cppe ; extra == 'cppe' - - pyqmc ; extra == 'pyqmc' - - basis-set-exchange ; extra == 'bse' - - pyscf-dispersion ; extra == 'dispersion' - - coupled-cluster-py ; extra == 'ccpy' - - pyscf[bse,ccpy,cppe,dispersion,doci,forge,geomopt,properties,pyqmc,semiempirical] ; extra == 'all' - - pyscf-cornell-shci ; extra == 'cornell-shci' - - pyscf-nao ; extra == 'nao' - - pyscf-fciqmc ; extra == 'fciqmcscf' - - pyscf-tblis ; extra == 'tblis' - - pyscf-icmpspt ; extra == 'icmpspt' - - pyscf-shciscf ; extra == 'shciscf' - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/4d/57/f53eb30c38aa4eeabddc3bddf283f4c10616de65d95fcd1f43900721f425/geometric-1.1.1.tar.gz - name: geometric - version: 1.1.1 - sha256: c712c4102bb9db4afab4c7a482289a13d04989735cc1430c89ebb73d587d1d8b - requires_dist: - - numpy>=1.11 - - networkx - - six - - scipy -- pypi: https://files.pythonhosted.org/packages/52/a0/c1f604538ff6db22a0690be2dc44ab59178e115f63c917794e529356ab23/h5py-3.16.0-cp311-cp311-manylinux_2_28_x86_64.whl - name: h5py - version: 3.16.0 - sha256: fb1720028d99040792bb2fb31facb8da44a6f29df7697e0b84f0d79aff2e9bd3 - requires_dist: - - numpy>=1.21.2 - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/5a/3e/d7ead2933f8434f264ac8e092c7f3793f982450e4ffa6a6c82fc60014508/gpu4pyscf_cuda13x-1.8.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - name: gpu4pyscf-cuda13x - version: 1.8.1 - sha256: 7b0f675e8595e256f9f39289cda244065979503b741cfafa5c752a655ad695e2 - requires_dist: - - pyscf>=2.8.0 - - pyscf-dispersion - - cupy-cuda13x>=13.0,!=13.4.0 - - geometric - - gpu4pyscf-libxc-cuda13x==0.8.1 - - packaging -- pypi: https://files.pythonhosted.org/packages/60/c2/959caec5c46f484b5f8bb6def4b0cf7a45ba6acda26f12b75142d98cc5ae/pandas_stubs-3.0.5.260730-py3-none-any.whl - name: pandas-stubs - version: 3.0.5.260730 - sha256: 60e90e3e1eda6937e337e243cbe6217e151c11137cd7eddf832af537c7310bfd - requires_dist: - - numpy>=1.23.5 - requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/63/7c/5c2892e6bc0628a2ccf4e938e1e2db22794657ccb374672d66e20d73839e/numpy_typing_compat-20251206.2.4-py3-none-any.whl - name: numpy-typing-compat - version: 20251206.2.4 - sha256: a82e723bd20efaa4cf2886709d4264c144f1f2b609bda83d1545113b7e47a5b5 - requires_dist: - - numpy>=2.4rc1,<2.5 - requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/63/b5/ff337f8db80e67c464846a7d10f7f6bc1039c40a2c8b57ecb90d6b0c11d9/gpu4pyscf_libxc_cuda12x-0.8.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - name: gpu4pyscf-libxc-cuda12x - version: 0.8.1 - sha256: c788f2ca50ef036076754e6167169c957834885430bfc2e23e3b8111942c686a -- pypi: https://files.pythonhosted.org/packages/65/6c/eea1d03e475217aea95b1d52aee09c97575d05bbc592c39c085b71dab89f/pyarrow_stubs-20.0.0.20260819-py3-none-any.whl - name: pyarrow-stubs - version: 20.0.0.20260819 - sha256: 297e60b6e5314739c082b4757d090d8be6047465510eb0684ca954ef7ea58be3 - requires_dist: - - pyarrow>=20 - requires_python: '>=3.9,<4' -- pypi: https://files.pythonhosted.org/packages/7c/5b/65124de2dbaf2e85109f611a41947e39acd6dd938751c04b4c4d7bf6fc82/cupy_cuda12x-14.2.0-cp312-cp312-manylinux2014_x86_64.whl - name: cupy-cuda12x - version: 14.2.0 - sha256: f82141761f2c81905d49387464ae29438887956d99063381c93a1d5d1b7d32e8 - requires_dist: - - numpy>=2.0,<2.6 - - cuda-pathfinder==1.*,>=1.3.4 - - scipy>=1.14,<1.18 ; extra == 'all' - - cython>=3,!=3.2.6 ; extra == 'all' - - optuna>=2.0 ; extra == 'all' - - packaging ; extra == 'test' - - pytest>=7.2 ; extra == 'test' - - hypothesis>=6.37.2,<6.55.0 ; extra == 'test' - - mpmath ; extra == 'test' - - cuda-toolkit[cublas,cudart,cufft,curand,cusolver,cusparse,nvrtc]==12.* ; extra == 'ctk' - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/7e/bf/c4c25e97552320451afdcd459d4b6e0b715459594e998b23051c06db64c3/cupy_cuda13x-14.2.0-cp312-cp312-manylinux2014_x86_64.whl - name: cupy-cuda13x - version: 14.2.0 - sha256: 9aafadbe29db3d4285026044aafeb28f2a3de4bd0df70718ec6892b7d27a4ded - requires_dist: - - numpy>=2.0,<2.6 - - cuda-pathfinder==1.*,>=1.3.4 - - scipy>=1.14,<1.18 ; extra == 'all' - - cython>=3,!=3.2.6 ; extra == 'all' - - optuna>=2.0 ; extra == 'all' - - packaging ; extra == 'test' - - pytest>=7.2 ; extra == 'test' - - hypothesis>=6.37.2,<6.55.0 ; extra == 'test' - - mpmath ; extra == 'test' - - cuda-toolkit[cublas,cudart,cufft,curand,cusolver,cusparse,nvrtc]==13.* ; extra == 'ctk' - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/81/1d/4fcbbf1ad89454d67ef227af32fe07a86a2bdc746c4cf245e105e227e64a/gpu4pyscf_libxc_cuda13x-0.8.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - name: gpu4pyscf-libxc-cuda13x - version: 0.8.1 - sha256: 4d95110689dbcd9cf371e6f2fc812d4a520d8ebda1cf8665ca97d805853d26d6 -- pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - name: pyscf - version: 2.14.0 - sha256: 37b0bccc55450311a55318cd643e851353331ddeab4fc0c0065e83c905e41502 - requires_dist: - - numpy>=1.13,!=1.16,!=1.17 - - scipy>=1.6.0 - - h5py>=2.7 - - setuptools - - psutil ; sys_platform == 'win32' - - pyscf-forge ; extra == 'forge' - - pyberny>=0.6.2 ; extra == 'geomopt' - - geometric>=0.9.7.2 ; extra == 'geomopt' - - pyscf-qsdopt ; extra == 'geomopt' - - pyscf-doci ; extra == 'doci' - - pyscf-properties ; extra == 'properties' - - pyscf-semiempirical ; extra == 'semiempirical' - - cppe ; extra == 'cppe' - - pyqmc ; extra == 'pyqmc' - - basis-set-exchange ; extra == 'bse' - - pyscf-dispersion ; extra == 'dispersion' - - coupled-cluster-py ; extra == 'ccpy' - - pyscf[bse,ccpy,cppe,dispersion,doci,forge,geomopt,properties,pyqmc,semiempirical] ; extra == 'all' - - pyscf-cornell-shci ; extra == 'cornell-shci' - - pyscf-nao ; extra == 'nao' - - pyscf-fciqmc ; extra == 'fciqmcscf' - - pyscf-tblis ; extra == 'tblis' - - pyscf-icmpspt ; extra == 'icmpspt' - - pyscf-shciscf ; extra == 'shciscf' - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/89/84/06281c82d4d1686fde1ac6b0f307c50918f1c0151062445ab3b6fa5a921d/h5py-3.16.0-cp312-cp312-manylinux_2_28_aarch64.whl - name: h5py - version: 3.16.0 - sha256: ff24039e2573297787c3063df64b60aab0591980ac898329a08b0320e0cf2527 - requires_dist: - - numpy>=1.21.2 - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/89/f2/24c58dad0c33ab417c5a090695a6788292d5d4edceae59bad055e5377e92/pyscf-2.14.0-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl - name: pyscf - version: 2.14.0 - sha256: 2c01234a5480e545e5e156d1fabe9b97264bf87ee274c62d14478ab9fe644100 - requires_dist: - - numpy>=1.13,!=1.16,!=1.17 - - scipy>=1.6.0 - - h5py>=2.7 - - setuptools - - psutil ; sys_platform == 'win32' - - pyscf-forge ; extra == 'forge' - - pyberny>=0.6.2 ; extra == 'geomopt' - - geometric>=0.9.7.2 ; extra == 'geomopt' - - pyscf-qsdopt ; extra == 'geomopt' - - pyscf-doci ; extra == 'doci' - - pyscf-properties ; extra == 'properties' - - pyscf-semiempirical ; extra == 'semiempirical' - - cppe ; extra == 'cppe' - - pyqmc ; extra == 'pyqmc' - - basis-set-exchange ; extra == 'bse' - - pyscf-dispersion ; extra == 'dispersion' - - coupled-cluster-py ; extra == 'ccpy' - - pyscf[bse,ccpy,cppe,dispersion,doci,forge,geomopt,properties,pyqmc,semiempirical] ; extra == 'all' - - pyscf-cornell-shci ; extra == 'cornell-shci' - - pyscf-nao ; extra == 'nao' - - pyscf-fciqmc ; extra == 'fciqmcscf' - - pyscf-tblis ; extra == 'tblis' - - pyscf-icmpspt ; extra == 'icmpspt' - - pyscf-shciscf ; extra == 'shciscf' - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/99/a7/6ed6f987f79d6442e553841ddd45439aa90a3992d8e009ccd47e46901814/gpu4pyscf_cuda12x-1.8.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - name: gpu4pyscf-cuda12x - version: 1.8.1 - sha256: 42dd9c619ff587dd393232d39c8894950956bace29d83765ce630bf7ad5d686c - requires_dist: - - pyscf>=2.8.0 - - pyscf-dispersion - - cupy-cuda12x>=13.0,!=13.4.0 - - geometric - - gpu4pyscf-libxc-cuda12x==0.8.1 - - packaging -- pypi: https://files.pythonhosted.org/packages/9e/e9/1a19e42cd43cc1365e127db6aae85e1c671da1d9a5d746f4d34a50edb577/h5py-3.16.0-cp312-cp312-manylinux_2_28_x86_64.whl - name: h5py - version: 3.16.0 - sha256: dfc21898ff025f1e8e67e194965a95a8d4754f452f83454538f98f8a3fcb207e - requires_dist: - - numpy>=1.21.2 - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/b0/42/c84efcc1d4caebafb1ecd8be4643f39c85c47a80fe254d92b8b43b1eadaf/h5py-3.16.0-cp312-cp312-macosx_11_0_arm64.whl - name: h5py - version: 3.16.0 - sha256: 42b012933a83e1a558c673176676a10ce2fd3759976a0fedee1e672d1e04fc9d - requires_dist: - - numpy>=1.21.2 - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/bd/98/ef2b6fe2903e377cbe870c3b2800d62552f1e3dbe81ce49e1923c53d1c5c/h5py-3.16.0-cp313-cp313-manylinux_2_28_x86_64.whl - name: h5py - version: 3.16.0 - sha256: 9300ad32dea9dfc5171f94d5f6948e159ed93e4701280b0f508773b3f582f402 - requires_dist: - - numpy>=1.21.2 - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/e1/26/d4bc2ba3427a623f79a6c10c8f427c7a55b56eb8b3eddc369319d97f741b/scipy_stubs-1.17.1.5-py3-none-any.whl - name: scipy-stubs - version: 1.17.1.5 - sha256: 58ebf054a86c000c72e8982e121c4ead0d3d9ba7a6c38aa5fa71b07f96a427fd - requires_dist: - - optype[numpy]>=0.14.0,<0.18 - - scipy>=1.17.1,<1.18 ; extra == 'scipy' - requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/e3/1e/2942a0d6d52240d439f44384a40c65d359d9ca70325b65b265c020113121/cuda_pathfinder-1.6.1-py3-none-any.whl - name: cuda-pathfinder - version: 1.6.1 - sha256: cc8ec4cb0881fa5bcbf96b6dd75d50e55352b74dd33d4f3d884e192e7c2b6ef8 - requires_python: '>=3.10' diff --git a/pixi.toml b/pixi.toml index b0055110..79c56f00 100644 --- a/pixi.toml +++ b/pixi.toml @@ -30,11 +30,8 @@ opt_einsum_fx = "*" [feature.model-definition.pypi-dependencies] skala-model = { path = "model", editable = true } -[feature.gauxc-python.dependencies] -h5py = "*" - [feature.component-sources.activation.env] -PYTHONPATH = "$PIXI_PROJECT_ROOT/gauxc/src" +PYTHONPATH = "$PIXI_PROJECT_ROOT/model/src:$PIXI_PROJECT_ROOT/benchmark/src" [feature.model-assets.dependencies] huggingface_hub = "*" @@ -85,10 +82,13 @@ pytorch-gpu = "2.12.*" platforms = ["linux-64-cuda12"] [feature.cuda-12.dependencies] -cuda-cudart-dev = ">=12,<13" -cuda-nvrtc = ">=12,<13" -cuda-version = ">=12,<13" +# GCC 14 requires CUDA 12.8 or newer. Keep the runtime toolkit in the same +# compatibility range as the compiler selected by skalaxc-cuda12-build below. +cuda-cudart-dev = ">=12.8,<13" +cuda-nvrtc-dev = ">=12.8,<13" +cuda-version = ">=12.8,<13" cutensor = ">=2" +libcublas-dev = ">=12.8,<13" [feature.cuda-12.pypi-dependencies] gpu4pyscf-cuda12x = "==1.8.1" @@ -98,9 +98,10 @@ platforms = ["linux-64-cuda13"] [feature.cuda-13.dependencies] cuda-cudart-dev = ">=13,<14" -cuda-nvrtc = ">=13,<14" +cuda-nvrtc-dev = ">=13,<14" cuda-version = ">=13,<14" cutensor = ">=2" +libcublas-dev = ">=13,<14" [feature.cuda-13.pypi-dependencies] gpu4pyscf-cuda13x = "==1.8.1" @@ -152,7 +153,7 @@ sphinxcontrib-moderncmakedomain = "*" python-build = "*" [feature.native-toolchain] -platforms = ["linux-64", "linux-64-cuda12"] +platforms = ["linux-64", "linux-aarch64", "osx-arm64", "linux-64-cuda12", "linux-64-cuda13"] [feature.native-toolchain.dependencies] c-compiler = "*" @@ -161,54 +162,141 @@ cxx-compiler = "*" ninja = "*" nlohmann_json = ">=3.9" +[feature.native-toolchain.activation.env] +CC = "$CONDA_PREFIX/bin/cc" +CXX = "$CONDA_PREFIX/bin/c++" + [feature.fortran] -platforms = ["linux-64"] +platforms = ["linux-64", "linux-aarch64", "osx-arm64", "linux-64-cuda12", "linux-64-cuda13"] [feature.fortran.dependencies] fortran-compiler = "*" -[feature.hdf5-serial] -platforms = ["linux-64", "linux-64-cuda12"] +[feature.fortran.activation.env] +FC = "$CONDA_PREFIX/bin/gfortran" -[feature.hdf5-serial.dependencies] -hdf5 = { version = "*", build = "nompi_*" } - -[feature.mpi] -platforms = ["linux-64"] +[feature.skalaxc-core.dependencies] +catch2 = "2.*" +eigen = ">=5,<6" +git = "*" +hdf5 = "*" +libblas = "*" +liblapack = "*" +pkg-config = "*" -[feature.mpi.dependencies] -hdf5 = { version = "*", build = "mpi_openmpi_*" } +[feature.skalaxc-mpi.dependencies] openmpi = "*" -[feature.gauxc-core] -platforms = ["linux-64", "linux-64-cuda12"] +[feature.skalaxc-python.dependencies] +h5py = "*" +mpi4py = ">=4" +mypy = ">=1.11" +nanobind = ">=2.4" +pip = "*" +scikit-build-core = ">=0.11" -[feature.gauxc-core.dependencies] -gau2grid = ">=2.0.6" -integratorxx = ">=1.0" -libblas = "*" +[feature.skalaxc-core.target.osx-arm64.dependencies] +llvm-openmp = "*" -[feature.gauxc-cpu] +[feature.skalaxc-clang] platforms = ["linux-64"] -[feature.gauxc-cpu.dependencies] -exchcxx = { version = ">=1.0", build = "cpu_*" } +[feature.skalaxc-clang.dependencies] +clang_linux-64 = "22.*" +clangxx_linux-64 = "22.*" +clang-tools = "22.*" +cmake = ">=3.21,<4" +llvm-openmp = "*" +ninja = "*" +nlohmann_json = ">=3.9" + +[feature.skalaxc-clang.activation.env] +CC = "$CONDA_PREFIX/bin/x86_64-conda-linux-gnu-clang" +CXX = "$CONDA_PREFIX/bin/x86_64-conda-linux-gnu-clang++" -[feature.gauxc-cuda12] +[feature.skalaxc-cuda12-build] platforms = ["linux-64-cuda12"] -[feature.gauxc-cuda12.dependencies] -cuda-compiler = ">=12,<13" -cuda-nvrtc-dev = ">=12,<13" -cuda-version = ">=12,<13" -exchcxx = { version = ">=1.0", build = "cuda*" } -libcublas-dev = ">=12,<13" -libcusparse-dev = ">=12,<13" -libmagma-devel = ">=2.10,<2.11" +[feature.skalaxc-cuda12-build.dependencies] +# PyTorch's CUDA compiler bounds require GCC <15 for CUDA 12.8/12.9. +# Pin nvcc as well: an unconstrained build dependency can otherwise combine +# CUDA 13 nvcc/GCC 15 with CUDA 12 headers from the host environment. +cuda-compiler = ">=12.8,<13" +gcc_linux-64 = "14.*" +gfortran_linux-64 = "14.*" +gxx_linux-64 = "14.*" + +[feature.skalaxc-cuda12-build.activation.env] +CUDACXX = "$CONDA_PREFIX/bin/nvcc" + +[feature.skalaxc-cuda13-build] +platforms = ["linux-64-cuda13"] + +[feature.skalaxc-cuda13-build.dependencies] +# CUDA 13 supports GCC 15; keep this compiler family independent of the CUDA +# 12 pin and of unconstrained CPU toolchains. +cuda-compiler = ">=13,<14" +gcc_linux-64 = "15.*" +gfortran_linux-64 = "15.*" +gxx_linux-64 = "15.*" + +[feature.skalaxc-cuda13-build.activation.env] +CUDACXX = "$CONDA_PREFIX/bin/nvcc" + +[feature.skalaxc-cuda13-clang-build] +platforms = ["linux-64-cuda13"] + +[feature.skalaxc-cuda13-clang-build.dependencies] +# Clang 20 is within PyTorch's conservative CUDA 13 bound (Clang <21). +clang_linux-64 = "20.*" +clangxx_linux-64 = "20.*" +cmake = ">=3.21,<4" +cuda-compiler = ">=13,<14" +llvm-openmp = "*" +ninja = "*" +nlohmann_json = ">=3.9" + +[feature.skalaxc-cuda13-clang-build.activation.env] +CC = "$CONDA_PREFIX/bin/x86_64-conda-linux-gnu-clang" +CUDACXX = "$CONDA_PREFIX/bin/nvcc" +CUDAHOSTCXX = "$CONDA_PREFIX/bin/x86_64-conda-linux-gnu-clang++" +CXX = "$CONDA_PREFIX/bin/x86_64-conda-linux-gnu-clang++" + +[feature.skalaxc-tools] +platforms = ["linux-64"] + +[feature.skalaxc-tools.dependencies] +clang-tools = "22.*" +cmake = ">=3.21,<4" +doxygen = ">=1.9" + +[feature.skalaxc-package] +platforms = ["linux-64", "linux-aarch64", "osx-arm64"] + +[feature.skalaxc-package.dependencies] +rattler-build = "0.74.*" + +[feature.skalaxc-parity] +platforms = ["linux-64"] + +[feature.skalaxc-core.tasks] +skalaxc-configure-host = { cmd = "cmake -S SkalaXC -B SkalaXC/build-pixi-host -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$PIXI_PROJECT_ROOT/SkalaXC/install-pixi-host -DSKALAXC_BUILD_FORTRAN=ON -DSKALAXC_BUILD_TESTS=ON -DSKALAXC_BUILD_EXAMPLES=ON -DSKALAXC_DOWNLOAD_MODELS=ON -DSKALAXC_ENABLE_CUDA=OFF -DSKALAXC_ENABLE_MPI=OFF -DSKALAXC_ENABLE_OPENMP=ON -DSKALAXC_ENABLE_SANITIZERS=OFF" } +skalaxc-build-host = { cmd = "cmake --build SkalaXC/build-pixi-host --parallel 2", depends-on = ["skalaxc-configure-host"] } +skalaxc-test-host = { cmd = "ctest --test-dir SkalaXC/build-pixi-host --output-on-failure", depends-on = ["skalaxc-build-host"], env = { OMP_NUM_THREADS = "4", SKALAXC_TEST_SEED = "20260729" } } +skalaxc-test-abi = { cmd = "ctest --test-dir SkalaXC/build-pixi-host -R 'skalaxc_abi\\.(exported_symbols|c_consumer_dependencies)' --output-on-failure", depends-on = ["skalaxc-build-host"], env = { OMP_NUM_THREADS = "4" } } +skalaxc-install-core = { cmd = "cmake -E rm -rf SkalaXC/install-pixi-core && cmake --install SkalaXC/build-pixi-host --prefix SkalaXC/install-pixi-core --component Core", depends-on = ["skalaxc-build-host"] } +skalaxc-install-full = { cmd = "cmake -E rm -rf SkalaXC/install-pixi-full && cmake --install SkalaXC/build-pixi-host --prefix SkalaXC/install-pixi-full", depends-on = ["skalaxc-build-host"] } +skalaxc-test-installed-core = { cmd = "cmake -E rm -rf SkalaXC/build-pixi-consumer-core && cmake -S SkalaXC/tests/installed -B SkalaXC/build-pixi-consumer-core -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=$PIXI_PROJECT_ROOT/SkalaXC/install-pixi-core -DSKALAXC_TEST_FORTRAN=OFF -DSKALAXC_EXPECT_FORTRAN_UNAVAILABLE=ON && cmake --build SkalaXC/build-pixi-consumer-core --parallel 2 && ctest --test-dir SkalaXC/build-pixi-consumer-core --output-on-failure", depends-on = ["skalaxc-install-core"], env = { OMP_NUM_THREADS = "4" } } +skalaxc-test-installed-full = { cmd = "cmake -E rm -rf SkalaXC/build-pixi-consumer-full && cmake -S SkalaXC/tests/installed -B SkalaXC/build-pixi-consumer-full -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=$PIXI_PROJECT_ROOT/SkalaXC/install-pixi-full -DSKALAXC_TEST_FORTRAN=ON -DSKALAXC_EXPECT_FORTRAN_UNAVAILABLE=OFF && cmake --build SkalaXC/build-pixi-consumer-full --parallel 2 && ctest --test-dir SkalaXC/build-pixi-consumer-full --output-on-failure", depends-on = ["skalaxc-install-full"], env = { OMP_NUM_THREADS = "4" } } +skalaxc-configure-sanitizer = { cmd = "cmake -S SkalaXC -B SkalaXC/build-pixi-sanitizer -G Ninja -DCMAKE_BUILD_TYPE=Debug -DSKALAXC_BUILD_FORTRAN=OFF -DSKALAXC_BUILD_TESTS=ON -DSKALAXC_BUILD_EXAMPLES=OFF -DSKALAXC_DOWNLOAD_MODELS=ON -DSKALAXC_ENABLE_CUDA=OFF -DSKALAXC_ENABLE_MPI=OFF -DSKALAXC_ENABLE_OPENMP=OFF -DSKALAXC_ENABLE_SANITIZERS=ON" } +skalaxc-test-sanitizer = { cmd = "cmake --build SkalaXC/build-pixi-sanitizer --target skalaxc_unit_test --parallel 2 && SkalaXC/build-pixi-sanitizer/tests/skalaxc_unit_test '[skala][stress]'", depends-on = ["skalaxc-configure-sanitizer"], env = { OMP_NUM_THREADS = "4", ASAN_OPTIONS = "detect_leaks=1:halt_on_error=1", UBSAN_OPTIONS = "halt_on_error=1:print_stacktrace=1", SKALAXC_MODEL_PATH = "$PIXI_PROJECT_ROOT/SkalaXC/build-pixi-sanitizer/data/skala_models" } } +skalaxc-configure-clang-tidy = { cmd = "cmake -S SkalaXC -B SkalaXC/build-pixi-clang-tidy -G Ninja -DCMAKE_BUILD_TYPE=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DSKALAXC_BUILD_FORTRAN=OFF -DSKALAXC_BUILD_TESTS=OFF -DSKALAXC_BUILD_EXAMPLES=ON -DSKALAXC_DOWNLOAD_MODELS=OFF -DSKALAXC_ENABLE_CUDA=OFF -DSKALAXC_ENABLE_MPI=OFF -DSKALAXC_ENABLE_OPENMP=ON -DSKALAXC_ENABLE_SANITIZERS=OFF" } +skalaxc-clang-tidy = { cmd = "run-clang-tidy -p SkalaXC/build-pixi-clang-tidy -j 2 -config-file SkalaXC/.clang-tidy -header-filter '^.*/SkalaXC/(include|src|tests|examples)/' '^.*/SkalaXC/(src|tests|examples)/.*\\.(cc|cpp|cxx)$'", depends-on = ["skalaxc-configure-clang-tidy"] } +skalaxc-doxygen = { cmd = "cmake -DSKALAXC_DOXYGEN_SOURCE_DIR=$PIXI_PROJECT_ROOT/SkalaXC -DSKALAXC_DOXYGEN_BINARY_DIR=$PIXI_PROJECT_ROOT/SkalaXC/build-pixi-doxygen -DSKALAXC_DOXYGEN_PROJECT_VERSION=development -P SkalaXC/cmake/skalaxc-doxygen.cmake && doxygen SkalaXC/build-pixi-doxygen/Doxyfile" } [environments] -default = { features = ["python-runtime", "model-definition", "gauxc-python", "component-sources", "model-assets", "python-312", "pyscf-214", "dispersion", "torch-213-cpu", "test", "lint", "profiling", "benchmark"], no-default-feature = true, platforms = ["linux-64", "linux-aarch64", "osx-arm64"] } -lint = { features = ["python-runtime", "model-definition", "gauxc-python", "component-sources", "model-assets", "python-312", "pyscf-214", "dispersion", "torch-213-cpu", "test", "lint", "profiling", "benchmark"], no-default-feature = true, platforms = ["linux-64"] } +default = { features = ["python-runtime", "model-definition", "component-sources", "model-assets", "python-312", "pyscf-214", "dispersion", "torch-213-cpu", "test", "lint", "profiling", "benchmark"], no-default-feature = true, platforms = ["linux-64", "linux-aarch64", "osx-arm64"] } +lint = { features = ["python-runtime", "model-definition", "component-sources", "model-assets", "python-312", "pyscf-214", "dispersion", "torch-213-cpu", "test", "lint", "profiling", "benchmark"], no-default-feature = true, platforms = ["linux-64"] } test-py311-pyscf214-torch213 = { features = ["python-runtime", "model-assets", "python-311", "pyscf-214", "dispersion", "torch-213-cpu", "test"], no-default-feature = true, platforms = ["linux-64"] } test-py312-pyscf214-torch212 = { features = ["python-runtime", "component-sources", "model-assets", "python-312", "pyscf-214", "dispersion", "torch-212-cpu", "test", "profiling", "benchmark"], no-default-feature = true, platforms = ["linux-64", "linux-aarch64", "osx-arm64"] } test-py312-pyscf214-torch213 = { features = ["python-runtime", "component-sources", "model-assets", "python-312", "pyscf-214", "dispersion", "torch-213-cpu", "test", "profiling", "benchmark"], no-default-feature = true, platforms = ["linux-64", "linux-aarch64", "osx-arm64"] } @@ -220,9 +308,12 @@ docs = { features = ["python-runtime", "component-sources", "model-assets", "pyt assets = { features = ["python-312", "model-assets"], no-default-feature = true, platforms = ["linux-64"] } release = { features = ["python-312", "release"], no-default-feature = true, platforms = ["linux-64"] } cpp-integration = { features = ["python-runtime", "model-definition", "component-sources", "model-assets", "python-312", "pyscf-214", "dispersion", "torch-213-cpu", "native-toolchain"], no-default-feature = true, platforms = ["linux-64"] } -gauxc-openmp = { features = ["python-312", "torch-213-cpu", "native-toolchain", "gauxc-core", "gauxc-cpu", "hdf5-serial"], no-default-feature = true, platforms = ["linux-64"] } -gauxc-openmp-fortran = { features = ["python-312", "torch-213-cpu", "native-toolchain", "fortran", "gauxc-core", "gauxc-cpu", "hdf5-serial"], no-default-feature = true, platforms = ["linux-64"] } -gauxc-mpi = { features = ["python-312", "torch-213-cpu", "native-toolchain", "gauxc-core", "gauxc-cpu", "mpi"], no-default-feature = true, platforms = ["linux-64"] } -gauxc-mpi-fortran = { features = ["python-312", "torch-213-cpu", "native-toolchain", "fortran", "gauxc-core", "gauxc-cpu", "mpi"], no-default-feature = true, platforms = ["linux-64"] } -gauxc-cuda12 = { features = ["python-312", "torch-213-gpu", "native-toolchain", "gauxc-core", "gauxc-cuda12", "hdf5-serial"], no-default-feature = true, platforms = ["linux-64-cuda12"] } ftorch = { features = ["python-312", "model-assets", "torch-213-cpu", "native-toolchain", "fortran"], no-default-feature = true, platforms = ["linux-64"] } +skalaxc-host = { features = ["python-312", "torch-213-cpu", "native-toolchain", "fortran", "skalaxc-core", "skalaxc-mpi", "skalaxc-python", "test"], no-default-feature = true, platforms = ["linux-64", "linux-aarch64", "osx-arm64"] } +skalaxc-host-clang = { features = ["python-312", "torch-213-cpu", "fortran", "skalaxc-core", "skalaxc-mpi", "skalaxc-python", "skalaxc-clang", "test"], no-default-feature = true, platforms = ["linux-64"] } +skalaxc-cuda12 = { features = ["python-runtime", "model-assets", "python-312", "pyscf-214", "torch-213-gpu", "cuda-12", "native-toolchain", "fortran", "skalaxc-core", "skalaxc-mpi", "skalaxc-python", "skalaxc-cuda12-build", "test"], no-default-feature = true, platforms = ["linux-64-cuda12"] } +skalaxc-cuda13 = { features = ["python-runtime", "model-assets", "python-312", "pyscf-214", "torch-213-gpu", "cuda-13", "native-toolchain", "fortran", "skalaxc-core", "skalaxc-mpi", "skalaxc-python", "skalaxc-cuda13-build", "test"], no-default-feature = true, platforms = ["linux-64-cuda13"] } +skalaxc-cuda13-clang = { features = ["python-runtime", "model-assets", "python-312", "pyscf-214", "torch-213-gpu", "cuda-13", "fortran", "skalaxc-core", "skalaxc-mpi", "skalaxc-python", "skalaxc-cuda13-clang-build", "test"], no-default-feature = true, platforms = ["linux-64-cuda13"] } +skalaxc-parity = { features = ["python-runtime", "model-assets", "python-312", "pyscf-214", "torch-213-cpu", "native-toolchain", "skalaxc-core", "skalaxc-python", "skalaxc-parity", "test"], no-default-feature = true, platforms = ["linux-64"] } +skalaxc-tools = { features = ["python-312", "torch-213-cpu", "skalaxc-core", "skalaxc-tools"], no-default-feature = true, platforms = ["linux-64"] } +skalaxc-package = { features = ["skalaxc-package"], no-default-feature = true, platforms = ["linux-64", "linux-aarch64", "osx-arm64"] } diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 00000000..548d2d44 --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1 @@ +# SPDX-License-Identifier: MIT diff --git a/tests/skalaxc_test_utils.py b/tests/skalaxc_test_utils.py new file mode 100644 index 00000000..cb34d72a --- /dev/null +++ b/tests/skalaxc_test_utils.py @@ -0,0 +1,143 @@ +# SPDX-License-Identifier: MIT + +"""Test-only conversion from PySCF objects to SkalaXC Python objects.""" + +import os +from dataclasses import dataclass +from typing import Any + +import numpy as np +import numpy.typing as npt +import skalaxc + +from pyscf import gto + +SKALA_1_1_REV1_SHA256 = ( + "7f3e8622e1eb520ccd88a55464c3e359ac4d7e5ccbd1fb77a26afa1e1c20a5cd" +) +SKALA_1_1_REV1_CUDA_SHA256 = ( + "f848eae769dca91741a518ae7275d10caac398ab21db649f91bc1f136872f223" +) + + +@dataclass(frozen=True) +class ParityTolerances: + """Absolute tolerances for fixed-density cross-backend observables.""" + + energy: float + scalar_potential: float + spin_potential: float + gradient: float + + +def pyscf_to_skalaxc( + pyscf_molecule: gto.Mole, +) -> tuple[skalaxc.Molecule, skalaxc.BasisSet]: + """Construct SkalaXC molecule and basis objects from a PySCF molecule.""" + molecule = skalaxc.Molecule() + coordinates = pyscf_molecule.atom_coords(unit="Bohr") + for atomic_number, center in zip( + pyscf_molecule.atom_charges(), coordinates, strict=True + ): + molecule.append( + skalaxc.Atom( + int(atomic_number), + float(center[0]), + float(center[1]), + float(center[2]), + ) + ) + + basis = skalaxc.BasisSet() + for atom_index, (atom_label, _) in enumerate(pyscf_molecule._atom): + center = coordinates[atom_index].tolist() + for pyscf_shell in pyscf_molecule._basis[atom_label]: + angular_momentum = int(pyscf_shell[0]) + primitives = pyscf_shell[1:] + exponents = [float(primitive[0]) for primitive in primitives] + for contraction_index in range(1, len(primitives[0])): + coefficients = [ + float(primitive[contraction_index]) for primitive in primitives + ] + basis.append( + skalaxc.Shell( + angular_momentum, + not pyscf_molecule.cart and angular_momentum != 1, + exponents, + coefficients, + center, + normalize=True, + ) + ) + + return molecule, basis + + +def uks_density_channels( + density: npt.NDArray[np.float64], +) -> tuple[npt.NDArray[np.float64], npt.NDArray[np.float64]]: + """Convert alpha/beta density matrices to scalar/spin-z matrices.""" + density_array = np.asarray(density, dtype=np.float64) + if density_array.ndim != 3 or density_array.shape[0] != 2: + raise ValueError( + f"Expected UKS density shape (2, nbf, nbf), got {density_array.shape}" + ) + if density_array.shape[1] != density_array.shape[2]: + raise ValueError( + f"Expected square UKS density matrices, got {density_array.shape}" + ) + + scalar_density = np.asfortranarray(density_array[0] + density_array[1]) + spin_density = np.asfortranarray(density_array[0] - density_array[1]) + return scalar_density, spin_density + + +def make_skalaxc_integrator( + pyscf_molecule: gto.Mole, + model: str, + execution_space: skalaxc.ExecutionSpace = skalaxc.ExecutionSpace.HOST, + grid_size: skalaxc.AtomicGridSize = skalaxc.AtomicGridSize.ULTRA_FINE, + device_memory_fraction: float = 0.5, + device_memory_cap_bytes: int = 1024**3, +) -> skalaxc.XCIntegrator: + """Construct a weighted SkalaXC integrator directly from a PySCF molecule.""" + runtime_environment: Any = skalaxc.RuntimeEnvironment + molecule, basis = pyscf_to_skalaxc(pyscf_molecule) + grid = skalaxc.MolGridFactory.create_default( + molecule, + pruning_scheme=skalaxc.PruningScheme.UNPRUNED, + radial_quad=skalaxc.RadialQuad.MURA_KNOWLES, + grid_size=grid_size, + ) + if skalaxc.CUDA_ENABLED and execution_space != skalaxc.ExecutionSpace.HOST: + device_settings = skalaxc.DeviceRuntimeSettings() + device_settings.memory_fraction = device_memory_fraction + memory_cap_variable = "GAUXC_DEVICE_MEMORY_CAP" + previous_memory_cap = os.environ.get(memory_cap_variable) + if previous_memory_cap is None: + os.environ[memory_cap_variable] = str(device_memory_cap_bytes) + try: + if skalaxc.MPI_ENABLED: + from mpi4py import MPI + + runtime = runtime_environment(MPI.COMM_SELF, device_settings) + else: + runtime = runtime_environment(device_settings) + finally: + if previous_memory_cap is None: + del os.environ[memory_cap_variable] + elif skalaxc.MPI_ENABLED: + from mpi4py import MPI + + runtime = runtime_environment(MPI.COMM_SELF) + else: + runtime = runtime_environment() + + load_balancer = skalaxc.LoadBalancerFactory(execution_space).get_instance( + runtime, molecule, grid, basis + ) + weights = skalaxc.MolecularWeightsFactory(execution_space).get_instance() + weights.modify_weights(load_balancer) + return skalaxc.XCIntegratorFactory(execution_space).get_instance( + skalaxc.Functional(model), load_balancer + ) diff --git a/tests/test_pyscf_skalaxc_gpu_parity.py b/tests/test_pyscf_skalaxc_gpu_parity.py new file mode 100644 index 00000000..85d91fc4 --- /dev/null +++ b/tests/test_pyscf_skalaxc_gpu_parity.py @@ -0,0 +1,235 @@ +# SPDX-License-Identifier: MIT + +"""Fixed-density parity tests between GPU4PySCF Skala and SkalaXC CUDA.""" + +import hashlib +from collections.abc import Generator +from dataclasses import dataclass + +import numpy as np +import numpy.typing as npt +import pytest +import skalaxc +import torch +from skala.functional import load_functional +from skala.functional.base import ExcFunctionalBase + +from pyscf import dft, gto, scf +from tests.skalaxc_test_utils import ( + SKALA_1_1_REV1_CUDA_SHA256, + ParityTolerances, + make_skalaxc_integrator, + uks_density_channels, +) + +pytestmark = pytest.mark.gpu + +if not torch.cuda.is_available(): + pytest.skip("CUDA is not available", allow_module_level=True) +if not skalaxc.CUDA_ENABLED: + pytest.skip("SkalaXC was built without CUDA", allow_module_level=True) +pytest.importorskip("cupy", reason="CuPy is not available") +pytest.importorskip("gpu4pyscf", reason="GPU4PySCF is not available") +DEVICE_EXECUTION_SPACE = skalaxc.ExecutionSpace.DEVICE + +from skala.gpu4pyscf.gradients import ( # noqa: E402 + nuc_grad_from_veff, + veff_and_expl_nuc_grad, +) +from skala.gpu4pyscf.grids import SkalaGrids # noqa: E402 +from skala.pyscf.xc_integrator import XCIntegrator # noqa: E402 + + +@dataclass(frozen=True) +class FunctionalCase: + name: str + functional: ExcFunctionalBase + model: str + tolerances: ParityTolerances + + +GPU_TOLERANCES = { + "lda": ParityTolerances(1e-7, 1.5e-8, 2e-9, 7.5e-6), + "pbe": ParityTolerances(1e-7, 1.5e-8, 3e-9, 7.5e-6), + "tpss": ParityTolerances(1e-7, 4e-8, 1.5e-8, 7.5e-6), + "skala-1.1": ParityTolerances(7.5e-5, 2.5e-4, 2.5e-4, 1e-4), +} +FUNCTIONAL_NAMES = ("lda", "pbe", "tpss", "skala-1.1") +# The current TPSS TorchScript trace can exceed sm_120 launch resources during +# backward. Keep its EXC/VXC coverage and use neural Skala for the primary +# kinetic-density gradient path until TPSS is retraced with a smaller kernel. +GRADIENT_FUNCTIONAL_NAMES = ("lda", "pbe", "skala-1.1") + + +@pytest.fixture(scope="module") +def molecule() -> gto.Mole: + return gto.M( + atom="O 0 0 0; H 0 0 1.1", + basis="def2-svp", + spin=1, + cart=False, + unit="Angstrom", + verbose=0, + ) + + +@pytest.fixture(scope="module") +def density(molecule: gto.Mole) -> npt.NDArray[np.float64]: + mean_field = scf.UHF(molecule) + mean_field.chkfile = None + mean_field.conv_tol = 1e-12 + mean_field.kernel() + assert mean_field.converged + result = np.asarray(mean_field.make_rdm1(), dtype=np.float64) + assert result.shape == (2, molecule.nao_nr(), molecule.nao_nr()) + return result + + +@pytest.fixture(scope="module") +def gpu4pyscf_grid(molecule: gto.Mole) -> SkalaGrids: + grid = SkalaGrids(molecule) + grid.level = 5 + grid.prune = None + grid.radi_method = dft.radi.mura_knowles + grid.build() + return grid + + +@pytest.fixture +def functional_case( + request: pytest.FixtureRequest, +) -> FunctionalCase: + name = str(request.param) + device = torch.device("cuda:0") + loaded_functional = load_functional(name, device=device) + assert isinstance(loaded_functional, ExcFunctionalBase) + if name == "skala-1.1": + model_path = skalaxc.MODEL_DIR / "skala-1.1-cuda.fun" + with model_path.open("rb") as model_file: + digest = hashlib.file_digest(model_file, "sha256").hexdigest() + assert digest == SKALA_1_1_REV1_CUDA_SHA256 + model = str(model_path) + else: + model = name.upper() + return FunctionalCase( + name, + loaded_functional, + model, + GPU_TOLERANCES[name], + ) + + +def _matrix_error( + actual: npt.NDArray[np.float64], expected: npt.NDArray[np.float64] +) -> float: + return float(np.linalg.norm(actual - expected) / actual.shape[0]) + + +def _fixed_density_xc_gradient( + functional: ExcFunctionalBase, + molecule: gto.Mole, + grid: SkalaGrids, + density: npt.NDArray[np.float64], +) -> npt.NDArray[np.float64]: + density_tensor = torch.as_tensor(density, device="cuda:0") + effective_potential, explicit_gradient = veff_and_expl_nuc_grad( + functional, + molecule, + grid, + density_tensor, + ) + contracted_gradient = 2 * nuc_grad_from_veff( + molecule, + effective_potential, + density_tensor, + ) + return (contracted_gradient + explicit_gradient).detach().cpu().numpy() + + +def _release_torch_cache() -> None: + torch.cuda.synchronize() + torch.cuda.empty_cache() + + +@pytest.fixture(autouse=True) +def release_torch_cache_after_test() -> Generator[None, None, None]: + """Release unused CUDA allocator blocks between parameterized cases.""" + yield + _release_torch_cache() + + +@pytest.mark.parametrize("functional_case", FUNCTIONAL_NAMES, indirect=True) +def test_gpu_exc_vxc_parity( + functional_case: FunctionalCase, + molecule: gto.Mole, + density: npt.NDArray[np.float64], + gpu4pyscf_grid: SkalaGrids, +) -> None: + density_tensor = torch.as_tensor(density, device="cuda:0") + gpu4pyscf_result = XCIntegrator( + functional_case.functional, + device=torch.device("cuda:0"), + )(molecule, gpu4pyscf_grid, density_tensor) + gpu4pyscf_energy = gpu4pyscf_result.energy.item() + gpu4pyscf_potential = gpu4pyscf_result.potential.detach().cpu().numpy() + del gpu4pyscf_result, density_tensor + _release_torch_cache() + + scalar_density, spin_density = uks_density_channels(density) + integrator = make_skalaxc_integrator( + molecule, + functional_case.model, + execution_space=DEVICE_EXECUTION_SPACE, + ) + energy, scalar_potential, spin_potential = integrator.eval_exc_vxc( + scalar_density, + spin_density, + ) + + expected_scalar = (gpu4pyscf_potential[0] + gpu4pyscf_potential[1]) / 2 + expected_spin = (gpu4pyscf_potential[0] - gpu4pyscf_potential[1]) / 2 + energy_error = abs(energy - gpu4pyscf_energy) + scalar_error = _matrix_error(scalar_potential, expected_scalar) + spin_error = _matrix_error(spin_potential, expected_spin) + + assert energy_error < functional_case.tolerances.energy, ( + f"{functional_case.name} GPU XC energy error: {energy_error:.3e}" + ) + assert scalar_error < functional_case.tolerances.scalar_potential, ( + f"{functional_case.name} GPU scalar VXC error per basis function: " + f"{scalar_error:.3e}" + ) + assert spin_error < functional_case.tolerances.spin_potential, ( + f"{functional_case.name} GPU spin-z VXC error per basis function: " + f"{spin_error:.3e}" + ) + + +@pytest.mark.parametrize("functional_case", GRADIENT_FUNCTIONAL_NAMES, indirect=True) +def test_gpu_exc_gradient_parity( + functional_case: FunctionalCase, + molecule: gto.Mole, + density: npt.NDArray[np.float64], + gpu4pyscf_grid: SkalaGrids, +) -> None: + gpu4pyscf_gradient = _fixed_density_xc_gradient( + functional_case.functional, + molecule, + gpu4pyscf_grid, + density, + ) + _release_torch_cache() + + scalar_density, spin_density = uks_density_channels(density) + integrator = make_skalaxc_integrator( + molecule, + functional_case.model, + execution_space=DEVICE_EXECUTION_SPACE, + ) + skalaxc_gradient = integrator.eval_exc_grad(scalar_density, spin_density) + max_error = float(np.max(np.abs(skalaxc_gradient - gpu4pyscf_gradient))) + + assert max_error < functional_case.tolerances.gradient, ( + f"{functional_case.name} GPU XC gradient max error: {max_error:.3e}\n" + f"GPU4PySCF:\n{gpu4pyscf_gradient}\nSkalaXC:\n{skalaxc_gradient}" + ) diff --git a/tests/test_pyscf_skalaxc_parity.py b/tests/test_pyscf_skalaxc_parity.py new file mode 100644 index 00000000..ddd21cb5 --- /dev/null +++ b/tests/test_pyscf_skalaxc_parity.py @@ -0,0 +1,219 @@ +# SPDX-License-Identifier: MIT + +"""Fixed-density parity tests between Python Skala/PySCF and SkalaXC.""" + +import hashlib +from dataclasses import dataclass + +import numpy as np +import numpy.typing as npt +import pytest +import skalaxc +import torch +from skala.functional import FunctionalArtifact, load_functional +from skala.functional.base import ExcFunctionalBase +from skala.pyscf.gradients import veff_and_expl_nuc_grad +from skala.pyscf.grids import SkalaGrids +from skala.pyscf.xc_integrator import XCIntegrator + +from pyscf import dft, gto, scf +from tests.skalaxc_test_utils import ( + SKALA_1_1_REV1_SHA256, + ParityTolerances, + make_skalaxc_integrator, + pyscf_to_skalaxc, + uks_density_channels, +) + + +@dataclass(frozen=True) +class FunctionalCase: + name: str + functional: ExcFunctionalBase + integrator: skalaxc.XCIntegrator + tolerances: ParityTolerances + + +CPU_TOLERANCES = { + "lda": ParityTolerances(1e-7, 1.5e-8, 2e-9, 7.5e-6), + "pbe": ParityTolerances(1e-7, 1.5e-8, 3e-9, 7.5e-6), + "tpss": ParityTolerances(1e-7, 4e-8, 1.5e-8, 7.5e-6), + "skala-1.1": ParityTolerances(7.5e-5, 2.5e-4, 2.5e-4, 1e-4), +} + + +@pytest.fixture(scope="module") +def molecule() -> gto.Mole: + return gto.M( + atom="O 0 0 0; H 0 0 1.1", + basis="def2-svp", + spin=1, + cart=False, + unit="Angstrom", + verbose=0, + ) + + +@pytest.fixture(scope="module") +def density(molecule: gto.Mole) -> npt.NDArray[np.float64]: + mean_field = scf.UHF(molecule) + mean_field.chkfile = None + mean_field.conv_tol = 1e-12 + mean_field.kernel() + assert mean_field.converged + result = np.asarray(mean_field.make_rdm1(), dtype=np.float64) + assert result.shape == (2, molecule.nao_nr(), molecule.nao_nr()) + return result + + +@pytest.fixture(scope="module") +def pyscf_grid(molecule: gto.Mole) -> SkalaGrids: + grid = SkalaGrids(molecule) + grid.level = 5 + grid.prune = None + grid.radi_method = dft.radi.mura_knowles + grid.build() + return grid + + +def _structural_density(molecule: gto.Mole) -> npt.NDArray[np.float64]: + basis_size = molecule.nao_nr() + alpha = np.eye(basis_size, dtype=np.float64) * 0.5 + beta = np.eye(basis_size, dtype=np.float64) * 0.25 + return np.stack((alpha, beta)) + + +def _matrix_error( + actual: npt.NDArray[np.float64], expected: npt.NDArray[np.float64] +) -> float: + return float(np.linalg.norm(actual - expected) / actual.shape[0]) + + +@pytest.fixture(scope="module", params=("lda", "pbe", "tpss", "skala-1.1")) +def functional_case( + request: pytest.FixtureRequest, + molecule: gto.Mole, +) -> FunctionalCase: + name = str(request.param) + functional: ExcFunctionalBase + if name == "skala-1.1": + model_path = skalaxc.MODEL_DIR / "skala-1.1.fun" + with model_path.open("rb") as model_file: + digest = hashlib.file_digest(model_file, "sha256").hexdigest() + assert digest == SKALA_1_1_REV1_SHA256 + functional = FunctionalArtifact(model_path, SKALA_1_1_REV1_SHA256).load() + model = str(model_path) + else: + loaded_functional = load_functional(name) + assert isinstance(loaded_functional, ExcFunctionalBase) + functional = loaded_functional + model = name.upper() + return FunctionalCase( + name, + functional, + make_skalaxc_integrator(molecule, model), + CPU_TOLERANCES[name], + ) + + +def _fixed_density_xc_gradient( + functional: ExcFunctionalBase, + molecule: gto.Mole, + grid: SkalaGrids, + density: npt.NDArray[np.float64], +) -> npt.NDArray[np.float64]: + density_tensor = torch.from_numpy(density.copy()) + effective_potential, explicit_gradient = veff_and_expl_nuc_grad( + functional, + molecule, + grid, + density_tensor, + ) + contracted_gradient = torch.empty( + (molecule.natm, 3), dtype=effective_potential.dtype + ) + for atom_index, (_, _, ao_start, ao_end) in enumerate(molecule.aoslice_by_atom()): + contracted_gradient[atom_index] = ( + torch.einsum( + "...xij,...ij->x", + effective_potential[..., ao_start:ao_end, :], + density_tensor[..., ao_start:ao_end, :], + ) + * 2 + ) + return (contracted_gradient + explicit_gradient).numpy() + + +def test_pyscf_conversion_matches_skalaxc_layout(molecule: gto.Mole) -> None: + density = _structural_density(molecule) + skalaxc_molecule, skalaxc_basis = pyscf_to_skalaxc(molecule) + assert skalaxc_molecule.natoms == molecule.natm + assert skalaxc_basis.nbf == molecule.nao_nr() + + scalar_density, spin_density = uks_density_channels(density) + assert scalar_density.flags.f_contiguous + assert spin_density.flags.f_contiguous + np.testing.assert_allclose((scalar_density + spin_density) / 2, density[0]) + np.testing.assert_allclose((scalar_density - spin_density) / 2, density[1]) + + +def test_exc_vxc_parity( + functional_case: FunctionalCase, + molecule: gto.Mole, + density: npt.NDArray[np.float64], + pyscf_grid: SkalaGrids, +) -> None: + pyscf_result = XCIntegrator(functional_case.functional)( + molecule, + pyscf_grid, + torch.from_numpy(density.copy()), + ) + + scalar_density, spin_density = uks_density_channels(density) + energy, scalar_potential, spin_potential = functional_case.integrator.eval_exc_vxc( + scalar_density, spin_density + ) + + pyscf_potential = pyscf_result.potential.detach().numpy() + # SkalaXC returns derivatives with respect to Ds = Da + Db and Dz = Da - Db. + expected_scalar = (pyscf_potential[0] + pyscf_potential[1]) / 2 + expected_spin = (pyscf_potential[0] - pyscf_potential[1]) / 2 + energy_error = abs(energy - pyscf_result.energy.item()) + scalar_error = _matrix_error(scalar_potential, expected_scalar) + spin_error = _matrix_error(spin_potential, expected_spin) + + assert energy_error < functional_case.tolerances.energy, ( + f"{functional_case.name} XC energy differs by {energy_error:.3e}: " + f"PySCF={pyscf_result.energy.item():.15g}, SkalaXC={energy:.15g}" + ) + assert scalar_error < functional_case.tolerances.scalar_potential, ( + f"{functional_case.name} scalar VXC error per basis function: {scalar_error:.3e}" + ) + assert spin_error < functional_case.tolerances.spin_potential, ( + f"{functional_case.name} spin-z VXC error per basis function: {spin_error:.3e}" + ) + + +def test_exc_gradient_parity( + functional_case: FunctionalCase, + molecule: gto.Mole, + density: npt.NDArray[np.float64], + pyscf_grid: SkalaGrids, +) -> None: + pyscf_gradient = _fixed_density_xc_gradient( + functional_case.functional, + molecule, + pyscf_grid, + density, + ) + + scalar_density, spin_density = uks_density_channels(density) + skalaxc_gradient = functional_case.integrator.eval_exc_grad( + scalar_density, spin_density + ) + max_error = float(np.max(np.abs(skalaxc_gradient - pyscf_gradient))) + + assert max_error < functional_case.tolerances.gradient, ( + f"{functional_case.name} XC gradient max error: {max_error:.3e}\n" + f"PySCF:\n{pyscf_gradient}\nSkalaXC:\n{skalaxc_gradient}" + ) From 4ba29bca82bf10d79b8e4e9ffef602b4de59ecb3 Mon Sep 17 00:00:00 2001 From: jenswehner Date: Fri, 4 Sep 2026 11:36:53 +0200 Subject: [PATCH 15/33] Add CI and update repository docs --- .github/actionlint.yaml | 10 + .github/actions/report-toolchain/action.yml | 76 ++++++ .github/workflows/examples.yml | 161 ------------ .github/workflows/gauxc-test.yml | 38 --- .github/workflows/model-test.yml | 2 +- .github/workflows/pyscf-skalaxc-parity.yml | 75 ++++++ .github/workflows/skala-test.yml | 2 +- .github/workflows/skalaxc-ci.yml | 245 ++++++++++++++++++ .github/workflows/skalaxc-clang-tidy.yml | 44 ++++ .github/workflows/skalaxc-cuda.yml | 268 ++++++++++++++++++++ .github/workflows/skalaxc-doxygen.yml | 38 +++ .github/workflows/skalaxc-package.yml | 169 ++++++++++++ .gitignore | 7 + .pre-commit-config.yaml | 25 +- AGENTS.md | 165 ++++++++++-- CONTRIBUTING.md | 17 +- README.md | 25 +- SkalaXC/.clang-format | 44 ++++ SkalaXC/.clang-tidy | 15 ++ pyproject.toml | 8 +- skala/README.md | 8 +- website/index.rst | 1 - website/model-card/skala-1.0.rst | 4 +- website/model-card/skala-1.1.rst | 4 +- 24 files changed, 1193 insertions(+), 258 deletions(-) create mode 100644 .github/actionlint.yaml create mode 100644 .github/actions/report-toolchain/action.yml delete mode 100644 .github/workflows/examples.yml delete mode 100644 .github/workflows/gauxc-test.yml create mode 100644 .github/workflows/pyscf-skalaxc-parity.yml create mode 100644 .github/workflows/skalaxc-ci.yml create mode 100644 .github/workflows/skalaxc-clang-tidy.yml create mode 100644 .github/workflows/skalaxc-cuda.yml create mode 100644 .github/workflows/skalaxc-doxygen.yml create mode 100644 .github/workflows/skalaxc-package.yml create mode 100644 SkalaXC/.clang-format create mode 100644 SkalaXC/.clang-tidy diff --git a/.github/actionlint.yaml b/.github/actionlint.yaml new file mode 100644 index 00000000..58b2a4d1 --- /dev/null +++ b/.github/actionlint.yaml @@ -0,0 +1,10 @@ +self-hosted-runner: + labels: + - microsoft-skala-cpu-pool + - microsoft-skala-gpu-pool + - microsoft-skala-small-gpu-pool + +paths: + .github/workflows/**/*.{yml,yaml}: + ignore: + - '"paths" section must be sequence node but got alias node' \ No newline at end of file diff --git a/.github/actions/report-toolchain/action.yml b/.github/actions/report-toolchain/action.yml new file mode 100644 index 00000000..40dda81b --- /dev/null +++ b/.github/actions/report-toolchain/action.yml @@ -0,0 +1,76 @@ +name: Report compiler toolchain +description: Report the activated compiler environment and compiler-selected linker + +inputs: + c-compiler: + description: C compiler command; defaults to CC or cc + required: false + default: "" + cxx-compiler: + description: C++ compiler command; defaults to CXX or c++ + required: false + default: "" + fortran-compiler: + description: Fortran compiler command; defaults to FC or gfortran + required: false + default: "" + cuda-compiler: + description: CUDA compiler command; defaults to CUDACXX or nvcc when available + required: false + default: "" + +runs: + using: composite + steps: + - name: Report compiler toolchain + shell: bash + env: + INPUT_C_COMPILER: ${{ inputs.c-compiler }} + INPUT_CXX_COMPILER: ${{ inputs.cxx-compiler }} + INPUT_FORTRAN_COMPILER: ${{ inputs.fortran-compiler }} + INPUT_CUDA_COMPILER: ${{ inputs.cuda-compiler }} + run: | + set -euo pipefail + + for variable in \ + CONDA_PREFIX CC CXX FC CUDACXX \ + CFLAGS CXXFLAGS FFLAGS CUDAFLAGS LDFLAGS + do + printf '%s=%s\n' "$variable" "${!variable:-}" + done + + c_compiler=${INPUT_C_COMPILER:-${CC:-$(command -v cc || true)}} + cxx_compiler=${INPUT_CXX_COMPILER:-${CXX:-$(command -v c++ || true)}} + fortran_compiler=${INPUT_FORTRAN_COMPILER:-${FC:-$(command -v gfortran || true)}} + cuda_compiler=${INPUT_CUDA_COMPILER:-${CUDACXX:-$(command -v nvcc || true)}} + + report_compiler() { + local language=$1 + local compiler=$2 + if [[ -z "$compiler" ]]; then + return + fi + printf '\n%s compiler: %s\n' "$language" "$compiler" + "$compiler" --version + } + + report_compiler C "$c_compiler" + report_compiler C++ "$cxx_compiler" + report_compiler Fortran "$fortran_compiler" + report_compiler CUDA "$cuda_compiler" + + if [[ -z "$cxx_compiler" ]]; then + printf 'A C++ compiler is required to identify the host linker.\n' >&2 + exit 1 + fi + + linker=$("$cxx_compiler" -print-prog-name=ld) + if [[ "$linker" != /* ]]; then + linker=$(command -v "$linker" || true) + fi + if [[ -z "$linker" || ! -x "$linker" ]]; then + printf 'Could not resolve the C++ compiler-selected linker.\n' >&2 + exit 1 + fi + + printf '\nC++ linker: %s\n' "$linker"; "$linker" --version || "$linker" -v \ No newline at end of file diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml deleted file mode 100644 index cf192fb8..00000000 --- a/.github/workflows/examples.yml +++ /dev/null @@ -1,161 +0,0 @@ -name: GauXC examples - -on: - push: - branches: [main] - paths: &gauxc-paths - - '.github/workflows/examples.yml' - - '.github/actions/setup-pixi/**' - - 'gauxc/**' - - 'pixi.lock' - - 'pixi.toml' - pull_request: - branches: [main] - paths: *gauxc-paths - -permissions: - contents: read - -jobs: - skala-checkpoint: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - persist-credentials: false - - - name: Print CPU diagnostics - uses: ./.github/actions/cpu-diagnostics - - - name: Setup Pixi - uses: ./.github/actions/setup-pixi - with: - environment: assets - - - name: Download checkpoint - run: >- - hf download microsoft/skala-1.1 skala-1.1-rev1.fun --local-dir . - - - name: Upload checkpoint - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 - with: - name: skala-checkpoint - path: skala-1.1-rev1.fun - - gauxc: - needs: - - skala-checkpoint - runs-on: ubuntu-latest - env: - GAUXC_REFERENCE_DATA: ${{ matrix.source == 'development' && '../gauxc/tests/ref_data/onedft_he_def2qzvp_tpss_uks.hdf5' || '../build_example/_deps/gauxc-src/tests/ref_data/onedft_he_def2qzvp_tpss_uks.hdf5' }} - strategy: - fail-fast: false - matrix: - toolchain: ["openmp", "mpi"] - source: ["pinned-release", "development"] - example: ["cpp", "c", "fortran"] - include: - - toolchain: openmp - example: cpp - environment: gauxc-openmp - - toolchain: openmp - example: c - environment: gauxc-openmp - - toolchain: openmp - example: fortran - environment: gauxc-openmp-fortran - - toolchain: mpi - example: cpp - environment: gauxc-mpi - - toolchain: mpi - example: c - environment: gauxc-mpi - - toolchain: mpi - example: fortran - environment: gauxc-mpi-fortran - - steps: - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 - with: - path: skala - - - name: Print CPU diagnostics - uses: ./skala/.github/actions/cpu-diagnostics - - - name: Setup Pixi - uses: ./skala/.github/actions/setup-pixi - with: - working-directory: skala - environment: ${{ matrix.environment }} - - - name: Checkout development GauXC - if: ${{ matrix.source == 'development' }} - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 - with: - repository: wavefunction91/gauxc - ref: skala - path: gauxc - - - name: Configure GauXC - if: ${{ matrix.source == 'development' }} - working-directory: skala - env: - GAUXC_ENABLE_C: ${{ matrix.example != 'cpp' && 'ON' || 'OFF' }} - GAUXC_ENABLE_FORTRAN: ${{ matrix.example == 'fortran' && 'ON' || 'OFF' }} - GAUXC_ENABLE_MPI: ${{ matrix.toolchain == 'mpi' && 'ON' || 'OFF' }} - GAUXC_ENABLE_OPENMP: ${{ matrix.toolchain == 'openmp' && 'ON' || 'OFF' }} - run: | - cmake -B ../build_gauxc -S ../gauxc -G Ninja \ - -DGAUXC_ENABLE_OPENMP="$GAUXC_ENABLE_OPENMP" \ - -DGAUXC_ENABLE_MPI="$GAUXC_ENABLE_MPI" \ - -DGAUXC_ENABLE_CUDA=OFF \ - -DGAUXC_ENABLE_ONEDFT=ON \ - -DGAUXC_ENABLE_C="$GAUXC_ENABLE_C" \ - -DGAUXC_ENABLE_FORTRAN="$GAUXC_ENABLE_FORTRAN" \ - -DGAUXC_ENABLE_TESTS=OFF \ - -DBUILD_SHARED_LIBS=ON \ - -DCMAKE_INSTALL_PREFIX="$CONDA_PREFIX" - - - name: Build GauXC - if: ${{ matrix.source == 'development' }} - working-directory: skala - run: cmake --build ../build_gauxc - - - name: Install GauXC - if: ${{ matrix.source == 'development' }} - working-directory: skala - run: cmake --install ../build_gauxc - - - name: Configure project - working-directory: skala - env: - GAUXC_ENABLE_MPI: ${{ matrix.toolchain == 'mpi' && 'ON' || 'OFF' }} - GAUXC_ENABLE_OPENMP: ${{ matrix.toolchain == 'openmp' && 'ON' || 'OFF' }} - run: | - cmake -B ../build_example -S gauxc/examples/${{ matrix.example }}/gauxc_integration -G Ninja \ - -DSkala_GauXC_ENABLE_OPENMP="$GAUXC_ENABLE_OPENMP" \ - -DSkala_GauXC_ENABLE_MPI="$GAUXC_ENABLE_MPI" \ - -DSkala_GauXC_ENABLE_CUDA=OFF \ - -DCMAKE_INSTALL_PREFIX="$CONDA_PREFIX" - - - name: Build project - working-directory: skala - run: cmake --build ../build_example - - - name: Install project - working-directory: skala - run: cmake --install ../build_example - - - name: Run example - working-directory: skala - run: Skala "$GAUXC_REFERENCE_DATA" --model TPSS - - - name: Download checkpoint - uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5 - with: - name: skala-checkpoint - path: skala - - - name: Run example - working-directory: skala - run: Skala "$GAUXC_REFERENCE_DATA" --model ./skala-1.1-rev1.fun diff --git a/.github/workflows/gauxc-test.yml b/.github/workflows/gauxc-test.yml deleted file mode 100644 index 9dc85ec8..00000000 --- a/.github/workflows/gauxc-test.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: "GauXC tests" - -on: - push: - branches: [main] - paths: &gauxc-test-paths - - '.github/workflows/gauxc-test.yml' - - '.github/actions/setup-pixi/**' - - 'gauxc/**' - - 'pixi.lock' - - 'pixi.toml' - - 'pyproject.toml' - pull_request: - branches: [main] - paths: *gauxc-test-paths - workflow_dispatch: - -permissions: - contents: read - -jobs: - test: - runs-on: ubuntu-latest - env: - OMP_NUM_THREADS: 4 - steps: - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 - - - name: Print CPU diagnostics - uses: ./.github/actions/cpu-diagnostics - - - name: Setup Pixi - uses: ./.github/actions/setup-pixi - with: - environment: default - - - name: Run GauXC unit tests - run: pytest -v gauxc/tests/ \ No newline at end of file diff --git a/.github/workflows/model-test.yml b/.github/workflows/model-test.yml index b67fa70e..63456fdd 100644 --- a/.github/workflows/model-test.yml +++ b/.github/workflows/model-test.yml @@ -36,4 +36,4 @@ jobs: environment: default - name: Run model unit tests - run: pytest -v model/tests/test_model.py model/tests/test_utils.py \ No newline at end of file + run: pytest -v model/tests/test_model.py model/tests/test_utils.py diff --git a/.github/workflows/pyscf-skalaxc-parity.yml b/.github/workflows/pyscf-skalaxc-parity.yml new file mode 100644 index 00000000..95d0413c --- /dev/null +++ b/.github/workflows/pyscf-skalaxc-parity.yml @@ -0,0 +1,75 @@ +name: "PySCF-SkalaXC parity tests" + +on: + push: + branches: [main] + paths: &parity-test-paths + - '.github/workflows/pyscf-skalaxc-parity.yml' + - 'tests/**' + - 'skala/src/skala/**' + - 'SkalaXC/**' + - 'pixi.lock' + - 'pixi.toml' + - 'pyproject.toml' + pull_request: + branches: [main] + paths: *parity-test-paths + workflow_dispatch: + +permissions: + contents: read + +jobs: + test: + runs-on: ubuntu-latest + env: + OMP_NUM_THREADS: 4 + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + with: + submodules: recursive + persist-credentials: false + + - name: Print CPU diagnostics + uses: ./.github/actions/cpu-diagnostics + + - name: Setup Pixi + uses: prefix-dev/setup-pixi@f00437f565399d418b0acc85936d12c1fb668347 # v0.10.1 + with: + pixi-version: v0.78.0 + environments: skalaxc-parity + activate-environment: true + locked: true + cache: false + + - name: Configure SkalaXC + run: >- + cmake + -S SkalaXC + -B SkalaXC/build-pixi-parity + -G Ninja + -DCMAKE_BUILD_TYPE=Release + -DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/SkalaXC/install-pixi-parity + -DSKALAXC_BUILD_FORTRAN=OFF + -DSKALAXC_BUILD_TESTS=OFF + -DSKALAXC_BUILD_EXAMPLES=OFF + -DSKALAXC_DOWNLOAD_MODELS=ON + -DSKALAXC_ENABLE_CUDA=OFF + -DSKALAXC_ENABLE_MPI=OFF + -DSKALAXC_ENABLE_OPENMP=ON + + - name: Build and install SkalaXC + run: | + cmake --build SkalaXC/build-pixi-parity --parallel 2 + cmake --install SkalaXC/build-pixi-parity --component Core + + - name: Install SkalaXC Python binding + env: + SkalaXC_DIR: ${{ github.workspace }}/SkalaXC/install-pixi-parity/lib/cmake/SkalaXC + SKALAXC_PYTHON_LAYOUT: WHEEL + run: >- + python -m pip install SkalaXC/python + --no-build-isolation --no-deps --force-reinstall + + - name: Run direct-binding parity tests + run: pytest -v tests/test_pyscf_skalaxc_parity.py \ No newline at end of file diff --git a/.github/workflows/skala-test.yml b/.github/workflows/skala-test.yml index 5fe50e35..5f99de65 100644 --- a/.github/workflows/skala-test.yml +++ b/.github/workflows/skala-test.yml @@ -120,4 +120,4 @@ jobs: environment: test-py312-pyscf214-torch213 - name: Run profiling tests - run: pytest -v -m profiling skala/tests/ \ No newline at end of file + run: pytest -v -m profiling skala/tests/ diff --git a/.github/workflows/skalaxc-ci.yml b/.github/workflows/skalaxc-ci.yml new file mode 100644 index 00000000..c83979e9 --- /dev/null +++ b/.github/workflows/skalaxc-ci.yml @@ -0,0 +1,245 @@ +name: SkalaXC CI + +on: + push: + branches: [ main ] + paths: &skalaxc-ci-paths + - .gitmodules + - SkalaXC/** + - .github/actions/report-toolchain/action.yml + - .github/workflows/skalaxc-ci.yml + - pixi.lock + - pixi.toml + pull_request: + branches: [ main ] + paths: *skalaxc-ci-paths + +permissions: + contents: read + +env: + OMP_NUM_THREADS: "4" + +jobs: + build-and-test: + runs-on: ${{ matrix.runner }} + strategy: + fail-fast: false + matrix: + include: + - name: serial-release + runner: ubuntu-latest + mpi: OFF + openmp: ON + hdf5: ON + build_type: Release + - name: serial-release-linux-aarch64 + runner: ubuntu-24.04-arm + mpi: OFF + openmp: ON + hdf5: ON + build_type: Release + - name: serial-release-macos-arm64 + runner: macos-14 + mpi: OFF + openmp: ON + hdf5: ON + build_type: Release + - name: serial-debug + runner: ubuntu-latest + mpi: OFF + openmp: ON + hdf5: ON + build_type: Debug + - name: mpi-release + runner: microsoft-skala-cpu-pool + mpi: ON + openmp: ON + hdf5: ON + build_type: Release + - name: mpi-debug + runner: microsoft-skala-cpu-pool + mpi: ON + openmp: ON + hdf5: ON + build_type: Debug + - name: serial-release-no-openmp + runner: ubuntu-latest + mpi: OFF + openmp: OFF + hdf5: ON + build_type: Release + - name: serial-release-no-hdf5 + runner: ubuntu-latest + mpi: OFF + openmp: ON + hdf5: OFF + build_type: Release + + name: ${{ matrix.name }} + + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + with: + submodules: recursive + + - name: Setup Pixi + uses: prefix-dev/setup-pixi@f00437f565399d418b0acc85936d12c1fb668347 # v0.10.1 + with: + pixi-version: v0.78.0 + environments: skalaxc-host + activate-environment: true + locked: true + cache: false + + - name: Verify compiler toolchain + uses: ./.github/actions/report-toolchain + + - name: Configure + run: >- + cmake + -S SkalaXC + -B SkalaXC/build-ci-${{ matrix.name }} + -G Ninja + -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} + -DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/SkalaXC/install-ci-${{ matrix.name }} + -DSKALAXC_BUILD_FORTRAN=ON + -DSKALAXC_BUILD_TESTS=ON + -DSKALAXC_BUILD_EXAMPLES=ON + -DSKALAXC_ENABLE_HDF5=${{ matrix.hdf5 }} + -DSKALAXC_ENABLE_MPI=${{ matrix.mpi }} + -DSKALAXC_ENABLE_OPENMP=${{ matrix.openmp }} + + - name: Build + run: >- + cmake + --build SkalaXC/build-ci-${{ matrix.name }} + + - name: Test + env: + SKALAXC_TEST_SEED: "20260729" + run: >- + ctest + --test-dir SkalaXC/build-ci-${{ matrix.name }} + --output-on-failure + + - name: Install + run: cmake --install SkalaXC/build-ci-${{ matrix.name }} + + - name: Configure installed consumers + run: >- + cmake + -S SkalaXC/tests/installed + -B SkalaXC/build-installed-consumers-${{ matrix.name }} + -G Ninja + -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} + -DCMAKE_PREFIX_PATH=${{ github.workspace }}/SkalaXC/install-ci-${{ matrix.name }} + -DSKALAXC_TEST_FORTRAN=ON + + - name: Test installed consumers + run: | + cmake --build SkalaXC/build-installed-consumers-${{ matrix.name }} + ctest --test-dir SkalaXC/build-installed-consumers-${{ matrix.name }} --output-on-failure + + sanitizer: + name: gcc-asan-ubsan + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + with: + submodules: recursive + + - name: Setup Pixi + uses: prefix-dev/setup-pixi@f00437f565399d418b0acc85936d12c1fb668347 # v0.10.1 + with: + pixi-version: v0.78.0 + environments: skalaxc-host + activate-environment: true + locked: true + cache: false + + - name: Verify compiler toolchain + uses: ./.github/actions/report-toolchain + + - name: Configure + run: >- + cmake + -S SkalaXC + -B SkalaXC/build-ci-sanitizer + -G Ninja + -DCMAKE_BUILD_TYPE=Debug + -DSKALAXC_BUILD_FORTRAN=OFF + -DSKALAXC_BUILD_TESTS=ON + -DSKALAXC_BUILD_EXAMPLES=OFF + -DSKALAXC_ENABLE_MPI=OFF + -DSKALAXC_ENABLE_OPENMP=OFF + -DSKALAXC_ENABLE_SANITIZERS=ON + + - name: Build sanitizer tests + run: >- + cmake --build SkalaXC/build-ci-sanitizer + --target skalaxc_unit_test skalaxc_c_api_test + + - name: Test repeated evaluation and C boundary + env: + ASAN_OPTIONS: detect_leaks=1:halt_on_error=1 + UBSAN_OPTIONS: halt_on_error=1:print_stacktrace=1 + SKALAXC_MODEL_PATH: ${{ github.workspace }}/SkalaXC/build-ci-sanitizer/data/skala_models + run: | + SkalaXC/build-ci-sanitizer/tests/skalaxc_unit_test '[skala][stress]' + ctest --test-dir SkalaXC/build-ci-sanitizer \ + -R '^skalaxc_c_api$' --output-on-failure + + clang-release: + name: clang-22-release + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + with: + submodules: recursive + + - name: Setup Pixi + uses: prefix-dev/setup-pixi@f00437f565399d418b0acc85936d12c1fb668347 # v0.10.1 + with: + pixi-version: v0.78.0 + environments: skalaxc-host-clang + activate-environment: true + locked: true + cache: false + + - name: Verify compiler toolchain + uses: ./.github/actions/report-toolchain + with: + c-compiler: x86_64-conda-linux-gnu-clang + cxx-compiler: x86_64-conda-linux-gnu-clang++ + fortran-compiler: x86_64-conda-linux-gnu-gfortran + + - name: Configure + run: >- + cmake + -S SkalaXC + -B SkalaXC/build-ci-clang-release + -G Ninja + -DCMAKE_BUILD_TYPE=Release + -DCMAKE_C_COMPILER=x86_64-conda-linux-gnu-clang + -DCMAKE_CXX_COMPILER=x86_64-conda-linux-gnu-clang++ + -DCMAKE_Fortran_COMPILER=x86_64-conda-linux-gnu-gfortran + "-DBLAS_LIBRARIES=$CONDA_PREFIX/lib/libblas.so" + -DSKALAXC_BUILD_FORTRAN=ON + -DSKALAXC_BUILD_TESTS=ON + -DSKALAXC_BUILD_EXAMPLES=ON + -DSKALAXC_ENABLE_MPI=OFF + -DSKALAXC_ENABLE_OPENMP=ON + + - name: Build + run: cmake --build SkalaXC/build-ci-clang-release + + - name: Test + env: + SKALAXC_TEST_SEED: "20260729" + run: >- + ctest + --test-dir SkalaXC/build-ci-clang-release + --output-on-failure diff --git a/.github/workflows/skalaxc-clang-tidy.yml b/.github/workflows/skalaxc-clang-tidy.yml new file mode 100644 index 00000000..6ac506ce --- /dev/null +++ b/.github/workflows/skalaxc-clang-tidy.yml @@ -0,0 +1,44 @@ +name: SkalaXC clang-tidy + +on: + push: + branches: [ main ] + paths: &skalaxc-clang-tidy-paths + - .gitmodules + - SkalaXC/** + - .github/actions/report-toolchain/action.yml + - .github/workflows/skalaxc-clang-tidy.yml + - pixi.lock + - pixi.toml + pull_request: + branches: [ main ] + paths: *skalaxc-clang-tidy-paths + +permissions: + contents: read + +jobs: + clang-tidy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + with: + submodules: recursive + + - name: Setup Pixi + uses: prefix-dev/setup-pixi@f00437f565399d418b0acc85936d12c1fb668347 # v0.10.1 + with: + pixi-version: v0.78.0 + environments: skalaxc-host-clang + activate-environment: true + locked: true + cache: false + + - name: Verify compiler toolchain + uses: ./.github/actions/report-toolchain + with: + c-compiler: x86_64-conda-linux-gnu-clang + cxx-compiler: x86_64-conda-linux-gnu-clang++ + + - name: Run clang-tidy on sources and headers + run: pixi run -e skalaxc-host-clang skalaxc-clang-tidy diff --git a/.github/workflows/skalaxc-cuda.yml b/.github/workflows/skalaxc-cuda.yml new file mode 100644 index 00000000..8d4aa7a9 --- /dev/null +++ b/.github/workflows/skalaxc-cuda.yml @@ -0,0 +1,268 @@ +name: SkalaXC CUDA + +on: + workflow_dispatch: + push: + branches: [ main ] + paths: &skalaxc-cuda-paths + - .gitmodules + - SkalaXC/** + - skala/src/skala/** + - tests/** + - .github/workflows/skalaxc-cuda.yml + - pixi.lock + - pixi.toml + pull_request: + branches: [ main] + paths: *skalaxc-cuda-paths + +permissions: + contents: read + +env: + OMP_NUM_THREADS: "4" + GAUXC_DEVICE_MEMORY_CAP: "1073741824" + +jobs: + cuda-build: + name: ${{ matrix.name }} build + runs-on: ${{ matrix.runner }} + if: >- + github.event_name != 'pull_request' || + github.event.pull_request.head.repo.full_name == github.repository + strategy: + fail-fast: false + matrix: + include: + - name: CUDA 12 + environment: skalaxc-cuda12 + version: "12" + runner: microsoft-skala-small-gpu-pool + c_compiler: x86_64-conda-linux-gnu-gcc + cxx_compiler: x86_64-conda-linux-gnu-g++ + - name: CUDA 13 + environment: skalaxc-cuda13 + version: "13" + runner: microsoft-skala-gpu-pool + c_compiler: x86_64-conda-linux-gnu-gcc + cxx_compiler: x86_64-conda-linux-gnu-g++ + - name: CUDA 13 / Clang 20 + environment: skalaxc-cuda13-clang + version: "13-clang20" + runner: microsoft-skala-gpu-pool + c_compiler: x86_64-conda-linux-gnu-clang + cxx_compiler: x86_64-conda-linux-gnu-clang++ + + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + with: + submodules: recursive + + - name: Setup Pixi + uses: prefix-dev/setup-pixi@f00437f565399d418b0acc85936d12c1fb668347 # v0.10.1 + with: + pixi-version: v0.78.0 + pixi-bin-path: ${{ runner.temp }}/bin/pixi + environments: ${{ matrix.environment }} + activate-environment: ${{ matrix.environment }} + locked: true + cache: false + post-cleanup: true + + - name: Verify compiler toolchain + run: | + ${{ matrix.c_compiler }} --version + ${{ matrix.cxx_compiler }} --version + nvcc --version + + - name: Configure CUDA build + run: >- + cmake + -S SkalaXC + -B SkalaXC/build-cuda-${{ matrix.version }} + -G Ninja + -DCMAKE_BUILD_TYPE=Release + "-DCMAKE_C_COMPILER=$CONDA_PREFIX/bin/${{ matrix.c_compiler }}" + "-DCMAKE_CXX_COMPILER=$CONDA_PREFIX/bin/${{ matrix.cxx_compiler }}" + "-DCMAKE_CUDA_HOST_COMPILER=$CONDA_PREFIX/bin/${{ matrix.cxx_compiler }}" + -DCMAKE_CUDA_ARCHITECTURES=80 + -DSKALAXC_BUILD_FORTRAN=OFF + -DSKALAXC_BUILD_TESTS=ON + -DSKALAXC_BUILD_EXAMPLES=ON + -DSKALAXC_ENABLE_CUDA=ON + -DSKALAXC_ENABLE_MPI=OFF + -DSKALAXC_ENABLE_OPENMP=ON + + - name: Verify CUDA is enabled + run: >- + grep -Fx + '#define SKALAXC_HAS_CUDA' + SkalaXC/build-cuda-${{ matrix.version }}/include/skalaxc/skalaxc_config.hpp + + - name: Build CUDA targets + run: >- + cmake + --build SkalaXC/build-cuda-${{ matrix.version }} + + cuda-test: + name: ${{ matrix.name }} runtime + runs-on: ${{ matrix.runner }} + if: >- + github.event_name != 'pull_request' || + github.event.pull_request.head.repo.full_name == github.repository + strategy: + fail-fast: false + matrix: + include: + - name: CUDA 12 + environment: skalaxc-cuda12 + version: "12" + runner: microsoft-skala-small-gpu-pool + - name: CUDA 13 + environment: skalaxc-cuda13 + version: "13" + runner: microsoft-skala-gpu-pool + + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + with: + submodules: recursive + + - name: Setup Pixi + uses: prefix-dev/setup-pixi@f00437f565399d418b0acc85936d12c1fb668347 # v0.10.1 + with: + pixi-version: v0.78.0 + pixi-bin-path: ${{ runner.temp }}/bin/pixi + environments: ${{ matrix.environment }} + activate-environment: ${{ matrix.environment }} + locked: true + cache: false + post-cleanup: true + + - name: Verify GPU runtime + run: | + nvidia-smi + python -c "import torch; assert torch.cuda.is_available(); print(torch.cuda.get_device_name(0))" + compute_capability=$(nvidia-smi --query-gpu=compute_cap --format=csv,noheader | sed -n '1{s/\.//;p;}') + test -n "$compute_capability" + echo "SKALAXC_CUDA_ARCH=$compute_capability" >> "$GITHUB_ENV" + + - name: Configure CUDA runtime build + run: >- + cmake + -S SkalaXC + -B SkalaXC/build-cuda-runtime-${{ matrix.version }} + -G Ninja + -DCMAKE_BUILD_TYPE=Release + "-DCMAKE_CUDA_ARCHITECTURES=$SKALAXC_CUDA_ARCH" + -DSKALAXC_BUILD_FORTRAN=ON + -DSKALAXC_BUILD_TESTS=ON + -DSKALAXC_BUILD_EXAMPLES=OFF + -DSKALAXC_ENABLE_CUDA=ON + -DSKALAXC_ENABLE_MPI=OFF + -DSKALAXC_ENABLE_OPENMP=ON + + - name: Build CUDA runtime tests + run: cmake --build SkalaXC/build-cuda-runtime-${{ matrix.version }} + + - name: Install SkalaXC Python binding + env: + SkalaXC_DIR: ${{ github.workspace }}/SkalaXC/install-cuda-runtime-${{ matrix.version }}/lib/cmake/SkalaXC + SKALAXC_PYTHON_LAYOUT: WHEEL + run: | + cmake --install SkalaXC/build-cuda-runtime-${{ matrix.version }} \ + --prefix SkalaXC/install-cuda-runtime-${{ matrix.version }} \ + --component Core + python -m pip install SkalaXC/python \ + --no-build-isolation --no-deps --force-reinstall + + - name: Test CUDA runtime + env: + SKALAXC_MODEL_PATH: ${{ github.workspace }}/SkalaXC/build-cuda-runtime-${{ matrix.version }}/data/skala_models + SKALAXC_TEST_SEED: "20260729" + run: | + SkalaXC/build-cuda-runtime-${{ matrix.version }}/tests/skalaxc_unit_test \ + '[skala][cuda]~[mpi-only]' + ctest \ + --test-dir SkalaXC/build-cuda-runtime-${{ matrix.version }} \ + -R '^(skalaxc_c_api|skalaxc_fortran)$' \ + --output-on-failure + + - name: Test GPU4PySCF-SkalaXC parity + run: | + python -c "import skalaxc, torch; assert skalaxc.CUDA_ENABLED and torch.cuda.is_available()" + pytest -v -m gpu tests/test_pyscf_skalaxc_gpu_parity.py + + cuda-mpi-test: + name: ${{ matrix.name }} MPI runtime + runs-on: ${{ matrix.runner }} + if: >- + github.event_name != 'pull_request' || + github.event.pull_request.head.repo.full_name == github.repository + strategy: + fail-fast: false + matrix: + include: + - name: CUDA 12 + environment: skalaxc-cuda12 + version: "12" + runner: microsoft-skala-small-gpu-pool + - name: CUDA 13 + environment: skalaxc-cuda13 + version: "13" + runner: microsoft-skala-gpu-pool + + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + with: + submodules: recursive + + - name: Setup Pixi + uses: prefix-dev/setup-pixi@f00437f565399d418b0acc85936d12c1fb668347 # v0.10.1 + with: + pixi-version: v0.78.0 + pixi-bin-path: ${{ runner.temp }}/bin/pixi + environments: ${{ matrix.environment }} + activate-environment: ${{ matrix.environment }} + locked: true + cache: false + post-cleanup: true + + - name: Verify GPU and MPI runtime + run: | + nvidia-smi + python -c "import torch; assert torch.cuda.is_available(); print(torch.cuda.get_device_name(0))" + mpiexec --version + compute_capability=$(nvidia-smi --query-gpu=compute_cap --format=csv,noheader | sed -n '1{s/\.//;p;}') + test -n "$compute_capability" + echo "SKALAXC_CUDA_ARCH=$compute_capability" >> "$GITHUB_ENV" + + - name: Configure CUDA MPI build + run: >- + cmake + -S SkalaXC + -B SkalaXC/build-cuda-mpi-${{ matrix.version }} + -G Ninja + -DCMAKE_BUILD_TYPE=Release + "-DCMAKE_CUDA_ARCHITECTURES=$SKALAXC_CUDA_ARCH" + -DSKALAXC_BUILD_FORTRAN=OFF + -DSKALAXC_BUILD_TESTS=ON + -DSKALAXC_BUILD_EXAMPLES=OFF + -DSKALAXC_ENABLE_CUDA=ON + -DSKALAXC_ENABLE_MPI=ON + -DSKALAXC_ENABLE_OPENMP=ON + -DMPIEXEC_PREFLAGS=--oversubscribe + + - name: Build CUDA MPI test + run: >- + cmake --build SkalaXC/build-cuda-mpi-${{ matrix.version }} + --target skalaxc_unit_test + + - name: Test CUDA MPI communication + env: + SKALAXC_TEST_SEED: "20260729" + run: >- + ctest + --test-dir SkalaXC/build-cuda-mpi-${{ matrix.version }} + -R '^skalaxc_unit_mpi\.(cuda_idle_rank|cuda_subcommunicator)$' + --output-on-failure diff --git a/.github/workflows/skalaxc-doxygen.yml b/.github/workflows/skalaxc-doxygen.yml new file mode 100644 index 00000000..a1e54796 --- /dev/null +++ b/.github/workflows/skalaxc-doxygen.yml @@ -0,0 +1,38 @@ +name: SkalaXC Doxygen + +on: + push: + branches: [main] + paths: &skalaxc-doxygen-paths + - SkalaXC/CMakeLists.txt + - SkalaXC/Doxyfile.in + - SkalaXC/cmake/skalaxc-doxygen.cmake + - SkalaXC/include/** + - SkalaXC/src/** + - .github/workflows/skalaxc-doxygen.yml + - pixi.lock + - pixi.toml + pull_request: + branches: [main] + paths: *skalaxc-doxygen-paths + +permissions: + contents: read + +jobs: + doxygen: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + + - name: Setup Pixi + uses: prefix-dev/setup-pixi@f00437f565399d418b0acc85936d12c1fb668347 # v0.10.1 + with: + pixi-version: v0.78.0 + environments: skalaxc-tools + activate-environment: true + locked: true + cache: false + + - name: Validate project documentation + run: pixi run -e skalaxc-tools skalaxc-doxygen diff --git a/.github/workflows/skalaxc-package.yml b/.github/workflows/skalaxc-package.yml new file mode 100644 index 00000000..933686a3 --- /dev/null +++ b/.github/workflows/skalaxc-package.yml @@ -0,0 +1,169 @@ +name: SkalaXC packages + +on: + workflow_dispatch: + push: + branches: [main] + paths: &skalaxc-package-paths + - SkalaXC/CMakeLists.txt + - SkalaXC/cmake/** + - SkalaXC/include/** + - SkalaXC/python/** + - SkalaXC/recipe/** + - SkalaXC/src/** + - SkalaXC/pixi.toml + - .github/workflows/skalaxc-package.yml + - pixi.lock + - pixi.toml + pull_request: + branches: [main] + paths: *skalaxc-package-paths + +permissions: + contents: read + +env: + CPU_COUNT: "2" + OMP_NUM_THREADS: "4" + +jobs: + render: + name: Render ${{ matrix.target-platform }} + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + target-platform: + - linux-64 + - linux-aarch64 + - osx-arm64 + + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + with: + submodules: recursive + + - name: Setup Pixi + uses: prefix-dev/setup-pixi@f00437f565399d418b0acc85936d12c1fb668347 # v0.10.1 + with: + pixi-version: v0.78.0 + environments: skalaxc-package + activate-environment: true + locked: true + cache: false + + - name: Render package matrix + run: >- + rattler-build build + --recipe SkalaXC/recipe/recipe.yaml + --target-platform ${{ matrix.target-platform }} + --render-only + --log-style plain + > render-${{ matrix.target-platform }}.json + + - name: Store rendered matrix + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: skalaxc-render-${{ matrix.target-platform }} + path: render-${{ matrix.target-platform }}.json + if-no-files-found: error + + cpu-package: + name: CPU package (${{ matrix.target-platform }}) + runs-on: ${{ matrix.runner }} + strategy: + fail-fast: false + matrix: + include: + - runner: ubuntu-latest + target-platform: linux-64 + - runner: ubuntu-24.04-arm + target-platform: linux-aarch64 + - runner: macos-14 + target-platform: osx-arm64 + + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + with: + submodules: recursive + + - name: Setup Pixi + uses: prefix-dev/setup-pixi@f00437f565399d418b0acc85936d12c1fb668347 # v0.10.1 + with: + pixi-version: v0.78.0 + environments: skalaxc-package + activate-environment: true + locked: true + cache: false + + - name: Build and test representative CPU packages + run: >- + rattler-build build + --recipe SkalaXC/recipe/recipe.yaml + --target-platform ${{ matrix.target-platform }} + --variant mpi=nompi + --variant cuda=cpu + --variant python=3.12 + --output-dir SkalaXC/output-packages + --log-style plain + + - name: Store CPU packages + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: skalaxc-${{ matrix.target-platform }}-cpu + path: SkalaXC/output-packages/${{ matrix.target-platform }}/*.conda + if-no-files-found: error + + cuda-package: + name: ${{ matrix.name }} package + runs-on: ${{ matrix.runner }} + if: >- + github.event_name != 'pull_request' || + github.event.pull_request.head.repo.full_name == github.repository + strategy: + fail-fast: false + matrix: + include: + - name: CUDA 12 + variant: cuda12 + runner: microsoft-skala-small-gpu-pool + - name: CUDA 13 + variant: cuda13 + runner: microsoft-skala-gpu-pool + + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + with: + submodules: recursive + + - name: Setup Pixi + uses: prefix-dev/setup-pixi@f00437f565399d418b0acc85936d12c1fb668347 # v0.10.1 + with: + pixi-version: v0.78.0 + pixi-bin-path: ${{ runner.temp }}/bin/pixi + environments: skalaxc-package + activate-environment: true + locked: true + cache: false + post-cleanup: true + + - name: Verify GPU runtime + run: nvidia-smi + + - name: Build and test representative ${{ matrix.name }} packages + run: >- + rattler-build build + --recipe SkalaXC/recipe/recipe.yaml + --target-platform linux-64 + --variant mpi=nompi + --variant cuda=${{ matrix.variant }} + --variant python=3.12 + --output-dir SkalaXC/output-packages + --log-style plain + + - name: Store ${{ matrix.name }} packages + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: skalaxc-linux-64-${{ matrix.variant }} + path: SkalaXC/output-packages/linux-64/*.conda + if-no-files-found: error diff --git a/.gitignore b/.gitignore index de97f211..daae360e 100644 --- a/.gitignore +++ b/.gitignore @@ -336,6 +336,13 @@ __pycache__/ .benchmarks/ htmlcov/ .pixi/ +/SkalaXC/build-pixi-*/ +/SkalaXC/install-pixi-*/ +/SkalaXC/output-packages/ +/SkalaXC/output-pixi-*/ +/SkalaXC/python/build/ +/SkalaXC/python/dist-pixi-*/ +/SkalaXC/python/install-pixi-*/ jupyter_execute/ /build/ **/_build/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index fe60b51f..9fd39888 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,30 @@ # See https://pre-commit.com for more information # See https://pre-commit.com/hooks.html for more hooks repos: + - repo: local + hooks: + - id: fprettify + name: fprettify + entry: fprettify + language: python + additional_dependencies: [fprettify==0.3.7] + types: [text] + files: ^.*\.(f90|F90|f95|F95|f03|F03)$ + exclude: (^|.*/)(external|build|build-[^/]*)(/|$) + + - repo: https://github.com/pre-commit/mirrors-clang-format + rev: v21.1.8 + hooks: + - id: clang-format + files: ^.*\.(c|cc|cpp|cxx|h|hh|hpp|hxx|cu)$ + exclude: (^|.*/)(external|build|build-[^/]*)(/|$) + + - repo: https://github.com/rhysd/actionlint + rev: v1.7.7 + hooks: + - id: actionlint + files: ^\.github/workflows/.*\.ya?ml$ + - repo: https://github.com/astral-sh/ruff-pre-commit rev: b831c3dc5d27d9da294ae4e915773b99aa24a7c5 # frozen: v0.15.10 hooks: @@ -29,7 +53,6 @@ repos: - "4" - skala - model - - gauxc - benchmark - website pass_filenames: false diff --git a/AGENTS.md b/AGENTS.md index d1c42e6c..e6446f27 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,19 +1,27 @@ # AGENTS.md -This file provides guidance to AI coding agents (e.g., GitHub Copilot, Cursor, OpenAI Codex) -working within the Skala repository. Follow these conventions to produce consistent, high-quality -contributions. +This file gives coding agents the repository-specific context and commands needed to work safely in +Skala. Run commands from the repository root unless a section says otherwise. Treat `README.md`, +`SkalaXC/README.md`, and the relevant build files as the source of truth when this guide falls behind. ## Repository overview -Skala is a neural network-based exchange-correlation (XC) functional for density functional theory -(DFT). The codebase includes: +Skala is a neural network exchange-correlation (XC) functional for density functional theory. This +repository has two distinct implementation surfaces: + +1. The Python package `skala`, with PyTorch implementations and PySCF, GPU4PySCF, ASE, and Azure AI + Foundry integrations. +2. `SkalaXC`, a standalone C++17 shared library that performs host-side ML XC evaluation through its + own ABI-isolated C++, C, and Fortran APIs. It reuses GauXC internals and LibTorch privately. + +The recommended Python functional is `skala-1.1`; `skala-1.0` remains available for compatibility. +SkalaXC's bundled model selectors are `LDA`, `PBE`, and `TPSS`, or an explicit `.fun` path. | Path | Description | |------|-------------| | `skala/` | Published ASE, PySCF, and GPU4PySCF runtime plus tests | | `model/` | Trainable model definition, tests, and LibTorch/FTorch examples | -| `gauxc/` | GauXC exporter, native examples, tests, and documentation | +| `SkalaXC/` | Standalone C++17 library plus C and Fortran bindings | | `benchmark/` | Benchmark runner, reference data, report tooling, and tests | | `website/` | Main Sphinx site | | `.github/workflows/` | CI workflows (test, docs) | @@ -65,22 +73,12 @@ When editing code: - Build locally: ```bash pixi run -e docs sphinx-build -b html website website/_build/html - pixi run -e docs sphinx-build -b html gauxc/docs website/_build/html/gauxc touch website/_build/html/.nojekyll ``` - Notebooks in `website/` should be executable with a 5-minute timeout. - Use reStructuredText for standalone pages; Jupyter notebooks for tutorials. -## Pull request guidelines - -1. Create a feature branch from `main`. -2. Ensure pre-commit hooks pass. -3. Add or update tests for new functionality. -4. Update documentation if public API changes. -5. Keep commits atomic; write clear commit messages. -6. CI must pass (tests, linting, docs build). - -## Architecture notes +## Python architecture - **Runtime functional API** (`skala/src/skala/functional/`): Loads traced checkpoints and defines traditional functionals and the runtime interface. @@ -90,7 +88,6 @@ When editing code: model into PySCF's DFT machinery. - **ASE calculator** (`skala/src/skala/ase/`): Provides an ASE-compatible calculator for energy/force evaluations and geometry optimizations. -- **GauXC integration** (`gauxc/`): Exporter and C/C++/Fortran examples for external GauXC builds. ## Common commands @@ -99,12 +96,130 @@ When editing code: | Format code | `pixi run -e default pre-commit run ruff-format --all-files` | | Lint code | `pixi run -e default pre-commit run --all-files` | | Run runtime tests | `OMP_NUM_THREADS=4 pixi run -e default pytest -v --doctest-modules --cov=skala --cov-report=xml --cov-report=term-missing --cov-report=html --durations=50 --durations-min=1.0 skala/src/skala/ skala/tests/` | -| Run component tests | `OMP_NUM_THREADS=4 pixi run -e default pytest -v model/tests/test_model.py model/tests/test_utils.py gauxc/tests/ benchmark/tests/` | -| Build docs | `pixi run -e docs sphinx-build -b html website website/_build/html && pixi run -e docs sphinx-build -b html gauxc/docs website/_build/html/gauxc && touch website/_build/html/.nojekyll` | -| Type check | `pixi run -e default mypy skala/src model/src gauxc/src benchmark/src` | - -## Contact +| Run component tests | `OMP_NUM_THREADS=4 pixi run -e default pytest -v model/tests/test_model.py model/tests/test_utils.py benchmark/tests/` | +| Build docs | `pixi run -e docs sphinx-build -b html website website/_build/html && touch website/_build/html/.nojekyll` | +| Type check | `pixi run -e default mypy skala/src model/src benchmark/src` | + +## SkalaXC architecture + +Read `SkalaXC/README.md` before changing the C++ library. The following constraints are intentional: + +- The complete, validated backend is host CPU evaluation of unrestricted (UKS) `EXC`, `VXC`, and XC + energy gradients. RKS is not implemented. CUDA kernels are scaffolded behind + `SKALAXC_ENABLE_CUDA=OFF`; the device orchestration is incomplete and must not be described as + production-ready without GPU compilation and validation. +- GauXC is a source-tree implementation dependency, not part of the public API. Do not add Skala or + OneDFT APIs to the GauXC submodule, and do not route evaluation through GauXC's public + `XCIntegrator::eval_exc_vxc*` entry points. Reuse its lower-level grid, load-balancing, + collocation, local-work, molecular-weight, and HDF5 machinery. +- No GauXC, LibTorch, ATen, ExchCXX, IntegratorXX, or Eigen type may cross the public SkalaXC + boundary. Keep C++ implementation details behind PIMPL, keep the C API opaque/POD-only, and keep + Fortran on `iso_c_binding` over the C API. A native `MPI_Comm` is the deliberate exception in MPI + builds. +- Public matrices and raw buffers are `double`, `nbf x nbf`, and column-major. Gradients contain + exactly `3 * natoms` values in atom-major xyz order. Preserve both allocating and caller-owned + output overloads. +- `skalaxc::XCIntegrator` owns its selected TorchScript model for its lifetime. Avoid process-wide + model caches and reloads during evaluation. +- `libskalaxc` statically embeds private dependencies and exports only the SkalaXC surface. Do not + weaken hidden visibility, the linker version script, or `--exclude-libs,ALL`. +- Use `skalaxc_` for public API and consumer artifacts. Use `skala_` for private model/driver code and + white-box tests. +- In MPI code, use the `RuntimeEnvironment` communicator for collectives. Do not hardcode + `MPI_COMM_WORLD` below the API construction boundary. + +Public API changes normally require coordinated updates to the C++, C, and Fortran surfaces, their +black-box tests, examples, and `SkalaXC/README.md`. Black-box tests must continue to compile without +private GauXC or LibTorch include directories and link only the public SkalaXC target plus their own +fixture-reading dependency. + +## Building SkalaXC + +SkalaXC needs CMake 3.21+, C++17, LibTorch, HDF5, and nlohmann_json. Fortran is enabled by default and +needs `gfortran`. The root `skalaxc-host` environment provides the locked host toolchain on Linux +x86-64, Linux ARM64, and macOS ARM64. + +Initialize the pinned GauXC source once after cloning: + +```bash +git submodule update --init SkalaXC/external/GauXC +``` + +Configure a host development build. Use a fresh build directory after dependency-source or major +option changes so stale CMake cache values do not select an old GauXC tree. + +```bash +pixi install --locked -e skalaxc-host +pixi run -e skalaxc-host skalaxc-configure-host +pixi run -e skalaxc-host skalaxc-build-host +``` + +Useful options are `SKALAXC_BUILD_FORTRAN`, `SKALAXC_ENABLE_OPENMP`, `SKALAXC_ENABLE_MPI`, and +`SKALAXC_ENABLE_CUDA`. CUDA defaults to off and currently covers kernels only. If GauXC's linalg +search selects an incompatible system OpenBLAS, reconfigure with: + +```bash +-DBLAS_LIBRARIES=$CONDA_PREFIX/lib/libblas.so +``` + +## Testing SkalaXC + +Build and run the narrowest relevant Catch2 tag first. The focused command below is the established +workflow for the reorder and array-view code; substitute another tag when appropriate. + +```bash +pixi run -e skalaxc-host cmake --build SkalaXC/build-pixi-host \ + --target skalaxc_unit_test --parallel 4 +OMP_NUM_THREADS=4 pixi run -e skalaxc-host \ + SkalaXC/build-pixi-host/tests/skalaxc_unit_test "[reorder]" +OMP_NUM_THREADS=4 pixi run -e skalaxc-host \ + SkalaXC/build-pixi-host/tests/skalaxc_unit_test "[array-view]" +``` + +Run a named CTest slice or the complete suite after the focused test: + +```bash +OMP_NUM_THREADS=4 pixi run -e skalaxc-host ctest --test-dir SkalaXC/build-pixi-host \ + -R 'skalaxc_(host_parity|public_api)' --output-on-failure +OMP_NUM_THREADS=4 pixi run -e skalaxc-host skalaxc-test-host +``` + +The numerical gradient test is intentionally slower than the other host tests. MPI changes require +an MPI-enabled configure and a real multi-rank runtime test; a serial build does not validate the MPI +collective path. CUDA changes require an actual CUDA compiler and GPU validation. + +Run the public examples against the bundled fixtures when changing API or integration behavior: + +```bash +SkalaXC/build-pixi-host/examples/skalaxc_eval_cpp \ + SkalaXC/tests/ref_data/skala_he_def2qzvp_pbe_uks.hdf5 PBE +SkalaXC/build-pixi-host/examples/skalaxc_eval_c \ + SkalaXC/tests/ref_data/skala_he_def2qzvp_lda_uks.hdf5 LDA +SkalaXC/build-pixi-host/examples/skalaxc_eval_fortran \ + SkalaXC/tests/ref_data/skala_he_def2qzvp_tpss_uks.hdf5 TPSS +``` + +For C++ formatting, use the checked-in style: + +```bash +clang-format -i SkalaXC/src/path/to/file.cxx SkalaXC/tests/path/to/test.cxx +``` + +## Change discipline + +- Start with a focused regression test for the touched behavior, then run the broader relevant suite. +- Keep Python and SkalaXC changes separated unless the contract genuinely spans both implementations. +- Do not edit generated headers under `SkalaXC/build/include`; their templates live under + `SkalaXC/include` and are configured by CMake. +- Do not commit build products, downloaded models, environment files, or CMake cache output. +- Update user-facing documentation when installation, model selection, public APIs, or limitations + change. +- Keep commits focused and do not modify the GauXC submodule unless the task explicitly updates the + pinned upstream dependency. + +## Project links - Issues: https://github.com/microsoft/skala/issues -- Security: See `SECURITY.md` -- Code of Conduct: Microsoft Open Source CoC (see `CONTRIBUTING.md`) +- Documentation: https://microsoft.github.io/skala +- Security policy: `SECURITY.md` +- Contribution guide and code of conduct: `CONTRIBUTING.md` diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9eece202..9cfb6298 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -30,10 +30,9 @@ OMP_NUM_THREADS=4 pixi run -e default pytest -v --doctest-modules \ --cov=skala --cov-report=xml --cov-report=term-missing --cov-report=html \ --durations=50 --durations-min=1.0 skala/src/skala/ skala/tests/ OMP_NUM_THREADS=4 pixi run -e default pytest -v model/tests/test_model.py \ - model/tests/test_utils.py gauxc/tests/ benchmark/tests/ + model/tests/test_utils.py benchmark/tests/ pixi run -e default pre-commit run --all-files pixi run -e docs sphinx-build -b html website website/_build/html -pixi run -e docs sphinx-build -b html gauxc/docs website/_build/html/gauxc touch website/_build/html/.nojekyll ``` @@ -43,6 +42,20 @@ Named compatibility environments cover Python 3.11 through 3.13, PySCF 2.14, PyTorch 2.12 and 2.13, GPU4PySCF 1.8.1, and CUDA 12 and 13. Keep `pixi.lock` synchronized with changes to `pixi.toml` or any component `pyproject.toml`. +SkalaXC development uses the same root workspace. Its host environment is +locked for Linux x86-64, Linux ARM64, and macOS ARM64: + +```bash +pixi install --locked -e skalaxc-host +OMP_NUM_THREADS=4 pixi run -e skalaxc-host skalaxc-test-host +pixi run -e skalaxc-host-clang skalaxc-clang-tidy +pixi run -e skalaxc-tools skalaxc-doxygen +``` + +CUDA 12 and 13 use the custom platforms `linux-64-cuda12` and +`linux-64-cuda13`; pass the matching platform with `-p` to both `pixi install` +and `pixi run`. + ## Model development diff --git a/README.md b/README.md index d454f2c0..1bc81e13 100644 --- a/README.md +++ b/README.md @@ -19,27 +19,16 @@ This repository contains five components: 1. [`skala/`](skala) is the only published Python package. It contains the runtime needed to load released checkpoints and use Skala through [PySCF](https://pyscf.org/), [GPU4PySCF](https://pyscf.org/user/gpu.html), and [ASE](https://ase-lib.org/). 2. [`model/`](model) contains the trainable model definition, its tests, and compiled-model examples. This development code is not included in the `skala` wheel or source distribution. -3. [`gauxc/`](gauxc) contains the GauXC exporter, native integration examples, tests, and source documentation. +3. [`SkalaXC/`](SkalaXC) contains the standalone C++17 library and its C and Fortran bindings. 4. [`benchmark/`](benchmark) contains the benchmark runner, reference data, report tooling, and tests. 5. [`website/`](website) contains the main Sphinx site. Compiled-code examples include: - [Skala in C++ with libtorch](model/examples/cpp/cpp_integration) - [Skala in Fortran with FTorch](https://microsoft.github.io/skala/ftorch) - - [Skala in C++ with GauXC](https://microsoft.github.io/skala/gauxc/cpp-library) - - [Skala in C with GauXC](https://microsoft.github.io/skala/gauxc/c-library) - - [Skala in Fortran with GauXC](https://microsoft.github.io/skala/gauxc/fortran-library) -Development-only imports use separate namespaces: `skala_model`, `skala_gauxc`, and -`skala_benchmark`. They are intentionally not compatibility aliases inside the released `skala` -package. - -### GauXC development version for PyTorch-based functionals like Skala - -[GauXC](https://github.com/wavefunction91/GauXC) is a CPU/GPU C++ library for XC functionals. -A development version with an add-on supporting PyTorch-based functionals like Skala is available in the [`skala` branch of the GauXC repository](https://github.com/wavefunction91/GauXC/tree/skala). -GauXC can be used to integrate Skala into other third-party DFT codes. -For detailed documentation on using GauXC visit the [Skala integration guide](https://microsoft.github.io/skala/gauxc). +Development-only imports use separate namespaces: `skala_model` and `skala_benchmark`. They are +intentionally not compatibility aliases inside the released `skala` package. ## Getting started: PySCF (CPU) @@ -64,6 +53,14 @@ pixi install --locked -e default pixi run -e default python your_script.py ``` +The standalone C++/C/Fortran library under `SkalaXC` uses dedicated +environments from the same lockfile. Run its default host build and tests with: + +```bash +pixi install --locked -e skalaxc-host +OMP_NUM_THREADS=4 pixi run -e skalaxc-host skalaxc-test-host +``` + Run an SCF calculation with Skala for a hydrogen molecule: ```python diff --git a/SkalaXC/.clang-format b/SkalaXC/.clang-format new file mode 100644 index 00000000..bff2d817 --- /dev/null +++ b/SkalaXC/.clang-format @@ -0,0 +1,44 @@ +# BasedOnStyle: Google +AccessModifierOffset: -1 +ConstructorInitializerIndentWidth: 4 +AlignEscapedNewlinesLeft: true +AlignTrailingComments: true +AllowAllParametersOfDeclarationOnNextLine: true +AlwaysBreakTemplateDeclarations: true +AlwaysBreakBeforeMultilineStrings: true +AllowShortIfStatementsOnASingleLine: true +AllowShortLoopsOnASingleLine: true +BreakBeforeBinaryOperators: false +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: false +BinPackParameters: true +ColumnLimit: 80 +ConstructorInitializerAllOnOneLineOrOnePerLine: true +DerivePointerBinding: true +ExperimentalAutoDetectBinPacking: false +IndentCaseLabels: true +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +ObjCSpaceBeforeProtocolList: false +PenaltyBreakBeforeFirstCallParameter: 1 +PenaltyBreakComment: 60 +PenaltyBreakString: 1000 +PenaltyBreakFirstLessLess: 120 +PenaltyExcessCharacter: 1000000 +PenaltyReturnTypeOnItsOwnLine: 200 +PointerBindsToType: true +SpacesBeforeTrailingComments: 2 +Cpp11BracedListStyle: true +Standard: Auto +IndentWidth: 2 +TabWidth: 8 +UseTab: Never +BreakBeforeBraces: Attach +IndentFunctionDeclarationAfterType: true +SpacesInParentheses: false +SpacesInAngles: false +SpaceInEmptyParentheses: false +SpacesInCStyleCastParentheses: false +SpaceAfterControlStatementKeyword: true +SpaceBeforeAssignmentOperators: true +ContinuationIndentWidth: 4 \ No newline at end of file diff --git a/SkalaXC/.clang-tidy b/SkalaXC/.clang-tidy new file mode 100644 index 00000000..19e35002 --- /dev/null +++ b/SkalaXC/.clang-tidy @@ -0,0 +1,15 @@ +Checks: > + -*, + clang-analyzer-*, + bugprone-*, + -bugprone-easily-swappable-parameters, + -bugprone-exception-escape, + -bugprone-forward-declaration-namespace, + -bugprone-implicit-widening-of-multiplication-result, + -bugprone-narrowing-conversions, + performance-*, + -performance-enum-size, + -performance-unnecessary-value-param +WarningsAsErrors: '*' +HeaderFilterRegex: '^(.*[/\\])?SkalaXC/(include|src|tests|examples)/' +FormatStyle: file \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 99beb84b..b507b5cd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [tool.mypy] strict = true explicit_package_bases = true -mypy_path = ["skala/src", "model/src", "gauxc/src", "benchmark/src", "skala", "."] +mypy_path = ["skala/src", "model/src", "benchmark/src", "skala", "."] python_version = "3.11" exclude = ["build/", "website/_build/", "htmlcov/", "third_party/"] @@ -25,7 +25,7 @@ ignore_missing_imports = true [tool.ruff] target-version = "py311" -src = ["skala/", "model/", "gauxc/", "benchmark/", "website/"] +src = ["skala/", "model/", "benchmark/", "website/"] exclude = ["build", "website/_build", "third_party"] [tool.ruff.lint] @@ -53,8 +53,8 @@ line-length = 100 [tool.pytest.ini_options] timeout = 300 addopts = "-m 'not profiling and not benchmark and not model_benchmark'" -pythonpath = [".", "skala/src", "gauxc/src"] -testpaths = ["tests", "skala/tests", "model/tests", "gauxc/tests", "benchmark/tests"] +pythonpath = [".", "skala/src", "model/src", "benchmark/src"] +testpaths = ["tests", "skala/tests", "model/tests", "benchmark/tests"] markers = [ "benchmark: performance measurements collected by pytest-benchmark", "gpu: requires a CUDA-capable GPU and GPU test dependencies", diff --git a/skala/README.md b/skala/README.md index c61d0324..73740500 100644 --- a/skala/README.md +++ b/skala/README.md @@ -18,16 +18,12 @@ Learn more about Skala in our [ArXiv paper](https://arxiv.org/abs/2506.14665). The published `skala` package contains only the runtime needed to load released checkpoints and use Skala through [PySCF](https://pyscf.org/), [GPU4PySCF](https://pyscf.org/user/gpu.html), and [ASE](https://ase-lib.org/). -The trainable model definition, benchmark/report tooling, GauXC utilities, tests, documentation, -and examples remain in separate repository components and are not included in the wheel or source -distribution. +The trainable model definition, benchmark/report tooling, tests, documentation, and examples remain +in separate repository components and are not included in the wheel or source distribution. Repository resources include: - [Skala in C++ with libtorch](https://github.com/microsoft/skala/tree/main/model/examples/cpp/cpp_integration) - [Skala in Fortran with FTorch](https://microsoft.github.io/skala/ftorch) - - [Skala in C++ with GauXC](https://microsoft.github.io/skala/gauxc/cpp-library) - - [Skala in C with GauXC](https://microsoft.github.io/skala/gauxc/c-library) - - [Skala in Fortran with GauXC](https://microsoft.github.io/skala/gauxc/fortran-library) ## Getting started: PySCF (CPU) diff --git a/website/index.rst b/website/index.rst index f84223e9..e7b622af 100644 --- a/website/index.rst +++ b/website/index.rst @@ -25,7 +25,6 @@ The model is trained on a large dataset of highly accurate total atomization ene SCF settings ASE Fortran (FTorch) - GauXC Performance & scaling .. toctree:: diff --git a/website/model-card/skala-1.0.rst b/website/model-card/skala-1.0.rst index 6a4b7547..03655cb6 100644 --- a/website/model-card/skala-1.0.rst +++ b/website/model-card/skala-1.0.rst @@ -43,7 +43,7 @@ Direct intended uses #. The Skala-1.0 functional is shared with the research community to facilitate reproduction of the evaluations presented in our paper. #. Evaluating reaction energy differences by computing the total energy of all compounds in a reaction using a self-consistent field (SCF) calculation with the Skala-1.0 exchange-correlation functional. #. Evaluating the total energy of a molecule using an SCF calculation with the Skala-1.0 exchange-correlation functional. Note that, as with all density functionals, energy differences are predicted much more reliably than total energies of individual molecules. -#. The SCF implementation provided uses PySCF, which runs the functional on CPU. We also provide a traced version of the Skala-1.0 functional so that other, more optimized open-source SCF codes—including GPU-enabled ones—can integrate it into their pipelines, for instance through GauXC. A compatible fork of GauXC is included in this repository. +#. The SCF implementation provided uses PySCF, which runs the functional on CPU. We also provide a traced version of the Skala-1.0 functional so that other, more optimized open-source SCF codes can integrate it into their pipelines. The standalone SkalaXC library provides C++, C, and Fortran integration. Out-of-scope uses ----------------- @@ -63,7 +63,7 @@ Recommendations --------------- #. In our PySCF-based SCF implementation, the largest system tested contained 180 atoms using the def2-TZVP basis set (:math:`\sim`\ 5000 orbitals) on `Eadsv5 series `__ virtual machines. Larger systems may run out of memory. -#. For implementations optimized for memory, speed, or GPU support, we recommend integrating the functional with other open-source SCF packages, for instance through GauXC. A compatible fork of GauXC is included in this repository. +#. For implementations optimized for memory or speed, we recommend integrating the functional through the standalone SkalaXC library. Training details diff --git a/website/model-card/skala-1.1.rst b/website/model-card/skala-1.1.rst index f4161e94..bc3b2d00 100644 --- a/website/model-card/skala-1.1.rst +++ b/website/model-card/skala-1.1.rst @@ -42,7 +42,7 @@ Direct intended uses #. The Skala-1.1 functional is shared with the research community to facilitate reproduction of the evaluations presented in our paper. #. Evaluating reaction energy differences by computing the total energy of all compounds in a reaction using a self-consistent field (SCF) calculation with the Skala-1.1 exchange-correlation functional. #. Evaluating the total energy of a molecule using an SCF calculation with the Skala-1.1 exchange-correlation functional. Note that, as with all density functionals, energy differences are predicted much more reliably than total energies of individual molecules. -#. The SCF implementation provided uses PySCF, which runs the functional on CPU. We also provide a traced version of the Skala-1.1 functional so that other, more optimized open-source SCF codes—including GPU-enabled ones—can integrate it into their pipelines, for instance through GauXC. A compatible fork of GauXC is included in this repository. +#. The SCF implementation provided uses PySCF, which runs the functional on CPU. We also provide a traced version of the Skala-1.1 functional so that other, more optimized open-source SCF codes can integrate it into their pipelines. The standalone SkalaXC library provides C++, C, and Fortran integration. Out-of-scope uses ----------------- @@ -62,7 +62,7 @@ Recommendations --------------- #. In our PySCF-based SCF implementation, the largest system tested contained 180 atoms using the def2-TZVP basis set (:math:`\sim`\ 5000 orbitals) on `Eadsv5 series `__ virtual machines. Larger systems may run out of memory. -#. For implementations optimized for memory, speed, or GPU support, we recommend integrating the functional with other open-source SCF packages, for instance through GauXC. A compatible fork of GauXC is included in this repository. +#. For implementations optimized for memory or speed, we recommend integrating the functional through the standalone SkalaXC library. Training details From b4a4ed3de98d732e4f61bc8e6d11d3e5e1f4a0ba Mon Sep 17 00:00:00 2001 From: jenswehner Date: Fri, 4 Sep 2026 14:21:23 +0200 Subject: [PATCH 16/33] fix all Setup Pixi --- .github/workflows/pyscf-skalaxc-parity.yml | 8 ++------ .github/workflows/skalaxc-ci.yml | 24 ++++++---------------- .github/workflows/skalaxc-clang-tidy.yml | 8 ++------ .github/workflows/skalaxc-cuda.yml | 24 ++++++---------------- .github/workflows/skalaxc-doxygen.yml | 8 ++------ .github/workflows/skalaxc-package.yml | 24 ++++++---------------- 6 files changed, 24 insertions(+), 72 deletions(-) diff --git a/.github/workflows/pyscf-skalaxc-parity.yml b/.github/workflows/pyscf-skalaxc-parity.yml index 95d0413c..e9d30c8e 100644 --- a/.github/workflows/pyscf-skalaxc-parity.yml +++ b/.github/workflows/pyscf-skalaxc-parity.yml @@ -34,13 +34,9 @@ jobs: uses: ./.github/actions/cpu-diagnostics - name: Setup Pixi - uses: prefix-dev/setup-pixi@f00437f565399d418b0acc85936d12c1fb668347 # v0.10.1 + uses: ./.github/actions/setup-pixi with: - pixi-version: v0.78.0 - environments: skalaxc-parity - activate-environment: true - locked: true - cache: false + environment: skalaxc-parity - name: Configure SkalaXC run: >- diff --git a/.github/workflows/skalaxc-ci.yml b/.github/workflows/skalaxc-ci.yml index c83979e9..1838f7f0 100644 --- a/.github/workflows/skalaxc-ci.yml +++ b/.github/workflows/skalaxc-ci.yml @@ -84,13 +84,9 @@ jobs: submodules: recursive - name: Setup Pixi - uses: prefix-dev/setup-pixi@f00437f565399d418b0acc85936d12c1fb668347 # v0.10.1 + uses: ./.github/actions/setup-pixi with: - pixi-version: v0.78.0 - environments: skalaxc-host - activate-environment: true - locked: true - cache: false + environment: skalaxc-host - name: Verify compiler toolchain uses: ./.github/actions/report-toolchain @@ -151,13 +147,9 @@ jobs: submodules: recursive - name: Setup Pixi - uses: prefix-dev/setup-pixi@f00437f565399d418b0acc85936d12c1fb668347 # v0.10.1 + uses: ./.github/actions/setup-pixi with: - pixi-version: v0.78.0 - environments: skalaxc-host - activate-environment: true - locked: true - cache: false + environment: skalaxc-host - name: Verify compiler toolchain uses: ./.github/actions/report-toolchain @@ -201,13 +193,9 @@ jobs: submodules: recursive - name: Setup Pixi - uses: prefix-dev/setup-pixi@f00437f565399d418b0acc85936d12c1fb668347 # v0.10.1 + uses: ./.github/actions/setup-pixi with: - pixi-version: v0.78.0 - environments: skalaxc-host-clang - activate-environment: true - locked: true - cache: false + environment: skalaxc-host-clang - name: Verify compiler toolchain uses: ./.github/actions/report-toolchain diff --git a/.github/workflows/skalaxc-clang-tidy.yml b/.github/workflows/skalaxc-clang-tidy.yml index 6ac506ce..d5174cf8 100644 --- a/.github/workflows/skalaxc-clang-tidy.yml +++ b/.github/workflows/skalaxc-clang-tidy.yml @@ -26,13 +26,9 @@ jobs: submodules: recursive - name: Setup Pixi - uses: prefix-dev/setup-pixi@f00437f565399d418b0acc85936d12c1fb668347 # v0.10.1 + uses: ./.github/actions/setup-pixi with: - pixi-version: v0.78.0 - environments: skalaxc-host-clang - activate-environment: true - locked: true - cache: false + environment: skalaxc-host-clang - name: Verify compiler toolchain uses: ./.github/actions/report-toolchain diff --git a/.github/workflows/skalaxc-cuda.yml b/.github/workflows/skalaxc-cuda.yml index 8d4aa7a9..2d0678f4 100644 --- a/.github/workflows/skalaxc-cuda.yml +++ b/.github/workflows/skalaxc-cuda.yml @@ -59,14 +59,10 @@ jobs: submodules: recursive - name: Setup Pixi - uses: prefix-dev/setup-pixi@f00437f565399d418b0acc85936d12c1fb668347 # v0.10.1 + uses: ./.github/actions/setup-pixi with: - pixi-version: v0.78.0 pixi-bin-path: ${{ runner.temp }}/bin/pixi - environments: ${{ matrix.environment }} - activate-environment: ${{ matrix.environment }} - locked: true - cache: false + environment: ${{ matrix.environment }} post-cleanup: true - name: Verify compiler toolchain @@ -129,14 +125,10 @@ jobs: submodules: recursive - name: Setup Pixi - uses: prefix-dev/setup-pixi@f00437f565399d418b0acc85936d12c1fb668347 # v0.10.1 + uses: ./.github/actions/setup-pixi with: - pixi-version: v0.78.0 pixi-bin-path: ${{ runner.temp }}/bin/pixi - environments: ${{ matrix.environment }} - activate-environment: ${{ matrix.environment }} - locked: true - cache: false + environment: ${{ matrix.environment }} post-cleanup: true - name: Verify GPU runtime @@ -218,14 +210,10 @@ jobs: submodules: recursive - name: Setup Pixi - uses: prefix-dev/setup-pixi@f00437f565399d418b0acc85936d12c1fb668347 # v0.10.1 + uses: ./.github/actions/setup-pixi with: - pixi-version: v0.78.0 pixi-bin-path: ${{ runner.temp }}/bin/pixi - environments: ${{ matrix.environment }} - activate-environment: ${{ matrix.environment }} - locked: true - cache: false + environment: ${{ matrix.environment }} post-cleanup: true - name: Verify GPU and MPI runtime diff --git a/.github/workflows/skalaxc-doxygen.yml b/.github/workflows/skalaxc-doxygen.yml index a1e54796..0a8d2901 100644 --- a/.github/workflows/skalaxc-doxygen.yml +++ b/.github/workflows/skalaxc-doxygen.yml @@ -26,13 +26,9 @@ jobs: - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 - name: Setup Pixi - uses: prefix-dev/setup-pixi@f00437f565399d418b0acc85936d12c1fb668347 # v0.10.1 + uses: ./.github/actions/setup-pixi with: - pixi-version: v0.78.0 - environments: skalaxc-tools - activate-environment: true - locked: true - cache: false + environment: skalaxc-tools - name: Validate project documentation run: pixi run -e skalaxc-tools skalaxc-doxygen diff --git a/.github/workflows/skalaxc-package.yml b/.github/workflows/skalaxc-package.yml index 933686a3..e8a8cd65 100644 --- a/.github/workflows/skalaxc-package.yml +++ b/.github/workflows/skalaxc-package.yml @@ -44,13 +44,9 @@ jobs: submodules: recursive - name: Setup Pixi - uses: prefix-dev/setup-pixi@f00437f565399d418b0acc85936d12c1fb668347 # v0.10.1 + uses: ./.github/actions/setup-pixi with: - pixi-version: v0.78.0 - environments: skalaxc-package - activate-environment: true - locked: true - cache: false + environment: skalaxc-package - name: Render package matrix run: >- @@ -88,13 +84,9 @@ jobs: submodules: recursive - name: Setup Pixi - uses: prefix-dev/setup-pixi@f00437f565399d418b0acc85936d12c1fb668347 # v0.10.1 + uses: ./.github/actions/setup-pixi with: - pixi-version: v0.78.0 - environments: skalaxc-package - activate-environment: true - locked: true - cache: false + environment: skalaxc-package - name: Build and test representative CPU packages run: >- @@ -137,14 +129,10 @@ jobs: submodules: recursive - name: Setup Pixi - uses: prefix-dev/setup-pixi@f00437f565399d418b0acc85936d12c1fb668347 # v0.10.1 + uses: ./.github/actions/setup-pixi with: - pixi-version: v0.78.0 pixi-bin-path: ${{ runner.temp }}/bin/pixi - environments: skalaxc-package - activate-environment: true - locked: true - cache: false + environment: skalaxc-package post-cleanup: true - name: Verify GPU runtime From bcf5b8c14639223e4d305c9acb43f469c8a77dba Mon Sep 17 00:00:00 2001 From: jenswehner Date: Fri, 4 Sep 2026 15:16:41 +0200 Subject: [PATCH 17/33] Migrate SkalaXC tests to Catch2 3 --- SkalaXC/CMakeLists.txt | 8 - SkalaXC/tests/CMakeLists.txt | 35 +- .../atomic_domain_assignment_unit_test.cxx | 2 +- .../atomic_domain_load_balancer_unit_test.cxx | 2 +- SkalaXC/tests/diagnostics_unit_test.cxx | 2 +- SkalaXC/tests/skala_device_test.cxx | 18 +- SkalaXC/tests/skala_host_mpi_test.cxx | 7 +- SkalaXC/tests/skala_host_test.cxx | 14 +- SkalaXC/tests/skala_model_unit_test.cxx | 40 +- SkalaXC/tests/skala_mpi_subcomm_unit_test.cxx | 17 +- SkalaXC/tests/skala_openmp_test.cxx | 4 +- SkalaXC/tests/skala_reorder_unit_test.cxx | 2 +- SkalaXC/tests/skala_stress_test.cxx | 5 +- .../skala_traditional_integration_test.cxx | 2 +- SkalaXC/tests/skala_unit_main.cxx | 10 +- SkalaXC/tests/skala_util_unit_test.cxx | 2 +- SkalaXC/tests/spin_gradient_unit_test.cxx | 2 +- pixi.lock | 24790 ++++++++++++++++ pixi.toml | 2 +- 19 files changed, 24861 insertions(+), 103 deletions(-) create mode 100644 pixi.lock diff --git a/SkalaXC/CMakeLists.txt b/SkalaXC/CMakeLists.txt index 1ed7b175..d79dff96 100644 --- a/SkalaXC/CMakeLists.txt +++ b/SkalaXC/CMakeLists.txt @@ -233,14 +233,6 @@ foreach(_skalaxc_target IN LISTS _skalaxc_owned_targets) endif() endforeach() -# Catch2 v2 uses __COUNTER__ for test registration, which Clang 22 diagnoses -# as a C2y extension under -Wpedantic. -if(TARGET skalaxc_unit_test) - target_compile_options(skalaxc_unit_test PRIVATE - "$<$:-Wno-c2y-extensions>" - ) -endif() - unset(_skalaxc_target) unset(_skalaxc_owned_targets) diff --git a/SkalaXC/tests/CMakeLists.txt b/SkalaXC/tests/CMakeLists.txt index af561812..61343f13 100644 --- a/SkalaXC/tests/CMakeLists.txt +++ b/SkalaXC/tests/CMakeLists.txt @@ -32,53 +32,26 @@ if(_skalaxc_missing_model_files) "tpss.fun, and skala-1.1.fun.") endif() -find_package(Catch2 CONFIG QUIET) -if(Catch2_FOUND AND Catch2_VERSION VERSION_GREATER_EQUAL 3) - message(FATAL_ERROR - "Catch2 v${Catch2_VERSION} found, but SkalaXC unit tests require Catch2 v2 " - "(catch2/catch.hpp). Please install v2 or let FetchContent provide it.") -endif() +find_package(Catch2 3 CONFIG QUIET) if(NOT Catch2_FOUND) FetchContent_Declare( catch2 GIT_REPOSITORY https://github.com/catchorg/Catch2.git - GIT_TAG v2.13.10 + GIT_TAG v3.8.1 ) set(CATCH_BUILD_TESTING OFF CACHE BOOL "Build Catch2 self tests" FORCE) set(CATCH_INSTALL_DOCS OFF CACHE BOOL "Install Catch2 docs" FORCE) - set(CATCH_INSTALL_HELPERS OFF CACHE BOOL "Install Catch2 helpers" FORCE) - - if(DEFINED CACHE{CMAKE_WARN_DEPRECATED}) - set(_skalaxc_catch2_warn_deprecated_defined TRUE) - get_property(_skalaxc_catch2_warn_deprecated - CACHE CMAKE_WARN_DEPRECATED PROPERTY VALUE) - else() - set(_skalaxc_catch2_warn_deprecated_defined FALSE) - endif() - set(CMAKE_WARN_DEPRECATED OFF CACHE BOOL - "Suppress deprecation warnings while configuring Catch2" FORCE) FetchContent_MakeAvailable(catch2) - - if(_skalaxc_catch2_warn_deprecated_defined) - set(CMAKE_WARN_DEPRECATED "${_skalaxc_catch2_warn_deprecated}" - CACHE BOOL "Whether to issue warnings for deprecated functionality" FORCE) - else() - set(CMAKE_WARN_DEPRECATED ON CACHE BOOL - "Whether to issue warnings for deprecated functionality" FORCE) - unset(CMAKE_WARN_DEPRECATED CACHE) - endif() - unset(_skalaxc_catch2_warn_deprecated) - unset(_skalaxc_catch2_warn_deprecated_defined) endif() # Make Catch2's `catch_discover_tests` helper available. An installed Catch2 # exposes the module through its package; a FetchContent build ships it under -# the source tree's contrib/ directory. +# the source tree's extras/ directory. if(NOT Catch2_FOUND) - list(APPEND CMAKE_MODULE_PATH "${catch2_SOURCE_DIR}/contrib") + list(APPEND CMAKE_MODULE_PATH "${catch2_SOURCE_DIR}/extras") endif() include(Catch) diff --git a/SkalaXC/tests/atomic_domain_assignment_unit_test.cxx b/SkalaXC/tests/atomic_domain_assignment_unit_test.cxx index 292810fa..fcb019a7 100644 --- a/SkalaXC/tests/atomic_domain_assignment_unit_test.cxx +++ b/SkalaXC/tests/atomic_domain_assignment_unit_test.cxx @@ -1,7 +1,7 @@ #include "atomic_domain_assignment.hpp" #include "saturating_math.hpp" -#include +#include #include #include diff --git a/SkalaXC/tests/atomic_domain_load_balancer_unit_test.cxx b/SkalaXC/tests/atomic_domain_load_balancer_unit_test.cxx index c9751edf..89141296 100644 --- a/SkalaXC/tests/atomic_domain_load_balancer_unit_test.cxx +++ b/SkalaXC/tests/atomic_domain_load_balancer_unit_test.cxx @@ -1,6 +1,6 @@ #include "atomic_domain_load_balancer.hpp" -#include +#include #include #include diff --git a/SkalaXC/tests/diagnostics_unit_test.cxx b/SkalaXC/tests/diagnostics_unit_test.cxx index dbb69d2f..9fe9b30e 100644 --- a/SkalaXC/tests/diagnostics_unit_test.cxx +++ b/SkalaXC/tests/diagnostics_unit_test.cxx @@ -1,7 +1,7 @@ #include "debug_log.hpp" #include "diagnostics.hpp" -#include +#include #include #include diff --git a/SkalaXC/tests/skala_device_test.cxx b/SkalaXC/tests/skala_device_test.cxx index 31f4365c..417769e5 100644 --- a/SkalaXC/tests/skala_device_test.cxx +++ b/SkalaXC/tests/skala_device_test.cxx @@ -1,4 +1,5 @@ -#include +#include +#include #include #include "test_utils.hpp" @@ -211,7 +212,7 @@ TEST_CASE("Skala CUDA exact-size batching modes agree", CHECK(SkalaXC::test::matrix_error_per_basis( std::get<2>(aggressive), std::get<2>(conservative)) <= 1e-10); CHECK(aggressive_diagnostics.device_id == 0); - CHECK(aggressive_diagnostics.device_memory_fraction == Approx(0.75)); + CHECK(aggressive_diagnostics.device_memory_fraction == Catch::Approx(0.75)); CHECK(aggressive_diagnostics.domain_batch_mode == SkalaXC::DomainBatchMode::Aggressive); CHECK(aggressive_diagnostics.local_atoms == system.molecule.size()); @@ -326,16 +327,14 @@ TEST_CASE("Skala CUDA supports an MPI rank with no atomic domains", MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); MPI_Comm_size(MPI_COMM_WORLD, &world_size); if (world_size < 3) { - SUCCEED("Requires at least three MPI ranks"); - return; + SKIP("Requires at least three MPI ranks"); } MPI_Comm subcomm = MPI_COMM_NULL; MPI_Comm_split(MPI_COMM_WORLD, world_rank < 3 ? 0 : MPI_UNDEFINED, world_rank, &subcomm); if (subcomm == MPI_COMM_NULL) { - SUCCEED("Only the first three ranks participate"); - return; + SKIP("Only the first three ranks participate"); } MPI_Comm local_comm = MPI_COMM_NULL; @@ -384,7 +383,7 @@ TEST_CASE("Skala CUDA supports an MPI rank with no atomic domains", CHECK(std::abs(device_gradient[index] - host_gradient[index]) <= 1e-6); MPI_Comm_free(&subcomm); #else - SUCCEED("MPI disabled"); + SKIP("MPI disabled"); #endif } @@ -396,8 +395,7 @@ TEST_CASE("Skala CUDA uses the runtime MPI subcommunicator", MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); MPI_Comm_size(MPI_COMM_WORLD, &world_size); if (world_size < 4) { - SUCCEED("Requires at least four MPI ranks"); - return; + SKIP("Requires at least four MPI ranks"); } const int color = world_rank % 2; @@ -461,6 +459,6 @@ TEST_CASE("Skala CUDA uses the runtime MPI subcommunicator", CHECK(gradient_error <= 1e-6); MPI_Comm_free(&subcomm); #else - SUCCEED("MPI disabled"); + SKIP("MPI disabled"); #endif } diff --git a/SkalaXC/tests/skala_host_mpi_test.cxx b/SkalaXC/tests/skala_host_mpi_test.cxx index b9179213..6a32ebf7 100644 --- a/SkalaXC/tests/skala_host_mpi_test.cxx +++ b/SkalaXC/tests/skala_host_mpi_test.cxx @@ -1,4 +1,4 @@ -#include +#include #include @@ -62,8 +62,7 @@ TEST_CASE("Skala host evaluation uses the runtime MPI subcommunicator", MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); MPI_Comm_size(MPI_COMM_WORLD, &world_size); if (world_size < 4) { - SUCCEED("Requires at least four MPI ranks"); - return; + SKIP("Requires at least four MPI ranks"); } const int color = world_rank % 2; @@ -106,6 +105,6 @@ TEST_CASE("Skala host evaluation uses the runtime MPI subcommunicator", CHECK(gradient_error <= 1e-8); MPI_Comm_free(&subcomm); #else - SUCCEED("MPI disabled"); + SKIP("MPI disabled"); #endif } \ No newline at end of file diff --git a/SkalaXC/tests/skala_host_test.cxx b/SkalaXC/tests/skala_host_test.cxx index 02597b29..8473ff9f 100644 --- a/SkalaXC/tests/skala_host_test.cxx +++ b/SkalaXC/tests/skala_host_test.cxx @@ -17,7 +17,8 @@ #include #include "skala_host_driver.hpp" -#include +#include +#include #include #include @@ -272,9 +273,9 @@ TEST_CASE("Debug logging preserves host results", "[skala][debug-logging]") { SkalaXC::TimingSettings settings; settings.debug_logging = true; const auto logged = run_case(fixture, "LDA", runtime, settings); - CHECK(logged.exc == Approx(quiet.exc).epsilon(1e-13)); - CHECK(logged.vxcs_err == Approx(quiet.vxcs_err).margin(1e-13)); - CHECK(logged.vxcz_err == Approx(quiet.vxcz_err).margin(1e-13)); + CHECK(logged.exc == Catch::Approx(quiet.exc).epsilon(1e-13)); + CHECK(logged.vxcs_err == Catch::Approx(quiet.vxcs_err).margin(1e-13)); + CHECK(logged.vxcz_err == Catch::Approx(quiet.vxcz_err).margin(1e-13)); } TEST_CASE("Host domain batching modes are numerically equivalent", @@ -328,7 +329,7 @@ TEST_CASE("Host domain batching modes are numerically equivalent", scalar_density, spin_density, RowMajorMatrixMap(aggressive_gradient.data(), molecule.natoms(), 3)); - CHECK(aggressive_exc == Approx(conservative_exc).epsilon(1e-12)); + CHECK(aggressive_exc == Catch::Approx(conservative_exc).epsilon(1e-12)); CHECK(aggressive_scalar.isApprox(conservative_scalar, 1e-11)); CHECK(aggressive_spin.isApprox(conservative_spin, 1e-11)); CHECK(aggressive_gradient.isApprox(conservative_gradient, 1e-10)); @@ -474,5 +475,6 @@ TEST_CASE("Skala host gradient matches a Ridders derivative", INFO("Ridders error estimate=" << numerical.error); CHECK(std::abs(analytic_derivative) > 1e-3); CHECK(numerical.error < 1e-7); - CHECK(numerical.derivative == Approx(analytic_derivative).margin(1e-6)); + CHECK(numerical.derivative == + Catch::Approx(analytic_derivative).margin(1e-6)); } diff --git a/SkalaXC/tests/skala_model_unit_test.cxx b/SkalaXC/tests/skala_model_unit_test.cxx index da7f9305..7fa161ad 100644 --- a/SkalaXC/tests/skala_model_unit_test.cxx +++ b/SkalaXC/tests/skala_model_unit_test.cxx @@ -1,4 +1,5 @@ -#include +#include +#include #include "host/skala_util.hpp" #include "skala_model.hpp" @@ -137,48 +138,49 @@ TEST_CASE("Model tensor validation rejects malformed boundary values", const c10::Device cpu(c10::DeviceType::CPU); const auto doubles = torch::TensorOptions().dtype(torch::kFloat64); - CHECK_THROWS_WITH(SkalaXC::validate_model_tensor({}, "test tensor", cpu, - torch::kFloat64, {2}), - Catch::Contains("Undefined test tensor")); + CHECK_THROWS_WITH( + SkalaXC::validate_model_tensor({}, "test tensor", cpu, torch::kFloat64, + {2}), + Catch::Matchers::ContainsSubstring("Undefined test tensor")); const auto wrong_type = torch::zeros({2}, torch::kFloat32); CHECK_THROWS_WITH(SkalaXC::validate_model_tensor(wrong_type, "test tensor", cpu, torch::kFloat64, {2}), - Catch::Contains("wrong dtype")); + Catch::Matchers::ContainsSubstring("wrong dtype")); const auto wrong_shape = torch::zeros({3}, doubles); CHECK_THROWS_WITH(SkalaXC::validate_model_tensor(wrong_shape, "test tensor", cpu, torch::kFloat64, {2}), - Catch::Contains("invalid dimensions")); + Catch::Matchers::ContainsSubstring("invalid dimensions")); const auto nonscalar_energy = torch::zeros({1}, doubles).requires_grad_(true); CHECK_THROWS_WITH(SkalaXC::validate_model_tensor( nonscalar_energy, "integrated model energy", cpu, torch::kFloat64, {}, false, true), - Catch::Contains("invalid dimensions")); + Catch::Matchers::ContainsSubstring("invalid dimensions")); const auto noncontiguous = torch::zeros({2, 3}, doubles).transpose(0, 1); CHECK_THROWS_WITH(SkalaXC::validate_model_tensor(noncontiguous, "test tensor", cpu, torch::kFloat64, noncontiguous.sizes(), true), - Catch::Contains("must be contiguous")); + Catch::Matchers::ContainsSubstring("must be contiguous")); const auto detached = torch::zeros({}, doubles); CHECK_THROWS_WITH( SkalaXC::validate_model_tensor(detached, "integrated model energy", cpu, torch::kFloat64, {}, false, true), - Catch::Contains("not connected to autograd")); + Catch::Matchers::ContainsSubstring("not connected to autograd")); CHECK_THROWS_WITH( SkalaXC::validate_model_tensor_finite( torch::full({1}, std::numeric_limits::quiet_NaN(), doubles), "test tensor"), - Catch::Contains("Non-finite test tensor")); + Catch::Matchers::ContainsSubstring("Non-finite test tensor")); CHECK_THROWS_WITH( SkalaXC::validate_model_tensor_finite( torch::full({1}, std::numeric_limits::infinity(), doubles), "test tensor"), - Catch::Contains("Non-finite test tensor")); + Catch::Matchers::ContainsSubstring("Non-finite test tensor")); #ifdef SKALAXC_HAS_CUDA if (torch::cuda::is_available()) { @@ -187,7 +189,7 @@ TEST_CASE("Model tensor validation rejects malformed boundary values", CHECK_THROWS_WITH( SkalaXC::validate_model_tensor(device_tensor, "test tensor", cpu, torch::kFloat64, {2}), - Catch::Contains("wrong device")); + Catch::Matchers::ContainsSubstring("wrong device")); const auto deferred = SkalaXC::model_tensor_finite_check(device_tensor); CHECK(deferred.device() == cuda); @@ -200,8 +202,9 @@ TEST_CASE("Model tensor validation rejects malformed boundary values", TEST_CASE("Model gradient validation preserves the feature contract", "[skala][model-validation]") { auto feature = torch::ones({2, 3}, torch::kFloat64).requires_grad_(true); - CHECK_THROWS_WITH(SkalaXC::validated_model_gradient(feature, "test gradient"), - Catch::Contains("Undefined test gradient")); + CHECK_THROWS_WITH( + SkalaXC::validated_model_gradient(feature, "test gradient"), + Catch::Matchers::ContainsSubstring("Undefined test gradient")); feature.square().sum().backward(); const auto gradient = @@ -221,7 +224,7 @@ def forward(self, mol: Dict[str, Tensor]) -> int: )JIT"); FeatureDict features; CHECK_THROWS_WITH(SkalaXC::get_exc(module.get_method("forward"), features), - Catch::Contains("must be a tensor")); + Catch::Matchers::ContainsSubstring("must be a tensor")); } TEST_CASE("Model resolution uses explicit and configured paths", @@ -252,8 +255,9 @@ TEST_CASE("Model resolution uses explicit and configured paths", std::string::npos); } - CHECK_THROWS_WITH(SkalaXC::detail::resolve_model_path("SKALA", installed), - Catch::Contains("specify a local checkpoint path")); + CHECK_THROWS_WITH( + SkalaXC::detail::resolve_model_path("SKALA", installed), + Catch::Matchers::ContainsSubstring("specify a local checkpoint path")); } TEST_CASE("Skala model loading validates paths and metadata", @@ -368,6 +372,6 @@ TEST_CASE("Runtime rank zero broadcasts the model archive", MPI_Comm_free(&runtime_communicator); #else - SUCCEED("MPI disabled"); + SKIP("MPI disabled"); #endif } diff --git a/SkalaXC/tests/skala_mpi_subcomm_unit_test.cxx b/SkalaXC/tests/skala_mpi_subcomm_unit_test.cxx index 1a33dd61..d2274d85 100644 --- a/SkalaXC/tests/skala_mpi_subcomm_unit_test.cxx +++ b/SkalaXC/tests/skala_mpi_subcomm_unit_test.cxx @@ -1,4 +1,4 @@ -#include +#include #include "model_grid_exchange.hpp" #include "mpi_wrapper.hpp" @@ -20,8 +20,7 @@ TEST_CASE("Eigen MPI collectives use runtime communicator", MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); MPI_Comm_size(MPI_COMM_WORLD, &world_size); if (world_size < 3) { - SUCCEED("Requires at least 3 MPI ranks"); - return; + SKIP("Requires at least 3 MPI ranks"); } MPI_Comm subcomm = MPI_COMM_NULL; @@ -68,7 +67,7 @@ TEST_CASE("Eigen MPI collectives use runtime communicator", MPI_Comm_free(&subcomm); #else - SUCCEED("MPI disabled"); + SKIP("MPI disabled"); #endif } @@ -80,8 +79,7 @@ TEST_CASE("MPI gradient wrapper transports semantic point records", MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); MPI_Comm_size(MPI_COMM_WORLD, &world_size); if (world_size < 3) { - SUCCEED("Requires at least 3 MPI ranks"); - return; + SKIP("Requires at least 3 MPI ranks"); } MPI_Comm subcomm = MPI_COMM_NULL; @@ -148,7 +146,7 @@ TEST_CASE("MPI gradient wrapper transports semantic point records", MPI_Comm_free(&subcomm); #else - SUCCEED("MPI disabled"); + SKIP("MPI disabled"); #endif } @@ -160,8 +158,7 @@ TEST_CASE("Model grid layout caches subcommunicator ordering metadata", MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); MPI_Comm_size(MPI_COMM_WORLD, &world_size); if (world_size < 3) { - SUCCEED("Requires at least 3 MPI ranks"); - return; + SKIP("Requires at least 3 MPI ranks"); } MPI_Comm subcomm = MPI_COMM_NULL; @@ -222,6 +219,6 @@ TEST_CASE("Model grid layout caches subcommunicator ordering metadata", MPI_Comm_free(&subcomm); #else - SUCCEED("MPI disabled"); + SKIP("MPI disabled"); #endif } diff --git a/SkalaXC/tests/skala_openmp_test.cxx b/SkalaXC/tests/skala_openmp_test.cxx index b38f4a24..5406cc1d 100644 --- a/SkalaXC/tests/skala_openmp_test.cxx +++ b/SkalaXC/tests/skala_openmp_test.cxx @@ -1,4 +1,4 @@ -#include +#include #include #include @@ -98,6 +98,6 @@ TEST_CASE("OpenMP thread counts preserve host EXC, VXC, and gradients", CHECK(spin_error <= 1e-12); CHECK(gradient_error <= 1e-10); #else - SUCCEED("OpenMP disabled"); + SKIP("OpenMP disabled"); #endif } diff --git a/SkalaXC/tests/skala_reorder_unit_test.cxx b/SkalaXC/tests/skala_reorder_unit_test.cxx index b0ba46e0..c3a70e05 100644 --- a/SkalaXC/tests/skala_reorder_unit_test.cxx +++ b/SkalaXC/tests/skala_reorder_unit_test.cxx @@ -1,4 +1,4 @@ -#include +#include #include "model_grid_exchange.hpp" #include "skala_util.hpp" diff --git a/SkalaXC/tests/skala_stress_test.cxx b/SkalaXC/tests/skala_stress_test.cxx index d7508ca1..7c24f266 100644 --- a/SkalaXC/tests/skala_stress_test.cxx +++ b/SkalaXC/tests/skala_stress_test.cxx @@ -1,4 +1,5 @@ -#include +#include +#include #include @@ -65,7 +66,7 @@ TEST_CASE("Repeated host evaluations remain stable and bounded", for (int iteration = 0; iteration < 100; ++iteration) { const auto result = integrator.eval_exc_vxc(scalar_density, spin_density); REQUIRE(std::get<0>(result) == - Approx(std::get<0>(reference)).margin(1e-13)); + Catch::Approx(std::get<0>(reference)).margin(1e-13)); REQUIRE((std::get<1>(result) - std::get<1>(reference)).norm() <= 1e-13); REQUIRE((std::get<2>(result) - std::get<2>(reference)).norm() <= 1e-13); } diff --git a/SkalaXC/tests/skala_traditional_integration_test.cxx b/SkalaXC/tests/skala_traditional_integration_test.cxx index ebf04c43..d1809a98 100644 --- a/SkalaXC/tests/skala_traditional_integration_test.cxx +++ b/SkalaXC/tests/skala_traditional_integration_test.cxx @@ -46,7 +46,7 @@ #include "parse_basis.hpp" -#include +#include #include #include "test_utils.hpp" diff --git a/SkalaXC/tests/skala_unit_main.cxx b/SkalaXC/tests/skala_unit_main.cxx index 72654ca6..aa65c0ce 100644 --- a/SkalaXC/tests/skala_unit_main.cxx +++ b/SkalaXC/tests/skala_unit_main.cxx @@ -1,5 +1,7 @@ #define CATCH_CONFIG_RUNNER -#include +#include +#include +#include #include #ifdef SKALAXC_HAS_CUDA @@ -10,15 +12,15 @@ namespace { /** * @brief Release unused LibTorch CUDA allocations between Catch2 cases. * - * Catch2 v2 executes cases serially within this process. CTest may still run + * Catch2 executes cases serially within this process. CTest may still run * separate test processes in parallel; each process has its own allocator, * although their live allocations still share the physical GPU. If in-process * parallel test execution is introduced, this process-wide cleanup must be * revisited because it can contend with concurrent cases and defeat caching. */ -class CudaCacheCleanupListener : public Catch::TestEventListenerBase { +class CudaCacheCleanupListener : public Catch::EventListenerBase { public: - using Catch::TestEventListenerBase::TestEventListenerBase; + using Catch::EventListenerBase::EventListenerBase; void testCaseEnded(const Catch::TestCaseStats&) override { c10::cuda::CUDACachingAllocator::emptyCache(); diff --git a/SkalaXC/tests/skala_util_unit_test.cxx b/SkalaXC/tests/skala_util_unit_test.cxx index c0b355ef..ca7c6cde 100644 --- a/SkalaXC/tests/skala_util_unit_test.cxx +++ b/SkalaXC/tests/skala_util_unit_test.cxx @@ -1,4 +1,4 @@ -#include +#include #include "task_data.hpp" #include diff --git a/SkalaXC/tests/spin_gradient_unit_test.cxx b/SkalaXC/tests/spin_gradient_unit_test.cxx index 9a7bd07d..dbd6bf61 100644 --- a/SkalaXC/tests/spin_gradient_unit_test.cxx +++ b/SkalaXC/tests/spin_gradient_unit_test.cxx @@ -1,4 +1,4 @@ -#include +#include #include "component_matrix_map.hpp" #include "spin_gradient.hpp" diff --git a/pixi.lock b/pixi.lock new file mode 100644 index 00000000..99135867 --- /dev/null +++ b/pixi.lock @@ -0,0 +1,24790 @@ +version: 7 +platforms: +- name: linux-64 + virtual-packages: + - __unix=0=0 + - __linux=4.18 + - __glibc=2.28 + - __archspec=0=x86_64 +- name: linux-64-cuda12 + subdir: linux-64 + virtual-packages: + - __cuda=12 + - __unix=0=0 + - __linux=4.18 + - __glibc=2.28 + - __archspec=0=x86_64 +- name: linux-64-cuda13 + subdir: linux-64 + virtual-packages: + - __cuda=13 + - __unix=0=0 + - __linux=4.18 + - __glibc=2.28 + - __archspec=0=x86_64 +- name: linux-aarch64 + virtual-packages: + - __unix=0=0 + - __linux=4.18 + - __glibc=2.28 + - __archspec=0=aarch64 +- name: osx-arm64 + virtual-packages: + - __unix=0=0 + - __osx=13.0 + - __archspec=0=m1 +environments: + assets: + channels: + - url: https://conda.anaconda.org/conda-forge/ + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.2.0-he0feb66_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.12.14-h0c77377_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.14-h5f976f7_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.15.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.30.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + cpp-integration: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-2.0.0-ha29393d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3c89d7e_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.3.0-h8846f6e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-2.0.0-hdab9b82_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-h7cc23a3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.3.0-h6f13dc8_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.3.0-h90d9265_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.1-py312h9be0db6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h9073bf1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-10_h5875eb1_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-10_hfef963f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.22.0-ha042cf0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-he503a2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.2.0-he0feb66_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.4.0-h23af247_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-10_h5e43f62_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h622638d_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.12.14-h0c77377_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.3.0-h54950a5_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.2.0-hdf11a46_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-hcc2c06a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-23.1.0-h7148c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py312h4c94fcb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hd2095e1_245.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-heb1ab33_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py312h38079b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h7cc23a3_1004.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.14-h5f976f7_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py312h54fa4ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.15.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/e3nn-0.6.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.30.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.3.0-h2b852eb_104.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.3.0-hb2c5482_104.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt-einsum-3.4.0-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum_fx-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - pypi: ./model + - pypi: ./skala + - pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9e/e9/1a19e42cd43cc1365e127db6aae85e1c671da1d9a5d746f4d34a50edb577/h5py-3.16.0-cp312-cp312-manylinux_2_28_x86_64.whl + linux-64-cuda12: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-2.0.0-ha29393d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3c89d7e_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.3.0-h8846f6e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-2.0.0-hdab9b82_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-h7cc23a3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.3.0-h6f13dc8_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.3.0-h90d9265_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.1-py312h9be0db6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h9073bf1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-10_h5875eb1_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-10_hfef963f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.22.0-ha042cf0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-he503a2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.2.0-he0feb66_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.4.0-h23af247_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-10_h5e43f62_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h622638d_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.12.14-h0c77377_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.3.0-h54950a5_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.2.0-hdf11a46_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-hcc2c06a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-23.1.0-h7148c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py312h4c94fcb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hd2095e1_245.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-heb1ab33_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py312h38079b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h7cc23a3_1004.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.14-h5f976f7_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py312h54fa4ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.15.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/e3nn-0.6.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.30.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.3.0-h2b852eb_104.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.3.0-hb2c5482_104.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt-einsum-3.4.0-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum_fx-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - pypi: ./model + - pypi: ./skala + - pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9e/e9/1a19e42cd43cc1365e127db6aae85e1c671da1d9a5d746f4d34a50edb577/h5py-3.16.0-cp312-cp312-manylinux_2_28_x86_64.whl + linux-64-cuda13: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-2.0.0-ha29393d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3c89d7e_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.3.0-h8846f6e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-2.0.0-hdab9b82_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-h7cc23a3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.3.0-h6f13dc8_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.3.0-h90d9265_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.1-py312h9be0db6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h9073bf1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-10_h5875eb1_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-10_hfef963f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.22.0-ha042cf0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-he503a2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.2.0-he0feb66_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.4.0-h23af247_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-10_h5e43f62_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h622638d_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.12.14-h0c77377_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.3.0-h54950a5_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.2.0-hdf11a46_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-hcc2c06a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-23.1.0-h7148c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py312h4c94fcb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hd2095e1_245.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-heb1ab33_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py312h38079b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h7cc23a3_1004.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.14-h5f976f7_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py312h54fa4ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.15.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/e3nn-0.6.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.30.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.3.0-h2b852eb_104.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.3.0-hb2c5482_104.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt-einsum-3.4.0-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum_fx-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - pypi: ./model + - pypi: ./skala + - pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9e/e9/1a19e42cd43cc1365e127db6aae85e1c671da1d9a5d746f4d34a50edb577/h5py-3.16.0-cp312-cp312-manylinux_2_28_x86_64.whl + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ast-serialize-0.9.0-py311hf77984d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-hb7a77c6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.14-h2aa3ae6_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h720e601_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.1-h6ffeea8_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-h38ae05a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.3-h6f4d18d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.16.0-h21f4ec5_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.8-h46fcd08_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h720e601_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h720e601_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.40.1-h102d43b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.833-hc7390e0_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.3-h206d751_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-h71f81a8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.18.0-h74b55db_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.14.0-hf596fc9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.16.0-h1f05bef_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3c89d7e_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.1.1-py312h703531f_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.16.0-py312h8b7ec3f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/elfutils-0.194-h849f50c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-h7cc23a3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.3.1-h54a6638_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hb7133d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gnutls-3.8.13-h18acefa_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.1-py312h9be0db6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h9073bf1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.9-gpl_h3152399_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-25.0.0-hcc2f0d9_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-25.0.0-h635bf11_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-25.0.0-h53684a4_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-25.0.0-h635bf11_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-25.0.0-h66fbfdd_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-10_h5875eb1_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-10_hfef963f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.22.0-ha042cf0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-he503a2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.8.0-hbc29df5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.8.0-hdbdcf42_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.82.1-h792040b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.4.0-h23af247_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.8-hfac485b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-10_h5e43f62_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmicrohttpd-1.0.10-hc2fc477_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.27.0-h3133023_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.27.0-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-25.0.0-h7376487_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h622638d_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.12.14-h0c77377_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h60473fc_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.2.0-hdf11a46_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtasn1-4.21.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-hcc2c06a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.8.3-h65a8314_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-23.1.0-h7148c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-hee9eb32_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-hebe6cf0_1003.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py312h4c94fcb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/memray-1.19.3-py312ha9ecdfb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hd2095e1_245.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-2.3.1-py312h89dfda2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.10.1-h5ef0d04_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-heb1ab33_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.1-h443056b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.26.5-h8d769aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.5-py312h8ecdadd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py312h38079b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h1b36aeb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h7cc23a3_1004.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/py-spy-0.4.2-hbe0e3b8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-25.0.0-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-25.0.0-py312h2054cf2_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.14-h5f976f7_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-librt-0.15.0-py312h1b36aeb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h94463f1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.5-h7e3ee7f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py312h54fa4ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py312hd9148b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.15.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/e3nn-0.6.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.30.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt-einsum-3.4.0-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum_fx-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.11.6-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.6.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/textual-8.2.8-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.7.8-pyh5ded981_0.conda + - pypi: ./benchmark + - pypi: ./model + - pypi: ./skala + - pypi: https://files.pythonhosted.org/packages/08/52/eefeba09be4ef2a1eb989eb92934561e8e502a6ee3c32654996e4be7e399/types_pyyaml-6.0.12.20260815-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2f/d4/c6a2b043e33f0dd012486dcebe0593585588d400175d22aad42049c88321/optype-0.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/60/c2/959caec5c46f484b5f8bb6def4b0cf7a45ba6acda26f12b75142d98cc5ae/pandas_stubs-3.0.5.260730-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/7c/5c2892e6bc0628a2ccf4e938e1e2db22794657ccb374672d66e20d73839e/numpy_typing_compat-20251206.2.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/65/6c/eea1d03e475217aea95b1d52aee09c97575d05bbc592c39c085b71dab89f/pyarrow_stubs-20.0.0.20260819-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9e/e9/1a19e42cd43cc1365e127db6aae85e1c671da1d9a5d746f4d34a50edb577/h5py-3.16.0-cp312-cp312-manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e1/26/d4bc2ba3427a623f79a6c10c8f427c7a55b56eb8b3eddc369319d97f741b/scipy_stubs-1.17.1.5-py3-none-any.whl + linux-aarch64: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ast-serialize-0.9.0-py311h8ca180e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.10.4-h03961ac_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.9.14-h6c1c863_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.14.2-he30d5cf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.3.2-hbf34bff_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.7.1-h423fd5f_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.11.0-hb2c4768_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.27.3-hc846123_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.16.0-hf64e385_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.12.8-h681413d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.2.7-hbf34bff_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.2.10-hbf34bff_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.40.1-h18900c3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.833-h1131a43_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-core-cpp-1.16.3-h412bcfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-identity-cpp-1.13.3-hd0001b6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-blobs-cpp-12.18.0-h2e50874_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-common-cpp-12.14.0-hacd5e5f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-files-datalake-cpp-12.16.0-hde34f15_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-1.2.0-h52fc18c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-bin-1.2.0-hdc3483e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.8-h29ee22c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-hca320e2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-2.1.1-py312h563f9cf_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/contourpy-1.3.3-py312hf18b547_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/coverage-7.16.0-py312he7c6268_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fmt-12.1.0-h166da81_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.18.3-ha4b22b4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fonttools-4.63.0-py312ha4530ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.14.3-h8af1aa0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fribidi-1.0.16-h5bc82ec_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.3.1-h7ac5ae9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glog-0.7.1-ha2f5727_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gmp-6.3.0-h4d6b352_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gmpy2-2.3.1-py312h70c4b35_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.15-h7ac5ae9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/hf-xet-1.5.2-py310h160093b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-py311h3512406_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h5bc82ec_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/kiwisolver-1.5.1-py312he33898b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-h095d8e5_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.19.1-h137c43b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.2.0-h52b7260_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20260526.0-cxx17_hc5e897d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-25.0.0-hf28620a_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-25.0.0-hb326ee9_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-compute-25.0.0-hdd99842_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-25.0.0-hb326ee9_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-25.0.0-hd99807d_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-10_haddc8a3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.2.0-h384ecca_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.2.0-h011f0d3_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.2.0-hb247b97_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-10_hd72aa62_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.22.0-h86273da_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-hfa851ae_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321hc48eb74_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h80f16a2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.1-hfae3067_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.7.0-hdaad0be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-h9cc7050_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.2.0-h205dda4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-16.2.0-he9431aa_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-16.2.0-he9431aa_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-16.2.0-hc864f27_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.88.3-hb514e8e_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-3.8.0-h2efc11c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-3.8.0-h66d5b86_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgrpc-1.82.1-h05b84e8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libharfbuzz-14.4.0-h8f7ccb3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h1ea5142_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.2.0-he30d5cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-10_h88aeb00_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.68.1-ha4b982d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.34-openmp_h2c8b6b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-1.27.0-hbe47268_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-headers-1.27.0-h8af1aa0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-25.0.0-h87079af_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.58-hf9b7768_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-7.35.1-h809b94e_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpsl-0.23.1-hb8431ed_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpython-3.12.14-hc3dd739_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libraqm-0.11.0-hd2f8911_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2025.11.05-h149037f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.4-h399dd60_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-h7572e3e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.2.0-hef695bb_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-16.2.0-hdbbeba8_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libthrift-0.22.0-ha522d1d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.2-h45f9f85_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtorch-2.13.0-cpu_generic_hf6f405e_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.11.3-hec6f9f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42.3-hd6fdeab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.52.1-h80f16a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h3f04742_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.38-h80f16a2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-16-2.15.3-h79dcc73_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.15.3-h869d058_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/llvm-openmp-23.1.0-hde6636f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-hfb11796_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py312hd077ced_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-base-3.11.1-py312h0683553_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpc-1.4.0-ha78d887_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpfr-4.2.2-h4b21e80_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-2.3.1-py312hd0d9aba_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-h2b6f883_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nlohmann_json-3.12.0-h7ac5ae9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.6-py312hce9e0af_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/onednn-3.12-omp_h605b386_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.4-h504851f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.4-he6ad1d5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/optree-0.20.0-py312h579b322_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orc-2.3.1-h1fb4f23_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-3.0.5-py312hf55c4e8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-he574923_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-12.3.0-py312h7f6b78e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.46.4-h7ac5ae9_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/prometheus-cpp-1.3.0-h7938499_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-7.2.2-py312h898233f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h5bc82ec_1004.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-25.0.0-py312h8025657_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-core-25.0.0-py312h2cce741_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.14-h94ad73b_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-librt-0.15.0-py312h085bef5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pytorch-2.13.0-cpu_generic_py312_h556be23_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py312ha4530ae_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/qhull-2020.2-h70be974_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/re2-2025.11.05-hfb2350b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-ha7194a6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.7.5-h61cb6f2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/scipy-1.18.0-py312ha7f05e0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sleef-3.9.0-h5bb93e2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.2-he774c54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_hf03c496_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ukkonen-1.1.0-py312h4f740d2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/unicodedata2-17.0.1-py312hcd1a082_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libice-1.1.2-h80f16a2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libsm-1.2.6-hf23e593_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libx11-1.8.13-h63a1b12_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxext-1.3.7-h5bc82ec_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrender-0.9.12-he30d5cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h29ee22c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.2-hdc9db2a_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-ng-2.3.3-h1024f78_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h9d15635_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.15.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/e3nn-0.6.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.30.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/opt-einsum-3.4.0-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum_fx-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.11.6-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.6.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.7.8-pyh5ded981_0.conda + - pypi: ./benchmark + - pypi: ./model + - pypi: ./skala + - pypi: https://files.pythonhosted.org/packages/08/52/eefeba09be4ef2a1eb989eb92934561e8e502a6ee3c32654996e4be7e399/types_pyyaml-6.0.12.20260815-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0a/9b/9053d2a5a6276352b883d57192ce0bed68b1bc2415b35824ea6942c2c999/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/2f/d4/c6a2b043e33f0dd012486dcebe0593585588d400175d22aad42049c88321/optype-0.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/60/c2/959caec5c46f484b5f8bb6def4b0cf7a45ba6acda26f12b75142d98cc5ae/pandas_stubs-3.0.5.260730-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/7c/5c2892e6bc0628a2ccf4e938e1e2db22794657ccb374672d66e20d73839e/numpy_typing_compat-20251206.2.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/65/6c/eea1d03e475217aea95b1d52aee09c97575d05bbc592c39c085b71dab89f/pyarrow_stubs-20.0.0.20260819-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/89/84/06281c82d4d1686fde1ac6b0f307c50918f1c0151062445ab3b6fa5a921d/h5py-3.16.0-cp312-cp312-manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/89/f2/24c58dad0c33ab417c5a090695a6788292d5d4edceae59bad055e5377e92/pyscf-2.14.0-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/e1/26/d4bc2ba3427a623f79a6c10c8f427c7a55b56eb8b3eddc369319d97f741b/scipy_stubs-1.17.1.5-py3-none-any.whl + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.15.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/e3nn-0.6.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.30.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/opt-einsum-3.4.0-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum_fx-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.11.6-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.6.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.7.8-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ast-serialize-0.9.0-py311hfcb3ee1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.4-h0f08c97_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.14-hb9ed60c_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.14.2-h84a0fba_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-hf0b4b85_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.7.1-ha581b6a_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.11.0-h27f0cb5_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.27.3-ha24efe8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.16.0-hf1a914d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.12.8-hdc61527_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.7-hf0b4b85_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-hf0b4b85_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.40.1-h5b5d287_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.833-haa98fb3_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.3-he5ae378_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.3-h05177fb_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.18.0-h409340b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.14.0-h7cba3ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.16.0-h16bb3af_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.2.0-hf00d406_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.2.0-he4a93e4_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h4e30115_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.8-h74c22ad_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.4-h580cee5_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.1.1-py312hc892d8b_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py312h3093aea_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.16.0-py312hf1f8172_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/dftd3-python-1.5.0-py312h2bbb03f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fmt-12.1.0-h99e4e11_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.18.3-h81aa574_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.63.0-py312h04c11ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.3-hce30654_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hb001647_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.3.1-h784d473_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-h6f9ecc1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-hf5e55b1_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.3.1-py312h1af6244_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.15-h784d473_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hf-xet-1.5.2-py310he76dbf2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-py310h579977c_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jonquil-0.3.2-gfortran_h04795c8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.5.1-py312hee531d8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h34f8a20_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.19.1-hce41798_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.2.0-h1eee2c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260526.0-cxx17_h4c27e2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-25.0.0-haaed7fe_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-25.0.0-heaff1e6_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-25.0.0-h93a2d87_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-25.0.0-heaff1e6_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-25.0.0-h2208e57_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-10_h51639a9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-h1dcdb26_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-h5295a6a_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-h2ddc9cb_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-10_hb0561ab_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.22.0-h6651222_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-23.1.0-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-he7e0567_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321h26f1114_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h1a92334_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.7.0-h47dc5ef_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-h2ed5691_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-16.2.0-h3cf6597_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-16.2.0-h07b0088_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-16.2.0-hdb7a957_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.3-h89cd0c0_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-3.8.0-ha595bda_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-3.8.0-hc8aed40_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.82.1-hf3e839d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libharfbuzz-14.4.0-hcda0f7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-he4c29f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.2.0-h84a0fba_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-10_hd9741b5_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h435687b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.34-openmp_h4f80526_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.27.0-h46c1d2a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.27.0-hce30654_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-25.0.0-h0de02aa_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-hf5e6511_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-7.35.1-h391e224_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpsl-0.23.1-hdb0c161_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpython-3.12.14-h4e5ec87_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libraqm-0.11.0-h45af499_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h5d15848_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.4-hca69786_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-hbf2880b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h1fb9c8a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.2-hf67920b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtorch-2.13.0-cpu_generic_hf893bd3_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.3-h2431656_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.52.1-h1a92334_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h202fb40_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hbffa61f_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-h5654f7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-23.1.0-hdb3d66b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-hdca3b7d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py312h04c11ed_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.11.1-py312h07c8dfe_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mctc-lib-0.5.2-gfortran_h0230218_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.4.0-h071a35a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.2-h72846b0_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-2.3.1-py312h9b6eb38_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-he64c551_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.12.0-h784d473_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.6-py312ha003a3f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/onednn-3.12-omp_h95bb4b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-h4d1e80c_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.4-h55eecbc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/optree-0.20.0-py312h42f75bc_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.3.1-hef2a647_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-3.0.5-py312h6510ced_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-he63d830_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.3.0-py312hf9dc30a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h784d473_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.2.2-py312hbd136b4_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hb001647_1004.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-25.0.0-py312h1f38498_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-25.0.0-py312h7d9569a_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.14-hd05a0c4_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-librt-0.15.0-py312h7ac3c4f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pytorch-2.13.0-cpu_generic_py312_ha1580ae_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py312h04c11ed_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-h5d60da5_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h8b90a29_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/s2n-1.7.5-h1b28cb6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.18.0-py312h4519d97_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/simple-dftd3-1.5.0-gfortran_h0230218_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sleef-3.9.0-hb028509_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.2-hada39a4_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-hbeba79b_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/toml-f-0.5.2-gfortran_h04795c8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.1.0-py312h766f71e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-17.0.1-py312h2bbb03f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h84a0fba_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-h84a0fba_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h74c22ad_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.2-h8088a28_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.3-h31dac16_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hf451053_7.conda + - pypi: ./benchmark + - pypi: ./model + - pypi: ./skala + - pypi: https://files.pythonhosted.org/packages/08/52/eefeba09be4ef2a1eb989eb92934561e8e502a6ee3c32654996e4be7e399/types_pyyaml-6.0.12.20260815-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2f/d4/c6a2b043e33f0dd012486dcebe0593585588d400175d22aad42049c88321/optype-0.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/48/ed/bb4aeb728505b4ce7edd55e9b2e35bcbd99ad0b0cae5c45b59e48b9ed62d/pyscf-2.14.0-py3-none-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/60/c2/959caec5c46f484b5f8bb6def4b0cf7a45ba6acda26f12b75142d98cc5ae/pandas_stubs-3.0.5.260730-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/7c/5c2892e6bc0628a2ccf4e938e1e2db22794657ccb374672d66e20d73839e/numpy_typing_compat-20251206.2.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/65/6c/eea1d03e475217aea95b1d52aee09c97575d05bbc592c39c085b71dab89f/pyarrow_stubs-20.0.0.20260819-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b0/42/c84efcc1d4caebafb1ecd8be4643f39c85c47a80fe254d92b8b43b1eadaf/h5py-3.16.0-cp312-cp312-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/e1/26/d4bc2ba3427a623f79a6c10c8f427c7a55b56eb8b3eddc369319d97f741b/scipy_stubs-1.17.1.5-py3-none-any.whl + docs: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-hb7a77c6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.14-h2aa3ae6_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h720e601_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.1-h6ffeea8_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-h38ae05a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.3-h6f4d18d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.16.0-h21f4ec5_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.8-h46fcd08_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h720e601_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h720e601_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.40.1-h102d43b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.833-hc7390e0_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.3-h206d751_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-h71f81a8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.18.0-h74b55db_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.14.0-hf596fc9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.16.0-h1f05bef_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.7.0-py312h3f22e6b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312he9c40d5_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3c89d7e_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.21-py312h8285ef7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-h7cc23a3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.3.1-h54a6638_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hb7133d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.5.5-py312h8285ef7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.1-py312h9be0db6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h9073bf1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-25.0.0-hcc2f0d9_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-25.0.0-h635bf11_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-25.0.0-h53684a4_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-25.0.0-h635bf11_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-25.0.0-h66fbfdd_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-10_h5875eb1_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-10_hfef963f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.22.0-ha042cf0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-he503a2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.8.0-hbc29df5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.8.0-hdbdcf42_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.82.1-h792040b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.4.0-h23af247_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-10_h5e43f62_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.27.0-h3133023_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.27.0-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-25.0.0-h7376487_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h622638d_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.12.14-h0c77377_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h60473fc_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.22-hebe6cf0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.2.0-hdf11a46_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-hcc2c06a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-23.1.0-h7148c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-hee9eb32_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py312h4c94fcb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hd2095e1_245.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-heb1ab33_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.1-h443056b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.5-py312h8ecdadd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py312h38079b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h1b36aeb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h7cc23a3_1004.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-25.0.0-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-25.0.0-py312h2054cf2_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.14-h5f976f7_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.2.0-py312h8a5ba0d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h94463f1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-2026.6.3-py312hc767a74_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.5-h7e3ee7f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py312h54fa4ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.52-py312h5253ce2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.8-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h09e67af_11.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.15.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.15.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/future-1.0.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.30.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.3.0-pyha191276_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.17.1-pyh53cf698_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.9-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.20.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-cache-1.0.1-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.17-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/myst-nb-1.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/myst-parser-5.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.11.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.11.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio2-1.7.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.11.6-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.53-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybtex-0.26.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybtex-docutils-1.0.3-pyhcf101f3_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.20.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.22.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.9.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-book-theme-1.4.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-fortran-1.1.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-bibtex-2.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-moderncmakedomain-3.29.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.16.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.8.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.16-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda + - pypi: ./benchmark + - pypi: ./skala + - pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9e/e9/1a19e42cd43cc1365e127db6aae85e1c671da1d9a5d746f4d34a50edb577/h5py-3.16.0-cp312-cp312-manylinux_2_28_x86_64.whl + ftorch: + channels: + - url: https://conda.anaconda.org/conda-forge/ + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-2.0.0-ha29393d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.3.0-h8846f6e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-2.0.0-hdab9b82_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-2.0.0-h0f4f740_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.3.0-h6f13dc8_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-15.3.0-h27ced10_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.3.0-h90d9265_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-10_h5875eb1_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-10_hfef963f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.22.0-ha042cf0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.2.0-he0feb66_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-10_h5e43f62_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h622638d_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.12.14-h0c77377_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.3.0-h54950a5_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-23.1.0-h7148c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hd2095e1_245.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.5.2-py312he827f4e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.14-h5f976f7_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.15.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.30.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.3.0-h2b852eb_104.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.3.0-hb2c5482_104.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + linux-64-cuda12: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-2.0.0-ha29393d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.3.0-h8846f6e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-2.0.0-hdab9b82_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-2.0.0-h0f4f740_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.3.0-h6f13dc8_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-15.3.0-h27ced10_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.3.0-h90d9265_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-10_h5875eb1_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-10_hfef963f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.22.0-ha042cf0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.2.0-he0feb66_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-10_h5e43f62_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h622638d_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.12.14-h0c77377_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.3.0-h54950a5_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-23.1.0-h7148c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hd2095e1_245.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.5.2-py312he827f4e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.14-h5f976f7_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.15.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.30.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.3.0-h2b852eb_104.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.3.0-hb2c5482_104.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + linux-64-cuda13: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-2.0.0-ha29393d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.3.0-h8846f6e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-2.0.0-hdab9b82_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-2.0.0-h0f4f740_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.3.0-h6f13dc8_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-15.3.0-h27ced10_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.3.0-h90d9265_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-10_h5875eb1_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-10_hfef963f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.22.0-ha042cf0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.2.0-he0feb66_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-10_h5e43f62_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h622638d_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.12.14-h0c77377_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.3.0-h54950a5_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-23.1.0-h7148c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hd2095e1_245.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.5.2-py312he827f4e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.14-h5f976f7_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.15.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.30.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.3.0-h2b852eb_104.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.3.0-hb2c5482_104.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + gpu-cuda12-torch212: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + packages: + linux-64-cuda12: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-hb7a77c6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.14-h2aa3ae6_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h720e601_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.1-h6ffeea8_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-h38ae05a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.3-h6f4d18d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.16.0-h21f4ec5_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.8-h46fcd08_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h720e601_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h720e601_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.40.1-h102d43b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.833-hc7390e0_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.3-h206d751_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-h71f81a8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.18.0-h74b55db_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.14.0-hf596fc9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.16.0-h1f05bef_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3c89d7e_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.16.0-py312h8b7ec3f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-crt-tools-12.9.86-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.9.79-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-12.9.79-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-12.9.79-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cuobjdump-12.9.82-hffce074_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-12.9.79-h676940d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-tools-12.9.86-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvdisasm-12.9.88-hffce074_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.9.86-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-dev-12.9.86-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-12.9.79-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-12.9.86-h4bc722e_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cutensor-2.7.0.5-h2d75abc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-h7cc23a3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.3.1-h54a6638_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hb7133d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.1-py312h9be0db6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h9073bf1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-25.0.0-hcc2f0d9_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-25.0.0-h635bf11_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-25.0.0-h53684a4_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-25.0.0-h635bf11_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-25.0.0-h66fbfdd_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-10_h5875eb1_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-10_hfef963f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-12.9.2.10-h676940d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-dev-12.9.2.10-h676940d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcudnn-9.10.2.21-hf7e9902_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcudss-0.8.0.10-h58dd1b1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-11.4.1.4-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.14.1.1-hbc026e6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.3.10.19-h676940d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.22.0-ha042cf0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-11.7.5.82-h676940d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.5.10.65-hecca717_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-he503a2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.8.0-hbc29df5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.8.0-hdbdcf42_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.82.1-h792040b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.4.0-h23af247_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-10_h5e43f62_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmagma-2.10.0-ha7672b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.9.86-hecca717_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.27.0-h3133023_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.27.0-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-25.0.0-h7376487_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h622638d_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.12.14-h0c77377_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h60473fc_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.2.0-hdf11a46_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-hcc2c06a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.12.1-cuda129_mkl_h6b8258c_300.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-23.1.0-h7148c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-hee9eb32_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py312h4c94fcb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hd2095e1_245.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nccl-2.30.7.1-h4d09622_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-heb1ab33_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.1-h443056b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.5-py312h8ecdadd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py312h38079b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h7cc23a3_1004.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-25.0.0-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-25.0.0-py312h2054cf2_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.14-h5f976f7_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.12.1-cuda129_mkl_py312_h51dba9f_300.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-gpu-2.12.1-cuda129_mkl_h0d04637_300.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-64.0-h192683f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h94463f1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.5-h7e3ee7f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py312h54fa4ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/triton-3.7.1-cuda129py312h811769c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.15.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-12.9.27-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-12.9.86-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-12.9.79-h3f2d84a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-12.9.79-h3f2d84a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.9.79-h3f2d84a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/e3nn-0.6.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.30.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt-einsum-3.4.0-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum_fx-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - pypi: ./benchmark + - pypi: ./model + - pypi: ./skala + - pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4d/57/f53eb30c38aa4eeabddc3bddf283f4c10616de65d95fcd1f43900721f425/geometric-1.1.1.tar.gz + - pypi: https://files.pythonhosted.org/packages/63/b5/ff337f8db80e67c464846a7d10f7f6bc1039c40a2c8b57ecb90d6b0c11d9/gpu4pyscf_libxc_cuda12x-0.8.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7c/5b/65124de2dbaf2e85109f611a41947e39acd6dd938751c04b4c4d7bf6fc82/cupy_cuda12x-14.2.0-cp312-cp312-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/99/a7/6ed6f987f79d6442e553841ddd45439aa90a3992d8e009ccd47e46901814/gpu4pyscf_cuda12x-1.8.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9d/e6/22df83f82f9bc26cb1c42265cf14d34d4908dba2a0f261bd7b28244acb00/cuda_pathfinder-1.8.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/e9/1a19e42cd43cc1365e127db6aae85e1c671da1d9a5d746f4d34a50edb577/h5py-3.16.0-cp312-cp312-manylinux_2_28_x86_64.whl + gpu-cuda12-torch213: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + packages: + linux-64-cuda12: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-hb7a77c6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.14-h2aa3ae6_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h720e601_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.1-h6ffeea8_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-h38ae05a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.3-h6f4d18d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.16.0-h21f4ec5_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.8-h46fcd08_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h720e601_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h720e601_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.40.1-h102d43b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.833-hc7390e0_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.3-h206d751_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-h71f81a8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.18.0-h74b55db_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.14.0-hf596fc9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.16.0-h1f05bef_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3c89d7e_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.16.0-py312h8b7ec3f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-crt-tools-12.9.86-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.9.79-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-12.9.79-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-12.9.79-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cuobjdump-12.9.82-hffce074_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-12.9.79-h676940d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-tools-12.9.86-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvdisasm-12.9.88-hffce074_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.9.86-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-dev-12.9.86-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-12.9.79-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-12.9.86-h4bc722e_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cutensor-2.7.0.5-h2d75abc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-h7cc23a3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.3.1-h54a6638_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hb7133d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.1-py312h9be0db6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h9073bf1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-25.0.0-hcc2f0d9_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-25.0.0-h635bf11_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-25.0.0-h53684a4_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-25.0.0-h635bf11_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-25.0.0-h66fbfdd_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-10_h5875eb1_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-10_hfef963f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-12.9.2.10-h676940d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-dev-12.9.2.10-h676940d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcudnn-9.10.2.21-hf7e9902_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcudss-0.8.0.10-h58dd1b1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-11.4.1.4-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.14.1.1-hbc026e6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.3.10.19-h676940d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.22.0-ha042cf0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-11.7.5.82-h676940d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.5.10.65-hecca717_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-he503a2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.8.0-hbc29df5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.8.0-hdbdcf42_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.82.1-h792040b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.4.0-h23af247_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-10_h5e43f62_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmagma-2.10.0-ha7672b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.9.86-hecca717_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.27.0-h3133023_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.27.0-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-25.0.0-h7376487_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h622638d_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.12.14-h0c77377_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h60473fc_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.2.0-hdf11a46_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-hcc2c06a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cuda129_mkl_h546cc0b_302.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-23.1.0-h7148c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-hee9eb32_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py312h4c94fcb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hd2095e1_245.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nccl-2.30.7.1-h4d09622_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-heb1ab33_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.1-h443056b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.5-py312h8ecdadd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py312h38079b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h7cc23a3_1004.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-25.0.0-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-25.0.0-py312h2054cf2_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.14-h5f976f7_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cuda129_mkl_py312_h0509a7e_302.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-gpu-2.13.0-cuda129_mkl_h0d04637_302.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-64.0-h192683f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h94463f1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.5-h7e3ee7f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py312h54fa4ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/triton-3.7.1-cuda129py312h811769c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.15.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-12.9.27-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-12.9.86-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-12.9.79-h3f2d84a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-12.9.79-h3f2d84a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.9.79-h3f2d84a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/e3nn-0.6.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.30.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt-einsum-3.4.0-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum_fx-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - pypi: ./benchmark + - pypi: ./model + - pypi: ./skala + - pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4d/57/f53eb30c38aa4eeabddc3bddf283f4c10616de65d95fcd1f43900721f425/geometric-1.1.1.tar.gz + - pypi: https://files.pythonhosted.org/packages/63/b5/ff337f8db80e67c464846a7d10f7f6bc1039c40a2c8b57ecb90d6b0c11d9/gpu4pyscf_libxc_cuda12x-0.8.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7c/5b/65124de2dbaf2e85109f611a41947e39acd6dd938751c04b4c4d7bf6fc82/cupy_cuda12x-14.2.0-cp312-cp312-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/99/a7/6ed6f987f79d6442e553841ddd45439aa90a3992d8e009ccd47e46901814/gpu4pyscf_cuda12x-1.8.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9d/e6/22df83f82f9bc26cb1c42265cf14d34d4908dba2a0f261bd7b28244acb00/cuda_pathfinder-1.8.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/e9/1a19e42cd43cc1365e127db6aae85e1c671da1d9a5d746f4d34a50edb577/h5py-3.16.0-cp312-cp312-manylinux_2_28_x86_64.whl + gpu-cuda13-torch213: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + packages: + linux-64-cuda13: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-hb7a77c6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.14-h2aa3ae6_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h720e601_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.1-h6ffeea8_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-h38ae05a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.3-h6f4d18d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.16.0-h21f4ec5_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.8-h46fcd08_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h720e601_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h720e601_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.40.1-h102d43b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.833-hc7390e0_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.3-h206d751_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-h71f81a8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.18.0-h74b55db_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.14.0-hf596fc9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.16.0-h1f05bef_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3c89d7e_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.16.0-py312h8b7ec3f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-crt-tools-13.3.73-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-13.3.29-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-13.3.29-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-13.3.29-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cuobjdump-13.3.73-hffce074_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-13.3.75-h676940d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-tools-13.3.73-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvdisasm-13.3.73-hffce074_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-13.3.33-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-dev-13.3.33-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-13.3.29-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-13.3.73-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cutensor-2.7.0.5-h15eaa2f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-h7cc23a3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.3.1-h54a6638_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hb7133d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.1-py312h9be0db6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h9073bf1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-25.0.0-hcc2f0d9_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-25.0.0-h635bf11_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-25.0.0-h53684a4_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-25.0.0-h635bf11_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-25.0.0-h66fbfdd_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-10_h5875eb1_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-10_hfef963f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-13.6.0.2-h676940d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-dev-13.6.0.2-h676940d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcudnn-9.25.1.1-ha4b6413_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcudss-0.8.0.10-h7bcfba5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-12.3.0.29-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.18.1.6-h053a66a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.4.3.29-h676940d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.22.0-ha042cf0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-12.2.6.9-h676940d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.8.2.51-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-he503a2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.8.0-hbc29df5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.8.0-hdbdcf42_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.82.1-h792040b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.4.0-h23af247_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-10_h5e43f62_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmagma-2.10.0-hd93470c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-13.3.33-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.27.0-h3133023_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.27.0-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-25.0.0-h7376487_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h622638d_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.12.14-h0c77377_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h60473fc_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.2.0-hdf11a46_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-hcc2c06a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cuda130_mkl_h1ca3d63_302.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-23.1.0-h7148c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-hee9eb32_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py312h4c94fcb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hd2095e1_245.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nccl-2.30.7.1-h1aa9b5a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-heb1ab33_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.1-h443056b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.5-py312h8ecdadd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py312h38079b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h7cc23a3_1004.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-25.0.0-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-25.0.0-py312h2054cf2_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.14-h5f976f7_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cuda130_mkl_py312_hcdc9d04_302.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-gpu-2.13.0-cuda129_mkl_h0d04637_302.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-64.0-h192683f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h94463f1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.5-h7e3ee7f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py312h54fa4ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/triton-3.7.1-cuda130py312hc6dca4b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.15.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-13.3.3.4.1-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-13.3.73-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-13.3.29-h376f20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-13.3.29-h376f20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-13.3.29-h376f20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/e3nn-0.6.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.30.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt-einsum-3.4.0-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum_fx-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - pypi: ./benchmark + - pypi: ./model + - pypi: ./skala + - pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4d/57/f53eb30c38aa4eeabddc3bddf283f4c10616de65d95fcd1f43900721f425/geometric-1.1.1.tar.gz + - pypi: https://files.pythonhosted.org/packages/5a/3e/d7ead2933f8434f264ac8e092c7f3793f982450e4ffa6a6c82fc60014508/gpu4pyscf_cuda13x-1.8.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7e/bf/c4c25e97552320451afdcd459d4b6e0b715459594e998b23051c06db64c3/cupy_cuda13x-14.2.0-cp312-cp312-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/81/1d/4fcbbf1ad89454d67ef227af32fe07a86a2bdc746c4cf245e105e227e64a/gpu4pyscf_libxc_cuda13x-0.8.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9d/e6/22df83f82f9bc26cb1c42265cf14d34d4908dba2a0f261bd7b28244acb00/cuda_pathfinder-1.8.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/e9/1a19e42cd43cc1365e127db6aae85e1c671da1d9a5d746f4d34a50edb577/h5py-3.16.0-cp312-cp312-manylinux_2_28_x86_64.whl + lint: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ast-serialize-0.9.0-py311hf77984d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-hb7a77c6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.14-h2aa3ae6_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h720e601_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.1-h6ffeea8_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-h38ae05a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.3-h6f4d18d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.16.0-h21f4ec5_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.8-h46fcd08_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h720e601_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h720e601_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.40.1-h102d43b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.833-hc7390e0_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.3-h206d751_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-h71f81a8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.18.0-h74b55db_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.14.0-hf596fc9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.16.0-h1f05bef_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3c89d7e_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.1.1-py312h703531f_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.16.0-py312h8b7ec3f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/elfutils-0.194-h849f50c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-h7cc23a3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.3.1-h54a6638_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hb7133d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gnutls-3.8.13-h18acefa_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.1-py312h9be0db6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h9073bf1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.9-gpl_h3152399_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-25.0.0-hcc2f0d9_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-25.0.0-h635bf11_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-25.0.0-h53684a4_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-25.0.0-h635bf11_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-25.0.0-h66fbfdd_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-10_h5875eb1_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-10_hfef963f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.22.0-ha042cf0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-he503a2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.8.0-hbc29df5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.8.0-hdbdcf42_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.82.1-h792040b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.4.0-h23af247_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.8-hfac485b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-10_h5e43f62_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmicrohttpd-1.0.10-hc2fc477_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.27.0-h3133023_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.27.0-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-25.0.0-h7376487_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h622638d_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.12.14-h0c77377_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h60473fc_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.2.0-hdf11a46_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtasn1-4.21.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-hcc2c06a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.8.3-h65a8314_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-23.1.0-h7148c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-hee9eb32_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-hebe6cf0_1003.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py312h4c94fcb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/memray-1.19.3-py312ha9ecdfb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hd2095e1_245.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-2.3.1-py312h89dfda2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.10.1-h5ef0d04_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-heb1ab33_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.1-h443056b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.26.5-h8d769aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.5-py312h8ecdadd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py312h38079b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h1b36aeb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h7cc23a3_1004.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/py-spy-0.4.2-hbe0e3b8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-25.0.0-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-25.0.0-py312h2054cf2_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.14-h5f976f7_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-librt-0.15.0-py312h1b36aeb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h94463f1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.5-h7e3ee7f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py312h54fa4ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py312hd9148b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.15.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/e3nn-0.6.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.30.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt-einsum-3.4.0-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum_fx-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.11.6-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.6.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/textual-8.2.8-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.7.8-pyh5ded981_0.conda + - pypi: ./benchmark + - pypi: ./model + - pypi: ./skala + - pypi: https://files.pythonhosted.org/packages/08/52/eefeba09be4ef2a1eb989eb92934561e8e502a6ee3c32654996e4be7e399/types_pyyaml-6.0.12.20260815-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2f/d4/c6a2b043e33f0dd012486dcebe0593585588d400175d22aad42049c88321/optype-0.17.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/60/c2/959caec5c46f484b5f8bb6def4b0cf7a45ba6acda26f12b75142d98cc5ae/pandas_stubs-3.0.5.260730-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/7c/5c2892e6bc0628a2ccf4e938e1e2db22794657ccb374672d66e20d73839e/numpy_typing_compat-20251206.2.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/65/6c/eea1d03e475217aea95b1d52aee09c97575d05bbc592c39c085b71dab89f/pyarrow_stubs-20.0.0.20260819-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9e/e9/1a19e42cd43cc1365e127db6aae85e1c671da1d9a5d746f4d34a50edb577/h5py-3.16.0-cp312-cp312-manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e1/26/d4bc2ba3427a623f79a6c10c8f427c7a55b56eb8b3eddc369319d97f741b/scipy_stubs-1.17.1.5-py3-none-any.whl + release: + channels: + - url: https://conda.anaconda.org/conda-forge/ + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.2.0-he0feb66_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.12.14-h0c77377_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.14-h5f976f7_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.6.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda + skalaxc-cuda12: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + packages: + linux-64-cuda12: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ast-serialize-0.9.0-py311hf77984d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-h4610da3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.15-h6bbde05_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h01ee8f8_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-hbe094ff_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.5-h4f381ba_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.13.1-h7508075_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h01ee8f8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h01ee8f8_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils-2.46.1-default_h4852527_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.46.1-default_h4852527_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3c89d7e_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/catch2-3.16.0-h4dbf13b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-14.4.0-h611768e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.16.0-py312h8b7ec3f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-crt-tools-12.9.86-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.9.79-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-12.9.79-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-12.9.79-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cuobjdump-12.9.82-hffce074_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-12.9.79-h676940d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cuxxfilt-12.9.82-hffce074_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-12.9.86-hcdd1206_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-impl-12.9.86-h85509e4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-tools-12.9.86-he02047a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc_linux-64-12.9.86-he0b4e1d_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvdisasm-12.9.88-hffce074_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvprune-12.9.82-hffce074_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.9.86-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-dev-12.9.86-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-12.9.79-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-12.9.86-h4bc722e_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-12.9.86-h4bc722e_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cutensor-2.7.0.5-h2d75abc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-1.11.0-hfcd1e18_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-5.0.1-h19c2612_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-1.11.0-h9bea470_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-h7cc23a3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-14.4.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.4.0-heaf7ae8_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.4.0-hc469d41_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-14.4.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-14.4.0-he75539a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-14.4.0-h490a4d9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.55.0-pl5321h5685339_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-14.4.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.4.0-hc436dd5_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.4.0-he93183a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py312h7082e50_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.2.0-nompi_hc529623_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.1-py312h9be0db6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h9073bf1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-10_h5875eb1_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-10_hfef963f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-12.9.2.10-h676940d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-dev-12.9.2.10-h676940d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcudnn-9.10.2.21-hf7e9902_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcudss-0.8.0.10-h58dd1b1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-11.4.1.4-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.14.1.1-hbc026e6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.3.10.19-h676940d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.22.0-ha042cf0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-11.7.5.82-h676940d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.5.10.65-hecca717_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfabric-2.6.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfabric1-2.6.0-h6b3ec72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-he503a2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.2.0-he0feb66_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.4.0-h23af247_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-10_h5e43f62_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmagma-2.10.0-ha7672b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.9.86-hecca717_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvptxcompiler-dev-12.9.86-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpmix-5.0.8-h31fc519_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h622638d_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.12.14-h0c77377_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.4.0-hf39dbba_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.2.0-hdf11a46_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-hcc2c06a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cuda129_mkl_h546cc0b_302.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-23.1.0-h7148c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py312h4c94fcb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hd2095e1_245.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpi4py-4.1.2-py312hd140a38_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-2.3.1-py312h89dfda2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nccl-2.30.7.1-h4d09622_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-heb1ab33_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openmpi-5.0.10-hee33aa4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py312h38079b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h1114479_1012.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h1b36aeb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h7cc23a3_1004.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.14-h5f976f7_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-librt-0.15.0-py312h1b36aeb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cuda129_mkl_py312_h0509a7e_302.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-gpu-2.13.0-cuda129_mkl_h0d04637_302.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-64.0-h192683f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.6-h7e3ee7f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py312h54fa4ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/triton-3.7.1-cuda129py312h811769c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ucc-1.8.0-h539fd1b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ucx-1.22.0-hb659a20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.15.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-2.0.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-2.0.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-12.9.27-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-compiler-12.9.2-hbad6d8a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-12.9.86-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-12.9.79-h3f2d84a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-12.9.79-h3f2d84a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.9.79-h3f2d84a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-driver-dev_linux-64-12.9.79-h3f2d84a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvcc-dev_linux-64-12.9.86-he91c749_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-12.9.86-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.30.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.4.0-hd9a9cd0_104.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_linux-64-12.9.86-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.4.0-ha5b54cb_104.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpi-1.0.1-openmpi.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.2.1-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.48.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda + - pypi: ./skala + - pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4d/57/f53eb30c38aa4eeabddc3bddf283f4c10616de65d95fcd1f43900721f425/geometric-1.1.1.tar.gz + - pypi: https://files.pythonhosted.org/packages/63/b5/ff337f8db80e67c464846a7d10f7f6bc1039c40a2c8b57ecb90d6b0c11d9/gpu4pyscf_libxc_cuda12x-0.8.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7c/5b/65124de2dbaf2e85109f611a41947e39acd6dd938751c04b4c4d7bf6fc82/cupy_cuda12x-14.2.0-cp312-cp312-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/99/a7/6ed6f987f79d6442e553841ddd45439aa90a3992d8e009ccd47e46901814/gpu4pyscf_cuda12x-1.8.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9d/e6/22df83f82f9bc26cb1c42265cf14d34d4908dba2a0f261bd7b28244acb00/cuda_pathfinder-1.8.1-py3-none-any.whl + skalaxc-cuda13: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + packages: + linux-64-cuda13: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ast-serialize-0.9.0-py311hf77984d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-h4610da3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.15-h6bbde05_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h01ee8f8_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-hbe094ff_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.5-h4f381ba_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.13.1-h7508075_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h01ee8f8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h01ee8f8_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.46.1-default_h4852527_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-2.0.0-ha29393d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3c89d7e_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/catch2-3.16.0-h4dbf13b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.3.0-h8846f6e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.16.0-py312h8b7ec3f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-crt-tools-13.3.73-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-ctadvisor-13.3.33-h676940d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-13.3.29-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-13.3.29-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-13.3.29-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cuobjdump-13.3.73-hffce074_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-13.3.75-h676940d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cuxxfilt-13.3.29-hffce074_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-13.3.73-hcdd1206_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-impl-13.3.73-h376f20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-tools-13.3.73-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc_linux-64-13.3.73-hb2fc203_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvdisasm-13.3.73-hffce074_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvprune-13.3.29-hffce074_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-13.3.33-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-dev-13.3.33-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-13.3.29-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-13.3.73-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-13.3.73-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-tileiras-13.3.36-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cutensor-2.7.0.5-h15eaa2f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-2.0.0-hdab9b82_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-5.0.1-h19c2612_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-2.0.0-h0f4f740_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-h7cc23a3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.3.0-h6f13dc8_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-15.3.0-h7df7c86_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-15.3.0-h27ced10_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-15.3.0-h901e4f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.55.0-pl5321h5685339_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.3.0-h90d9265_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-15.3.0-h8c4937a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py312h7082e50_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.2.0-nompi_hc529623_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.1-py312h9be0db6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h9073bf1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-10_h5875eb1_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-10_hfef963f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-13.6.0.2-h676940d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-dev-13.6.0.2-h676940d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcudnn-9.25.1.1-ha4b6413_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcudss-0.8.0.10-h7bcfba5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-12.3.0.29-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.18.1.6-h053a66a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.4.3.29-h676940d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.22.0-ha042cf0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-12.2.6.9-h676940d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.8.2.51-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfabric-2.6.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfabric1-2.6.0-h6b3ec72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-he503a2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.2.0-he0feb66_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.4.0-h23af247_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-10_h5e43f62_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmagma-2.10.0-hd93470c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-13.3.33-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvptxcompiler-dev-13.3.73-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpmix-5.0.8-h31fc519_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h622638d_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.12.14-h0c77377_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.3.0-h54950a5_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.2.0-hdf11a46_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-hcc2c06a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cuda130_mkl_h1ca3d63_302.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-23.1.0-h7148c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py312h4c94fcb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hd2095e1_245.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpi4py-4.1.2-py312hd140a38_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-2.3.1-py312h89dfda2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nccl-2.30.7.1-h1aa9b5a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-heb1ab33_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openmpi-5.0.10-hee33aa4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py312h38079b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h1114479_1012.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h1b36aeb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h7cc23a3_1004.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.14-h5f976f7_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-librt-0.15.0-py312h1b36aeb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cuda130_mkl_py312_hcdc9d04_302.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-gpu-2.13.0-cuda129_mkl_h0d04637_302.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-64.0-h192683f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.6-h7e3ee7f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py312h54fa4ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/triton-3.7.1-cuda130py312hc6dca4b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ucc-1.8.0-h7a4b9c7_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ucx-1.22.0-h1527165_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.15.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-2.0.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-2.0.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-13.3.3.4.1-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-compiler-13.3.1-hbad6d8a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-13.3.73-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-13.3.29-h376f20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-13.3.29-h376f20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-13.3.29-h376f20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-driver-dev_linux-64-13.3.29-h376f20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvcc-dev_linux-64-13.3.73-he91c749_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-13.3.73-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.30.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.3.0-h2b852eb_104.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_linux-64-13.3.73-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.3.0-hb2c5482_104.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpi-1.0.1-openmpi.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.2.1-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.48.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda + - pypi: ./skala + - pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4d/57/f53eb30c38aa4eeabddc3bddf283f4c10616de65d95fcd1f43900721f425/geometric-1.1.1.tar.gz + - pypi: https://files.pythonhosted.org/packages/5a/3e/d7ead2933f8434f264ac8e092c7f3793f982450e4ffa6a6c82fc60014508/gpu4pyscf_cuda13x-1.8.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7e/bf/c4c25e97552320451afdcd459d4b6e0b715459594e998b23051c06db64c3/cupy_cuda13x-14.2.0-cp312-cp312-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/81/1d/4fcbbf1ad89454d67ef227af32fe07a86a2bdc746c4cf245e105e227e64a/gpu4pyscf_libxc_cuda13x-0.8.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9d/e6/22df83f82f9bc26cb1c42265cf14d34d4908dba2a0f261bd7b28244acb00/cuda_pathfinder-1.8.1-py3-none-any.whl + skalaxc-cuda13-clang: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + packages: + linux-64-cuda13: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ast-serialize-0.9.0-py311hf77984d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-h4610da3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.15-h6bbde05_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h01ee8f8_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-hbe094ff_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.5-h4f381ba_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.13.1-h7508075_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h01ee8f8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h01ee8f8_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.46.1-default_h4852527_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-2.0.0-ha29393d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3c89d7e_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/catch2-3.16.0-h4dbf13b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-20-20.1.8-default_hc302687_17.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-20.1.8-default_cfg_h7f4fe12_17.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang_impl_linux-64-20.1.8-default_cfg_h027053c_17.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang_linux-64-20.1-h3830e3d_28.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clangxx_impl_linux-64-20.1.8-default_cfg_h027053c_17.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clangxx_linux-64-20.1-h8eaea6b_28.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/compiler-rt-20.1.8-hb700be7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.16.0-py312h8b7ec3f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-crt-tools-13.3.73-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-ctadvisor-13.3.33-h676940d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-13.3.29-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-13.3.29-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-13.3.29-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cuobjdump-13.3.73-hffce074_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-13.3.75-h676940d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cuxxfilt-13.3.29-hffce074_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-13.3.73-hcdd1206_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-impl-13.3.73-h376f20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-tools-13.3.73-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc_linux-64-13.3.73-hb2fc203_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvdisasm-13.3.73-hffce074_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvprune-13.3.29-hffce074_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-13.3.33-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-dev-13.3.33-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-13.3.29-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-13.3.73-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-13.3.73-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-tileiras-13.3.36-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cutensor-2.7.0.5-h15eaa2f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-2.0.0-hdab9b82_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-5.0.1-h19c2612_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-2.0.0-h0f4f740_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-h7cc23a3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.2.0-hb7a6aa6_20.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-h8ddf172_20.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-15.2.0-h7be306e_28.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-15.2.0-hd47ba16_20.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-15.2.0-hb7147c0_20.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.55.0-pl5321h5685339_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.2.0-hd47ba16_20.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.2.0-he8f701c_20.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-15.2.0-h71fc77c_28.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py312h7082e50_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.2.0-nompi_hc529623_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.1-py312h9be0db6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h9073bf1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-10_h5875eb1_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-10_hfef963f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.8-default_hc302687_17.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-13.6.0.2-h676940d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-dev-13.6.0.2-h676940d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcudnn-9.25.1.1-ha4b6413_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcudss-0.8.0.10-h7bcfba5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-12.3.0.29-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.18.1.6-h053a66a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.4.3.29-h676940d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.22.0-ha042cf0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-12.2.6.9-h676940d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.8.2.51-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfabric-2.6.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfabric1-2.6.0-h6b3ec72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-he503a2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.2.0-he0feb66_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.4.0-h23af247_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-10_h5e43f62_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.8-hf7376ad_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmagma-2.10.0-hd93470c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-13.3.33-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnvptxcompiler-dev-13.3.73-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpmix-5.0.8-h31fc519_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h622638d_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.12.14-h0c77377_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h984fb3e_20.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.2.0-hdf11a46_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-hcc2c06a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cuda130_mkl_h1ca3d63_302.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-23.1.0-h7148c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py312h4c94fcb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hd2095e1_245.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpi4py-4.1.2-py312hd140a38_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-2.3.1-py312h89dfda2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nccl-2.30.7.1-h1aa9b5a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-heb1ab33_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openmpi-5.0.10-hee33aa4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py312h38079b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h1114479_1012.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h1b36aeb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h7cc23a3_1004.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.14-h5f976f7_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-librt-0.15.0-py312h1b36aeb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cuda130_mkl_py312_hcdc9d04_302.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-gpu-2.13.0-cuda129_mkl_h0d04637_302.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-64.0-h192683f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.6-h7e3ee7f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py312h54fa4ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/triton-3.7.1-cuda130py312hc6dca4b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ucc-1.8.0-h7a4b9c7_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ucx-1.22.0-h1527165_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.15.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-2.0.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-2.0.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_linux-64-20.1.8-hffcefe0_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-13.3.3.4.1-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-compiler-13.3.1-hbad6d8a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-13.3.73-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-13.3.29-h376f20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-13.3.29-h376f20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-13.3.29-h376f20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-driver-dev_linux-64-13.3.29-h376f20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvcc-dev_linux-64-13.3.73-he91c749_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-13.3.73-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.30.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_120.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_linux-64-13.3.73-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_120.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpi-1.0.1-openmpi.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.2.1-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.48.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda + - pypi: ./skala + - pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4d/57/f53eb30c38aa4eeabddc3bddf283f4c10616de65d95fcd1f43900721f425/geometric-1.1.1.tar.gz + - pypi: https://files.pythonhosted.org/packages/5a/3e/d7ead2933f8434f264ac8e092c7f3793f982450e4ffa6a6c82fc60014508/gpu4pyscf_cuda13x-1.8.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7e/bf/c4c25e97552320451afdcd459d4b6e0b715459594e998b23051c06db64c3/cupy_cuda13x-14.2.0-cp312-cp312-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/81/1d/4fcbbf1ad89454d67ef227af32fe07a86a2bdc746c4cf245e105e227e64a/gpu4pyscf_libxc_cuda13x-0.8.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9d/e6/22df83f82f9bc26cb1c42265cf14d34d4908dba2a0f261bd7b28244acb00/cuda_pathfinder-1.8.1-py3-none-any.whl + skalaxc-host: + channels: + - url: https://conda.anaconda.org/conda-forge/ + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ast-serialize-0.9.0-py311hf77984d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-h4610da3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.15-h6bbde05_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h01ee8f8_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-hbe094ff_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.5-h4f381ba_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.13.1-h7508075_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h01ee8f8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h01ee8f8_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-2.0.0-ha29393d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/catch2-3.16.0-h4dbf13b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.3.0-h8846f6e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.16.0-py312h8b7ec3f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-2.0.0-hdab9b82_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-5.0.1-h19c2612_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-2.0.0-h0f4f740_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.3.0-h6f13dc8_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-15.3.0-h27ced10_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.55.0-pl5321h5685339_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.3.0-h90d9265_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py312h7082e50_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.2.0-nompi_hc529623_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-10_h5875eb1_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-10_hfef963f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.22.0-ha042cf0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfabric-2.6.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfabric1-2.6.0-h6b3ec72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.2.0-he0feb66_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-10_h5e43f62_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpmix-5.0.8-h31fc519_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h622638d_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.12.14-h0c77377_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.3.0-h54950a5_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-23.1.0-h7148c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hd2095e1_245.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpi4py-4.1.2-py312hd140a38_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-2.3.1-py312h89dfda2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.5.2-py312he827f4e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openmpi-5.0.10-hee33aa4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h1114479_1012.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h1b36aeb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.14-h5f976f7_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-librt-0.15.0-py312h1b36aeb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-64.0-h192683f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.6-h7e3ee7f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ucc-1.8.0-h539fd1b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ucx-1.22.0-hb659a20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-2.0.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-2.0.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.3.0-h2b852eb_104.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.3.0-hb2c5482_104.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpi-1.0.1-openmpi.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.2.1-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.48.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda + linux-64-cuda12: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ast-serialize-0.9.0-py311hf77984d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-h4610da3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.15-h6bbde05_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h01ee8f8_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-hbe094ff_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.5-h4f381ba_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.13.1-h7508075_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h01ee8f8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h01ee8f8_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-2.0.0-ha29393d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/catch2-3.16.0-h4dbf13b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.3.0-h8846f6e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.16.0-py312h8b7ec3f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-2.0.0-hdab9b82_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-5.0.1-h19c2612_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-2.0.0-h0f4f740_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.3.0-h6f13dc8_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-15.3.0-h27ced10_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.55.0-pl5321h5685339_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.3.0-h90d9265_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py312h7082e50_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.2.0-nompi_hc529623_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-10_h5875eb1_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-10_hfef963f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.22.0-ha042cf0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfabric-2.6.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfabric1-2.6.0-h6b3ec72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.2.0-he0feb66_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-10_h5e43f62_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpmix-5.0.8-h31fc519_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h622638d_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.12.14-h0c77377_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.3.0-h54950a5_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-23.1.0-h7148c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hd2095e1_245.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpi4py-4.1.2-py312hd140a38_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-2.3.1-py312h89dfda2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.5.2-py312he827f4e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openmpi-5.0.10-hee33aa4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h1114479_1012.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h1b36aeb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.14-h5f976f7_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-librt-0.15.0-py312h1b36aeb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-64.0-h192683f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.6-h7e3ee7f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ucc-1.8.0-h539fd1b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ucx-1.22.0-hb659a20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-2.0.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-2.0.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.3.0-h2b852eb_104.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.3.0-hb2c5482_104.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpi-1.0.1-openmpi.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.2.1-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.48.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda + linux-64-cuda13: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ast-serialize-0.9.0-py311hf77984d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-h4610da3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.15-h6bbde05_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h01ee8f8_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-hbe094ff_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.5-h4f381ba_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.13.1-h7508075_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h01ee8f8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h01ee8f8_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-2.0.0-ha29393d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/catch2-3.16.0-h4dbf13b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.3.0-h8846f6e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.16.0-py312h8b7ec3f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-2.0.0-hdab9b82_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-5.0.1-h19c2612_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-2.0.0-h0f4f740_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.3.0-h6f13dc8_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-15.3.0-h27ced10_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.55.0-pl5321h5685339_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.3.0-h90d9265_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py312h7082e50_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.2.0-nompi_hc529623_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-10_h5875eb1_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-10_hfef963f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.22.0-ha042cf0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfabric-2.6.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfabric1-2.6.0-h6b3ec72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.2.0-he0feb66_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-10_h5e43f62_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpmix-5.0.8-h31fc519_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h622638d_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.12.14-h0c77377_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.3.0-h54950a5_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-23.1.0-h7148c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hd2095e1_245.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpi4py-4.1.2-py312hd140a38_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-2.3.1-py312h89dfda2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.5.2-py312he827f4e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openmpi-5.0.10-hee33aa4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h1114479_1012.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h1b36aeb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.14-h5f976f7_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-librt-0.15.0-py312h1b36aeb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-64.0-h192683f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.6-h7e3ee7f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ucc-1.8.0-h539fd1b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ucx-1.22.0-hb659a20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-2.0.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-2.0.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.3.0-h2b852eb_104.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.3.0-hb2c5482_104.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpi-1.0.1-openmpi.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.2.1-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.48.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda + linux-aarch64: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ast-serialize-0.9.0-py311h8ca180e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.10.4-h31aafc4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.9.15-he0a0ff2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.14.3-he30d5cf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.3.2-hbc11874_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.11.0-h299f1a2_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.27.5-hd6bac6b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.13.1-he888730_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.2.7-hbc11874_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.2.10-hbc11874_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.46.1-default_h5f4c503_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.8-h29ee22c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-compiler-2.0.0-h1f08cd5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/catch2-3.16.0-h45ce4d5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cmake-3.31.8-hc9d863e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/conda-gcc-specs-15.3.0-hbdd0822_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/coverage-7.16.0-py312he7c6268_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cxx-compiler-2.0.0-hf41333a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/eigen-5.0.1-hbf0d46f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fmt-12.1.0-h166da81_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fortran-compiler-2.0.0-h2e332f4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc-15.3.0-hfdd745d_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-15.3.0-hfe63468_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran-15.3.0-hfdd745d_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran_impl_linux-aarch64-15.3.0-he1101e8_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/git-2.55.0-pl5321h06f7e71_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gmp-6.3.0-h4d6b352_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gmpy2-2.3.1-py312h70c4b35_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx-15.3.0-hfdd745d_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-15.3.0-hcb04d1e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/h5py-3.16.0-nompi_py312h1ad5da3_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/hdf5-2.2.0-nompi_hdc8a35d_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-py311h3512406_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h5bc82ec_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-h095d8e5_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20260526.0-cxx17_hc5e897d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libaec-1.1.5-hff7e48a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-10_haddc8a3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcap-2.78-hfcc8634_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-10_hd72aa62_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.22.0-h86273da_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321hc48eb74_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h80f16a2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.1-hfae3067_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfabric-2.6.0-h8af1aa0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfabric1-2.6.0-h6b50f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.7.0-hdaad0be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.2.0-h205dda4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-16.2.0-he9431aa_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-16.2.0-he9431aa_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-16.2.0-hc864f27_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.2.0-h8acb6b2_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libhwloc-2.13.0-default_ha95e27d_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h1ea5142_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-10_h88aeb00_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.68.1-ha4b982d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnl-3.11.0-he30d5cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.34-openmp_h2c8b6b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpmix-5.0.8-h83c401c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-7.35.1-h809b94e_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpsl-0.23.1-hb8431ed_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpython-3.12.14-hc3dd739_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-15.3.0-he541324_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.4-h399dd60_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-h7572e3e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.2.0-hef695bb_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsystemd0-257.13-hfcc8634_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtorch-2.13.0-cpu_generic_hf6f405e_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libudev1-257.13-hfcc8634_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42.3-hd6fdeab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.52.1-h80f16a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.38-h80f16a2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-16-2.15.3-h79dcc73_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.15.3-h869d058_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/llvm-openmp-23.1.0-hde6636f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py312hd077ced_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpc-1.4.0-ha78d887_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpfr-4.2.2-h4b21e80_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpi4py-4.1.2-py312hb998f61_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-2.3.1-py312hd0d9aba_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-h2b6f883_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ninja-1.13.2-hdc560ac_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nlohmann_json-3.12.0-h7ac5ae9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.5.2-py312hfb93532_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/onednn-3.12-omp_h605b386_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openmpi-5.0.10-hba2b3a9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.4-he6ad1d5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/optree-0.20.0-py312h579b322_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-he574923_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pkg-config-0.29.2-hfbd14cd_1012.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-7.2.2-py312h898233f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.14-h94ad73b_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-librt-0.15.0-py312h085bef5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pytorch-2.13.0-cpu_generic_py312_h556be23_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rdma-core-64.0-h1f0f388_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-ha7194a6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rhash-1.4.6-he30d5cf_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.7.6-h61cb6f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sleef-3.9.0-h5bb93e2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_hf03c496_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ucc-1.8.0-he2b9832_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ucx-1.22.0-h6ab93cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h9d15635_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-2.0.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-2.0.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-15.3.0-h6e7e4e0_104.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-15.3.0-h0e8df58_104.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpi-1.0.1-openmpi.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.2.1-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.48.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-2.0.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-2.0.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt21_osx-arm64-21.1.8-hb8825d9_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-arm64-21.1.8-hce30654_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-21.1.8-h707e725_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_osx-arm64-15.3.0-h647fcfe_104.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpi-1.0.1-openmpi.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.2.1-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.48.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ast-serialize-0.9.0-py311hfcb3ee1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.4-h436dbe7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.15-hdbc54b2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.14.3-h84a0fba_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-he8604bc_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.11.0-hc1b69ad_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.27.5-h8fb7669_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.13.1-h1fbe2f8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.7-he8604bc_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-he8604bc_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h4e30115_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.8-h74c22ad_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-compiler-2.0.0-h39478f8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/catch2-3.16.0-hfbe1efa_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools-1030.6.3-llvm21_1_h8e84c17_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm21_1_h2e2604f_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm21_1_h8e84c17_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-21-21.1.8-default_h4399b93_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-21.1.8-default_cfg_h7f0254a_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-scan-deps-21.1.8-default_h4399b93_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_impl_osx-arm64-21.1.8-default_hc11f16d_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx-21.1.8-default_cfg_h7f0254a_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx_impl_osx-arm64-21.1.8-default_hc11f16d_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cmake-3.31.8-h54ad630_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt-21.1.8-hce30654_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt21-21.1.8-hdb3d66b_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/conda-gcc-specs-15.3.0-h64e22ab_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.16.0-py312hf1f8172_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cxx-compiler-2.0.0-he3883d0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/eigen-5.0.1-hdb59ae0_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fmt-12.1.0-h99e4e11_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fortran-compiler-2.0.0-h919a6ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gcc-15.3.0-h500d687_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gcc_impl_osx-arm64-15.3.0-hdd9f9fa_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gfortran-15.3.0-h500d687_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gfortran_impl_osx-arm64-15.3.0-hc97e033_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/git-2.55.0-pl5321h545aa0d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-hf5e55b1_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.3.1-py312h1af6244_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.16.0-nompi_py312hbcbdda9_104.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-2.2.0-nompi_h7eff4e6_100.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-py310h579977c_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h34f8a20_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-956.6-llvm21_1_h5d6df6c_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm21_1_h1a10cc4_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260526.0-cxx17_h4c27e2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.5-h8664d51_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-10_h51639a9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-10_hb0561ab_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp21.1-21.1.8-default_h4399b93_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp23.1-23.1.0-default_h79071a4_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang13-23.1.0-default_h8d85846_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcompiler-rt-21.1.8-hdb3d66b_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.22.0-h6651222_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-23.1.0-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-devel-21.1.8-h6dc3340_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321h26f1114_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h1a92334_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfabric-2.6.0-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfabric1-2.6.0-h84a0fba_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.7.0-h47dc5ef_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-16.2.0-h3cf6597_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-16.2.0-h07b0088_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-16.2.0-hdb7a957_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libhwloc-2.13.0-default_ha97f43a_1000.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-he4c29f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-10_hd9741b5_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm21-21.1.8-h759d1ac_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm23-23.1.0-h759d1ac_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h435687b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.34-openmp_h4f80526_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpmix-5.0.8-hddb0edd_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-7.35.1-h391e224_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpsl-0.23.1-hdb0c161_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpython-3.12.14-h4e5ec87_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.4-hca69786_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-hbf2880b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtorch-2.13.0-cpu_generic_hf893bd3_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.52.1-h1a92334_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-h5654f7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-23.1.0-hdb3d66b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-21-21.1.8-h79441dc_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-21.1.8-hdb3d66b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py312h04c11ed_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.4.0-h071a35a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.2-h72846b0_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpi4py-4.1.2-py312h50e9609_100.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-2.3.1-py312h9b6eb38_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-he64c551_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.13.2-h3feff0a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.12.0-h784d473_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.5.2-py312hff34920_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/onednn-3.12-omp_h95bb4b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openmpi-5.0.10-h07cac57_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.4-h55eecbc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/optree-0.20.0-py312h42f75bc_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-he63d830_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pkg-config-0.29.2-he0b766d_1012.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.2.2-py312hbd136b4_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.14-hd05a0c4_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-librt-0.15.0-py312h7ac3c4f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pytorch-2.13.0-cpu_generic_py312_ha1580ae_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h8b90a29_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rhash-1.4.6-h84a0fba_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/s2n-1.7.6-h1b28cb6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sleef-3.9.0-hb028509_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-hb561403_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-hbeba79b_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hf451053_7.conda + skalaxc-host-clang: + channels: + - url: https://conda.anaconda.org/conda-forge/ + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ast-serialize-0.9.0-py311hf77984d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-h4610da3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.15-h6bbde05_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h01ee8f8_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-hbe094ff_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.5-h4f381ba_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.13.1-h7508075_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h01ee8f8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h01ee8f8_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.46.1-default_h4852527_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/catch2-3.16.0-h4dbf13b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-22-22.1.8-default_h90b978e_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-format-22-22.1.8-default_h0acdd01_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-format-22.1.8-default_hf2538bd_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-scan-deps-22.1.8-default_h0acdd01_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-tools-22.1.8-default_h444efe8_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang_impl_linux-64-22.1.8-default_h2a708d9_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang_linux-64-22.1-hecd59b2_28.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clangxx_impl_linux-64-22.1.8-default_h9d9a4db_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clangxx_linux-64-22.1-h2bf5a4b_28.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/compiler-rt-22.1.8-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/compiler-rt22-22.1.8-h7148c6a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.16.0-py312h8b7ec3f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-5.0.1-h19c2612_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-2.0.0-h0f4f740_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.2.0-hb7a6aa6_20.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-h8ddf172_20.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-15.2.0-hd47ba16_20.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-15.2.0-hb7147c0_20.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.55.0-pl5321h5685339_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py312h7082e50_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.2.0-nompi_hc529623_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-10_h5875eb1_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-10_hfef963f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp22.1-22.1.8-default_h0acdd01_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp23.1-23.1.0-default_h0acdd01_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-23.1.0-default_h7855034_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcompiler-rt-22.1.8-h7148c6a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.22.0-ha042cf0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfabric-2.6.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfabric1-2.6.0-h6b3ec72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.2.0-he0feb66_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-10_h5e43f62_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.8-h474f4eb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm23-23.1.0-h474f4eb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpmix-5.0.8-h31fc519_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h622638d_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.12.14-h0c77377_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h984fb3e_20.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-23.1.0-h7148c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hd2095e1_245.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpi4py-4.1.2-py312hd140a38_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-2.3.1-py312h89dfda2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.5.2-py312he827f4e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openmpi-5.0.10-hee33aa4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h1114479_1012.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h1b36aeb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.14-h5f976f7_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-librt-0.15.0-py312h1b36aeb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-64.0-h192683f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.6-h7e3ee7f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ucc-1.8.0-h539fd1b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ucx-1.22.0-hb659a20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-2.0.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-2.0.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt22_linux-64-22.1.8-h0e38de2_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_linux-64-22.1.8-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_120.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_120.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpi-1.0.1-openmpi.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.2.1-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.48.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda + linux-64-cuda12: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ast-serialize-0.9.0-py311hf77984d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-h4610da3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.15-h6bbde05_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h01ee8f8_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-hbe094ff_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.5-h4f381ba_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.13.1-h7508075_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h01ee8f8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h01ee8f8_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.46.1-default_h4852527_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/catch2-3.16.0-h4dbf13b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-22-22.1.8-default_h90b978e_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-format-22-22.1.8-default_h0acdd01_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-format-22.1.8-default_hf2538bd_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-scan-deps-22.1.8-default_h0acdd01_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-tools-22.1.8-default_h444efe8_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang_impl_linux-64-22.1.8-default_h2a708d9_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang_linux-64-22.1-hecd59b2_28.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clangxx_impl_linux-64-22.1.8-default_h9d9a4db_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clangxx_linux-64-22.1-h2bf5a4b_28.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/compiler-rt-22.1.8-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/compiler-rt22-22.1.8-h7148c6a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.16.0-py312h8b7ec3f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-5.0.1-h19c2612_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-2.0.0-h0f4f740_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.2.0-hb7a6aa6_20.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-h8ddf172_20.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-15.2.0-hd47ba16_20.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-15.2.0-hb7147c0_20.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.55.0-pl5321h5685339_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py312h7082e50_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.2.0-nompi_hc529623_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-10_h5875eb1_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-10_hfef963f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp22.1-22.1.8-default_h0acdd01_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp23.1-23.1.0-default_h0acdd01_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-23.1.0-default_h7855034_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcompiler-rt-22.1.8-h7148c6a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.22.0-ha042cf0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfabric-2.6.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfabric1-2.6.0-h6b3ec72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.2.0-he0feb66_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-10_h5e43f62_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.8-h474f4eb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm23-23.1.0-h474f4eb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpmix-5.0.8-h31fc519_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h622638d_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.12.14-h0c77377_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h984fb3e_20.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-23.1.0-h7148c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hd2095e1_245.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpi4py-4.1.2-py312hd140a38_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-2.3.1-py312h89dfda2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.5.2-py312he827f4e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openmpi-5.0.10-hee33aa4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h1114479_1012.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h1b36aeb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.14-h5f976f7_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-librt-0.15.0-py312h1b36aeb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-64.0-h192683f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.6-h7e3ee7f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ucc-1.8.0-h539fd1b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ucx-1.22.0-hb659a20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-2.0.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-2.0.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt22_linux-64-22.1.8-h0e38de2_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_linux-64-22.1.8-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_120.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_120.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpi-1.0.1-openmpi.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.2.1-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.48.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda + linux-64-cuda13: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ast-serialize-0.9.0-py311hf77984d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-h4610da3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.15-h6bbde05_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h01ee8f8_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-hbe094ff_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.5-h4f381ba_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.13.1-h7508075_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h01ee8f8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h01ee8f8_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.46.1-default_h4852527_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/catch2-3.16.0-h4dbf13b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-22-22.1.8-default_h90b978e_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-format-22-22.1.8-default_h0acdd01_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-format-22.1.8-default_hf2538bd_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-scan-deps-22.1.8-default_h0acdd01_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-tools-22.1.8-default_h444efe8_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang_impl_linux-64-22.1.8-default_h2a708d9_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang_linux-64-22.1-hecd59b2_28.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clangxx_impl_linux-64-22.1.8-default_h9d9a4db_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clangxx_linux-64-22.1-h2bf5a4b_28.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/compiler-rt-22.1.8-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/compiler-rt22-22.1.8-h7148c6a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.16.0-py312h8b7ec3f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-5.0.1-h19c2612_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-2.0.0-h0f4f740_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.2.0-hb7a6aa6_20.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-h8ddf172_20.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-15.2.0-hd47ba16_20.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-15.2.0-hb7147c0_20.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.55.0-pl5321h5685339_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py312h7082e50_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.2.0-nompi_hc529623_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-10_h5875eb1_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-10_hfef963f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp22.1-22.1.8-default_h0acdd01_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp23.1-23.1.0-default_h0acdd01_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-23.1.0-default_h7855034_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcompiler-rt-22.1.8-h7148c6a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.22.0-ha042cf0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfabric-2.6.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfabric1-2.6.0-h6b3ec72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.2.0-he0feb66_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-10_h5e43f62_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.8-h474f4eb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm23-23.1.0-h474f4eb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpmix-5.0.8-h31fc519_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h622638d_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.12.14-h0c77377_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h984fb3e_20.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-23.1.0-h7148c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hd2095e1_245.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpi4py-4.1.2-py312hd140a38_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-2.3.1-py312h89dfda2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.5.2-py312he827f4e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openmpi-5.0.10-hee33aa4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h1114479_1012.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h1b36aeb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.14-h5f976f7_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-librt-0.15.0-py312h1b36aeb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-64.0-h192683f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.6-h7e3ee7f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ucc-1.8.0-h539fd1b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ucx-1.22.0-hb659a20_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-2.0.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-2.0.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt22_linux-64-22.1.8-h0e38de2_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_linux-64-22.1.8-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_120.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_120.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpi-1.0.1-openmpi.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.2.1-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.48.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda + skalaxc-package: + channels: + - url: https://conda.anaconda.org/conda-forge/ + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.2.0-he0feb66_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/patchelf-0.19.1-hee9eb32_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rattler-build-0.74.0-hf01adef_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + linux-aarch64: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.2.0-h205dda4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.2.0-h8acb6b2_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.2.0-hef695bb_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.4-he6ad1d5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/patchelf-0.19.1-hfb11796_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rattler-build-0.74.0-hc342849_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-23.1.0-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rattler-build-0.74.0-h74d5219_1.conda + skalaxc-parity: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ast-serialize-0.9.0-py311hf77984d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-h4610da3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.15-h6bbde05_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h01ee8f8_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-hbe094ff_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.5-h4f381ba_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.13.1-h7508075_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h01ee8f8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h01ee8f8_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-2.0.0-ha29393d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3c89d7e_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/catch2-3.16.0-h4dbf13b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.3.0-h8846f6e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.16.0-py312h8b7ec3f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-2.0.0-hdab9b82_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-5.0.1-h19c2612_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-h7cc23a3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.3.0-h6f13dc8_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.55.0-pl5321h5685339_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.3.0-h90d9265_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py312h7082e50_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.2.0-nompi_hc529623_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/impi_rt-2021.18.0-h4715778_754.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.1-py312h9be0db6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h9073bf1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-10_h5875eb1_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-10_hfef963f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.22.0-ha042cf0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-he503a2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.2.0-he0feb66_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.4.0-h23af247_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-10_h5e43f62_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h622638d_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.12.14-h0c77377_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.3.0-h54950a5_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.2.0-hdf11a46_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-hcc2c06a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-23.1.0-h7148c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py312h4c94fcb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hd2095e1_245.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpi-1.0-impi.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpi4py-4.1.2-py312h18f78f0_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-2.3.1-py312h89dfda2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-heb1ab33_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py312h38079b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h1114479_1012.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h1b36aeb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h7cc23a3_1004.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.14-h5f976f7_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-librt-0.15.0-py312h1b36aeb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.6-h7e3ee7f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py312h54fa4ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.15.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-2.0.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-2.0.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.30.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.3.0-h2b852eb_104.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.3.0-hb2c5482_104.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.2.1-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.48.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda + - pypi: ./skala + - pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + linux-64-cuda12: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ast-serialize-0.9.0-py311hf77984d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-h4610da3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.15-h6bbde05_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h01ee8f8_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-hbe094ff_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.5-h4f381ba_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.13.1-h7508075_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h01ee8f8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h01ee8f8_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-2.0.0-ha29393d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3c89d7e_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/catch2-3.16.0-h4dbf13b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.3.0-h8846f6e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.16.0-py312h8b7ec3f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-2.0.0-hdab9b82_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-5.0.1-h19c2612_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-h7cc23a3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.3.0-h6f13dc8_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.55.0-pl5321h5685339_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.3.0-h90d9265_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py312h7082e50_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.2.0-nompi_hc529623_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/impi_rt-2021.18.0-h4715778_754.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.1-py312h9be0db6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h9073bf1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-10_h5875eb1_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-10_hfef963f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.22.0-ha042cf0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-he503a2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.2.0-he0feb66_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.4.0-h23af247_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-10_h5e43f62_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h622638d_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.12.14-h0c77377_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.3.0-h54950a5_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.2.0-hdf11a46_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-hcc2c06a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-23.1.0-h7148c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py312h4c94fcb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hd2095e1_245.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpi-1.0-impi.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpi4py-4.1.2-py312h18f78f0_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-2.3.1-py312h89dfda2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-heb1ab33_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py312h38079b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h1114479_1012.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h1b36aeb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h7cc23a3_1004.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.14-h5f976f7_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-librt-0.15.0-py312h1b36aeb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.6-h7e3ee7f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py312h54fa4ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.15.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-2.0.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-2.0.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.30.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.3.0-h2b852eb_104.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.3.0-hb2c5482_104.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.2.1-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.48.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda + - pypi: ./skala + - pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + linux-64-cuda13: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ast-serialize-0.9.0-py311hf77984d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-h4610da3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.15-h6bbde05_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h01ee8f8_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-hbe094ff_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.5-h4f381ba_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.13.1-h7508075_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h01ee8f8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h01ee8f8_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-2.0.0-ha29393d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3c89d7e_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/catch2-3.16.0-h4dbf13b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.3.0-h8846f6e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.16.0-py312h8b7ec3f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-2.0.0-hdab9b82_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-5.0.1-h19c2612_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-h7cc23a3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.3.0-h6f13dc8_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.55.0-pl5321h5685339_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.3.0-hc6a0c74_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.3.0-h90d9265_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py312h7082e50_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.2.0-nompi_hc529623_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/impi_rt-2021.18.0-h4715778_754.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.1-py312h9be0db6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h9073bf1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-10_h5875eb1_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-10_hfef963f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.22.0-ha042cf0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-he503a2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.2.0-he0feb66_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.4.0-h23af247_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-10_h5e43f62_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h622638d_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.12.14-h0c77377_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.3.0-h54950a5_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.2.0-hdf11a46_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-hcc2c06a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-23.1.0-h7148c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py312h4c94fcb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hd2095e1_245.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpi-1.0-impi.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpi4py-4.1.2-py312h18f78f0_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-2.3.1-py312h89dfda2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-heb1ab33_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py312h38079b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h1114479_1012.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h1b36aeb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h7cc23a3_1004.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.14-h5f976f7_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-librt-0.15.0-py312h1b36aeb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.6-h7e3ee7f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py312h54fa4ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.15.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-2.0.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-2.0.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.30.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.3.0-h2b852eb_104.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.3.0-hb2c5482_104.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.2.1-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.48.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda + - pypi: ./skala + - pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + skalaxc-tools: + channels: + - url: https://conda.anaconda.org/conda-forge/ + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-h4610da3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.15-h6bbde05_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h01ee8f8_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-hbe094ff_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.5-h4f381ba_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.13.1-h7508075_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h01ee8f8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h01ee8f8_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/catch2-3.16.0-h4dbf13b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-format-22-22.1.8-default_h0acdd01_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-format-22.1.8-default_hf2538bd_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-scan-deps-22.1.8-default_h0acdd01_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-tools-22.1.8-default_h444efe8_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/doxygen-1.18.0-py310hb664d3d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-5.0.1-h19c2612_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.55.0-pl5321h5685339_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.2.0-nompi_hc529623_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-10_h5875eb1_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-10_hfef963f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp22.1-22.1.8-default_h0acdd01_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp23.1-23.1.0-default_h0acdd01_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-23.1.0-default_h7855034_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.22.0-ha042cf0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-10_h5e43f62_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.8-h474f4eb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm23-23.1.0-h474f4eb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h622638d_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.12.14-h0c77377_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-23.1.0-h7148c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hd2095e1_245.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.5.2-py312he827f4e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h1114479_1012.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.14-h5f976f7_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.6-h7e3ee7f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + test-py311-pyscf214-torch213: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3c89d7e_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py311h724c32c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.16.0-py311h364832d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py311h3778330_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-h7cc23a3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py311hbc40be8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.1-py311h4c6fd42_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h9073bf1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-10_h5875eb1_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-10_hfef963f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-he503a2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.4.0-h23af247_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-10_h5e43f62_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h622638d_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.11.16-h0c77377_2_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.2.0-hdf11a46_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-hcc2c06a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-23.1.0-h7148c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py311h3778330_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py311he401cf6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hd2095e1_245.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py311h2e04523_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-heb1ab33_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py311h5f908af_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py311hf303fd3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h7cc23a3_1004.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.16-h5f976f7_2_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py311_h249fa5d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py311h3778330_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py311hbe70eeb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py311h49ec1c0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.15.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.11.16-py311hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.30.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.11.16-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-9_cp311.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - pypi: ./skala + - pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/52/a0/c1f604538ff6db22a0690be2dc44ab59178e115f63c917794e529356ab23/h5py-3.16.0-cp311-cp311-manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + test-py312-pyscf214-torch212: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-hb7a77c6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.14-h2aa3ae6_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h720e601_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.1-h6ffeea8_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-h38ae05a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.3-h6f4d18d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.16.0-h21f4ec5_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.8-h46fcd08_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h720e601_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h720e601_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.40.1-h102d43b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.833-hc7390e0_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.3-h206d751_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-h71f81a8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.18.0-h74b55db_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.14.0-hf596fc9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.16.0-h1f05bef_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3c89d7e_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.16.0-py312h8b7ec3f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/elfutils-0.194-h849f50c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-h7cc23a3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.3.1-h54a6638_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hb7133d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gnutls-3.8.13-h18acefa_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.1-py312h9be0db6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h9073bf1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.9-gpl_h3152399_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-25.0.0-hcc2f0d9_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-25.0.0-h635bf11_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-25.0.0-h53684a4_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-25.0.0-h635bf11_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-25.0.0-h66fbfdd_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-10_h5875eb1_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-10_hfef963f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.22.0-ha042cf0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-he503a2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.8.0-hbc29df5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.8.0-hdbdcf42_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.82.1-h792040b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.4.0-h23af247_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.8-hfac485b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-10_h5e43f62_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmicrohttpd-1.0.10-hc2fc477_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.27.0-h3133023_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.27.0-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-25.0.0-h7376487_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h622638d_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.12.14-h0c77377_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h60473fc_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.2.0-hdf11a46_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtasn1-4.21.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-hcc2c06a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.12.1-cpu_mkl_h4f7e408_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.8.3-h65a8314_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-23.1.0-h7148c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-hee9eb32_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-hebe6cf0_1003.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py312h4c94fcb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/memray-1.19.3-py312ha9ecdfb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hd2095e1_245.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.10.1-h5ef0d04_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-heb1ab33_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.1-h443056b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.26.5-h8d769aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.5-py312h8ecdadd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py312h38079b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h7cc23a3_1004.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/py-spy-0.4.2-hbe0e3b8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-25.0.0-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-25.0.0-py312h2054cf2_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.14-h5f976f7_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.12.1-cpu_mkl_py312_h38523ed_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h94463f1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.5-h7e3ee7f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py312h54fa4ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.15.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.30.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.11.6-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/textual-8.2.8-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda + - pypi: ./benchmark + - pypi: ./skala + - pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9e/e9/1a19e42cd43cc1365e127db6aae85e1c671da1d9a5d746f4d34a50edb577/h5py-3.16.0-cp312-cp312-manylinux_2_28_x86_64.whl + linux-aarch64: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.10.4-h03961ac_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.9.14-h6c1c863_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.14.2-he30d5cf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.3.2-hbf34bff_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.7.1-h423fd5f_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.11.0-hb2c4768_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.27.3-hc846123_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.16.0-hf64e385_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.12.8-h681413d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.2.7-hbf34bff_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.2.10-hbf34bff_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.40.1-h18900c3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.833-h1131a43_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-core-cpp-1.16.3-h412bcfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-identity-cpp-1.13.3-hd0001b6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-blobs-cpp-12.18.0-h2e50874_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-common-cpp-12.14.0-hacd5e5f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-files-datalake-cpp-12.16.0-hde34f15_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-1.2.0-h52fc18c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-bin-1.2.0-hdc3483e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.8-h29ee22c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-hca320e2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/contourpy-1.3.3-py312hf18b547_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/coverage-7.16.0-py312he7c6268_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fmt-12.1.0-h166da81_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.18.3-ha4b22b4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fonttools-4.63.0-py312ha4530ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.14.3-h8af1aa0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fribidi-1.0.16-h5bc82ec_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.3.1-h7ac5ae9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glog-0.7.1-ha2f5727_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gmp-6.3.0-h4d6b352_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gmpy2-2.3.1-py312h70c4b35_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.15-h7ac5ae9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/hf-xet-1.5.2-py310h160093b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-py311h3512406_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h5bc82ec_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/kiwisolver-1.5.1-py312he33898b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-h095d8e5_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.19.1-h137c43b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.2.0-h52b7260_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20260526.0-cxx17_hc5e897d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-25.0.0-hf28620a_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-25.0.0-hb326ee9_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-compute-25.0.0-hdd99842_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-25.0.0-hb326ee9_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-25.0.0-hd99807d_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-10_haddc8a3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.2.0-h384ecca_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.2.0-h011f0d3_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.2.0-hb247b97_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-10_hd72aa62_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.22.0-h86273da_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-hfa851ae_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321hc48eb74_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h80f16a2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.1-hfae3067_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.7.0-hdaad0be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-h9cc7050_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.2.0-h205dda4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-16.2.0-he9431aa_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-16.2.0-he9431aa_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-16.2.0-hc864f27_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.88.3-hb514e8e_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-3.8.0-h2efc11c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-3.8.0-h66d5b86_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgrpc-1.82.1-h05b84e8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libharfbuzz-14.4.0-h8f7ccb3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h1ea5142_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.2.0-he30d5cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-10_h88aeb00_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.68.1-ha4b982d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.34-openmp_h2c8b6b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-1.27.0-hbe47268_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-headers-1.27.0-h8af1aa0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-25.0.0-h87079af_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.58-hf9b7768_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-7.35.1-h809b94e_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpsl-0.23.1-hb8431ed_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpython-3.12.14-hc3dd739_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libraqm-0.11.0-hd2f8911_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2025.11.05-h149037f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.4-h399dd60_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-h7572e3e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.2.0-hef695bb_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-16.2.0-hdbbeba8_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libthrift-0.22.0-ha522d1d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.2-h45f9f85_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtorch-2.12.1-cpu_generic_hb12a5ee_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.11.3-hec6f9f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42.3-hd6fdeab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.52.1-h80f16a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h3f04742_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.38-h80f16a2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-16-2.15.3-h79dcc73_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.15.3-h869d058_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/llvm-openmp-23.1.0-hde6636f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-hfb11796_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py312hd077ced_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-base-3.11.1-py312h0683553_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpc-1.4.0-ha78d887_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpfr-4.2.2-h4b21e80_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-h2b6f883_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nlohmann_json-3.12.0-h7ac5ae9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.6-py312hce9e0af_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/onednn-3.12-omp_h605b386_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.4-h504851f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.4-he6ad1d5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/optree-0.20.0-py312h579b322_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orc-2.3.1-h1fb4f23_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-3.0.5-py312hf55c4e8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-he574923_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-12.3.0-py312h7f6b78e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.46.4-h7ac5ae9_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/prometheus-cpp-1.3.0-h7938499_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h5bc82ec_1004.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-25.0.0-py312h8025657_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-core-25.0.0-py312h2cce741_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.14-h94ad73b_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pytorch-2.12.1-cpu_generic_py312_h9dd5f13_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py312ha4530ae_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/qhull-2020.2-h70be974_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/re2-2025.11.05-hfb2350b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-ha7194a6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.7.5-h61cb6f2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/scipy-1.18.0-py312ha7f05e0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sleef-3.9.0-h5bb93e2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.2-he774c54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_hf03c496_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/unicodedata2-17.0.1-py312hcd1a082_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libice-1.1.2-h80f16a2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libsm-1.2.6-hf23e593_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libx11-1.8.13-h63a1b12_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxext-1.3.7-h5bc82ec_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrender-0.9.12-he30d5cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h29ee22c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.2-hdc9db2a_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-ng-2.3.3-h1024f78_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h9d15635_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.15.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.30.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - pypi: ./benchmark + - pypi: ./skala + - pypi: https://files.pythonhosted.org/packages/0a/9b/9053d2a5a6276352b883d57192ce0bed68b1bc2415b35824ea6942c2c999/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/89/84/06281c82d4d1686fde1ac6b0f307c50918f1c0151062445ab3b6fa5a921d/h5py-3.16.0-cp312-cp312-manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/89/f2/24c58dad0c33ab417c5a090695a6788292d5d4edceae59bad055e5377e92/pyscf-2.14.0-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.15.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.30.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.4-h0f08c97_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.14-hb9ed60c_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.14.2-h84a0fba_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-hf0b4b85_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.7.1-ha581b6a_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.11.0-h27f0cb5_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.27.3-ha24efe8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.16.0-hf1a914d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.12.8-hdc61527_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.7-hf0b4b85_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-hf0b4b85_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.40.1-h5b5d287_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.833-haa98fb3_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.3-he5ae378_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.3-h05177fb_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.18.0-h409340b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.14.0-h7cba3ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.16.0-h16bb3af_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.2.0-hf00d406_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.2.0-he4a93e4_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h4e30115_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.8-h74c22ad_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.4-h580cee5_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.1.1-py312hc892d8b_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py312h3093aea_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.16.0-py312hf1f8172_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/dftd3-python-1.5.0-py312h2bbb03f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fmt-12.1.0-h99e4e11_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.18.3-h81aa574_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.63.0-py312h04c11ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.3-hce30654_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hb001647_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.3.1-h784d473_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-h6f9ecc1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-hf5e55b1_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.3.1-py312h1af6244_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.15-h784d473_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hf-xet-1.5.2-py310he76dbf2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-py310h579977c_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jonquil-0.3.2-gfortran_h04795c8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.5.1-py312hee531d8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h34f8a20_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.19.1-hce41798_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.2.0-h1eee2c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260526.0-cxx17_h4c27e2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-25.0.0-haaed7fe_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-25.0.0-heaff1e6_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-25.0.0-h93a2d87_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-25.0.0-heaff1e6_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-25.0.0-h2208e57_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-10_h51639a9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-h1dcdb26_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-h5295a6a_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-h2ddc9cb_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-10_hb0561ab_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.22.0-h6651222_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-23.1.0-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-he7e0567_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321h26f1114_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h1a92334_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.7.0-h47dc5ef_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-h2ed5691_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-16.2.0-h3cf6597_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-16.2.0-h07b0088_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-16.2.0-hdb7a957_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.3-h89cd0c0_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-3.8.0-ha595bda_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-3.8.0-hc8aed40_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.82.1-hf3e839d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libharfbuzz-14.4.0-hcda0f7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-he4c29f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.2.0-h84a0fba_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-10_hd9741b5_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h435687b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.34-openmp_h4f80526_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.27.0-h46c1d2a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.27.0-hce30654_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-25.0.0-h0de02aa_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-hf5e6511_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-7.35.1-h391e224_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpsl-0.23.1-hdb0c161_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpython-3.12.14-h4e5ec87_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libraqm-0.11.0-h45af499_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h5d15848_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.4-hca69786_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-hbf2880b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h1fb9c8a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.2-hf67920b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtorch-2.12.1-cpu_generic_h931913c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.3-h2431656_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.52.1-h1a92334_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h202fb40_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hbffa61f_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-h5654f7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-23.1.0-hdb3d66b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-hdca3b7d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py312h04c11ed_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.11.1-py312h07c8dfe_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mctc-lib-0.5.2-gfortran_h0230218_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.4.0-h071a35a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.2-h72846b0_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-he64c551_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.12.0-h784d473_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.6-py312ha003a3f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/onednn-3.12-omp_h95bb4b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-h4d1e80c_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.4-h55eecbc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/optree-0.20.0-py312h42f75bc_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.3.1-hef2a647_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-3.0.5-py312h6510ced_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-he63d830_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.3.0-py312hf9dc30a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h784d473_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hb001647_1004.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-25.0.0-py312h1f38498_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-25.0.0-py312h7d9569a_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.14-hd05a0c4_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pytorch-2.12.1-cpu_generic_py312_h7a5249f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py312h04c11ed_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-h5d60da5_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h8b90a29_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/s2n-1.7.5-h1b28cb6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.18.0-py312h4519d97_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/simple-dftd3-1.5.0-gfortran_h0230218_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sleef-3.9.0-hb028509_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.2-hada39a4_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-hbeba79b_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/toml-f-0.5.2-gfortran_h04795c8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-17.0.1-py312h2bbb03f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h84a0fba_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-h84a0fba_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h74c22ad_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.2-h8088a28_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.3-h31dac16_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hf451053_7.conda + - pypi: ./benchmark + - pypi: ./skala + - pypi: https://files.pythonhosted.org/packages/48/ed/bb4aeb728505b4ce7edd55e9b2e35bcbd99ad0b0cae5c45b59e48b9ed62d/pyscf-2.14.0-py3-none-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/b0/42/c84efcc1d4caebafb1ecd8be4643f39c85c47a80fe254d92b8b43b1eadaf/h5py-3.16.0-cp312-cp312-macosx_11_0_arm64.whl + test-py312-pyscf214-torch213: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-hb7a77c6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.14-h2aa3ae6_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h720e601_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.1-h6ffeea8_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-h38ae05a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.3-h6f4d18d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.16.0-h21f4ec5_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.8-h46fcd08_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h720e601_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h720e601_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.40.1-h102d43b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.833-hc7390e0_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.3-h206d751_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-h71f81a8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.18.0-h74b55db_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.14.0-hf596fc9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.16.0-h1f05bef_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3c89d7e_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.16.0-py312h8b7ec3f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/elfutils-0.194-h849f50c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-h7cc23a3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.3.1-h54a6638_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hb7133d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gnutls-3.8.13-h18acefa_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.1-py312h9be0db6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h9073bf1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.9-gpl_h3152399_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-25.0.0-hcc2f0d9_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-25.0.0-h635bf11_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-25.0.0-h53684a4_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-25.0.0-h635bf11_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-25.0.0-h66fbfdd_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-10_h5875eb1_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-10_hfef963f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.22.0-ha042cf0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-he503a2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.8.0-hbc29df5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.8.0-hdbdcf42_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.82.1-h792040b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.4.0-h23af247_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.8-hfac485b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-10_h5e43f62_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmicrohttpd-1.0.10-hc2fc477_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.27.0-h3133023_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.27.0-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-25.0.0-h7376487_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h622638d_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.12.14-h0c77377_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h60473fc_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.2.0-hdf11a46_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtasn1-4.21.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-hcc2c06a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.8.3-h65a8314_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-23.1.0-h7148c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-hee9eb32_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-hebe6cf0_1003.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py312h4c94fcb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/memray-1.19.3-py312ha9ecdfb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hd2095e1_245.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.10.1-h5ef0d04_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-heb1ab33_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.1-h443056b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.26.5-h8d769aa_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.5-py312h8ecdadd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py312h38079b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h7cc23a3_1004.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/py-spy-0.4.2-hbe0e3b8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-25.0.0-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-25.0.0-py312h2054cf2_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.14-h5f976f7_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h94463f1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.5-h7e3ee7f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py312h54fa4ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.15.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.30.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.2.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.11.6-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/textual-8.2.8-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda + - pypi: ./benchmark + - pypi: ./skala + - pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9e/e9/1a19e42cd43cc1365e127db6aae85e1c671da1d9a5d746f4d34a50edb577/h5py-3.16.0-cp312-cp312-manylinux_2_28_x86_64.whl + linux-aarch64: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.10.4-h03961ac_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.9.14-h6c1c863_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.14.2-he30d5cf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.3.2-hbf34bff_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.7.1-h423fd5f_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.11.0-hb2c4768_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.27.3-hc846123_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.16.0-hf64e385_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.12.8-h681413d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.2.7-hbf34bff_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.2.10-hbf34bff_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.40.1-h18900c3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.833-h1131a43_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-core-cpp-1.16.3-h412bcfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-identity-cpp-1.13.3-hd0001b6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-blobs-cpp-12.18.0-h2e50874_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-common-cpp-12.14.0-hacd5e5f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-files-datalake-cpp-12.16.0-hde34f15_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-1.2.0-h52fc18c_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-bin-1.2.0-hdc3483e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.8-h29ee22c_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-hca320e2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/contourpy-1.3.3-py312hf18b547_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/coverage-7.16.0-py312he7c6268_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fmt-12.1.0-h166da81_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.18.3-ha4b22b4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fonttools-4.63.0-py312ha4530ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.14.3-h8af1aa0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fribidi-1.0.16-h5bc82ec_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.3.1-h7ac5ae9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glog-0.7.1-ha2f5727_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gmp-6.3.0-h4d6b352_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gmpy2-2.3.1-py312h70c4b35_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.15-h7ac5ae9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/hf-xet-1.5.2-py310h160093b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-py311h3512406_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h5bc82ec_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/kiwisolver-1.5.1-py312he33898b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-h095d8e5_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.19.1-h137c43b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.2.0-h52b7260_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20260526.0-cxx17_hc5e897d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-25.0.0-hf28620a_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-25.0.0-hb326ee9_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-compute-25.0.0-hdd99842_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-25.0.0-hb326ee9_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-25.0.0-hd99807d_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-10_haddc8a3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.2.0-h384ecca_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.2.0-h011f0d3_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.2.0-hb247b97_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-10_hd72aa62_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.22.0-h86273da_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-hfa851ae_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321hc48eb74_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h80f16a2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.1-hfae3067_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.7.0-hdaad0be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-h9cc7050_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.2.0-h205dda4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-16.2.0-he9431aa_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-16.2.0-he9431aa_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-16.2.0-hc864f27_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.88.3-hb514e8e_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-3.8.0-h2efc11c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-3.8.0-h66d5b86_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgrpc-1.82.1-h05b84e8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libharfbuzz-14.4.0-h8f7ccb3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h1ea5142_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.2.0-he30d5cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-10_h88aeb00_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.68.1-ha4b982d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.34-openmp_h2c8b6b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-1.27.0-hbe47268_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-headers-1.27.0-h8af1aa0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-25.0.0-h87079af_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.58-hf9b7768_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-7.35.1-h809b94e_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpsl-0.23.1-hb8431ed_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpython-3.12.14-hc3dd739_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libraqm-0.11.0-hd2f8911_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2025.11.05-h149037f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.4-h399dd60_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-h7572e3e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.2.0-hef695bb_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-16.2.0-hdbbeba8_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libthrift-0.22.0-ha522d1d_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.2-h45f9f85_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtorch-2.13.0-cpu_generic_hf6f405e_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.11.3-hec6f9f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42.3-hd6fdeab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.52.1-h80f16a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h3f04742_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.38-h80f16a2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-16-2.15.3-h79dcc73_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.15.3-h869d058_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/llvm-openmp-23.1.0-hde6636f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-hfb11796_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py312hd077ced_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-base-3.11.1-py312h0683553_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpc-1.4.0-ha78d887_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpfr-4.2.2-h4b21e80_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-h2b6f883_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nlohmann_json-3.12.0-h7ac5ae9_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.6-py312hce9e0af_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/onednn-3.12-omp_h605b386_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.4-h504851f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.4-he6ad1d5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/optree-0.20.0-py312h579b322_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orc-2.3.1-h1fb4f23_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-3.0.5-py312hf55c4e8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-he574923_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-12.3.0-py312h7f6b78e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.46.4-h7ac5ae9_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/prometheus-cpp-1.3.0-h7938499_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h5bc82ec_1004.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-25.0.0-py312h8025657_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-core-25.0.0-py312h2cce741_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.14-h94ad73b_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pytorch-2.13.0-cpu_generic_py312_h556be23_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py312ha4530ae_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/qhull-2020.2-h70be974_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/re2-2025.11.05-hfb2350b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-ha7194a6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.7.5-h61cb6f2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/scipy-1.18.0-py312ha7f05e0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sleef-3.9.0-h5bb93e2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.2-he774c54_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_hf03c496_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/unicodedata2-17.0.1-py312hcd1a082_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libice-1.1.2-h80f16a2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libsm-1.2.6-hf23e593_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libx11-1.8.13-h63a1b12_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxext-1.3.7-h5bc82ec_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrender-0.9.12-he30d5cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h29ee22c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.2-hdc9db2a_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-ng-2.3.3-h1024f78_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h9d15635_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.15.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.30.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - pypi: ./benchmark + - pypi: ./skala + - pypi: https://files.pythonhosted.org/packages/0a/9b/9053d2a5a6276352b883d57192ce0bed68b1bc2415b35824ea6942c2c999/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/89/84/06281c82d4d1686fde1ac6b0f307c50918f1c0151062445ab3b6fa5a921d/h5py-3.16.0-cp312-cp312-manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/89/f2/24c58dad0c33ab417c5a090695a6788292d5d4edceae59bad055e5377e92/pyscf-2.14.0-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.15.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.30.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.4-h0f08c97_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.14-hb9ed60c_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.14.2-h84a0fba_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-hf0b4b85_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.7.1-ha581b6a_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.11.0-h27f0cb5_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.27.3-ha24efe8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.16.0-hf1a914d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.12.8-hdc61527_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.7-hf0b4b85_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-hf0b4b85_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.40.1-h5b5d287_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.833-haa98fb3_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.3-he5ae378_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.3-h05177fb_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.18.0-h409340b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.14.0-h7cba3ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.16.0-h16bb3af_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.2.0-hf00d406_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.2.0-he4a93e4_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h4e30115_10.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.8-h74c22ad_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.4-h580cee5_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.1.1-py312hc892d8b_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py312h3093aea_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.16.0-py312hf1f8172_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/dftd3-python-1.5.0-py312h2bbb03f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fmt-12.1.0-h99e4e11_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.18.3-h81aa574_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.63.0-py312h04c11ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.3-hce30654_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hb001647_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.3.1-h784d473_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-h6f9ecc1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-hf5e55b1_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.3.1-py312h1af6244_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.15-h784d473_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hf-xet-1.5.2-py310he76dbf2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-py310h579977c_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jonquil-0.3.2-gfortran_h04795c8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.5.1-py312hee531d8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h34f8a20_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.19.1-hce41798_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.2.0-h1eee2c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260526.0-cxx17_h4c27e2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-25.0.0-haaed7fe_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-25.0.0-heaff1e6_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-25.0.0-h93a2d87_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-25.0.0-heaff1e6_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-25.0.0-h2208e57_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-10_h51639a9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-h1dcdb26_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-h5295a6a_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-h2ddc9cb_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-10_hb0561ab_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.22.0-h6651222_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-23.1.0-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-he7e0567_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321h26f1114_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h1a92334_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.7.0-h47dc5ef_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-h2ed5691_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-16.2.0-h3cf6597_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-16.2.0-h07b0088_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-16.2.0-hdb7a957_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.3-h89cd0c0_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-3.8.0-ha595bda_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-3.8.0-hc8aed40_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.82.1-hf3e839d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libharfbuzz-14.4.0-hcda0f7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-he4c29f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.2.0-h84a0fba_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-10_hd9741b5_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h435687b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.34-openmp_h4f80526_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.27.0-h46c1d2a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.27.0-hce30654_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-25.0.0-h0de02aa_4_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-hf5e6511_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-7.35.1-h391e224_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpsl-0.23.1-hdb0c161_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpython-3.12.14-h4e5ec87_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libraqm-0.11.0-h45af499_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h5d15848_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.4-hca69786_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-hbf2880b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h1fb9c8a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.2-hf67920b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtorch-2.13.0-cpu_generic_hf893bd3_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.3-h2431656_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.52.1-h1a92334_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h202fb40_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hbffa61f_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-h5654f7c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-23.1.0-hdb3d66b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-hdca3b7d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py312h04c11ed_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.11.1-py312h07c8dfe_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mctc-lib-0.5.2-gfortran_h0230218_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.4.0-h071a35a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.2-h72846b0_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-he64c551_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.12.0-h784d473_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.6-py312ha003a3f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/onednn-3.12-omp_h95bb4b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-h4d1e80c_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.4-h55eecbc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/optree-0.20.0-py312h42f75bc_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.3.1-hef2a647_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-3.0.5-py312h6510ced_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-he63d830_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.3.0-py312hf9dc30a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h784d473_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hb001647_1004.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-25.0.0-py312h1f38498_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-25.0.0-py312h7d9569a_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.14-hd05a0c4_3_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pytorch-2.13.0-cpu_generic_py312_ha1580ae_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py312h04c11ed_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-h5d60da5_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h8b90a29_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/s2n-1.7.5-h1b28cb6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.18.0-py312h4519d97_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/simple-dftd3-1.5.0-gfortran_h0230218_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sleef-3.9.0-hb028509_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.2-hada39a4_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-hbeba79b_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/toml-f-0.5.2-gfortran_h04795c8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-17.0.1-py312h2bbb03f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h84a0fba_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-h84a0fba_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h74c22ad_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.2-h8088a28_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.3-h31dac16_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hf451053_7.conda + - pypi: ./benchmark + - pypi: ./skala + - pypi: https://files.pythonhosted.org/packages/48/ed/bb4aeb728505b4ce7edd55e9b2e35bcbd99ad0b0cae5c45b59e48b9ed62d/pyscf-2.14.0-py3-none-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/b0/42/c84efcc1d4caebafb1ecd8be4643f39c85c47a80fe254d92b8b43b1eadaf/h5py-3.16.0-cp312-cp312-macosx_11_0_arm64.whl + test-py313-pyscf214-torch213: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-8_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3c89d7e_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py313hc8edb43_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.16.0-py313h2af15c8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py313h3dea7bd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-h7cc23a3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py313ha4a6282_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.1-py313h2551ef2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h9073bf1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-10_h5875eb1_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-10_hfef963f_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.2.0-h69a702a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-he503a2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.4.0-h23af247_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-10_h5e43f62_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h622638d_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.13.15-hdc7f604_103_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.2.0-hdf11a46_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-hcc2c06a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-23.1.0-h7148c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py313h134213a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hd2095e1_245.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py313hf6604e3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-heb1ab33_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py313h6bdb861_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py313h3b26573_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h7cc23a3_1004.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.15-hf47f18c_103_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py313_h80c0f76_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py313h4b8bb8b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.15.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.15-py313hd8ed1ab_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.30.0-pyh5ded981_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.15-h4df99d1_103.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-9_cp313.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - pypi: ./skala + - pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/bd/98/ef2b6fe2903e377cbe870c3b2800d62552f1e3dbe81ce49e1923c53d1c5c/h5py-3.16.0-cp313-cp313-manylinux_2_28_x86_64.whl +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + build_number: 20 + sha256: 1dd3fffd892081df9726d7eb7e0dea6198962ba775bd88842135a4ddb4deb3c9 + md5: a9f577daf3de00bca7c3c76c0ecbd1de + depends: + - __glibc >=2.17,<3.0.a0 + - libgomp >=7.5.0 + constrains: + - openmp_impl <0.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + strong: + - _openmp_mutex >=4.5 + size: 28948 + timestamp: 1770939786096 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-8_kmp_llvm.conda + build_number: 8 + sha256: b8de006376660eb12c7fc40803c97e1480bf4bc1253f0d59694b12f81b52fe14 + md5: b4d1b93dd1dab4eea23395fd5e5b357d + depends: + - llvm-openmp >=9.0.1 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - _openmp_mutex >=4.5 + size: 8050 + timestamp: 1788046427177 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ast-serialize-0.9.0-py311hf77984d_0.conda + noarch: python + sha256: 5b77c2444c8fef0feb1c37e7050c78f7e235c62ffec9ab58b6c4a82566ef32d4 + md5: d62c61e02f021c697a25baf855251284 + depends: + - python >=3.11 + - libgcc >=15 + - __glibc >=2.17,<3.0.a0 + - _python_abi3_support 1.* + - cpython >=3.11 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ast-serialize?source=hash-mapping + run_exports: {} + size: 1141952 + timestamp: 1788442342727 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-h4610da3_2.conda + sha256: 0c92dc5ddf4edd4038a63adb79f9f0b03f61e9455ce3253b7d2cf708e06ff99e + md5: cefa84dbf94066e7a6902af288a2fedd + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - aws-c-http >=0.11.0,<0.11.1.0a0 + - aws-c-common >=0.14.3,<0.14.4.0a0 + - aws-c-io >=0.27.5,<0.27.6.0a0 + - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 + - aws-c-cal >=0.9.15,<0.9.16.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-c-auth >=0.10.4,<0.10.5.0a0 + size: 135127 + timestamp: 1785199053057 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.4-hb7a77c6_1.conda + sha256: 845fe32ee750d4a4d3efdb1d95a8c29c3388e3ea9787b77341ec4abe4e198b11 + md5: 4347d5ffdf34adf9c5edd10837727d96 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - aws-c-http >=0.11.0,<0.11.1.0a0 + - aws-c-io >=0.27.3,<0.27.4.0a0 + - aws-c-cal >=0.9.14,<0.9.15.0a0 + - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 + - aws-c-common >=0.14.2,<0.14.3.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-c-auth >=0.10.4,<0.10.5.0a0 + size: 135073 + timestamp: 1784086842394 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.14-h2aa3ae6_4.conda + sha256: a67c944be1728f576c02fe8f28b0cbb78b5353415075db3da4ef71bc9dd8c00c + md5: 9c6072e7b882d35ac956c07e493d6a9e + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.14.2,<0.14.3.0a0 + - libgcc >=14 + - openssl >=3.5.7,<4.0a0 + license: Apache-2.0 + license_family: Apache + purls: [] + run_exports: + weak: + - aws-c-cal >=0.9.14,<0.9.15.0a0 + size: 56752 + timestamp: 1784043396713 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.15-h6bbde05_1.conda + sha256: 6eb21a0129e0aa7c6be733c7f2d1de6bc97a60c8382c1016f19dced722600d73 + md5: 8f2b374c79908f271be3d0e9f1c462a8 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.14.3,<0.14.4.0a0 + - libgcc >=14 + - openssl >=3.5.7,<4.0a0 + license: Apache-2.0 + license_family: Apache + purls: [] + run_exports: + weak: + - aws-c-cal >=0.9.15,<0.9.16.0a0 + size: 56630 + timestamp: 1785157790550 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.2-hb03c661_0.conda + sha256: 701398f1c9978c41e93cb0947869a66b7f8004e9d6e548d63d11aedae83cfb02 + md5: f3e0b2e044485ae90d4a59c77e7a0182 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + purls: [] + run_exports: + weak: + - aws-c-common >=0.14.2,<0.14.3.0a0 + size: 246263 + timestamp: 1783637234072 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.3-hb03c661_0.conda + sha256: 8ea79f36d50ba90d7147fe1a047f9a7f2d33b114a3d4bacf1360cd8df43986e4 + md5: ce8664d7c01d4a598ad38107b289b5ec + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + purls: [] + run_exports: + weak: + - aws-c-common >=0.14.3,<0.14.4.0a0 + size: 245819 + timestamp: 1784596136918 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h01ee8f8_5.conda + sha256: 27f8581573c533a92a1a9619516ebb66d390b9923d296331985cfd342dc32d29 + md5: ae862abdbb3160f97478d3d4749164c0 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.14.3,<0.14.4.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-c-compression >=0.3.2,<0.3.3.0a0 + size: 22282 + timestamp: 1785157574179 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h720e601_4.conda + sha256: 8e0a5513cfc42df8bd16adbd8e83a37d3ca89b8e04cb20eb04eb177bbbfea365 + md5: c9be3f5854f349ae77a1a174b59e11a8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - aws-c-common >=0.14.2,<0.14.3.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-c-compression >=0.3.2,<0.3.3.0a0 + size: 22301 + timestamp: 1784042853709 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.1-h6ffeea8_4.conda + sha256: b1f35f7b7a5e745e2d56cf93212770bb56f5207fa9f0e38f98b0c05a1b898a90 + md5: 204d1e8d60c3ae839bd1898e4c7742c8 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - aws-checksums >=0.2.10,<0.2.11.0a0 + - aws-c-common >=0.14.2,<0.14.3.0a0 + - aws-c-io >=0.27.3,<0.27.4.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-c-event-stream >=0.7.1,<0.7.2.0a0 + size: 59633 + timestamp: 1784075699558 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-h38ae05a_4.conda + sha256: 4b939b4a76a11c9ec50c891ae9bf232da8dcaf8797701df1e79ae51c988be2d4 + md5: 97f2799ae6ff7b6f52dfa321fef9676b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - aws-c-compression >=0.3.2,<0.3.3.0a0 + - aws-c-io >=0.27.3,<0.27.4.0a0 + - aws-c-cal >=0.9.14,<0.9.15.0a0 + - aws-c-common >=0.14.2,<0.14.3.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-c-http >=0.11.0,<0.11.1.0a0 + size: 231294 + timestamp: 1784075685646 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-hbe094ff_5.conda + sha256: a4a5e24b398e7c0ef64de5a341ecb3f0fa87c2879177695c5d0bcbde0c4f8b5e + md5: c09f7ec7327b8bd52fc2d6eacaa18d3b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - aws-c-io >=0.27.5,<0.27.6.0a0 + - aws-c-cal >=0.9.15,<0.9.16.0a0 + - aws-c-common >=0.14.3,<0.14.4.0a0 + - aws-c-compression >=0.3.2,<0.3.3.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-c-http >=0.11.0,<0.11.1.0a0 + size: 231270 + timestamp: 1785186134512 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.3-h6f4d18d_1.conda + sha256: 94c32ca672ce290e250aea1cfb92582cca4658bdc3ec7cb1ceef254f34451595 + md5: bd19b685b88557830f1a617a6d404eb2 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - aws-c-cal >=0.9.14,<0.9.15.0a0 + - s2n >=1.7.5,<1.7.6.0a0 + - aws-c-common >=0.14.2,<0.14.3.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-c-io >=0.27.3,<0.27.4.0a0 + size: 183100 + timestamp: 1784054829913 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.27.5-h4f381ba_1.conda + sha256: 76ab4eb6cae12e14244cb1fe11ecccc2f103f8ffa7e80e222099c6b16c19ae20 + md5: 948f5a4fddac779b7942626e5807caba + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - aws-c-common >=0.14.3,<0.14.4.0a0 + - aws-c-cal >=0.9.15,<0.9.16.0a0 + - s2n >=1.7.6,<1.7.7.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-c-io >=0.27.5,<0.27.6.0a0 + size: 183633 + timestamp: 1785170070776 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.16.0-h21f4ec5_2.conda + sha256: 0252f072e2f493f8348575938c69b48b2799f29f0489c4ad2c5a919ab7e3d02e + md5: 9728195c2f600ef427a1964ee193e707 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - aws-c-io >=0.27.3,<0.27.4.0a0 + - aws-c-http >=0.11.0,<0.11.1.0a0 + - aws-c-common >=0.14.2,<0.14.3.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-c-mqtt >=0.16.0,<0.16.1.0a0 + size: 224933 + timestamp: 1784087527918 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.8-h46fcd08_1.conda + sha256: a423bffbb0e6cacb5e2a0861b918ba3180e5132509afb1faf225ee9f0ec8f981 + md5: 706aa99414d18db5b23475b45cc93a0b + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - aws-c-io >=0.27.3,<0.27.4.0a0 + - aws-c-http >=0.11.0,<0.11.1.0a0 + - openssl >=3.5.7,<4.0a0 + - aws-c-cal >=0.9.14,<0.9.15.0a0 + - aws-c-auth >=0.10.4,<0.10.5.0a0 + - aws-checksums >=0.2.10,<0.2.11.0a0 + - aws-c-common >=0.14.2,<0.14.3.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-c-s3 >=0.12.8,<0.12.9.0a0 + size: 156174 + timestamp: 1784100985258 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.13.1-h7508075_1.conda + sha256: d24f7f34b3b564535b533b17176e71f71b6944aa2cb71813283bece139908d9f + md5: 2daf54d3eef87b757f68d7597534dd2f + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - aws-c-http >=0.11.0,<0.11.1.0a0 + - aws-c-auth >=0.10.4,<0.10.5.0a0 + - openssl >=3.5.7,<4.0a0 + - aws-c-common >=0.14.3,<0.14.4.0a0 + - aws-checksums >=0.2.10,<0.2.11.0a0 + - aws-c-io >=0.27.5,<0.27.6.0a0 + - aws-c-cal >=0.9.15,<0.9.16.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-c-s3 >=0.13.1,<0.13.2.0a0 + size: 157667 + timestamp: 1785351292770 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h01ee8f8_3.conda + sha256: b308c393a3db78cef29942c6b83ca7321f86d357fbb47504d59f55254601c87a + md5: 412f0cf18cc4c4945655dba954ca2d76 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - aws-c-common >=0.14.3,<0.14.4.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 + size: 68574 + timestamp: 1785159234141 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-h720e601_2.conda + sha256: e419e179e04021fc680d98af23fac4b4c2369cea61171087e57a734e968dd9bd + md5: 816f62fa82532118ebb2398382090945 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - aws-c-common >=0.14.2,<0.14.3.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 + size: 68515 + timestamp: 1784044260935 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h01ee8f8_5.conda + sha256: f8d2cd9faccb273df739fc28431b484a90aca10027ef44f7fec1d4f0bd229a76 + md5: 4d70caf5260e0787675c3bf61ae5b64c + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.14.3,<0.14.4.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-checksums >=0.2.10,<0.2.11.0a0 + size: 101887 + timestamp: 1785159213897 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h720e601_4.conda + sha256: 6cc8617854a43040291dea791fe111ba408e7a5bbd9ee9e5a99375da7a16846b + md5: 24ee781effc5779206a80139323c9caf + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.14.2,<0.14.3.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-checksums >=0.2.10,<0.2.11.0a0 + size: 101904 + timestamp: 1784044248506 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.40.1-h102d43b_3.conda + sha256: e0c3a119c7035a00e0da325187ee723e07e0e6337e50362349d178ab40961f97 + md5: 3315ce09371baf6d70248b8927aa9866 + depends: + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 + - aws-c-mqtt >=0.16.0,<0.16.1.0a0 + - aws-c-auth >=0.10.4,<0.10.5.0a0 + - aws-c-s3 >=0.12.8,<0.12.9.0a0 + - aws-c-common >=0.14.2,<0.14.3.0a0 + - aws-c-io >=0.27.3,<0.27.4.0a0 + - aws-c-event-stream >=0.7.1,<0.7.2.0a0 + - aws-c-cal >=0.9.14,<0.9.15.0a0 + - aws-c-http >=0.11.0,<0.11.1.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-crt-cpp >=0.40.1,<0.40.2.0a0 + size: 416399 + timestamp: 1784113232967 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.833-hc7390e0_9.conda + sha256: 0c15c036c3b71471eecc58bbe08a68c66fd6a051b548dca7675c7c924ed3972b + md5: c65efa87d532339a090c87093097bf09 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + - aws-c-event-stream >=0.7.1,<0.7.2.0a0 + - aws-c-common >=0.14.2,<0.14.3.0a0 + - libcurl >=8.21.0,<9.0a0 + - aws-crt-cpp >=0.40.1,<0.40.2.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-sdk-cpp >=1.11.833,<1.11.834.0a0 + size: 3394321 + timestamp: 1784137257627 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.3-h206d751_0.conda + sha256: fffc66e9be8806a92b314e27129c42b1298ea7065028c9e5d175dacb07829261 + md5: 0cabc152dc8896c3a4c4aebf2b308627 + depends: + - __glibc >=2.17,<3.0.a0 + - libcurl >=8.19.0,<9.0a0 + - libgcc >=14 + - libstdcxx >=14 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + size: 349147 + timestamp: 1775238757304 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-h71f81a8_2.conda + sha256: ebca774f1ebaa24c150730603b418b33fc7862811a16d097716b1a29f34798c5 + md5: f4fc754ec17176046988c46a54962a8c + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + - libgcc >=14 + - libstdcxx >=14 + - openssl >=3.5.7,<4.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - azure-identity-cpp >=1.13.3,<1.13.4.0a0 + size: 250737 + timestamp: 1781268163278 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.18.0-h74b55db_1.conda + sha256: 04bb27dbf1d426b4447b28c3dc92ec01c807fa784eea86ffa1f8c2bd9b9e8076 + md5: 43151a3b0a8e037747d79a82dff9f967 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + - azure-storage-common-cpp >=12.14.0,<12.14.1.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - azure-storage-blobs-cpp >=12.18.0,<12.18.1.0a0 + size: 589716 + timestamp: 1781283775801 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.14.0-hf596fc9_1.conda + sha256: 8a806f9852d280926d7613df548889b49e2a1c5d836385bcb2cedb24e7b08c64 + md5: 7896f4a6ee78538e2d0261e3b36dfa69 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libxml2 + - libxml2-16 >=2.14.6 + - openssl >=3.5.7,<4.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - azure-storage-common-cpp >=12.14.0,<12.14.1.0a0 + size: 159394 + timestamp: 1781268171097 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.16.0-h1f05bef_1.conda + sha256: 13e2e6eb942f65bf81e9089bf6b5926534d9245c781288c5270beb3a25c9156b + md5: 70972c9cb0893d6499dd4118415a966b + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + - azure-storage-blobs-cpp >=12.18.0,<12.18.1.0a0 + - azure-storage-common-cpp >=12.14.0,<12.14.1.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - azure-storage-files-datalake-cpp >=12.16.0,<12.16.1.0a0 + size: 308699 + timestamp: 1781538835962 +- conda: https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.7.0-py312h3f22e6b_1.conda + sha256: b377a4f053c4e184b031253c702984194d10c98228004d7cf07c1eca86247d62 + md5: b0e9b44b494bb001c4d35b206022eba2 + depends: + - python + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - python_abi 3.12.* *_cp312 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-3-Clause AND MIT AND EPL-2.0 + purls: + - pkg:pypi/backports-zstd?source=compressed-mapping + run_exports: {} + size: 241113 + timestamp: 1788491295568 +- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils-2.46.1-default_h4852527_102.conda + sha256: 659c367ef49df7741749a2ad240b007d7df51b4f210505a78543deafb001e44c + md5: e8452fe381cac5fff20563a07722dfa5 + depends: + - binutils_impl_linux-64 >=2.46.1,<2.46.2.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + run_exports: {} + size: 35399 + timestamp: 1784214547142 +- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda + sha256: fb7bf36984a37ce7e4714d1d1da0bd0e3bfc679520f5cdc184afc676fd4b5da2 + md5: a0c5e0b7f58c8ceeb08e5bc41251d5a2 + depends: + - ld_impl_linux-64 2.46.1 default_hbd61a6d_102 + - sysroot_linux-64 + - zstd >=1.5.7,<1.6.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + run_exports: {} + size: 3713752 + timestamp: 1784214522814 +- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.46.1-default_h4852527_102.conda + sha256: 08d7238663fc408ba2ab60b02fa3d06a7ca9d872962e03e90c7e0fdecb7ed1d0 + md5: 32fd07abe84eb14f17c7f5cc6fa8df82 + depends: + - binutils_impl_linux-64 2.46.1 default_hfdba357_102 + license: GPL-3.0-only + license_family: GPL + purls: [] + run_exports: {} + size: 36337 + timestamp: 1784214551894 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-h505cf86_4.conda + sha256: 61b78574f002390b6a7fc79834fc344beaab09550068a51100eea5a485dac741 + md5: 746aa619a1bcaf4da541101179d7c60e + depends: + - __glibc >=2.17,<3.0.a0 + - brotli-bin 1.2.0 h9908984_4 + - libbrotlidec 1.2.0 ha411449_4 + - libbrotlienc 1.2.0 h018ffa1_4 + - libgcc >=15 + license: MIT + purls: [] + run_exports: + weak: + - libbrotlicommon >=1.2.0,<1.3.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + size: 20679 + timestamp: 1788480401508 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_4.conda + sha256: ce7db81d5fd4b222ee1a27c52ccf7af44faaf88283017103a8e288f9c372b973 + md5: c48c09444f3736800ea0b9550c365baf + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlidec 1.2.0 ha411449_4 + - libbrotlienc 1.2.0 h018ffa1_4 + - libgcc >=15 + license: MIT + purls: [] + run_exports: {} + size: 21601 + timestamp: 1788480392621 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py312he9c40d5_4.conda + sha256: 6e4f440a7015d7d78120b3a3f90a4ec3d7bb6de7bc65458123c52433755db5f0 + md5: edb667e7ce56106424e8afab2dc0f0cb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - libstdcxx >=15 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - libbrotlicommon 1.2.0 h39a168f_4 + license: MIT + purls: + - pkg:pypi/brotli?source=hash-mapping + run_exports: {} + size: 367657 + timestamp: 1788480501027 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_10.conda + sha256: 1a0d382c515ebf55f8ee1f38c8b81bc95af5c2acc42ad53b66bc5df932032f96 + md5: e675fabcf81499adc7edf58124fb1e01 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + run_exports: + weak: + - bzip2 >=1.0.8,<2.0a0 + size: 257808 + timestamp: 1785906269155 +- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.8-hebe6cf0_2.conda + sha256: 9c37cc233238adf366ea75b0e845662a5be07ceadf62e458183516369340274b + md5: 3ad2b403be8fc5612b9159e2ce621f69 + depends: + - libgcc >=15 + - __glibc >=2.17,<3.0.a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - c-ares >=1.34.8,<2.0a0 + size: 228700 + timestamp: 1787169971173 +- conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.11.0-h4d9bdce_0.conda + sha256: 8e7a40f16400d7839c82581410aa05c1f8324a693c9d50079f8c50dc9fb241f0 + md5: abd85120de1187b0d1ec305c2173c71b + depends: + - binutils + - gcc + - gcc_linux-64 14.* + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: {} + size: 6693 + timestamp: 1753098721814 +- conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-2.0.0-ha29393d_0.conda + sha256: a54488d2b00380f542a2e1aa00dee3d878803a8c2c025dfce852a23685584dc6 + md5: b08763a8d93f2ba35bbf956dab90950b + depends: + - gcc 15.* + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: {} + size: 7017 + timestamp: 1786642183250 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3c89d7e_3.conda + sha256: 6b551d9346997bc4c6fadf96b7b92442b8f3244011cc462e4ee77afc714d52c5 + md5: 7b870cffbaa8430290e567a0facd8dca + depends: + - __glibc >=2.17,<3.0.a0 + - fontconfig >=2.18.3,<3.0a0 + - fonts-conda-ecosystem + - icu >=78.3,<79.0a0 + - libexpat >=2.8.1,<3.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libgcc >=15 + - libglib >=2.88.3,<3.0a0 + - libpng >=1.6.58,<1.7.0a0 + - libstdcxx >=15 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - pixman >=0.46.4,<1.0a0 + - xorg-libice >=1.1.2,<2.0a0 + - xorg-libsm >=1.2.6,<2.0a0 + - xorg-libx11 >=1.8.13,<2.0a0 + - xorg-libxext >=1.3.7,<2.0a0 + - xorg-libxrender >=0.9.12,<0.10.0a0 + license: LGPL-2.1-only or MPL-1.1 + purls: [] + run_exports: + weak: + - cairo >=1.18.4,<2.0a0 + size: 991011 + timestamp: 1788221336073 +- conda: https://conda.anaconda.org/conda-forge/linux-64/catch2-3.16.0-h4dbf13b_0.conda + sha256: 2912874e38b635b89db9bbecb284f13ae449a6c3925a28a87f78b23e4730d767 + md5: ff146041192f4d830974030bdec19f86 + depends: + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=15 + - libgcc >=15 + license: BSL-1.0 + purls: [] + run_exports: + weak: + - catch2 >=3.16.0,<4.0a0 + size: 659129 + timestamp: 1787658434406 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.1.1-py312h703531f_3.conda + sha256: 7c6e8b24d62e0bfa5d14050cd29053778f399feefa7d6887b04575210285a849 + md5: 41f019d067f8c52c6d9283d8afb28889 + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.7.0,<3.8.0a0 + - libgcc >=15 + - pycparser + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: MIT + purls: + - pkg:pypi/cffi?source=compressed-mapping + run_exports: {} + size: 302937 + timestamp: 1788485303634 +- conda: https://conda.anaconda.org/conda-forge/linux-64/clang-20-20.1.8-default_hc302687_17.conda + sha256: 9e0e9a2dd44e7cd5a06f1fa446a680c9d6cead2822c9bb125b35865cd13e46f8 + md5: 74912225a10937d9a98f71b09cdf7e51 + depends: + - __glibc >=2.17,<3.0.a0 + - libclang-cpp20.1 20.1.8 default_hc302687_17 + - libgcc >=15 + - libllvm20 >=20.1.8,<20.2.0a0 + - libstdcxx >=15 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 865175 + timestamp: 1788477439449 +- conda: https://conda.anaconda.org/conda-forge/linux-64/clang-20.1.8-default_cfg_h7f4fe12_17.conda + sha256: 49cf412191cc1d0a4c4a762c73076a7aec3e202c465ab36190e64dc89dacd93a + md5: 2b696096c881218d61071737b8febb93 + depends: + - binutils_impl_linux-64 + - clang-20 20.1.8 default_hc302687_17 + - clang_impl_linux-64 20.1.8 default_cfg_h027053c_17 + - libgcc-devel_linux-64 + - sysroot_linux-64 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 77093 + timestamp: 1788477514480 +- conda: https://conda.anaconda.org/conda-forge/linux-64/clang-22-22.1.8-default_h90b978e_10.conda + sha256: 812c9075110812fef0694ce9976ea6db2fd9bb250f1424e8d9d959a77c87427f + md5: e0876f7128b4aa0c8f7930c91f9d1425 + depends: + - compiler-rt22 ==22.1.8 + - libclang-cpp22.1 ==22.1.8 default_h0acdd01_10 + - libstdcxx >=15 + - libgcc >=15 + - __glibc >=2.17,<3.0.a0 + - libxml2 + - libxml2-16 >=2.15.3 + - zstd >=1.5.7,<1.6.0a0 + - libzlib >=1.3.2,<2.0a0 + - libclang-cpp22.1 >=22.1.8,<22.2.0a0 + - libllvm22 >=22.1.8,<22.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + run_exports: {} + size: 942600 + timestamp: 1788043761816 +- conda: https://conda.anaconda.org/conda-forge/linux-64/clang-format-22-22.1.8-default_h0acdd01_10.conda + sha256: da82be7ef35b60cd17c99856a8ebaf775a51254a4edc5ca64cc2debda898fafb + md5: 79f7621594eb150f8e0c2d058b773356 + depends: + - libclang-cpp22.1 >=22.1.8,<22.2.0a0 + - libstdcxx >=15 + - libgcc >=15 + - __glibc >=2.17,<3.0.a0 + - libxml2 + - libxml2-16 >=2.15.3 + - zstd >=1.5.7,<1.6.0a0 + - libzlib >=1.3.2,<2.0a0 + - libllvm22 >=22.1.8,<22.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + run_exports: {} + size: 76131 + timestamp: 1788043761816 +- conda: https://conda.anaconda.org/conda-forge/linux-64/clang-format-22.1.8-default_hf2538bd_10.conda + sha256: c82315aa42475edf116814bfb86dc5e7e8f837bba3ae1971a2246b170e451ad1 + md5: 815264f142af0631484baa2f94d2b165 + depends: + - libclang-cpp22.1 >=22.1.8,<22.2.0a0 + - clang-format-22 ==22.1.8 default_h0acdd01_10 + - libstdcxx >=15 + - libgcc >=15 + - __glibc >=2.17,<3.0.a0 + - libxml2 + - libxml2-16 >=2.15.3 + - zstd >=1.5.7,<1.6.0a0 + - libzlib >=1.3.2,<2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + run_exports: {} + size: 33749 + timestamp: 1788043761816 +- conda: https://conda.anaconda.org/conda-forge/linux-64/clang-scan-deps-22.1.8-default_h0acdd01_10.conda + sha256: fc4d5fc03cc293af90fef96ac122ab5bce8c0cca52c8e31c25bdcf69510fd06d + md5: 61bc8c192603995ee5a9aa3f7bb52fc7 + depends: + - libclang13 >=22.1.8 + - libclang-cpp22.1 >=22.1.8,<22.2.0a0 + - libstdcxx >=15 + - libgcc >=15 + - __glibc >=2.17,<3.0.a0 + - libxml2 + - libxml2-16 >=2.15.3 + - zstd >=1.5.7,<1.6.0a0 + - libzlib >=1.3.2,<2.0a0 + - libllvm22 >=22.1.8,<22.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + run_exports: {} + size: 112874 + timestamp: 1788043761816 +- conda: https://conda.anaconda.org/conda-forge/linux-64/clang-tools-22.1.8-default_h444efe8_10.conda + sha256: 9e7a74dc67ab4bdbcd03b1fe5640482aac1c35725dd67f538b2a0cc0f702778d + md5: cbe15e995d769d742caaa02a828dba11 + depends: + - clang-format ==22.1.8 default_hf2538bd_10 + - libclang13 >=22.1.8 + - clang-scan-deps ==22.1.8 default_h0acdd01_10 + - libclang-cpp22.1 >=22.1.8,<22.2.0a0 + - libstdcxx >=15 + - libgcc >=15 + - __glibc >=2.17,<3.0.a0 + - libxml2 + - libxml2-16 >=2.15.3 + - zstd >=1.5.7,<1.6.0a0 + - libzlib >=1.3.2,<2.0a0 + - libllvm22 >=22.1.8,<22.2.0a0 + constrains: + - clangdev ==22.1.8 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + run_exports: {} + size: 11880384 + timestamp: 1788043761816 +- conda: https://conda.anaconda.org/conda-forge/linux-64/clang_impl_linux-64-20.1.8-default_cfg_h027053c_17.conda + sha256: f84bf01d2fc912bfe407fa6a4ac92318b0c8cd953fe52ee7c405c98caa382263 + md5: d7389b4cf9345b65cfeb140f9632cc9a + depends: + - binutils_impl_linux-64 + - clang-20 20.1.8 default_hc302687_17 + - compiler-rt 20.1.8.* + - compiler-rt_linux-64 + - libgcc-devel_linux-64 + - llvm-openmp >=20.1.8 + - sysroot_linux-64 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 77459 + timestamp: 1788477494250 +- conda: https://conda.anaconda.org/conda-forge/linux-64/clang_impl_linux-64-22.1.8-default_h2a708d9_10.conda + sha256: bc6404c83d52a4c3acb3d454bbc3074e9dcaa09f4070b6e9bdd2346b4ca2b7ef + md5: 73d50ec5d622a6487d592d4a56eb0129 + depends: + - clang-22 ==22.1.8 default_h90b978e_10 + - compiler-rt_linux-64 ==22.1.8 + - compiler-rt ==22.1.8 + - binutils_impl_linux-64 + - libgcc-devel_linux-64 + - sysroot_linux-64 + - libstdcxx >=15 + - libgcc >=15 + - __glibc >=2.17,<3.0.a0 + - libxml2 + - libxml2-16 >=2.15.3 + - zstd >=1.5.7,<1.6.0a0 + - libzlib >=1.3.2,<2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + run_exports: {} + size: 33792 + timestamp: 1788043761816 +- conda: https://conda.anaconda.org/conda-forge/linux-64/clang_linux-64-20.1-h3830e3d_28.conda + sha256: c3b71aeb4d516c040fdb64f7fcaa87ed85f3c4c63e0b6ffa4e8a3a6752b48af4 + md5: 6d859229ca047dd03a0bb44319697876 + depends: + - binutils_linux-64 + - clang_impl_linux-64 20.1.* + - libgcc-devel_linux-64 15.2.0.* + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + strong: + - libgcc >=15 + size: 29472 + timestamp: 1785174991052 +- conda: https://conda.anaconda.org/conda-forge/linux-64/clang_linux-64-22.1-hecd59b2_28.conda + sha256: a29bf378546dc37cb943bcbcf0bb9e907037ae06128b5c84e9a67ff67bbb125b + md5: 3eaa40c19a7645d5e8d321da9fac3718 + depends: + - binutils_linux-64 + - clang_impl_linux-64 22.1.* + - libgcc-devel_linux-64 15.2.0.* + license: BSD-3-Clause + license_family: BSD + run_exports: + strong: + - libgcc >=15 + size: 29467 + timestamp: 1785174991052 +- conda: https://conda.anaconda.org/conda-forge/linux-64/clangxx_impl_linux-64-20.1.8-default_cfg_h027053c_17.conda + sha256: 2b7906c72d5d59344cddc7ba65e13c597e049aad68c5fb73ad692676a1811e1b + md5: 40e9f566f46ecadf64c4c52e870ce757 + depends: + - clang-20 20.1.8 default_hc302687_17 + - clang_impl_linux-64 20.1.8 default_cfg_h027053c_17 + - libstdcxx-devel_linux-64 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 77260 + timestamp: 1788477579822 +- conda: https://conda.anaconda.org/conda-forge/linux-64/clangxx_impl_linux-64-22.1.8-default_h9d9a4db_10.conda + sha256: 8ae45dfc412510b86180d7d0953aae2fd465cb7f850953d6e178e29a3e8ddd9b + md5: 4bb0b422195d017105e0ed946b5274c9 + depends: + - clang-22 ==22.1.8 default_h90b978e_10 + - clang_impl_linux-64 ==22.1.8 default_h2a708d9_10 + - clang-scan-deps ==22.1.8 default_h0acdd01_10 + - libstdcxx-devel_linux-64 + - libstdcxx >=15 + - libgcc >=15 + - __glibc >=2.17,<3.0.a0 + - libxml2 + - libxml2-16 >=2.15.3 + - zstd >=1.5.7,<1.6.0a0 + - libzlib >=1.3.2,<2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + run_exports: {} + size: 33908 + timestamp: 1788043761816 +- conda: https://conda.anaconda.org/conda-forge/linux-64/clangxx_linux-64-20.1-h8eaea6b_28.conda + sha256: 73efd49cfecc0634a79d8066bd55241891e3a226a86b6424460114cb287bd8a1 + md5: 9985bb45f57de2619acb6fb786dfefff + depends: + - clang_linux-64 ==20.1 h3830e3d_28 + - clangxx_impl_linux-64 20.1.* + - libstdcxx-devel_linux-64 15.2.0.* + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + strong: + - libstdcxx >=15 + - libgcc >=15 + size: 27939 + timestamp: 1785174991052 +- conda: https://conda.anaconda.org/conda-forge/linux-64/clangxx_linux-64-22.1-h2bf5a4b_28.conda + sha256: 843be097afe0dd5a80699e320b838d5a7b8910a613e0e8610257e120199c871a + md5: 624e5d5a8bfe8ad500e9db0b56cf73e2 + depends: + - clang_linux-64 ==22.1 hecd59b2_28 + - clangxx_impl_linux-64 22.1.* + - libstdcxx-devel_linux-64 15.2.0.* + license: BSD-3-Clause + license_family: BSD + run_exports: + strong: + - libstdcxx >=15 + - libgcc >=15 + size: 27947 + timestamp: 1785174991052 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.31.8-hc85cc9f_0.conda + sha256: 10660ed21b9d591f8306028bd36212467b94f23bc2f78faec76524f6ee592613 + md5: 057e16a12847eea846ecf99710d3591b + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - libcurl >=8.14.1,<9.0a0 + - libexpat >=2.7.1,<3.0a0 + - libgcc >=14 + - liblzma >=5.8.1,<6.0a0 + - libstdcxx >=14 + - libuv >=1.51.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - rhash >=1.4.6,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: {} + size: 20991288 + timestamp: 1757877168657 +- conda: https://conda.anaconda.org/conda-forge/linux-64/compiler-rt-20.1.8-hb700be7_1.conda + sha256: 8dd25cb56ec529b43b05f93f1b501848ba1f958501f2da2ab8b5d3f910afcbff + md5: 76dfabc5943bd8ab2a916b276c5f7a59 + depends: + - __glibc >=2.17,<3.0.a0 + - clang 20.1.8.* + - compiler-rt_linux-64 20.1.8.* + - libgcc >=14 + - libstdcxx >=14 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + run_exports: {} + size: 114057 + timestamp: 1757411545630 +- conda: https://conda.anaconda.org/conda-forge/linux-64/compiler-rt-22.1.8-ha770c72_2.conda + sha256: 2d1981daa747e884f359c698b95cb36dafea675772e10654e79c0b3516d51832 + md5: 1aa79dea4abc486d7538e200e47987a6 + depends: + - compiler-rt22 22.1.8 h7148c6a_2 + - libcompiler-rt 22.1.8 h7148c6a_2 + constrains: + - clang 22.1.8 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + run_exports: {} + size: 16638 + timestamp: 1787293765325 +- conda: https://conda.anaconda.org/conda-forge/linux-64/compiler-rt22-22.1.8-h7148c6a_2.conda + sha256: a363ee7ace374becfda5a4277a78166fa8e541d49ec5280b56b470b72b01f118 + md5: 4f275c16dcfe4374f3d41bc487de219b + depends: + - __glibc >=2.17,<3.0.a0 + - compiler-rt22_linux-64 22.1.8.* + - libgcc >=15 + - libstdcxx >=15 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + run_exports: {} + size: 115799 + timestamp: 1787293764090 +- conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-14.4.0-h611768e_4.conda + sha256: aa5bd240da2b9a3cfe9571cc09009bb69285c624c9513207c7f6916e1af89f11 + md5: 856d208bf951e600ab3fdc732a775b09 + depends: + - gcc_impl_linux-64 >=14.4.0,<14.4.1.0a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 32534 + timestamp: 1787617898102 +- conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-15.3.0-h8846f6e_4.conda + sha256: 87ebd4f94c8823763d35adaba292c2dc8c60ddda70e0980f32eae0dbb0e2aa2d + md5: 4bfbca2f3bfcdf6d78a339cfd5368fce + depends: + - gcc_impl_linux-64 >=15.3.0,<15.3.1.0a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 32631 + timestamp: 1787618595567 +- conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py311h724c32c_4.conda + sha256: fd7aca059253cff3d8b0aec71f0c1bf2904823b13f1997bf222aea00a76f3cce + md5: d04e508f5a03162c8bab4586a65d00bf + depends: + - numpy >=1.25 + - python + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/contourpy?source=hash-mapping + run_exports: {} + size: 320553 + timestamp: 1769155975008 +- conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda + sha256: 62447faf7e8eb691e407688c0b4b7c230de40d5ecf95bf301111b4d05c5be473 + md5: 43c2bc96af3ae5ed9e8a10ded942aa50 + depends: + - numpy >=1.25 + - python + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/contourpy?source=hash-mapping + run_exports: {} + size: 320386 + timestamp: 1769155979897 +- conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py313hc8edb43_4.conda + sha256: 7f86eb205d2d7fcf2c82654a08c6a240623ac34cb406206b4b1f1afa5cda8e49 + md5: 33639459bc29437315d4bff9ed5bc7a7 + depends: + - numpy >=1.25 + - python + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/contourpy?source=hash-mapping + run_exports: {} + size: 321850 + timestamp: 1769155964333 +- conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.16.0-py311h364832d_0.conda + sha256: 0dbe00acbd25fb7ced45200d044b9199d1f6a806bcecac9b6818f7bdbc4a0650 + md5: 53d6a3984dfa6b2a76abccc29ef87d50 + depends: + - python + - libgcc >=15 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.11.* *_cp311 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/coverage?source=hash-mapping + run_exports: {} + size: 427996 + timestamp: 1787965687641 +- conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.16.0-py312h8b7ec3f_0.conda + sha256: aaea290a54335ad42ca4a416936c51acbd6f5be7cc2ed6c49fb629f3e8946a31 + md5: 385233507bd4b374469cc6563734c22b + depends: + - python + - libgcc >=15 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/coverage?source=hash-mapping + run_exports: {} + size: 416603 + timestamp: 1787965687641 +- conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.16.0-py313h2af15c8_0.conda + sha256: c95c677deaae32f2cca15f5c6e1a9267d6c0ba072f82d6667596946c5b30dff3 + md5: e53c02d7a82ec851a22628cdd241f182 + depends: + - python + - libgcc >=15 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.13.* *_cp313 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/coverage?source=hash-mapping + run_exports: {} + size: 425215 + timestamp: 1787965687641 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-crt-tools-12.9.86-ha770c72_2.conda + sha256: 2da9964591af14ba11b2379bed01d56e7185260ee0998d1a939add7fb752db45 + md5: 503a94e20d2690d534d676a764a1852c + depends: + - cuda-version >=12.9,<12.10.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 29138 + timestamp: 1753975252445 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-crt-tools-13.3.73-ha770c72_1.conda + sha256: 2be2013460c18858cadf54bebe089b7f5a4f0c3e9c7dbb0930b32fe407bffc4f + md5: e98cbf0020c1e3db50b797a229f177a9 + depends: + - cuda-version >=13.3,<13.4.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 30123 + timestamp: 1787703441049 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-ctadvisor-13.3.33-h676940d_0.conda + sha256: 05d865ab9e5c44ab240d5b27b579d2d5f523d4bda062f99721aac20592d501ef + md5: 7b8805fc29e0e3f2abe0da7431a2bad3 + depends: + - __glibc >=2.28,<3.0.a0 + - cuda-version >=13.3,<13.4.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 845795 + timestamp: 1779896449867 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-12.9.79-h5888daf_0.conda + sha256: 57d1294ecfaf9dc8cdb5fc4be3e63ebc7614538bddb5de53cfd9b1b7de43aed5 + md5: cb15315d19b58bd9cd424084e58ad081 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-cudart_linux-64 12.9.79 h3f2d84a_0 + - cuda-version >=12.9,<12.10.0a0 + - libgcc >=13 + - libstdcxx >=13 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 23242 + timestamp: 1749218416505 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-13.3.29-hecca717_0.conda + sha256: 3d74819f261d77a410e8f8ddbd973446c312ec76605d60619d9b85113eca9632 + md5: 3fc21c99786b908fd7f32ea279fc9780 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-cudart_linux-64 13.3.29 h376f20c_0 + - cuda-version >=13.3,<13.4.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 24659 + timestamp: 1779898425780 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-12.9.79-h5888daf_0.conda + sha256: 04d8235cb3cb3510c0492c3515a9d1a6053b50ef39be42b60cafb05044b5f4c6 + md5: ba38a7c3b4c14625de45784b773f0c71 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-cudart 12.9.79 h5888daf_0 + - cuda-cudart-dev_linux-64 12.9.79 h3f2d84a_0 + - cuda-cudart-static 12.9.79 h5888daf_0 + - cuda-version >=12.9,<12.10.0a0 + - libgcc >=13 + - libstdcxx >=13 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: + weak: + - cuda-cudart >=12.9.79,<13.0a0 + size: 23687 + timestamp: 1749218464010 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-dev-13.3.29-hecca717_0.conda + sha256: 050ac942737f501b5dee21c0bbfa77f4617c52269f188ab66a5e2b8b7acd0f22 + md5: e21171cc900f202b2af82f1afddbdfcf + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-cudart 13.3.29 hecca717_0 + - cuda-cudart-dev_linux-64 13.3.29 h376f20c_0 + - cuda-cudart-static 13.3.29 hecca717_0 + - cuda-version >=13.3,<13.4.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: + weak: + - cuda-cudart >=13.3.29,<14.0a0 + size: 25129 + timestamp: 1779898446163 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-12.9.79-h5888daf_0.conda + sha256: 6261e1d9af80e1ec308e3e5e2ff825d189ef922d24093beaf6efca12e67ce060 + md5: d3c4ac48f4967f09dd910d9c15d40c81 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-cudart-static_linux-64 12.9.79 h3f2d84a_0 + - cuda-version >=12.9,<12.10.0a0 + - libgcc >=13 + - libstdcxx >=13 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 23283 + timestamp: 1749218442382 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cudart-static-13.3.29-hecca717_0.conda + sha256: e2596138baef66e9b7fa08329e944d3ef8cca7c3d2da28d32bc37ff7e4801d1a + md5: 3a99ba2e09c508fd8b8b0eaf6d37a376 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-cudart-static_linux-64 13.3.29 h376f20c_0 + - cuda-version >=13.3,<13.4.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 24626 + timestamp: 1779898435744 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cuobjdump-12.9.82-hffce074_1.conda + sha256: 113c354cb176eee131cc193507214a471bef73e000f5a143f7367c0e48d92959 + md5: 55a83761db33f82d92d7d7a4a61662e5 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-nvdisasm + - cuda-version >=12.9,<12.10.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 245074 + timestamp: 1761107448598 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cuobjdump-13.3.73-hffce074_0.conda + sha256: a65cb1cecf1c10b5788d99c5c0e97878e1bd422e9626d0905a3f62ead1451440 + md5: 0e65be2f6812d0acf74e6c90fedeac7b + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-nvdisasm + - cuda-version >=13.3,<13.4.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 311736 + timestamp: 1782782292034 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-12.9.79-h676940d_2.conda + sha256: c6c5ba6456af7ab6580868bc9c25b57fddde819d59458d3dea28b3d9b162a9fd + md5: dcbc9b64f862ad6f92fa15bb9e95cb57 + depends: + - __glibc >=2.28,<3.0.a0 + - cuda-version >=12.9,<12.10.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 1854034 + timestamp: 1784664104747 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cupti-13.3.75-h676940d_1.conda + sha256: 74102b8c0b16fdbcf2dbd0979737a39e9bbda91af648a9f02e463a941d3aaa5d + md5: 52cc2a03940221694e9ee60386f5892f + depends: + - __glibc >=2.28,<3.0.a0 + - cuda-version >=13.3,<13.4.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 1600177 + timestamp: 1784050032907 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cuxxfilt-12.9.82-hffce074_1.conda + sha256: 54e59c7c802e3491ec901011711e79a0dd65e75a12c3e6178c3948f653ac5a59 + md5: 73204e01a30d7d2783de5acd153f6a1d + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.9,<12.10.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 216466 + timestamp: 1761098778582 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-cuxxfilt-13.3.29-hffce074_0.conda + sha256: c30a1e5a4fb93b0cee76b651af6135bfebc02981b176862109020af8ad722081 + md5: 9000fb13bc58a761fc9017e963f180ca + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=13.3,<13.4.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 66065 + timestamp: 1779896357268 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-12.9.86-hcdd1206_6.conda + sha256: f7c5de6b1f0f463f73c78cc73439027cdd5cb94fb4ce099116969812973cabcb + md5: 02289b10ac97bac35ad1add086c5072a + depends: + - cuda-nvcc_linux-64 12.9.86.* + - gcc_linux-64 + - gxx_linux-64 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 25472 + timestamp: 1771619493470 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-13.3.73-hcdd1206_1.conda + sha256: 10910ece3aa4e8ef6e438986d81dd6f78b0343d84409580af341982e86d500f1 + md5: 9e3c48ca714c8e503c45aec042848223 + depends: + - cuda-nvcc_linux-64 13.3.73.* + - gcc_linux-64 + - gxx_linux-64 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 24924 + timestamp: 1787703396389 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-impl-12.9.86-h85509e4_2.conda + sha256: 961cf20d411b7685cd744e6c6ed35efea547d095c62151d6f3053d9931bb994d + md5: 67458d2685e7503933efa550f3ee40f3 + depends: + - cuda-cudart >=12.9.79,<13.0a0 + - cuda-cudart-dev + - cuda-nvcc-dev_linux-64 12.9.86 he91c749_2 + - cuda-nvcc-tools 12.9.86 he02047a_2 + - cuda-nvvm-impl 12.9.86 h4bc722e_2 + - cuda-version >=12.9,<12.10.0a0 + - libnvptxcompiler-dev 12.9.86 ha770c72_2 + constrains: + - gcc_impl_linux-64 >=6,<15.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 27215 + timestamp: 1753975546846 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-impl-13.3.73-h376f20c_1.conda + sha256: 45e5738d1896ffe517d118210b432b193577f8086cb8be4e2412730f4fa1aa80 + md5: 80b50ecd5cd3bdaf6e006190bfbbbacc + depends: + - cuda-cudart >=13.3.29,<14.0a0 + - cuda-cudart-dev + - cuda-nvcc-dev_linux-64 13.3.73 he91c749_1 + - cuda-nvcc-tools 13.3.73 hecca717_1 + - cuda-nvvm-impl 13.3.73 hb03c661_1 + - cuda-version >=13.3,<13.4.0a0 + - libnvptxcompiler-dev 13.3.73 ha770c72_1 + constrains: + - gcc_impl_linux-64 >=6,<16.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 28220 + timestamp: 1787703607362 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-tools-12.9.86-he02047a_2.conda + sha256: 0e849be7b5e4832ca218ec2c48a9ba3a15a984f629e2e54f38a53f4f57220341 + md5: dc256c9864c2e8e9c817fbca1c84a4bc + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-crt-tools 12.9.86 ha770c72_2 + - cuda-nvvm-tools 12.9.86 h4bc722e_2 + - cuda-version >=12.9,<12.10.0a0 + - libgcc >=12 + - libstdcxx >=12 + constrains: + - gcc_impl_linux-64 >=6,<15.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 27380012 + timestamp: 1753975454194 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc-tools-13.3.73-hecca717_1.conda + sha256: 6adc60d76af7461812cdb056b8dd9879507ade10ef578cbaee5838a8e8fe205e + md5: 83fb3d735cccb2043389f696e23b416c + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-crt-tools 13.3.73 ha770c72_1 + - cuda-nvvm-tools 13.3.73 hb03c661_1 + - cuda-version >=13.3,<13.4.0a0 + - libgcc >=14 + - libstdcxx >=14 + constrains: + - gcc_impl_linux-64 >=6,<16.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 34657421 + timestamp: 1787703548053 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc_linux-64-12.9.86-he0b4e1d_6.conda + sha256: c506221dafb7cfd081f7d12d01d8e8ab9b29adfcc7d69d61fedd3232174e4016 + md5: 359d05bc3ec5d3a467eb558e3844aea2 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-cudart-dev_linux-64 12.9.* + - cuda-driver-dev_linux-64 12.9.* + - cuda-nvcc-dev_linux-64 12.9.86.* + - cuda-nvcc-impl 12.9.86.* + - cuda-nvcc-tools 12.9.86.* + - sysroot_linux-64 >=2.17,<3.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: + strong: + - cuda-version >=12.9,<13 + size: 27575 + timestamp: 1771619492974 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvcc_linux-64-13.3.73-hb2fc203_1.conda + sha256: 96f36641c9082429156fd18a171fde65641b7659ea222be08e7276f9ff84a4e8 + md5: a30b5a17a56514ac14809b03ec3edf4c + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-cudart-dev_linux-64 13.3.* + - cuda-driver-dev_linux-64 13.3.* + - cuda-nvcc-dev_linux-64 13.3.73.* + - cuda-nvcc-impl 13.3.73.* + - cuda-nvcc-tools 13.3.73.* + - sysroot_linux-64 >=2.17,<3.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: + strong: + - cuda-version >=13.3,<14 + size: 27309 + timestamp: 1787703395844 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvdisasm-12.9.88-hffce074_1.conda + sha256: 6851de88381f2ea0cbc5d18a91ae8a8ff6e682c6ee58c03c922902a0c25eb1a7 + md5: 5e7845d208a5067cb1461a429ff887e0 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.9,<12.10.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 5518360 + timestamp: 1761098730432 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvdisasm-13.3.73-hffce074_0.conda + sha256: b69e14ccc7192729d6b50442401e429d70435f18f365be5e21d658c4de240f76 + md5: 4e6afe47c9930b435ca158beff6e4e96 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=13.3,<13.4.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 4704495 + timestamp: 1782772091030 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvprune-12.9.82-hffce074_1.conda + sha256: 3bf91b1c682e698cfe4af1952b4255303ec8949d499e4a40e88fa6e40d96e1bf + md5: 60ff367b93b5ddb5043487c9a3372f3b + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.9,<12.10.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 70948 + timestamp: 1761099226016 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvprune-13.3.29-hffce074_0.conda + sha256: ecb86bca8111ec2c092830161cadb784b67fcc039002027bcb690cbcaa35d022 + md5: 15abfdf8a3ea2811e6c8209d709f56cd + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=13.3,<13.4.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 580708 + timestamp: 1779896847589 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-12.9.86-hecca717_1.conda + sha256: 68f81268c25befa9b70dc49af469ab0eb131960e3700b9a4edb46a32da343a28 + md5: 53f0062e2243b26e43ddac0b5267c6a3 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.9,<12.10.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 67168282 + timestamp: 1760723629347 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-13.3.33-hecca717_0.conda + sha256: a70641e7d81694f57c7df46a17b657594393082dad667532c29df9540b7f99ca + md5: 57124a775cb937bb2bfd10f09a230430 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=13.3,<13.4.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 39254802 + timestamp: 1779897349474 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-dev-12.9.86-hecca717_1.conda + sha256: ae620051c16eabf7720a47c5115634d64f7703d32124555ad0afccfd4b8d7cf4 + md5: 0d28090f4e63410e20397c7975612837 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-nvrtc 12.9.86 hecca717_1 + - cuda-version >=12.9,<12.10.0a0 + - libgcc >=14 + - libstdcxx >=14 + constrains: + - cuda-nvrtc-static >=12.9.86 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: + weak: + - cuda-nvrtc >=12.9.86,<13.0a0 + size: 36819 + timestamp: 1760723845601 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvrtc-dev-13.3.33-hecca717_0.conda + sha256: 5ed71b75e73241ab007d92a6b1f28ce90cc50abf3615876e7ef8d3dea9443d58 + md5: 37fe136dc4411687579abf75826a0609 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-nvrtc 13.3.33 hecca717_0 + - cuda-version >=13.3,<13.4.0a0 + - libgcc >=14 + - libstdcxx >=14 + constrains: + - cuda-nvrtc-static >=13.3.33 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: + weak: + - cuda-nvrtc >=13.3.33,<14.0a0 + size: 38404 + timestamp: 1779897472176 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-12.9.79-hecca717_1.conda + sha256: b16600e48ef3247366b83d5f195852fcefbc4d52bb245f82a632c7129d1d6283 + md5: b4a3411fa031c409f98cfbd4b2db9ad7 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.9,<12.10.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 29436 + timestamp: 1761098820386 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvtx-13.3.29-hecca717_0.conda + sha256: 5af9ccd785d66de9b25907f33c05b3b96fb289b030d041dc106303c0ae10caea + md5: b9ece8f54967d0e38857e6c562273f68 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=13.3,<13.4.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 33852 + timestamp: 1779896656406 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-12.9.86-h4bc722e_2.conda + sha256: f4d34556174e4faa9d374ba2244707082870e1bbc1bb441ad3d9d2cea37da6af + md5: 82125dd3c0c4aa009faa00e2829b93d8 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.9,<12.10.0a0 + - libgcc >=12 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 21425520 + timestamp: 1753975283188 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-impl-13.3.73-hb03c661_1.conda + sha256: c34430c589777f2ee16fb4ff90ef8400349fb6cfc36d5303668926e68033fd8a + md5: af6afcc8ed386257e3b2f091e1d14e23 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=13.3,<13.4.0a0 + - libgcc >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 22428811 + timestamp: 1787703453005 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-12.9.86-h4bc722e_2.conda + sha256: 45f5e881ed0d973132a5475a0b5c066db6e748ef3a831a14dba8374b252e0067 + md5: f9af26e4079adcd72688a8e8dbecb229 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.9,<12.10.0a0 + - libgcc >=12 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 24246736 + timestamp: 1753975332907 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-nvvm-tools-13.3.73-hb03c661_1.conda + sha256: 808ef346da9669d6e30a07997bf324076793ef5dee020c0e2361021cf3118517 + md5: 9b7d8bc3afef28851e8910be62a050ac + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=13.3,<13.4.0a0 + - libgcc >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 29733840 + timestamp: 1787703485138 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cuda-tileiras-13.3.36-hecca717_0.conda + sha256: a07ea0cdd7ae8f7802bd59368aaee68ecc3edcab58b3b1ecd0e1e86284b08023 + md5: 7548be407524388a21111da4b385f350 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-nvcc-tools + - cuda-nvvm-impl + - cuda-version >=13.3,<13.4.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 28119891 + timestamp: 1779914201352 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cutensor-2.7.0.5-h15eaa2f_1.conda + sha256: 4e22c5cae2a2f4d8b9be509740737b80418a9f1274f4174f871e34fdb89dcc79 + md5: d78b425773f4a367b4f4c2bdc5cf3922 + depends: + - __glibc >=2.28,<3.0.a0 + - cuda-version >=13,<14.0a0 + - libcublas + - libgcc >=14 + - libstdcxx >=14 + license: LicenseRef-cuTENSOR-Software-License-Agreement + purls: [] + run_exports: + weak: + - cutensor >=2.7.0.5,<3.0a0 + size: 224965683 + timestamp: 1782817486396 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cutensor-2.7.0.5-h2d75abc_1.conda + sha256: aa633cbff15ac42cdff4ed979ce33dd904f877af67161cac3471698210453ee4 + md5: c76b59cea362f58e6fc85b3eb86aad21 + depends: + - __glibc >=2.28,<3.0.a0 + - cuda-version >=12,<13.0a0 + - libcublas + - libgcc >=14 + - libstdcxx >=14 + license: LicenseRef-cuTENSOR-Software-License-Agreement + purls: [] + run_exports: + weak: + - cutensor >=2.7.0.5,<3.0a0 + size: 242185870 + timestamp: 1782817485486 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-1.11.0-hfcd1e18_0.conda + sha256: 3fcc97ae3e89c150401a50a4de58794ffc67b1ed0e1851468fcc376980201e25 + md5: 5da8c935dca9186673987f79cef0b2a5 + depends: + - c-compiler 1.11.0 h4d9bdce_0 + - gxx + - gxx_linux-64 14.* + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: {} + size: 6635 + timestamp: 1753098722177 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-2.0.0-hdab9b82_0.conda + sha256: 384ab445d260e0d69e701c32eb0ed870d348ec7e3efc78d944823855d4512ca1 + md5: 923dacbfd97122c65c97a35f6e959ab8 + depends: + - gxx 15.* + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: {} + size: 6972 + timestamp: 1786642183694 +- conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.21-py312h8285ef7_0.conda + sha256: b8dbe25820064a099f315bbb8f45f5bac3fddb63e96af3cbf0c93a830733ef34 + md5: e6778419a1851f6e15820558abddfa04 + depends: + - python + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/debugpy?source=hash-mapping + run_exports: {} + size: 2821960 + timestamp: 1780390159181 +- conda: https://conda.anaconda.org/conda-forge/linux-64/doxygen-1.18.0-py310hb664d3d_0.conda + sha256: aa8efe84767d1f628f439749df5bd1d369cad6ef1a6cc2922ffc75238e62f07a + md5: 13974bf5357b9bb5ecab0a09fd06d144 + depends: + - libiconv + - libgcc >=15 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=15 + - libiconv >=1.18,<2.0a0 + license: GPL-2.0-only + license_family: GPL + run_exports: {} + size: 14579949 + timestamp: 1788247237167 +- conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-5.0.1-h19c2612_1.conda + sha256: faccfc13d5e2af4fd03ab585221a8c4915f2954d60a321f8953b8b730e2e3c2d + md5: 329251b710717ddee4f83198f450362b + license: MPL-2.0 + license_family: MOZILLA + purls: [] + run_exports: {} + size: 1311668 + timestamp: 1788180248648 +- conda: https://conda.anaconda.org/conda-forge/linux-64/elfutils-0.194-h849f50c_0.conda + sha256: f71eae7dc8ff9392d225d2d529691b2db16289b7d8009646eeb1adf0caf3937b + md5: 6da1f998c8ea85ba7692afbb5db72fb9 + depends: + - libgcc >=14 + - libstdcxx >=14 + - __glibc >=2.17,<3.0.a0 + - libzlib >=1.3.1,<2.0a0 + - libsqlite >=3.51.1,<4.0a0 + - libmicrohttpd >=1.0.2,<1.1.0a0 + - libarchive >=3.8.2,<3.9.0a0 + - liblzma >=5.8.1,<6.0a0 + - bzip2 >=1.0.8,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + - libcurl >=8.17.0,<9.0a0 + license: LGPL-3.0-only + license_family: LGPL + purls: [] + run_exports: + weak: + - elfutils >=0.194,<0.195.0a0 + size: 1289929 + timestamp: 1765447425767 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-h76c4fd7_1.conda + sha256: 25d14a197601fdd616f2e501431b52887e69b31e7defbc1679381d718357ceb7 + md5: a70bb6d42ad121aef456e0007e92bed6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - fmt >=12.1.0,<12.2.0a0 + size: 199072 + timestamp: 1785915412102 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.3-h4db4eae_1.conda + sha256: 5a3eb10b18a97223ab06b3a7f0d7f56658db2f2800e2f2af95836fe3bf55ba63 + md5: 922776b528a470ab5afa81fd42abfa1d + depends: + - __glibc >=2.17,<3.0.a0 + - libexpat >=2.8.1,<3.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libgcc >=15 + - libuuid >=2.42.2,<3.0a0 + - libzlib >=1.3.2,<2.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - fontconfig >=2.18.3,<3.0a0 + - fonts-conda-ecosystem + size: 296288 + timestamp: 1786667377340 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py311h3778330_0.conda + sha256: ce5004df66a6bf4e3d634850ab43471b98700291065281eb1982eb54b7bf7d85 + md5: 498ede447c05b203be980ae1dceb06f3 + depends: + - __glibc >=2.17,<3.0.a0 + - brotli + - libgcc >=14 + - munkres + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - unicodedata2 >=15.1.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/fonttools?source=hash-mapping + run_exports: {} + size: 3045399 + timestamp: 1778770357867 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py312h8a5da7c_0.conda + sha256: d235ae7075642044ceb3d922ef2a710a82665755ac9bbb7e8dad7daa72bc6d87 + md5: 294fb524171e2a2748cb7fe708aba826 + depends: + - __glibc >=2.17,<3.0.a0 + - brotli + - libgcc >=14 + - munkres + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - unicodedata2 >=15.1.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/fonttools?source=hash-mapping + run_exports: {} + size: 3007892 + timestamp: 1778770568019 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.63.0-py313h3dea7bd_0.conda + sha256: e0029a390d7aef29bd6e7c12a3759f5e0b989930b5781e544ca9bac0abcd8442 + md5: ae83c999b4cfc4c171ce88b99c8b43cc + depends: + - __glibc >=2.17,<3.0.a0 + - brotli + - libgcc >=14 + - munkres + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: MIT + license_family: MIT + purls: + - pkg:pypi/fonttools?source=hash-mapping + run_exports: {} + size: 2995315 + timestamp: 1778770432258 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-1.11.0-h9bea470_0.conda + sha256: 53e5562ede83b478ebe9f4fc3d3b4eff5b627883f48aa0bf412e8fd90b5d6113 + md5: d5596f445a1273ddc5ea68864c01b69f + depends: + - binutils + - c-compiler 1.11.0 h4d9bdce_0 + - gfortran + - gfortran_linux-64 14.* + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: {} + size: 6656 + timestamp: 1753098722318 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-2.0.0-h0f4f740_0.conda + sha256: 7c1439c589983a6d76b5acaafe55437dd942ae21dc970e497ee0a3270fdd8a0d + md5: 7b2f4089fcf4cf6aa43ff932daee8c8b + depends: + - gfortran 15.* + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: {} + size: 6970 + timestamp: 1786642183826 +- conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_2.conda + sha256: 612a8e0c1a6ecae23da54d81ef395f6ebb5c8e4468ec2611593ebce75876a4e0 + md5: 2d0ea23b23603e07ca47f23f949f67b6 + depends: + - libfreetype 2.14.3 ha770c72_2 + - libfreetype6 2.14.3 h5e6c136_2 + license: GPL-2.0-only OR FTL + purls: [] + run_exports: + weak: + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + size: 175239 + timestamp: 1786641011029 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-h7cc23a3_2.conda + sha256: 76dd097bd65d812a9104edb0e266386e152e65928ac5c8eb4f480ce24affc470 + md5: 16d6e5a0f8dbc17bd6669dba6f49bad3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + license: LGPL-2.1-or-later + purls: [] + run_exports: + weak: + - fribidi >=1.0.16,<2.0a0 + size: 62401 + timestamp: 1788385624706 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-14.4.0-hc6a0c74_4.conda + sha256: e8fcf859f1d294be88fede47dc197baec6f50dac9a73554e86835ab72e4b993c + md5: 8190cc2aceda3c553e4567914ac2c1ee + depends: + - conda-gcc-specs + - gcc_impl_linux-64 14.4.0 heaf7ae8_4 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: {} + size: 29352 + timestamp: 1787617988030 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.2.0-hb7a6aa6_20.conda + sha256: a06b6154bc3357010c3b99627dcd042d1ae8dae6b1f92bc4a2c07eb1b6befe5a + md5: ce28eaba7dc3180ae717b548fb0ec363 + depends: + - gcc_impl_linux-64 15.2.0 h8ddf172_20 + track_features: + - gcc_no_conda_specs + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: {} + size: 29212 + timestamp: 1784924116372 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-15.3.0-hc6a0c74_4.conda + sha256: f9ee593ac1cbad6633c51c498b0ba8b1da14e6dc22c0cb49a1d158abe8d2cb0f + md5: cd390c3b900677ec6b0fdd729173125d + depends: + - conda-gcc-specs + - gcc_impl_linux-64 15.3.0 h6f13dc8_4 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: {} + size: 29431 + timestamp: 1787618696046 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.4.0-heaf7ae8_4.conda + sha256: 598d73603537f206822f081defc8ba81cc3d96392ad897761d7e10acebbbaaef + md5: 4f27260a21a28c1814fda15b3dc00672 + depends: + - binutils_impl_linux-64 >=2.46.1 + - libgcc >=14.4.0 + - libgcc-devel_linux-64 14.4.0 hd9a9cd0_104 + - libgomp >=14.4.0 + - libsanitizer 14.4.0 hf39dbba_4 + - libstdcxx >=14.4.0 + - libstdcxx-devel_linux-64 14.4.0 ha5b54cb_104 + - sysroot_linux-64 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 77257006 + timestamp: 1787617820201 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-h8ddf172_20.conda + sha256: 8e5725dfd8dfb4df6b78252abca52e29c778862900714d38aed6328144da229b + md5: 2b360e802262428a5e21312b3c95fffb + depends: + - binutils_impl_linux-64 >=2.46.1 + - libgcc >=15.2.0 + - libgcc-devel_linux-64 15.2.0 hcc6f6b0_120 + - libgomp >=15.2.0 + - libsanitizer 15.2.0 h984fb3e_20 + - libstdcxx >=15.2.0 + - libstdcxx-devel_linux-64 15.2.0 hd446a21_120 + - sysroot_linux-64 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 81311910 + timestamp: 1784923892134 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.3.0-h6f13dc8_4.conda + sha256: c7e4915c0c5e8f081e107d50ab6041eab17fbe094108538d614faed354ab8974 + md5: b1f9f0b4a4697fd26c1fe3c7a1ac659f + depends: + - binutils_impl_linux-64 >=2.46.1 + - libgcc >=15.3.0 + - libgcc-devel_linux-64 15.3.0 h2b852eb_104 + - libgomp >=15.3.0 + - libsanitizer 15.3.0 h54950a5_4 + - libstdcxx >=15.3.0 + - libstdcxx-devel_linux-64 15.3.0 hb2c5482_104 + - sysroot_linux-64 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 82843060 + timestamp: 1787618483258 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.4.0-hc469d41_1.conda + sha256: c0e265a5781bdf88ae6fcf488b0f12d729a09dbf8139e3f42bc5b1fa7d0cdea4 + md5: e166437b6cf4f824d732da823dc70f15 + depends: + - gcc_impl_linux-64 14.4.0.* + - binutils_linux-64 + - sysroot_linux-64 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + strong: + - libgcc >=14 + size: 29787 + timestamp: 1787166213180 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-15.2.0-h7be306e_28.conda + sha256: 57e7204cf78133f34b20c3e8aabf360db22a0a25b190823ce74cce25c4fefc88 + md5: 1947dad907c82aef51f4e102ed42fbdd + depends: + - gcc_impl_linux-64 15.2.0.* + - binutils_linux-64 + - sysroot_linux-64 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + strong: + - libgcc >=15 + size: 29394 + timestamp: 1785174991052 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-15.3.0-h7df7c86_1.conda + sha256: 19b19ef4a5f87d3263377244dd96d1854debbf095520149ce783594261cfb2bc + md5: c6f07e8a36d9b3cc781e0cb827d82bc0 + depends: + - gcc_impl_linux-64 15.3.0.* + - binutils_linux-64 + - sysroot_linux-64 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + strong: + - libgcc >=15 + size: 29771 + timestamp: 1787166287979 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.3.1-h54a6638_0.conda + sha256: f7026323ac769ef432c747a6c22abd39c583d0d4f6985a7100fb371e2167f214 + md5: 04be12e7dd050aaf364ece2393988e85 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - gflags >=2.3.1,<2.4.0a0 + size: 130991 + timestamp: 1785044715896 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-14.4.0-hc6a0c74_4.conda + sha256: f61c301b8a4f2a1fe7e57629aacc50b82683a8527e4966ebd0911dd5f886bbcb + md5: 86a985338e3734d5c81e86ac36f4c611 + depends: + - conda-gcc-specs + - gcc 14.4.0 hc6a0c74_4 + - gcc_impl_linux-64 14.4.0 heaf7ae8_4 + - gfortran_impl_linux-64 14.4.0 he75539a_4 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: {} + size: 28776 + timestamp: 1787618004556 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-15.2.0-hd47ba16_20.conda + sha256: 7b8725f35797a3235950eb958b8ff3c1653a4595227138896548a93d95451b63 + md5: b3cb6b912dbb24cdeb370a683f5e32b8 + depends: + - gcc 15.2.0 hb7a6aa6_20 + - gcc_impl_linux-64 15.2.0 h8ddf172_20 + - gfortran_impl_linux-64 15.2.0 hb7147c0_20 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: {} + size: 28545 + timestamp: 1784924188712 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-15.3.0-hc6a0c74_4.conda + sha256: 530f263d2f1bf798f851158b0f27a2152384cf010731b02425b8a5ef52ab6639 + md5: 1ca5f1fb2acff8660df49ff975f4f2af + depends: + - conda-gcc-specs + - gcc 15.3.0 hc6a0c74_4 + - gcc_impl_linux-64 15.3.0 h6f13dc8_4 + - gfortran_impl_linux-64 15.3.0 h27ced10_4 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: {} + size: 28872 + timestamp: 1787618716638 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-14.4.0-he75539a_4.conda + sha256: 7ce7a3da4540c9dd4c0f76bbb70facde8bcd55959f92d125f155451f621dcd61 + md5: 9a4c5569155b0df60d0a002448c9c37e + depends: + - gcc_impl_linux-64 14.4.0.* + - libgcc >=14.4.0 + - libgfortran5 >=14.4.0 + - libstdcxx >=14.4.0 + - sysroot_linux-64 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 18911998 + timestamp: 1787617929863 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-15.2.0-hb7147c0_20.conda + sha256: d8e66e69bd0792a649de534f8030175e0f2bf73a4365b85586311524f09d55c9 + md5: ea6e09b95a805332bb429906310af4db + depends: + - gcc_impl_linux-64 >=15.2.0 + - libgcc >=15.2.0 + - libgfortran5 >=15.2.0 + - libstdcxx >=15.2.0 + - sysroot_linux-64 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 19825507 + timestamp: 1784924034986 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-15.3.0-h27ced10_4.conda + sha256: 85947a2004e18b27e1e22b9f1d1170bc77535e3f5bc831b82073f096d8896f9e + md5: 92f4216d2f001881f27b96f96e54f865 + depends: + - gcc_impl_linux-64 15.3.0.* + - libgcc >=15.3.0 + - libgfortran5 >=15.3.0 + - libstdcxx >=15.3.0 + - sysroot_linux-64 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 20651296 + timestamp: 1787618630976 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-14.4.0-h490a4d9_1.conda + sha256: a498ff5eb7d208180310d98c4f5b225bade9a6bbc3190f7181a2c15288325a6a + md5: da4783686775367e976331447005c209 + depends: + - gfortran_impl_linux-64 14.4.0.* + - gcc_linux-64 ==14.4.0 hc469d41_1 + - binutils_linux-64 + - sysroot_linux-64 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + strong: + - libgfortran5 >=14.4.0 + - libgfortran + - libgcc >=14 + size: 27865 + timestamp: 1787166213180 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-15.3.0-h901e4f3_1.conda + sha256: 81b7ab32ea59abce9fe31733cad61bceec2078fe83a0dbb02a7df7a6068ff018 + md5: 99dde5981a3eb69c92d124b8ef89511b + depends: + - gfortran_impl_linux-64 15.3.0.* + - gcc_linux-64 ==15.3.0 h7df7c86_1 + - binutils_linux-64 + - sysroot_linux-64 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + strong: + - libgfortran5 >=15.3.0 + - libgfortran + - libgcc >=15 + size: 27871 + timestamp: 1787166287979 +- conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.55.0-pl5321h5685339_1.conda + sha256: ffe825e3ff78876dc5aa28eee791d8d9be4a47157761aa38dbff79e9222b3b8e + md5: da325124b01b7b88e7374d160d02698b + depends: + - __glibc >=2.17,<3.0.a0 + - libcurl >=8.21.0,<9.0a0 + - libexpat >=2.8.1,<3.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.7,<4.0a0 + - pcre2 >=10.47,<10.48.0a0 + - perl 5.* + constrains: + - __glibc >=2.17 + license: GPL-2.0-or-later and LGPL-2.1-or-later + purls: [] + run_exports: {} + size: 11598127 + timestamp: 1783981072661 +- conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hb7133d2_1.conda + sha256: f24feeda3aeec3a2cbb9fe2e0fabc4785372e70b6cc838c96023e08e17f4bfa0 + md5: 6941f96b8a8056677d79b4f5a2c4aaca + depends: + - __glibc >=2.17,<3.0.a0 + - gflags >=2.3.0,<2.4.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - glog >=0.7.1,<0.8.0a0 + size: 149031 + timestamp: 1784094370091 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hfd2156b_3.conda + sha256: f36c336efc874f346a53a9011f67e997f9faac505562cc18c13b6d399cfe61c7 + md5: 576e32739f323438bf69ab006c21be7b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: GPL-2.0-or-later OR LGPL-3.0-or-later + purls: [] + run_exports: + weak: + - gmp >=6.3.0,<7.0a0 + size: 493498 + timestamp: 1786629164954 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py311hbc40be8_0.conda + sha256: 0c3fbef9e0f1f3049c2d74c4b3801b135ab95a8ef0b3c421c883e0158f3b07e8 + md5: d9772193877442b8eeb63b56b81882f3 + depends: + - python + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - mpc >=1.4.0,<2.0a0 + - gmp >=6.3.0,<7.0a0 + - mpfr >=4.2.2,<5.0a0 + - python_abi 3.11.* *_cp311 + license: LGPL-3.0-or-later + license_family: LGPL + purls: + - pkg:pypi/gmpy2?source=compressed-mapping + run_exports: {} + size: 312441 + timestamp: 1787066347085 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py312h04c1168_0.conda + sha256: 8f1abde65e50bf2f30292442a5388bf962f8275bb1e23a0fe8fbdc83b8b5a241 + md5: 96a25063461871ac66728ecfa645116c + depends: + - python + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - mpfr >=4.2.2,<5.0a0 + - gmp >=6.3.0,<7.0a0 + - python_abi 3.12.* *_cp312 + - mpc >=1.4.0,<2.0a0 + license: LGPL-3.0-or-later + license_family: LGPL + purls: + - pkg:pypi/gmpy2?source=compressed-mapping + run_exports: {} + size: 327022 + timestamp: 1787066358050 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.3.1-py313ha4a6282_0.conda + sha256: fe8326323cece1ef063541047f7cd98754eaa26f68ab271e07227932f0aa3817 + md5: ab774b6526899f7f9816efeb02372c0f + depends: + - python + - libgcc >=15 + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - mpfr >=4.2.2,<5.0a0 + - mpc >=1.4.0,<2.0a0 + - python_abi 3.13.* *_cp313 + license: LGPL-3.0-or-later + license_family: LGPL + purls: + - pkg:pypi/gmpy2?source=compressed-mapping + run_exports: {} + size: 327580 + timestamp: 1787066358811 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gnutls-3.8.13-h18acefa_0.conda + sha256: dbdbb714064914281c755650bc54e1855412e7e2f4c99ad171b5123ed704b2b1 + md5: 7c3de21891993e89aabdadaa603ed835 + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=14 + - libidn2 >=2,<3.0a0 + - libstdcxx >=14 + - libtasn1 >=4.21.0,<5.0a0 + - nettle >=3.10.1,<3.11.0a0 + - p11-kit >=0.26.2,<0.27.0a0 + license: LGPL-2.1-or-later + license_family: LGPL + purls: [] + run_exports: + weak: + - gnutls >=3.8.13,<3.9.0a0 + size: 2054535 + timestamp: 1778044634746 +- conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-h54a6638_1.conda + sha256: 7fa3b6a9c081fa3e545573152a788d061a0a0ba57df7251cc0f4f75225fc93e7 + md5: f9fe2984587fa8235a6af6004760cd18 + depends: + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + run_exports: + weak: + - graphite2 >=1.3.15,<2.0a0 + size: 102835 + timestamp: 1786118485753 +- conda: https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.5.5-py312h8285ef7_0.conda + sha256: dd501d5a23203ce6d770044270c46e132973c7f8aa515a6dd097a11bb2e5a800 + md5: ddf5a875fe09a244a1f64329272bdc32 + depends: + - python + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/greenlet?source=compressed-mapping + run_exports: {} + size: 275998 + timestamp: 1786384044080 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-14.4.0-hc6a0c74_4.conda + sha256: a1f015bf59dce69e9d906787c5c593952a37b3187e36e783bc312535965be34a + md5: 4bb792e0ae12a500819e53656ce7e12d + depends: + - conda-gcc-specs + - gcc 14.4.0 hc6a0c74_4 + - gxx_impl_linux-64 14.4.0 hc436dd5_4 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: {} + size: 28775 + timestamp: 1787618022021 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.2.0-hd47ba16_20.conda + sha256: e5ea3187a71d39c69f781ebef5ea6149b2ad1568e17c00e9035cedaa5f879f90 + md5: a764e951ae015a6bf56395bb78de9553 + depends: + - gcc 15.2.0 hb7a6aa6_20 + - gxx_impl_linux-64 15.2.0 he8f701c_20 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: {} + size: 28530 + timestamp: 1784924200452 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-15.3.0-hc6a0c74_4.conda + sha256: 9ea6ca0830d8fe8ede308b4ab3f206f3504c422f7155981e13f2eca56a5ef9e8 + md5: 2264c7beb16d977423e8ebd69f44be88 + depends: + - conda-gcc-specs + - gcc 15.3.0 hc6a0c74_4 + - gxx_impl_linux-64 15.3.0 h90d9265_4 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: {} + size: 28893 + timestamp: 1787618735531 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.4.0-hc436dd5_4.conda + sha256: ad45e4ebe5d43ad7db73daf3679f5298312620c28eb6cad564fac12c77b71c83 + md5: 4bde5767dff86ac7227da41331cb5c66 + depends: + - gcc_impl_linux-64 14.4.0 heaf7ae8_4 + - libstdcxx-devel_linux-64 14.4.0 ha5b54cb_104 + - sysroot_linux-64 + - tzdata + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 15869057 + timestamp: 1787617955102 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.2.0-he8f701c_20.conda + sha256: 4cfbde34c89ad1707ebd240b0ba705aae912de9ba24792d2a0e2872c1d9fce2a + md5: 8541ee94f1d03791333d6341b65436a2 + depends: + - gcc_impl_linux-64 15.2.0 h8ddf172_20 + - libstdcxx-devel_linux-64 15.2.0 hd446a21_120 + - sysroot_linux-64 + - tzdata + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 15603218 + timestamp: 1784924072148 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-15.3.0-h90d9265_4.conda + sha256: 2b18349ad16f4be8dd9f2afa58d4ab7b9014fc543326ddecd59db215c6dc721d + md5: 9a6fbf3da4dd624b8382e096bbca10f4 + depends: + - gcc_impl_linux-64 15.3.0 h6f13dc8_4 + - libstdcxx-devel_linux-64 15.3.0 hb2c5482_104 + - sysroot_linux-64 + - tzdata + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 16252239 + timestamp: 1787618666649 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.4.0-he93183a_1.conda + sha256: cf55c19e7c413dcca673a15c473801528afa61945d01aeecfdb3c498e71e9695 + md5: 6116cf8d0380169c4bf0b9f045577c88 + depends: + - gxx_impl_linux-64 14.4.0.* + - gcc_linux-64 ==14.4.0 hc469d41_1 + - binutils_linux-64 + - sysroot_linux-64 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + strong: + - libstdcxx >=14 + - libgcc >=14 + size: 28158 + timestamp: 1787166213180 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-15.2.0-h71fc77c_28.conda + sha256: 2090221d24cc477d73d2a0e667fb395520e5a2222af1371d157fc70a96e385ec + md5: e110dfbcd087ae679df62975fcde1abc + depends: + - gxx_impl_linux-64 15.2.0.* + - gcc_linux-64 ==15.2.0 h7be306e_28 + - binutils_linux-64 + - sysroot_linux-64 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + strong: + - libstdcxx >=15 + - libgcc >=15 + size: 27880 + timestamp: 1785174991052 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-15.3.0-h8c4937a_1.conda + sha256: 6dce7b7a8882fe6e7261ac13ae5fd5bce4ded5bb5b65d2390e501739b43327ff + md5: f55099dd99cb4adceb30b06bdc88b7d3 + depends: + - gxx_impl_linux-64 15.3.0.* + - gcc_linux-64 ==15.3.0 h7df7c86_1 + - binutils_linux-64 + - sysroot_linux-64 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + strong: + - libstdcxx >=15 + - libgcc >=15 + size: 28165 + timestamp: 1787166287979 +- conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py312h7082e50_104.conda + sha256: 89f02df4fe64e8aa2ea9c16d682687c850a9393bfc4b57e71b5758a2ae389e6e + md5: 5ff86c0aab697f7ebf36c0be5cde30b9 + depends: + - __glibc >=2.17,<3.0.a0 + - cached-property + - hdf5 >=2.2.0,<3.0a0 + - libgcc >=15 + - numpy >=1.25,<3 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/h5py?source=compressed-mapping + run_exports: {} + size: 1357261 + timestamp: 1787108682064 +- conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.2.0-nompi_hc529623_100.conda + sha256: 786d126bfb33b923dd1341a92c2a3edd0ff5d0a71db8557fca9324ea4e93d677 + md5: 336f7fb9af0c49cc246e2cff0992c3c4 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-auth >=0.10.4,<0.10.5.0a0 + - aws-c-common >=0.14.3,<0.14.4.0a0 + - aws-c-http >=0.11.0,<0.11.1.0a0 + - aws-c-io >=0.27.5,<0.27.6.0a0 + - aws-c-s3 >=0.13.1,<0.13.2.0a0 + - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 + - libaec >=1.1.5,<2.0a0 + - libcurl >=8.21.0,<9.0a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.4.0 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.7,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - hdf5 >=2.2.0,<3.0a0 + size: 4250161 + timestamp: 1786233343747 +- conda: https://conda.anaconda.org/conda-forge/linux-64/hf-xet-1.5.2-py310hb823017_2.conda + noarch: python + sha256: dffdf5e74cafc6fa4a5cafed0e23f8ae9ff4a76b46b4bb70310ce0695f26c516 + md5: b1d8d3cf1190f6dadb8da304a053e307 + depends: + - python + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - _python_abi3_support 1.* + - cpython >=3.10 + - openssl >=3.5.7,<4.0a0 + constrains: + - __glibc >=2.17 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/hf-xet?source=hash-mapping + run_exports: {} + size: 3536864 + timestamp: 1784665043990 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda + sha256: 9f07834f0c546ab14d885ce0366285f61f44e326c0edd1fc63b8294e113ae432 + md5: 72a381cbad04f24b1c2a43ef707f45b4 + depends: + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - icu >=78.3,<79.0a0 + size: 14459115 + timestamp: 1786545741408 +- conda: https://conda.anaconda.org/conda-forge/linux-64/impi_rt-2021.18.0-h4715778_754.conda + sha256: 8a1ec92527811cc95c08bd7480209e0e997ab053a932bee17891f912de05235b + md5: 9f2bf5cd17ace116ee4b7c6551d69f4e + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - libgcc >=15 + - libstdcxx >=15 + - llvm-openmp >=23.1.0 + - mpi 1.0 impi + license: LicenseRef-IntelSimplifiedSoftwareOct2022 + license_family: Proprietary + purls: [] + run_exports: {} + size: 70807066 + timestamp: 1787725639596 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-h7cc23a3_1.conda + sha256: dd053c96dcb0dcfd59422aefea9d2fe937a190167f34fba7893ec1e10a7e8963 + md5: ba55d1b89fd7775e67de8291029b4059 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + license: LGPL-2.1-or-later + purls: [] + run_exports: + weak: + - keyutils >=1.6.3,<2.0a0 + size: 135295 + timestamp: 1786739238128 +- conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.1-py311h4c6fd42_1.conda + sha256: eebaf0c99289ce44c991a999da79aafc309b45280c9c212f4e4489a60dea34cc + md5: cab9a75d2f727ed062426e6327007e56 + depends: + - python + - libstdcxx >=15 + - libgcc >=15 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + purls: + - pkg:pypi/kiwisolver?source=compressed-mapping + run_exports: {} + size: 76668 + timestamp: 1788505647123 +- conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.1-py312h9be0db6_1.conda + sha256: 608716113cb671415a038654e2bc55c2372c8817c24c0a5043323fd7c06b86f3 + md5: 231fede9051444ed7d243f78f3cb4a8f + depends: + - python + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=15 + - libgcc >=15 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + purls: + - pkg:pypi/kiwisolver?source=compressed-mapping + run_exports: {} + size: 75215 + timestamp: 1788505643992 +- conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.1-py313h2551ef2_1.conda + sha256: 773f5eb66391d92a39c6cf6651111594c4a3f9941540934af3b813529c083ce1 + md5: 6e7bc60a75f1668be8cb9b27191abe54 + depends: + - python + - libstdcxx >=15 + - libgcc >=15 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.13.* *_cp313 + license: BSD-3-Clause + purls: + - pkg:pypi/kiwisolver?source=hash-mapping + run_exports: {} + size: 75129 + timestamp: 1788505657484 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbc21106_2.conda + sha256: 2a5c38c85e63df84c4e69ee71439841ce570d259ae3060627bb9a49a938d66f4 + md5: 53318d715316929a574f83591308b1f8 + depends: + - __glibc >=2.17,<3.0.a0 + - keyutils >=1.6.3,<2.0a0 + - libedit >=3.1.20250104,<3.2.0a0 + - libedit >=3.1.20250104,<4.0a0 + - libgcc >=15 + - libstdcxx >=15 + - openssl >=3.5.7,<4.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - krb5 >=1.22.2,<1.23.0a0 + size: 1394333 + timestamp: 1786762112514 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h9073bf1_2.conda + sha256: 8cdec1ff3f276cd2069dca0dae4f45f3dc5c224e2d72daef78227832938467a6 + md5: b68c7304d2edb0f1a5bdfb875094d603 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - libjpeg-turbo >=3.2.0,<4.0a0 + - libtiff >=4.7.2,<4.8.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - lcms2 >=2.19.1,<3.0a0 + size: 253830 + timestamp: 1788155917881 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda + sha256: 27d83f1188cd19bcb7754a078b3fa7f4cfb8527f8eb2fde54dd01fc529d1adec + md5: 449500f2c089da11c40f5c21312e3e07 + depends: + - __glibc >=2.17,<3.0.a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - binutils_impl_linux-64 2.46.1 + license: GPL-3.0-only + license_family: GPL + purls: [] + run_exports: {} + size: 745303 + timestamp: 1784214507189 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.2.0-hdb68285_0.conda + sha256: bf9fdebf55d8bc99d83531cdffda00703f4dc5f93a1a956768c147362c72feda + md5: fb9d356b1a57d6d54768be7ebd5fce09 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: Apache-2.0 + license_family: Apache + purls: [] + run_exports: + weak: + - lerc >=4.2.0,<5.0a0 + size: 271158 + timestamp: 1785036167977 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260526.0-cxx17_h0dc7533_2.conda + sha256: 7bb3d495411b7059e85225aae500d84e7846a4bb02ebd77e4450200b20c180f0 + md5: 6983bfe8e09992014b9cf393769c7a84 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + constrains: + - abseil-cpp =20260526.0 + - libabseil-static =20260526.0=cxx17* + license: Apache-2.0 + license_family: Apache + purls: [] + run_exports: + weak: + - libabseil >=20260526.0,<20260527.0a0 + - libabseil =*=cxx17* + size: 1436888 + timestamp: 1787217011773 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda + sha256: 822e4ae421a7e9c04e841323526321185f6659222325e1a9aedec811c686e688 + md5: 86f7414544ae606282352fa1e116b41f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: BSD-2-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libaec >=1.1.5,<2.0a0 + size: 36544 + timestamp: 1769221884824 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.9-gpl_h3152399_101.conda + sha256: bfae027a67d02325cd6b75edd60beb67cf24483af9df0ae9ef74d4438e41c806 + md5: 680520cff78a974d564cd99cdf5ec0b5 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - libgcc >=15 + - liblzma >=5.8.3,<6.0a0 + - libxml2 + - libxml2-16 >=2.15.3 + - libzlib >=1.3.2,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - lzo >=2.10,<3.0a0 + - openssl >=3.5.7,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libarchive >=3.8.9,<3.9.0a0 + size: 875346 + timestamp: 1787292369121 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-25.0.0-hcc2f0d9_4_cpu.conda + build_number: 4 + sha256: b3b92d94fa20d1d195de702c4b61cd0c3438d26672cbaf6ebbf021114a840a77 + md5: c344b5608c65a09b341f2e784efb4422 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-crt-cpp >=0.40.1,<0.40.2.0a0 + - aws-sdk-cpp >=1.11.833,<1.11.834.0a0 + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + - azure-identity-cpp >=1.13.3,<1.13.4.0a0 + - azure-storage-blobs-cpp >=12.18.0,<12.18.1.0a0 + - azure-storage-files-datalake-cpp >=12.16.0,<12.16.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libgcc >=14 + - libgoogle-cloud >=3.8.0,<3.9.0a0 + - libgoogle-cloud-storage >=3.8.0,<3.9.0a0 + - libopentelemetry-cpp >=1.27.0,<1.28.0a0 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.3.1,<2.3.2.0a0 + - snappy >=1.2.2,<1.3.0a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - apache-arrow-proc =*=cpu + - arrow-cpp <0.0a0 + - parquet-cpp <0.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - libarrow >=25.0.0,<25.1.0a0 + size: 6598422 + timestamp: 1786315080658 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-25.0.0-h635bf11_4_cpu.conda + build_number: 4 + sha256: 886631b6e32f62e04cc314462c0fbbf9d461cfb6625d2384ae0f36b5a8a72890 + md5: 64fad2fca810b34f5bbc9738a6fb298f + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 25.0.0 hcc2f0d9_4_cpu + - libarrow-compute 25.0.0 h53684a4_4_cpu + - libgcc >=14 + - libstdcxx >=14 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - libarrow-acero >=25.0.0,<25.1.0a0 + size: 590543 + timestamp: 1786315249993 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-25.0.0-h53684a4_4_cpu.conda + build_number: 4 + sha256: ad642502977edceeb4ca385e42f085fb4391c409d8d098866bc4a5e3fda7a04a + md5: 05f6b378ae80d2d06e35dc794412da3a + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 25.0.0 hcc2f0d9_4_cpu + - libgcc >=14 + - libre2-11 >=2025.11.5 + - libstdcxx >=14 + - libutf8proc >=2.11.3,<2.12.0a0 + - re2 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - libarrow-compute >=25.0.0,<25.1.0a0 + size: 2974934 + timestamp: 1786315141259 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-25.0.0-h635bf11_4_cpu.conda + build_number: 4 + sha256: 6715d36e6aaf00986876e67e97ae8e9b60afb2a7f52ab79b89543c37cd914e28 + md5: 26f7b996f0674217f78d5c6432445b71 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 25.0.0 hcc2f0d9_4_cpu + - libarrow-acero 25.0.0 h635bf11_4_cpu + - libarrow-compute 25.0.0 h53684a4_4_cpu + - libgcc >=14 + - libparquet 25.0.0 h7376487_4_cpu + - libstdcxx >=14 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - libarrow-dataset >=25.0.0,<25.1.0a0 + size: 591131 + timestamp: 1786315326056 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-25.0.0-h66fbfdd_4_cpu.conda + build_number: 4 + sha256: 7478e785ad4b7aee72e685921d849b3fb11b0c477dfea76d9e861ee5056b35a6 + md5: 287c5915a8b8bf79613840e0df9dc7b7 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libarrow 25.0.0 hcc2f0d9_4_cpu + - libarrow-acero 25.0.0 h635bf11_4_cpu + - libarrow-dataset 25.0.0 h635bf11_4_cpu + - libgcc >=14 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libstdcxx >=14 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - libarrow-substrait >=25.0.0,<25.1.0a0 + size: 500255 + timestamp: 1786315353425 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-10_h5875eb1_mkl.conda + build_number: 10 + sha256: 15b4c82e8c1d9f4a609890c8f5409fa42230da29cd91affdeb4d41906549aa1d + md5: fe1a5ccbcba308212c58f9a8059c4b5a + depends: + - mkl >=2026.1.0,<2027.0a0 + constrains: + - blas 2.310 mkl + - libcblas 3.11.0 10*_mkl + - liblapack 3.11.0 10*_mkl + - liblapacke 3.11.0 10*_mkl + track_features: + - blas_mkl + - blas_mkl_2 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libblas >=3.11.0,<4.0a0 + size: 18477 + timestamp: 1788077004663 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-h39a168f_4.conda + sha256: c4e9854c585f3ee1785f651287ecdf8c28f30a2ea1b159a513005f8a0f6453a3 + md5: df210655e30a05e3b069c91b7aaddd2d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + license: MIT + purls: [] + run_exports: + weak: + - libbrotlicommon >=1.2.0,<1.3.0a0 + size: 80561 + timestamp: 1788480364653 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-ha411449_4.conda + sha256: d5ed24da3e583a92227fe77280978b7933f07a39a2b60156c5ad95e5c76733fa + md5: 0cfd601eb03cca403dcc248844787486 + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.2.0 h39a168f_4 + - libgcc >=15 + license: MIT + purls: [] + run_exports: + weak: + - libbrotlidec >=1.2.0,<1.3.0a0 + size: 34739 + timestamp: 1788480374261 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-h018ffa1_4.conda + sha256: b9f3cb510337655485c2e79ce5f7dd468991b19ad29723ffa1175a0aed1b69ae + md5: 4136f6e4ef4835cc7df39a707cbd511c + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.2.0 h39a168f_4 + - libgcc >=15 + license: MIT + purls: [] + run_exports: + weak: + - libbrotlienc >=1.2.0,<1.3.0a0 + size: 298134 + timestamp: 1788480383223 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.78-h084b8d7_1.conda + sha256: 8cb25174d6b6fac95d31e86cfe41faffc8ee9dacbf2bfd22e6c23377e8f338c1 + md5: 5db514adf5f843126ff846d1510f22a4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libcap >=2.78,<2.79.0a0 + size: 124306 + timestamp: 1786025967663 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-10_hfef963f_mkl.conda + build_number: 10 + sha256: 77d5ffec523f85f627df251aae2eefa23518d4eec36dd045e0d40dddc80d69cf + md5: 5447c2bbf73e2e83d14cfa43717f0c14 + depends: + - libblas 3.11.0 10_h5875eb1_mkl + constrains: + - blas 2.310 mkl + - liblapack 3.11.0 10*_mkl + - liblapacke 3.11.0 10*_mkl + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libcblas >=3.11.0,<4.0a0 + size: 18127 + timestamp: 1788077011041 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp20.1-20.1.8-default_hc302687_17.conda + sha256: 419581357acbd32f662d48b7d96ef59f3f8b527098653f7910708e2a7a349906 + md5: 9286bffa815d825de0294f79af02110d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - libllvm20 >=20.1.8,<20.2.0a0 + - libstdcxx >=15 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: + weak: + - libclang-cpp20.1 >=20.1.8,<20.2.0a0 + size: 21738939 + timestamp: 1788477358651 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp22.1-22.1.8-default_h0acdd01_10.conda + sha256: 44ed5220e286dbb2886225b4ca2ea8eaac2769ac039e933440bea6ced3dadf95 + md5: 2b93d9e99401f2384694c61eb292bdf0 + depends: + - libstdcxx >=15 + - libgcc >=15 + - __glibc >=2.17,<3.0.a0 + - libxml2 + - libxml2-16 >=2.15.3 + - zstd >=1.5.7,<1.6.0a0 + - libzlib >=1.3.2,<2.0a0 + - libllvm22 >=22.1.8,<22.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + run_exports: + weak: + - libclang-cpp22.1 >=22.1.8,<22.2.0a0 + size: 24529851 + timestamp: 1788043761816 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp23.1-23.1.0-default_h0acdd01_1.conda + sha256: ff0507777b9d5ff5678466516d2f1793361ecef541114fb6f3cabb91fc7d5b3c + md5: d3ba2947f7d7cdd7c4eb73b206de330b + depends: + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=15 + - libgcc >=15 + - libxml2 + - libxml2-16 >=2.15.3 + - zstd >=1.5.7,<1.6.0a0 + - libzlib >=1.3.2,<2.0a0 + - libllvm23 >=23.1.0,<23.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + run_exports: + weak: + - libclang-cpp23.1 >=23.1.0,<23.2.0a0 + size: 25353391 + timestamp: 1788037800581 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-23.1.0-default_h7855034_1.conda + sha256: 1c7589a69833294ab79e5b239d4d70c8c6af68b745a5c17344319d088d884bb0 + md5: 6afb92887568acc8f18281c57c92c28b + depends: + - libclang-cpp23.1 ==23.1.0 default_h0acdd01_1 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=15 + - libgcc >=15 + - libxml2 + - libxml2-16 >=2.15.3 + - zstd >=1.5.7,<1.6.0a0 + - libzlib >=1.3.2,<2.0a0 + - libllvm23 >=23.1.0,<23.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + run_exports: + weak: + - libclang13 >=23.1.0 + size: 15442245 + timestamp: 1788037800581 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcompiler-rt-22.1.8-h7148c6a_2.conda + sha256: 84ca16b2ea02a365c36a0a5b488dd88f460433e49575c925e849ad76ef573302 + md5: 98bfa4c4f5dbce62e9435978d4564424 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - libstdcxx >=15 + constrains: + - compiler-rt >=9.0.1 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + run_exports: + weak: + - libcompiler-rt >=22.1.8 + size: 10841077 + timestamp: 1787293745038 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + sha256: fd1d153962764433fe6233f34a72cdeed5dcf8a883a85769e8295ce940b5b0c5 + md5: c965a5aa0d5c1c37ffc62dff36e28400 + depends: + - libgcc-ng >=9.4.0 + - libstdcxx-ng >=9.4.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libcrc32c >=1.1.2,<1.2.0a0 + size: 20440 + timestamp: 1633683576494 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-12.9.2.10-h676940d_0.conda + sha256: 16666002786d59dd7d62ddbeffe08c4118d882c986c6bf72443c7f983c24fb0a + md5: 55dfb580a84aea59185586a306bf9605 + depends: + - __glibc >=2.28,<3.0.a0 + - cuda-nvrtc + - cuda-version >=12.9,<12.10.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 467672248 + timestamp: 1778771595911 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-13.6.0.2-h676940d_0.conda + sha256: d10ce5ea92af1cccc0ed4640506489762f273f2e40debaf6300be2c866f17e8b + md5: b94086b1a487ca78ec1836dfd4a3efca + depends: + - __glibc >=2.28,<3.0.a0 + - cuda-nvrtc + - cuda-version >=13.3,<13.4.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 384624985 + timestamp: 1782782999955 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-dev-12.9.2.10-h676940d_0.conda + sha256: 3a68ef147c0a7fdd59286e49c4dd1a03be9ea6180b12ee5324ecd555c17419bb + md5: 7f35376e196eecc81ffe97f63b2b7e3a + depends: + - __glibc >=2.28,<3.0.a0 + - cuda-crt-dev_linux-64 + - cuda-cudart-dev_linux-64 + - cuda-version >=12.9,<12.10.0a0 + - libcublas 12.9.2.10 h676940d_0 + - libgcc >=14 + - libstdcxx >=14 + constrains: + - libcublas-static >=12.9.2.10 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: + weak: + - libcublas >=12.9.2.10,<13.0a0 + size: 94143 + timestamp: 1778772159259 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcublas-dev-13.6.0.2-h676940d_0.conda + sha256: 66fdcc04eb03d968d25d9a383b59c132b393514db8871956c836974151876af5 + md5: b9c580bb2555671b132582b680441774 + depends: + - __glibc >=2.28,<3.0.a0 + - cuda-crt-dev_linux-64 + - cuda-cudart-dev_linux-64 + - cuda-version >=13.3,<13.4.0a0 + - libcublas 13.6.0.2 h676940d_0 + - libgcc >=14 + - libstdcxx >=14 + constrains: + - libcublas-static >=13.6.0.2 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: + weak: + - libcublas >=13.6.0.2,<14.0a0 + size: 96817 + timestamp: 1782783444671 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcudnn-9.10.2.21-hf7e9902_0.conda + sha256: dc6b89e874867b2cdf08224059bd1543cbb72ed646da177c1454596469c9a4bb + md5: a178a1f3642521f104ecceeefa138d01 + depends: + - __glibc >=2.28,<3.0.a0 + - cuda-nvrtc + - cuda-version >=12,<13.0a0 + - libcublas + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + constrains: + - libcudnn-jit <0a + license: LicenseRef-cuDNN-Software-License-Agreement + purls: [] + run_exports: {} + size: 526823453 + timestamp: 1762823414388 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcudnn-9.25.1.1-ha4b6413_0.conda + sha256: b8e53bb2bc6ad1e06cf31bae07e4f71bedbddbc923a78dbabad20d247a1ec6fb + md5: 682e2958f270c0f82481d3ff2ea0fcbe + depends: + - __glibc >=2.28,<3.0.a0 + - cuda-nvrtc + - cuda-version >=13,<14.0a0 + - libcublas + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + constrains: + - libcudnn-jit <0a + license: LicenseRef-cuDNN-Software-License-Agreement + purls: [] + run_exports: {} + size: 440156353 + timestamp: 1787982266447 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcudss-0.8.0.10-h58dd1b1_0.conda + sha256: ad5a8237c14c3c1aba2e6ff9020ff1cd0d031f776b82241f960ed3310d7583a2 + md5: 52613f228d68055019454080df15ee52 + depends: + - __glibc >=2.28,<3.0.a0 + - _openmp_mutex >=4.5 + - cuda-version >=12,<13.0a0 + - libcublas + - libgcc >=14 + - libstdcxx >=14 + constrains: + - libcudss-commlayer-mpi 0.8.0.10 h09b4041_0 + - libcudss0 <0.0.0a0 + - libcudss-commlayer-nccl 0.8.0.10 h1b17935_0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 89804166 + timestamp: 1780355350170 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcudss-0.8.0.10-h7bcfba5_0.conda + sha256: 05c4f349df99636cae828489ce0f842bbbc7da0006ce4cf37b6d3d7433d06aef + md5: b993006a7f8c1f2d0e4adf1c9ac17201 + depends: + - __glibc >=2.28,<3.0.a0 + - _openmp_mutex >=4.5 + - cuda-version >=13,<14.0a0 + - libcublas + - libgcc >=14 + - libstdcxx >=14 + constrains: + - libcudss-commlayer-nccl 0.8.0.10 h84ff803_0 + - libcudss-commlayer-mpi 0.8.0.10 h6647138_0 + - libcudss0 <0.0.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 78215168 + timestamp: 1780355336257 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-11.4.1.4-hecca717_1.conda + sha256: 62d4214c182c89cfb02271a42eaac56a41f50bbbea3b0d795a8e33f167a39a4e + md5: 75ae571353ec92c8f34d4cf6ec6ba264 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.9,<12.10.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 162080769 + timestamp: 1761098842719 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcufft-12.3.0.29-hecca717_0.conda + sha256: bd69d4b63be28c36e0fa962256666672e3f2eff5dfc06bdd545acef278f83754 + md5: b347b9844eb16238c7f7b62cd2bd1e68 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=13.3,<13.4.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 150951336 + timestamp: 1779897536120 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.14.1.1-hbc026e6_1.conda + sha256: 5fa43e8a8d335fc0c3a6aeb2e7b0debc7d8495b8a60a56ac30f23b0e852ab74a + md5: cab1818eada3952ed09c8dcbb7c26af7 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.9,<12.10.0a0 + - libgcc >=14 + - libstdcxx >=14 + - rdma-core >=59.0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 969845 + timestamp: 1761098818759 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcufile-1.18.1.6-h053a66a_0.conda + sha256: 72b9c44d6d33c6d384ddaef755e717c781782cbcb32cfba454a8d8084f02ac55 + md5: 434bbefad502f7a9f7eaf7558c645d75 + depends: + - __glibc >=2.28,<3.0.a0 + - cuda-version >=13.3,<13.4.0a0 + - libgcc >=14 + - libstdcxx >=14 + - rdma-core >=63.0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 1117538 + timestamp: 1782772352403 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.3.10.19-h676940d_1.conda + sha256: 3d40daf956b220cc367a6306ede1e259446fb844051bcfed87c46539cc1aaf03 + md5: 2a91559a9345bedf09af8b7903deb6e6 + depends: + - __glibc >=2.28,<3.0.a0 + - cuda-version >=12.9,<12.10.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 46221876 + timestamp: 1761098855347 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurand-10.4.3.29-h676940d_0.conda + sha256: 9a1615a44f0d01fcc23b4f1be4c8f86b2e19e3974481e826180dd261b67dcad6 + md5: 6172124b5a746cc1f3f9fc7fac9f6740 + depends: + - __glibc >=2.28,<3.0.a0 + - cuda-version >=13.3,<13.4.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 43805393 + timestamp: 1779897559895 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.22.0-ha042cf0_0.conda + sha256: 483b7eb97f56fbb3a9cb7190d33012dfa0a5aaed99ede61465563cd97dd82504 + md5: e617deee7af8eb0c04f6296d12b54157 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.22.2,<1.23.0a0 + - libgcc >=15 + - libnghttp2 >=1.68.1,<2.0a0 + - libpsl >=0.23.1,<0.24.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.8,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + purls: [] + run_exports: + weak: + - libcurl >=8.22.0,<9.0a0 + size: 499651 + timestamp: 1788340719230 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-11.7.5.82-h676940d_2.conda + sha256: 8691cf6b1585cf6251663029e00485da5a912f6ca0ff7e5c31a6d8d604b29253 + md5: bb6e31a0daa64ede76fe8d3fff01c06f + depends: + - __glibc >=2.28,<3.0.a0 + - cuda-version >=12.9,<12.10.0a0 + - libcublas >=12.9.1.4,<12.10.0a0 + - libcusparse >=12.5.10.65,<12.6.0a0 + - libgcc >=14 + - libnvjitlink >=12.9.86,<13.0a0 + - libstdcxx >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 205149446 + timestamp: 1761098826989 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcusolver-12.2.6.9-h676940d_0.conda + sha256: c72cb48bd4983527ec78972fcb982b197250d3f0144461a4500c4dde2da36af8 + md5: c2b24b3215b808a2b74d5a72f9af66b6 + depends: + - __glibc >=2.28,<3.0.a0 + - cuda-version >=13.3,<13.4.0a0 + - libcublas >=13.6.0.2,<13.7.0a0 + - libcusparse >=12.8.2.51,<12.9.0a0 + - libgcc >=14 + - libnvjitlink >=13.3.33,<14.0a0 + - libstdcxx >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 197068627 + timestamp: 1782788745128 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.5.10.65-hecca717_2.conda + sha256: 7b511549a22df408d36dadbeabdfd9c35b124d9d6f000b29ffcbe4b38b7faeb7 + md5: 890ebfaad48c887d3d82847ec9d6bc79 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12.9,<12.10.0a0 + - libgcc >=14 + - libnvjitlink >=12.9.86,<13.0a0 + - libstdcxx >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 208846028 + timestamp: 1761069913328 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcusparse-12.8.2.51-hecca717_0.conda + sha256: 23ed1ae0414d204615fece50c58a80462193c08b4da6f177a4a134447c62efff + md5: 0ee8865db10f700dd542ac18126d0cbb + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=13.3,<13.4.0a0 + - libgcc >=14 + - libnvjitlink >=13.3.33,<14.0a0 + - libstdcxx >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 145373224 + timestamp: 1782772363943 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-hd45a770_1.conda + sha256: 82e134c8a08b1eed9a2ed8ab578b89aa1730dcde3dea8dd87645ed0637878e54 + md5: 40f9b31aa9cf007789867df0decd0492 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libdeflate >=1.25,<1.26.0a0 + size: 73710 + timestamp: 1785908694612 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h373387f_1.conda + sha256: 6473eb8caf2aae830f37caa93db9b26dddf7ac84b63229e8bf7fc0e5c3ab95b0 + md5: 50708d3b951d0f8e2d7f2df5b5edc040 + depends: + - ncurses + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - ncurses >=6.6,<7.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libedit >=3.1.20250104,<3.2.0a0 + size: 135098 + timestamp: 1786616658086 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h280c20c_3.conda + sha256: e4418f68d01a6307c4431b585c71b584f40189877364e542ee87deb777f5e85b + md5: 7bc31538d6e3fb349e897353969237ec + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: BSD-2-Clause OR GPL-2.0-or-later + license_family: GPL + purls: [] + run_exports: + weak: + - libev >=4.33,<4.34.0a0 + size: 43220 + timestamp: 1785917328200 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + sha256: 2e14399d81fb348e9d231a82ca4d816bf855206923759b69ad006ba482764131 + md5: a1cfcc585f0c42bf8d5546bb1dfb668d + depends: + - libgcc-ng >=12 + - openssl >=3.1.1,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libevent >=2.1.12,<2.1.13.0a0 + size: 427426 + timestamp: 1685725977222 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + sha256: 16feffd9ddbbe5b718515d38ee376c685ba95491cd901244e24671d20b952a77 + md5: b24d3c612f71e7aa74158d92106318b2 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - expat 2.8.1.* + license: MIT + license_family: MIT + purls: [] + run_exports: {} + size: 77856 + timestamp: 1781203599810 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfabric-2.6.0-ha770c72_0.conda + sha256: 45bb0eb92000a3f82555cc948013935aace8a1ea522b79700f58d3906c18e846 + md5: b04e60c49d09399a009f3bb70bb53a23 + depends: + - libfabric1 2.6.0 h6b3ec72_0 + license: BSD-2-Clause OR GPL-2.0-only + license_family: BSD + purls: [] + run_exports: {} + size: 14365 + timestamp: 1782364120544 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfabric1-2.6.0-h6b3ec72_0.conda + sha256: ba8de6a838bc0727ef8e5a1409c6735465b7b582627a9b4c2704126e53903f43 + md5: 7d8c510157360d0a6fdd84a1d3db8de7 + depends: + - __glibc >=2.28,<3.0.a0 + - libgcc >=14 + - libnl >=3.11.0,<4.0a0 + - rdma-core >=63.0 + license: BSD-2-Clause OR GPL-2.0-only + license_family: BSD + purls: [] + run_exports: {} + size: 734920 + timestamp: 1782364119825 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.7.0-h81df57d_1.conda + sha256: c8c7583ef063bc3c430f1d48298e5ad24f796a35c22ed5b14183325825a61106 + md5: 6525a0b06aa4fd390795f0740636a9dd + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libffi >=3.7.0,<3.8.0a0 + size: 68004 + timestamp: 1787753412298 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_2.conda + sha256: fb12ecb46c30d18d928c0e8fc346ab13b5f6fc8a9cacae4f2f4bb188782586f5 + md5: f8054e759d0ddddaf34a5c8fedc900a1 + depends: + - libfreetype6 >=2.14.3 + license: GPL-2.0-only OR FTL + purls: [] + run_exports: {} + size: 8407 + timestamp: 1786641007099 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h5e6c136_2.conda + sha256: ec607dd5445dd17ff6bf8b7fe6832e5504c226dd91d3aaea7ba83569808b0ce4 + md5: b72a266a9317036fd0464cb98b027cd0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - libpng >=1.6.58,<1.7.0a0 + - libzlib >=1.3.2,<2.0a0 + constrains: + - freetype >=2.14.3 + license: GPL-2.0-only OR FTL + purls: [] + run_exports: {} + size: 387671 + timestamp: 1786641006460 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.2.0-ha9f2e26_4.conda + sha256: 24090e675d34403b4ee1cd4372d8f6c0937da7ecfd66a19a57cac2ed0f4ea793 + md5: cba14d01083fc62ffd32c24d7d390633 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==16.2.0=*_4 + - libgomp 16.2.0 he0feb66_4 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 1058083 + timestamp: 1787618680111 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-16.2.0-h69a702a_4.conda + sha256: d8e66c14e23f2b3c70410cff5979d9d357e6edfb990b28d8e630852f4d395629 + md5: b3e52878163a841f6fb951989cc0b217 + depends: + - libgcc 16.2.0 ha9f2e26_4 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: + strong: + - libgcc + size: 28403 + timestamp: 1787618684957 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-16.2.0-h69a702a_4.conda + sha256: 7653be4d88a4d74676c38dd892914d027dcecc0c65c406be772d31cb641f8cfd + md5: 5e92b8413fd1c8f8f3006f4661b12def + depends: + - libgfortran5 16.2.0 h6b99dfc_4 + constrains: + - libgfortran-ng ==16.2.0=*_4 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 28377 + timestamp: 1787618711732 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-16.2.0-h6b99dfc_4.conda + sha256: a5510cbcea3b9e9ab24b336429de997fa727af1dba323031500a962a20e38600 + md5: c22348a769bb072b6184eb6f7f05e4f2 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=16.2.0 + constrains: + - libgfortran 16.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 2526008 + timestamp: 1787618692926 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.3-he503a2a_2.conda + sha256: af6c14f387f810c5df491b328ae955329596d3bc73b1e2e091ab5adb46a10759 + md5: 533d342dedadf134c67760ce6fc5b748 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - pcre2 >=10.47,<10.48.0a0 + - libzlib >=1.3.2,<2.0a0 + - libiconv >=1.18,<2.0a0 + - libffi >=3.7.0,<3.8.0a0 + constrains: + - glib >2.66 + license: LGPL-2.1-or-later + purls: [] + run_exports: + weak: + - libglib >=2.88.3,<3.0a0 + size: 4758097 + timestamp: 1787884091247 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.2.0-he0feb66_4.conda + sha256: 0fe5cb8e0752241ab55e11656ed1b9726248b522d23b929fe7c95b83eb55b9bb + md5: 89d2c1231f47bd818f5d624b9411459d + depends: + - __glibc >=2.17,<3.0.a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: + strong: + - _openmp_mutex >=4.5 + size: 639968 + timestamp: 1787618616266 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.8.0-hbc29df5_0.conda + sha256: 46126b858d173d6808262e39e3a8aa39946d39aebb5ffb720984dc44f74feafe + md5: 60ff8935e16bf2fd302289ec4f129df8 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libcurl >=8.21.0,<9.0a0 + - libgcc >=14 + - libgrpc >=1.82.1,<1.83.0a0 + - libopentelemetry-cpp >=1.27.0,<1.28.0a0 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libstdcxx >=14 + - openssl >=3.5.7,<4.0a0 + constrains: + - libgoogle-cloud 3.8.0 *_0 + license: Apache-2.0 + license_family: Apache + purls: [] + run_exports: + weak: + - libgoogle-cloud >=3.8.0,<3.9.0a0 + size: 2663465 + timestamp: 1786226759530 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.8.0-hdbdcf42_0.conda + sha256: 03437ce50129f9ca82a0400b7722cd2dd3ee3bfa50dcb557657f55a7de76ab6f + md5: 84a8d5a661792da2127ab908b5ae83ef + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libgcc >=14 + - libgoogle-cloud 3.8.0 hbc29df5_0 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + - openssl + license: Apache-2.0 + license_family: Apache + purls: [] + run_exports: + weak: + - libgoogle-cloud-storage >=3.8.0,<3.9.0a0 + size: 810573 + timestamp: 1786226867433 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.82.1-h792040b_0.conda + sha256: 1e657c1b802c111178bc1845fe06488db5f69a85e34e970ce0989810aa562d45 + md5: aa4571fc3bcf18ad12370429aa991223 + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.34.6,<2.0a0 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libgcc >=14 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libre2-11 >=2025.11.5 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.7,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.82.1 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - libgrpc >=1.82.1,<1.83.0a0 + size: 6957755 + timestamp: 1783588701960 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.4.0-h23af247_1.conda + sha256: 979b14ba13054aab9e90363809aac470a58b7c37203c330216327356a98c8f60 + md5: c44470b6bfa6a582cb4dd42cbda3401e + depends: + - __glibc >=2.17,<3.0.a0 + - cairo >=1.18.4,<2.0a0 + - graphite2 >=1.3.15,<2.0a0 + - icu >=78.3,<79.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libgcc >=15 + - libglib >=2.88.3,<3.0a0 + - libpng >=1.6.58,<1.7.0a0 + - libstdcxx >=15 + - libzlib >=1.3.2,<2.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: {} + size: 1382623 + timestamp: 1788405508587 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.13.0-default_he001693_1000.conda + sha256: 5041d295813dfb84652557839825880aae296222ab725972285c5abe3b6e4288 + md5: c197985b58bc813d26b42881f0021c82 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libxml2 + - libxml2-16 >=2.14.6 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libhwloc >=2.13.0,<2.13.1.0a0 + size: 2436378 + timestamp: 1770953868164 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda + sha256: f943117edb9cd4d9c61cc972eee5a34291dc55ea7a6e9e38da104995841cbcb6 + md5: f92233bf33e24a25668bb2119e2c51f9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + license: LGPL-2.1-only + purls: [] + run_exports: + weak: + - libiconv >=1.18,<2.0a0 + size: 789471 + timestamp: 1787033836207 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.8-hfac485b_1.conda + sha256: cc38c900b9a20fe75e61cbb594e749c57a06d96510722f5ddfa309682062b065 + md5: 842a81de672ddcf476337c8bde3cad33 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libunistring >=0,<1.0a0 + license: LGPL-2.0-only + license_family: LGPL + purls: [] + run_exports: + weak: + - libidn2 >=2,<3.0a0 + size: 139036 + timestamp: 1760385590993 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_1.conda + sha256: bba8538e6538ed58a8479b332337b96986561f975d06cfa2039a016c2d246ee4 + md5: 898d1c9793eaa52efc4727bd84d2e39a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + purls: [] + run_exports: + weak: + - libjpeg-turbo >=3.2.0,<4.0a0 + size: 650434 + timestamp: 1785896381946 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-10_h5e43f62_mkl.conda + build_number: 10 + sha256: 182f78268834055d24a14f1cc233ef5df0e94d7ff66b0c4e5d4e9df8596c142d + md5: 25dcf7345bd6c4ec965e1e5b9e105233 + depends: + - libblas 3.11.0 10_h5875eb1_mkl + constrains: + - blas 2.310 mkl + - libcblas 3.11.0 10*_mkl + - liblapacke 3.11.0 10*_mkl + track_features: + - blas_mkl + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - liblapack >=3.11.0,<3.12.0a0 + size: 18134 + timestamp: 1788077018484 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm20-20.1.8-hf7376ad_1.conda + sha256: bd2981488f63afbc234f6c7759f8363c63faf38dd0f4e64f48ef5a06541c12b4 + md5: eafa8fd1dfc9a107fe62f7f12cabbc9c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libxml2 + - libxml2-16 >=2.14.5 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: + weak: + - libllvm20 >=20.1.8,<20.2.0a0 + size: 43977914 + timestamp: 1757353652788 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.8-h474f4eb_2.conda + sha256: cfc90781f703b8b8cc35694d46c9a200e3cf66657f55517f8b1ec1f672c42752 + md5: d70196b03134e3bab985d9f5554fb38b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - libstdcxx >=15 + - libxml2 + - libxml2-16 >=2.15.3 + - libzlib >=1.3.2,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + run_exports: + weak: + - libllvm22 >=22.1.8,<22.2.0a0 + size: 44652037 + timestamp: 1787288437518 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm23-23.1.0-h474f4eb_0.conda + sha256: 50b31f6c51afe7df0639acf5dde8acf3f4f0dc9f644ab9842b717ae798507d68 + md5: 3b8c8325547a4fd8c51649ef7dfab688 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - libstdcxx >=15 + - libxml2 + - libxml2-16 >=2.15.3 + - libzlib >=1.3.2,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + run_exports: + weak: + - libllvm23 >=23.1.0,<23.2.0a0 + size: 45046595 + timestamp: 1787716721647 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda + sha256: 9787df8c22a59c9a70d3e5a10db9ad663485e75e9ccc3f09bd092cb7b95e0dab + md5: 1390b7c5ac0b1d8e447bc5efa6d3c8c2 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - xz 5.8.3.* + license: 0BSD + purls: [] + run_exports: + weak: + - liblzma >=5.8.3,<6.0a0 + size: 112995 + timestamp: 1786348617826 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libmagma-2.10.0-ha7672b3_0.conda + sha256: e324b70b74495c00f582dc89cda6676963b4685ffefca0facfd6e3e8635f8258 + md5: 21cfdc5459decaca16af5e00aa6addb1 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + - cuda-cudart + - cuda-version >=12,<13.0a0 + - libblas >=3.9.0,<4.0a0 + - libcublas + - libcusparse + - libgcc >=14 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx >=14 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: {} + size: 545950720 + timestamp: 1773083369944 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libmagma-2.10.0-hd93470c_0.conda + sha256: 07607cffe1f53a5e405e29c897bfcad800f3c71b2a57ed7502a0ef82a60edc78 + md5: d9e0e4dbf5aff16fb804e6a656fc73bc + depends: + - __glibc >=2.28,<3.0.a0 + - _openmp_mutex >=4.5 + - cuda-cudart + - cuda-version >=13,<14.0a0 + - libblas >=3.9.0,<4.0a0 + - libcublas + - libcusparse + - libgcc >=14 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx >=14 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: {} + size: 272468878 + timestamp: 1773078724253 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libmicrohttpd-1.0.10-hc2fc477_0.conda + sha256: 2c27ceb7c159ee3d6ea8b333dfc8d7bede5d8bfd325df677d4c292e24a0dd7dc + md5: 4e01a1886e86ee32a5cbdb354d56d86f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - gnutls >=3.8.13,<3.9.0a0 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + run_exports: + weak: + - libmicrohttpd >=1.0.10,<1.1.0a0 + size: 303021 + timestamp: 1786366467972 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_2.conda + sha256: 46820b4a835e175940ae20bec00fdddaff804cda27a1408ab1b95e77a2196437 + md5: fcfed1dc5053eb1901b66e7b1fc32588 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: BSD-2-Clause + license_family: BSD + purls: [] + run_exports: {} + size: 92759 + timestamp: 1786650399772 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h74cf4be_1.conda + sha256: 11a2f54a6f391e25738bce0023e6ef499600147bbcf21c1fa69d2e251b03cc6a + md5: 75d211f04ac87506f1f43420712a69fe + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.34.8,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=15 + - libstdcxx >=15 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.7,<4.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libnghttp2 >=1.68.1,<2.0a0 + size: 649974 + timestamp: 1787177490105 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnl-3.11.0-hb03c661_1.conda + sha256: d0f2fd77aad83641c11bc3686bac677e99869f1d62b99e5064c9d99af8bfde6a + md5: eeaf53e3c9593d63ffee5ad97182858e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: LGPL-2.1-or-later + license_family: LGPL + purls: [] + run_exports: + weak: + - libnl >=3.11.0,<4.0a0 + size: 735004 + timestamp: 1787038268022 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + sha256: 927fe72b054277cde6cb82597d0fcf6baf127dcbce2e0a9d8925a68f1265eef5 + md5: d864d34357c3b65a4b731f78c0801dc4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.1-only + license_family: GPL + purls: [] + run_exports: + weak: + - libnsl >=2.0.1,<2.1.0a0 + size: 33731 + timestamp: 1750274110928 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-12.9.86-hecca717_2.conda + sha256: 3b1c851f4fc42d347ce1c1606bdd195343a47f121e0fceb7a1f1e5aa1d497da9 + md5: 3461b0f2d5cbb7973d361f9e85241d98 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=12,<12.10.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 30515495 + timestamp: 1760723776293 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvjitlink-13.3.33-hecca717_0.conda + sha256: f5d0aed3cfb504239fac6e03e994f36c34725acba5382adc516cbfdd6993a959 + md5: 2795538ca415afd5d35aec7c6cd2e385 + depends: + - __glibc >=2.17,<3.0.a0 + - cuda-version >=13,<13.4.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 31168008 + timestamp: 1779897778168 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvptxcompiler-dev-12.9.86-ha770c72_2.conda + sha256: 1e7a7b34f8639a5feb75ba864127059e4d83edfe1a516547f0dbb9941e7b8f8b + md5: 3fd926c321c6dbf386aa14bd8b125bfb + depends: + - cuda-version >=12.9,<12.10.0a0 + - libnvptxcompiler-dev_linux-64 12.9.86 ha770c72_2 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 27046 + timestamp: 1753975516342 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnvptxcompiler-dev-13.3.73-ha770c72_1.conda + sha256: 385a2e60cb2f6854134daafac9935335a2c10237f6fd83e7b1137a3d7c846354 + md5: 367de9671743bf515680d8d7e41514ce + depends: + - cuda-version >=13.3,<13.4.0a0 + - libnvptxcompiler-dev_linux-64 13.3.73 ha770c72_1 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 27739 + timestamp: 1787703595006 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.27.0-h3133023_1.conda + sha256: 8f9281133322e9eb0bd4a5b11330db1c14f3b40c409639dd3805251151ca52e2 + md5: f749f223bede1bac7724e49d686ac598 + depends: + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libcurl >=8.21.0,<9.0a0 + - libgrpc >=1.82.0,<1.83.0a0 + - libopentelemetry-cpp-headers 1.27.0 ha770c72_1 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libzlib >=1.3.2,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.27.0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - libopentelemetry-cpp >=1.27.0,<1.28.0a0 + size: 948783 + timestamp: 1783133058845 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.27.0-ha770c72_1.conda + sha256: 31349543e3c59c64f17e24494939a22b0e1d611bdb19d98d115775dba423cbf7 + md5: 6cc68cbbe88746be8beaf027d6c64ad3 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: {} + size: 394726 + timestamp: 1783133038109 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-25.0.0-h7376487_4_cpu.conda + build_number: 4 + sha256: dba948e05d62de3833caa065c1b7de960f921bb0a8a7687b8593df95d2d925a9 + md5: d736a4f89a3b63f9970152923e4c3016 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 25.0.0 hcc2f0d9_4_cpu + - libgcc >=14 + - libstdcxx >=14 + - libthrift >=0.22.0,<0.22.1.0a0 + - openssl >=3.5.7,<4.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - libparquet >=25.0.0,<25.1.0a0 + size: 1412634 + timestamp: 1786315223543 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpmix-5.0.8-h31fc519_4.conda + sha256: 2837759fb832ab8587622602531f8e4b5d5e5ec12ea9b3936be06f384b933800 + md5: bd15ae3916a0cbe005c683bbc33811b7 + depends: + - __glibc >=2.17,<3.0.a0 + - libevent >=2.1.12,<2.1.13.0a0 + - libgcc >=14 + - libhwloc >=2.13.0,<2.13.1.0a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libpmix >=5.0.8,<6.0a0 + size: 731098 + timestamp: 1770962978877 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h922cc85_1.conda + sha256: c19eefb87d70d9b4b0629fa48414a155a47a1be4f04583ae71ed8c5a9a32fdcb + md5: fcf71c8d979148873f6f8ad4cfc73d86 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - libzlib >=1.3.2,<2.0a0 + license: zlib-acknowledgement + purls: [] + run_exports: + weak: + - libpng >=1.6.58,<1.7.0a0 + size: 316643 + timestamp: 1786616563127 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-7.35.1-h622638d_3.conda + sha256: 37c51fbc936a6bb8bf5f67c8f056edacaaa41e8603738bc8a4dee186292bb114 + md5: fd307b61cceb36fdca38e1718bdb2893 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libgcc >=15 + - libstdcxx >=15 + - libzlib >=1.3.2,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libprotobuf >=7.35.1,<7.35.2.0a0 + size: 3808338 + timestamp: 1787657986197 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.23.1-hd9e3e90_1.conda + sha256: 09e8effdc89bc5d021349318d32b85594f5b8d8e3ab8f90a85b81f8fe695a566 + md5: 77be60417aa572afcb48cbe0f967401d + depends: + - libstdcxx >=15 + - libgcc >=15 + - __glibc >=2.17,<3.0.a0 + - icu >=78.3,<79.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libpsl >=0.23.1,<0.24.0a0 + size: 72519 + timestamp: 1786970753847 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.11.16-h0c77377_2_cpython.conda + build_number: 2 + sha256: 9c945fbdc2292a8a39e412cb99672722c60ddf38b9002a52d5bd5954a0b25844 + md5: 55c7bd7fa76a498266addcddf2356647 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - libstdcxx >=15 + license: Python-2.0 + purls: [] + run_exports: {} + size: 7831580 + timestamp: 1788393477692 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.12.14-h0c77377_3_cpython.conda + build_number: 3 + sha256: 6be16a4906d83eb8e9e04375d524f339f426a847cffd294f1ceb0611988dc17a + md5: d247b7632f09324c11f24b5270361385 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - libstdcxx >=15 + license: Python-2.0 + purls: [] + run_exports: {} + size: 8770625 + timestamp: 1788392466381 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpython-3.13.15-hdc7f604_103_cp313.conda + build_number: 103 + sha256: a25db25aad6cbf53e523e1f310713f31372932d5db655f1f2d62a204c7cdf1d7 + md5: e64cd43bbd07afafbc458138e979c851 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - libstdcxx >=15 + license: Python-2.0 + purls: [] + run_exports: {} + size: 9711017 + timestamp: 1788387797958 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.11.0-h6406941_0.conda + sha256: ab3ccb9fd5816f76b18ee8974d359cd2605ca87d8ddef55369dc461b9986f95c + md5: 3ac89a48d224409739dbf6200e524373 + depends: + - libgcc >=14 + - __glibc >=2.28,<3.0.a0 + - fribidi >=1.0.16,<2.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libharfbuzz >=14.2.1 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libraqm >=0.11.0,<0.12.0a0 + size: 33983 + timestamp: 1784850267262 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h60473fc_2.conda + sha256: 43132eb45a569b1f63199b0e7d5874d94227e9be950b327a323e7dcc1f8cd58c + md5: ee5c400d37b79db5d32a69ed1a79fc0b + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libgcc >=14 + - libstdcxx >=14 + constrains: + - re2 2025.11.05.* + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libre2-11 >=2025.11.5 + size: 210598 + timestamp: 1781312565737 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.4.0-hf39dbba_4.conda + sha256: 63b90e661f8735e82a0a04726ec2ef4ea6820093c6a0588099b451a79291da22 + md5: d3b6210d92e8a8aecf85e55d19abc4f3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14.4.0 + - libstdcxx >=14.4.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: + weak: + - libsanitizer 14.4.0 + size: 7500513 + timestamp: 1787617784552 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h984fb3e_20.conda + sha256: d7b184884d924154c2ffb924e188be93d5922096e3754d11a26277d99a8f3943 + md5: fd805662ef1211d7a54d98fd4efb130b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15.2.0 + - libstdcxx >=15.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: + weak: + - libsanitizer 15.2.0 + size: 7403387 + timestamp: 1784923843022 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.3.0-h54950a5_4.conda + sha256: 074869ef41874beec0ffee576fdd809f72eb8a4196fe2fa4d1a922c9a0742572 + md5: 306fcd92c8f1cd7049bc6e361bd37f09 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15.3.0 + - libstdcxx >=15.3.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: + weak: + - libsanitizer 15.3.0 + size: 7579092 + timestamp: 1787618435127 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.22-hebe6cf0_2.conda + sha256: 7454c6a7cf27033757f2895bc5e3941fe27604506edd62cf6bc00e50ab015a43 + md5: 42c585f153c17b790cd01f01553d24a1 + depends: + - libgcc >=15 + - __glibc >=2.17,<3.0.a0 + license: ISC + purls: [] + run_exports: + weak: + - libsodium >=1.0.22,<1.0.23.0a0 + size: 269985 + timestamp: 1787225747011 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.4-h13e7031_1.conda + sha256: f20d70da54e5b31dd4a51fb1efeaafafd5ab6dd8d7ac9d1438eaa2526ac4ed3d + md5: e72bbec309c2b0f37823ee7d4fabfcd3 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=78.3,<79.0a0 + - libgcc >=15 + - libzlib >=1.3.2,<2.0a0 + license: blessing + purls: [] + run_exports: + weak: + - libsqlite >=3.53.4,<4.0a0 + size: 974348 + timestamp: 1787051145557 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-h6154650_1.conda + sha256: 7e463000fa1cba3f3a6597b776f6ab301d425a96e3bc20d0d9d76a3b9f237aa3 + md5: 5c526561e1d2a2e071941174eae84557 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.7,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libssh2 >=1.11.1,<2.0a0 + size: 306045 + timestamp: 1786713107897 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.2.0-h934c35e_4.conda + sha256: 40b792b0186c1e8859280a1f6f19a54fc50a11b32724fc7b637009c1a9bd302b + md5: 2f2ef0d96de5bdd8c1270ff22fdf9352 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 16.2.0 ha9f2e26_4 + constrains: + - libstdcxx-ng ==16.2.0=*_4 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 6613148 + timestamp: 1787618704262 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-16.2.0-hdf11a46_4.conda + sha256: 4cdebd87b76cf53a58a08ebd6d15336daa79c5f0aa34d83a895ac503c0203632 + md5: de0dceacf3e33c5fc88e167885dc8274 + depends: + - libstdcxx 16.2.0 h934c35e_4 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: + strong: + - libstdcxx + size: 28459 + timestamp: 1787618737021 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-h084b8d7_1.conda + sha256: 2293884d59cf0436c37fc0a4bad71011a8de2a6913610d1c701a7703377c1f75 + md5: ea0da9c20bbb221b530810c3c68bbe62 + depends: + - __glibc >=2.17,<3.0.a0 + - libcap >=2.78,<2.79.0a0 + - libgcc >=14 + license: LGPL-2.1-or-later + purls: [] + run_exports: {} + size: 493022 + timestamp: 1780084748140 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtasn1-4.21.0-hb03c661_1.conda + sha256: 566a9d39a9a89ee0ef7cb8ab36de0ab9f01b74039347cab727179da32fb44168 + md5: e9268f0d59cc7559d0e910b402cd437a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: LGPL-2.1-or-later + purls: [] + run_exports: + weak: + - libtasn1 >=4.21.0,<5.0a0 + size: 119260 + timestamp: 1785905789773 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda + sha256: af6025aa4a4fc3f4e71334000d2739d927e2f678607b109ec630cc17d716918a + md5: b6e326fbe1e3948da50ec29cee0380db + depends: + - __glibc >=2.17,<3.0.a0 + - libevent >=2.1.12,<2.1.13.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - libthrift >=0.22.0,<0.22.1.0a0 + size: 423861 + timestamp: 1777018957474 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-hcc2c06a_1.conda + sha256: 10e125da82ca93e09191e66e5a94d566b2cf8d4024e2a0db3a9114297447e0d9 + md5: 0907d876f460ebc941ae590338b6102f + depends: + - __glibc >=2.17,<3.0.a0 + - lerc >=4.2.0,<5.0a0 + - libdeflate >=1.25,<1.26.0a0 + - libgcc >=15 + - libjpeg-turbo >=3.2.0,<4.0a0 + - liblzma >=5.8.3,<6.0a0 + - libstdcxx >=15 + - libwebp-base >=1.6.0,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: HPND + purls: [] + run_exports: + weak: + - libtiff >=4.7.2,<4.8.0a0 + size: 459753 + timestamp: 1787755584172 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.12.1-cpu_mkl_h4f7e408_100.conda + sha256: 7e3c58fffa49da11b2dd388b0031d7d28632b36591d658881bedf57c69ac93d8 + md5: 00e6cb69159e94d2fc13848ce4453e7e + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - fmt >=12.1.0,<12.2.0a0 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libblas * *mkl + - libcblas >=3.11.0,<4.0a0 + - libgcc >=14 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libstdcxx >=14 + - libuv >=1.52.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - llvm-openmp >=22.1.8 + - mkl >=2026.0.0,<2027.0a0 + - onednn >=3.12,<4.0a0 + - pybind11-abi 11 + - sleef >=3.9.0,<4.0a0 + constrains: + - pytorch-gpu <0.0a0 + - pytorch 2.12.1 cpu_mkl_*_100 + - pytorch-cpu 2.12.1 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libtorch >=2.12.1,<2.13.0a0 + size: 61888662 + timestamp: 1781832531047 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.12.1-cuda129_mkl_h6b8258c_300.conda + sha256: ae90e59cf0ab0d4122a3f80999f9b2d4e6af79f096e1c216c38b0b9d44822b0c + md5: d1a067294e26b7d467afce8f7502e6c0 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - cuda-cudart >=12.9.79,<13.0a0 + - cuda-cupti >=12.9.79,<13.0a0 + - cuda-nvrtc >=12.9.86,<13.0a0 + - cuda-nvtx >=12.9.79,<13.0a0 + - cuda-version >=12.9,<13 + - fmt >=12.1.0,<12.2.0a0 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libblas * *mkl + - libcblas >=3.11.0,<4.0a0 + - libcublas >=12.9.2.10,<13.0a0 + - libcudnn >=9.10.2.21,<10.0a0 + - libcudss >=0.8.0.10,<0.8.1.0a0 + - libcufft >=11.4.1.4,<12.0a0 + - libcufile >=1.14.1.1,<2.0a0 + - libcurand >=10.3.10.19,<11.0a0 + - libcusolver >=11.7.5.82,<12.0a0 + - libcusparse >=12.5.10.65,<13.0a0 + - libgcc >=14 + - libmagma >=2.10.0,<2.10.1.0a0 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libstdcxx >=14 + - libuv >=1.52.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - llvm-openmp >=22.1.8 + - mkl >=2026.0.0,<2027.0a0 + - nccl >=2.28.9.1,<3.0a0 + - onednn >=3.12,<4.0a0 + - pybind11-abi 11 + - sleef >=3.9.0,<4.0a0 + constrains: + - pytorch-cpu <0.0a0 + - pytorch-gpu 2.12.1 + - pytorch 2.12.1 cuda129_mkl_*_300 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libtorch >=2.12.1,<2.13.0a0 + size: 814422440 + timestamp: 1781846404264 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cpu_mkl_h40bd1c6_102.conda + sha256: 5c2eecda8a606b5616b724633b395d5adfb1aa5302356a13e36030b6b11fe237 + md5: ade0fe2ec049a598697733b3acff1de5 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - fmt >=12.1.0,<12.2.0a0 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libblas * *mkl + - libcblas >=3.11.0,<4.0a0 + - libgcc >=14 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libstdcxx >=14 + - libuv >=1.52.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - llvm-openmp >=22.1.8 + - mkl >=2026.1.0,<2027.0a0 + - onednn >=3.12,<4.0a0 + - pybind11-abi 11 + - sleef >=3.9.0,<4.0a0 + constrains: + - pytorch 2.13.0 cpu_mkl_*_102 + - pytorch-cpu 2.13.0 + - pytorch-gpu <0.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libtorch >=2.13.0,<2.14.0a0 + size: 60881910 + timestamp: 1786374025450 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cuda129_mkl_h546cc0b_302.conda + sha256: a05d4ff057bfe85262d395f8dca895d3c6cdbcb7f3334cb72adda3a0bf101e93 + md5: d1dbed3b67f32b9ed8ed68afa823f0e1 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - cuda-cudart >=12.9.79,<13.0a0 + - cuda-cupti >=12.9.79,<13.0a0 + - cuda-nvrtc >=12.9.86,<13.0a0 + - cuda-nvtx >=12.9.79,<13.0a0 + - cuda-version >=12.9,<13 + - fmt >=12.1.0,<12.2.0a0 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libblas * *mkl + - libcblas >=3.11.0,<4.0a0 + - libcublas >=12.9.2.10,<13.0a0 + - libcudnn >=9.10.2.21,<10.0a0 + - libcudss >=0.8.0.10,<0.8.1.0a0 + - libcufft >=11.4.1.4,<12.0a0 + - libcufile >=1.14.1.1,<2.0a0 + - libcurand >=10.3.10.19,<11.0a0 + - libcusolver >=11.7.5.82,<12.0a0 + - libcusparse >=12.5.10.65,<13.0a0 + - libgcc >=14 + - libmagma >=2.10.0,<2.10.1.0a0 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libstdcxx >=14 + - libuv >=1.52.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - llvm-openmp >=22.1.8 + - mkl >=2026.1.0,<2027.0a0 + - nccl >=2.28.9.1,<3.0a0 + - onednn >=3.12,<4.0a0 + - pybind11-abi 11 + - sleef >=3.9.0,<4.0a0 + constrains: + - pytorch 2.13.0 cuda129_mkl_*_302 + - pytorch-cpu <0.0a0 + - pytorch-gpu 2.13.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libtorch >=2.13.0,<2.14.0a0 + size: 817463992 + timestamp: 1786387590848 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtorch-2.13.0-cuda130_mkl_h1ca3d63_302.conda + sha256: d390d36fd6ee32439be5bb1d35aed8b2ca95113026c442bae8a6e2ea747c37b3 + md5: 80e67870a03be265d5836884309719ec + depends: + - __glibc >=2.28,<3.0.a0 + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - cuda-cudart >=13.0.96,<14.0a0 + - cuda-cupti >=13.0.85,<14.0a0 + - cuda-nvrtc >=13.0.88,<14.0a0 + - cuda-nvtx >=13.0.85,<14.0a0 + - cuda-version >=13.0,<14 + - fmt >=12.1.0,<12.2.0a0 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libblas * *mkl + - libcblas >=3.11.0,<4.0a0 + - libcublas >=13.1.1.3,<14.0a0 + - libcudnn >=9.25.0.15,<10.0a0 + - libcudss >=0.8.0.10,<0.8.1.0a0 + - libcufft >=12.0.0.61,<13.0a0 + - libcufile >=1.15.1.6,<2.0a0 + - libcurand >=10.4.0.35,<11.0a0 + - libcusolver >=12.0.4.66,<13.0a0 + - libcusparse >=12.6.3.3,<13.0a0 + - libgcc >=14 + - libmagma >=2.10.0,<2.10.1.0a0 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libstdcxx >=14 + - libuv >=1.52.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - llvm-openmp >=22.1.8 + - mkl >=2026.1.0,<2027.0a0 + - nccl >=2.30.7.1,<3.0a0 + - onednn >=3.12,<4.0a0 + - pybind11-abi 11 + - sleef >=3.9.0,<4.0a0 + constrains: + - pytorch 2.13.0 cuda130_mkl_*_302 + - pytorch-cpu <0.0a0 + - pytorch-gpu 2.13.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libtorch >=2.13.0,<2.14.0a0 + size: 479595790 + timestamp: 1786383738092 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-h084b8d7_1.conda + sha256: 287d05680e49eea51b8145fbf34bc213c0618b04f32e450e9da5d715e5134e38 + md5: 89e5671a076d99516a6acd72a35b1640 + depends: + - __glibc >=2.17,<3.0.a0 + - libcap >=2.78,<2.79.0a0 + - libgcc >=14 + license: LGPL-2.1-or-later + purls: [] + run_exports: {} + size: 145969 + timestamp: 1780084753104 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2 + sha256: e88c45505921db29c08df3439ddb7f771bbff35f95e7d3103bf365d5d6ce2a6d + md5: 7245a044b4a1980ed83196176b78b73a + depends: + - libgcc-ng >=9.3.0 + license: GPL-3.0-only OR LGPL-3.0-only + purls: [] + run_exports: + weak: + - libunistring >=0,<1.0a0 + size: 1433436 + timestamp: 1626955018689 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.8.3-h65a8314_0.conda + sha256: 71c8b9d5c72473752a0bb6e91b01dd209a03916cb71f36cc6a564e3a2a132d7a + md5: e179a69edd30d75c0144d7a380b88f28 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libunwind >=1.8.3,<1.9.0a0 + size: 75995 + timestamp: 1757032240102 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda + sha256: ecbf4b7520296ed580498dc66a72508b8a79da5126e1d6dc650a7087171288f9 + md5: 1247168fe4a0b8912e3336bccdbf98a5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libutf8proc >=2.11.3,<2.12.0a0 + size: 85969 + timestamp: 1768735071295 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.3-hcfc3c73_0.conda + sha256: aa58bbba56644ffd062a4a9b358782c5eb7560ccead2ab8f7c5c6ede0a7d33a6 + md5: 74a0a409d9f4561265d36b789d3f398a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libuuid >=2.42.3,<3.0a0 + size: 39998 + timestamp: 1788347719520 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.52.1-h280c20c_1.conda + sha256: 67761d0206f84140047a367eaf9befe03a7e157a29ee25aee0047b40801cc6b6 + md5: 01c4ed87826af55996768af6dbc936b4 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libuv >=1.52.1,<2.0a0 + size: 420040 + timestamp: 1785914567661 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_1.conda + sha256: 8415001414f488c85b72b9d8cc2071dfb3981a47bc3c8eb56ef91a57d12eae7f + md5: 9332b53d0ea93c5d39e33be03a0c611a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - libwebp 1.6.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libwebp-base >=1.6.0,<2.0a0 + size: 428430 + timestamp: 1785954557217 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-hb83e432_2.conda + sha256: 7b49e6fd2a584b7f072943e6adf4149677af5121246975278804782d37752837 + md5: 61f0ffba9161cbb3a77722869b21e4bb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - pthread-stubs + - xorg-libxau >=1.0.12,<2.0a0 + - xorg-libxdmcp >=1.1.5,<2.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libxcb >=1.17.0,<2.0a0 + size: 395120 + timestamp: 1787885788278 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.38-h280c20c_0.conda + sha256: f7e9292dd219a6435bbb1223da9586c3e70d66d169c5a92f08db3f2127df04e9 + md5: f7a7ff5a6ab331e037abd34f379a631d + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: LGPL-2.1-or-later + purls: [] + run_exports: + weak: + - libxcrypt >=4.4.38 + size: 101957 + timestamp: 1785887123445 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda + sha256: 087d4de023f22d6a28b9e1b818961dd41e9bda6e9793590600ff16ca150bf9cb + md5: 20e4d67ec908f0405124f11612c48305 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=78.3,<79.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libzlib >=1.3.2,<2.0a0 + constrains: + - libxml2 2.15.3 + license: MIT + license_family: MIT + purls: [] + run_exports: {} + size: 559721 + timestamp: 1787237579170 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda + sha256: a16a576a5844a3a0e1cdfc5e162b9fe9c64dccf6a93f44c293bb42851aebe2b4 + md5: 2d34cdb31014cbc8f1e9384c89ede0a5 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=78.3,<79.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libxml2-16 2.15.3 hca6bf5a_1 + - libzlib >=1.3.2,<2.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libxml2 + - libxml2-16 >=2.15.3 + size: 46203 + timestamp: 1787237584107 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda + sha256: eb8a0db0aa570124f7d2a93d7c7f596e3390df5e047818d873baad32985fc736 + md5: 0de0122d9570a8ab637c6b73db268389 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - zlib 1.3.2 *_3 + license: Zlib + license_family: Other + purls: [] + run_exports: + weak: + - libzlib >=1.3.2,<2.0a0 + size: 63713 + timestamp: 1785362952714 +- conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-23.1.0-h7148c6a_0.conda + sha256: b6fa85a30cceca3ad7a811ab34f842b9c2ae9d9d4c520e084b62b2abe50e9a70 + md5: 58b4529023435973ab911c3c51892671 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - intel-openmp <0.0a0 + - openmp 23.1.0|23.1.0.* + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + run_exports: + strong: + - llvm-openmp >=23.1.0 + - _openmp_mutex >=4.5 + - _openmp_mutex * *_llvm + size: 6117432 + timestamp: 1787722419188 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-hee9eb32_2.conda + sha256: b8c0e930183e6b7f83cd35ace102f2b8c2f0faae41dc05255dc72f247dfc556a + md5: e38a3253d72ab07d471483f24947e2a2 + depends: + - libgcc >=15 + - libstdcxx >=15 + - __glibc >=2.17,<3.0.a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - lz4-c >=1.10.0,<1.11.0a0 + size: 181812 + timestamp: 1786717122815 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-hebe6cf0_1003.conda + sha256: a0a1400198e5302d8367f2ed53437ee3cc41dbc463cb481921ce765578780b7a + md5: 10e0aa58ed390ba598b728badf9eb1b7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + run_exports: + weak: + - lzo >=2.10,<3.0a0 + size: 191573 + timestamp: 1787049167898 +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py311h3778330_1.conda + sha256: 710e207b2e91308a34bcfe547c60ad86c1fa294827266ba18548c1fe1a9d8333 + md5: f9efdf9b0f3d0cc309d56af6edf2a6b0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + run_exports: {} + size: 26756 + timestamp: 1772445078834 +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py312h8a5da7c_1.conda + sha256: 5f3aad1f3a685ed0b591faad335957dbdb1b73abfd6fc731a0d42718e0653b33 + md5: 93a4752d42b12943a355b682ee43285b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + run_exports: {} + size: 26057 + timestamp: 1772445297924 +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py313h3dea7bd_1.conda + sha256: 72ed7c0216541d65a17b171bf2eec4a3b81e9158d8ed48e59e1ecd3ae302d263 + md5: aeb9b9da79fd0258b3db091d1fefcd71 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + run_exports: {} + size: 26100 + timestamp: 1772445154165 +- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py311he401cf6_2.conda + sha256: f9f48162f2553080d041b061b9f6cfec64d79d7c40df0e6379496f9ad2df738c + md5: f602c096988d0f744f4f017aa0269e30 + depends: + - __glibc >=2.17,<3.0.a0 + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.28.2 + - freetype + - kiwisolver >=1.3.1 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libgcc >=14 + - libraqm >=0.11.0,<0.12.0a0 + - libstdcxx >=14 + - numpy >=1.23,<3 + - numpy >=1.25 + - packaging >=20.0 + - pillow >=9 + - pyparsing >=3 + - python >=3.11,<3.12.0a0 + - python-dateutil >=2.7 + - python_abi 3.11.* *_cp311 + - qhull >=2020.2,<2020.3.0a0 + - tk >=8.6.13,<8.7.0a0 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/matplotlib?source=hash-mapping + run_exports: {} + size: 8925010 + timestamp: 1785211062689 +- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py312h4c94fcb_2.conda + sha256: 8596841a7adf2ff135a7d3a5266727d7a562046f998e8edf9c568a0b20de7ddd + md5: 97eb87f2704fc5212a05b5fb6202ace0 + depends: + - __glibc >=2.17,<3.0.a0 + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.28.2 + - freetype + - kiwisolver >=1.3.1 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libgcc >=14 + - libraqm >=0.11.0,<0.12.0a0 + - libstdcxx >=14 + - numpy >=1.25 + - numpy >=1.25,<3 + - packaging >=20.0 + - pillow >=9 + - pyparsing >=3 + - python >=3.12,<3.13.0a0 + - python-dateutil >=2.7 + - python_abi 3.12.* *_cp312 + - qhull >=2020.2,<2020.3.0a0 + - tk >=8.6.13,<8.7.0a0 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/matplotlib?source=hash-mapping + run_exports: {} + size: 8931979 + timestamp: 1785211134185 +- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.1-py313h134213a_2.conda + sha256: 40e7f144d6a1df2372b7a8b8b42d7f03bcb236dfcb053c32030f9b1635c8f429 + md5: 2c99937357c9476a1f5dc5ecd08d0c75 + depends: + - __glibc >=2.17,<3.0.a0 + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.28.2 + - freetype + - kiwisolver >=1.3.1 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libgcc >=14 + - libraqm >=0.11.0,<0.12.0a0 + - libstdcxx >=14 + - numpy >=1.25 + - numpy >=1.25,<3 + - packaging >=20.0 + - pillow >=9 + - pyparsing >=3 + - python >=3.13,<3.14.0a0 + - python-dateutil >=2.7 + - python_abi 3.13.* *_cp313 + - qhull >=2020.2,<2020.3.0a0 + - tk >=8.6.13,<8.7.0a0 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/matplotlib?source=hash-mapping + run_exports: {} + size: 9005023 + timestamp: 1785211111407 +- conda: https://conda.anaconda.org/conda-forge/linux-64/memray-1.19.3-py312ha9ecdfb_0.conda + sha256: ceca48bd96d989ae2b3694aaece1cde065ec7564a0dfeb5c1adf6369cfeecab9 + md5: bda01f82da732f19e18e8b60638654cd + depends: + - python + - rich >=11.2.0 + - jinja2 + - textual >=0.34.0 + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.12.* *_cp312 + - lz4-c >=1.10.0,<1.11.0a0 + - libunwind >=1.8.3,<1.9.0a0 + - elfutils >=0.194,<0.195.0a0 + license: Apache-2.0 AND BSD-3-Clause + purls: + - pkg:pypi/memray?source=hash-mapping + run_exports: {} + size: 1839717 + timestamp: 1775683241839 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2026.1.0-hd2095e1_245.conda + sha256: a2699b4db5f93ae7211249f5b8df4981c22765c392cc6d34c18d76994fe3b327 + md5: 5c8b5643ac9b96cd1c5b65a17337ce5c + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - libgcc >=15 + - libstdcxx >=15 + - llvm-openmp >=23.1.0 + - tbb >=2023.0.0 + license: LicenseRef-IntelSimplifiedSoftwareOct2022 + license_family: Proprietary + purls: [] + run_exports: {} + size: 142335878 + timestamp: 1787725704439 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.4.0-ha2cb11d_1.conda + sha256: 3d56733fe0f44159787ad086d5e7bdab8b69e6a5a9b6b873a8beb3519f3d8d07 + md5: f0f6c8691a9ed4099d1f287a444e251a + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=15 + - mpfr >=4.2.2,<5.0a0 + license: LGPL-3.0-or-later + license_family: LGPL + purls: [] + run_exports: + weak: + - mpc >=1.4.0,<2.0a0 + size: 101074 + timestamp: 1787668090174 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.2-ha2cb11d_1.conda + sha256: 0be79ef2ee536e0c5d3ddb4a52bbae9f26d08560623299f33db2f4c4a17c525a + md5: 7dcc10f6c0bc3596d5519a710a84dfd4 + depends: + - __glibc >=2.17,<3.0.a0 + - gmp >=6.3.0,<7.0a0 + - libgcc >=15 + license: LGPL-3.0-only + license_family: LGPL + purls: [] + run_exports: + weak: + - mpfr >=4.2.2,<5.0a0 + size: 730409 + timestamp: 1787236218159 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpi-1.0-impi.conda + sha256: c01194d779d9053dd3748e7b4e5337382df8656b587ebc291bee9f3a5316f8dc + md5: 39f492b9ff8543bc991c543484a8bb93 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: {} + size: 6529 + timestamp: 1698265214566 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpi4py-4.1.2-py312h18f78f0_100.conda + sha256: a5e430c3021277c9cfcec79f6704c52f18735632caa6c0acca11e5cff7d44176 + md5: a89c4978241224f652f0d3c90674d503 + depends: + - python + - impi_rt >=2021.10 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/mpi4py?source=hash-mapping + run_exports: + weak: + - mpi4py >=4.1.2,<5.0a0 + size: 885794 + timestamp: 1778930332754 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mpi4py-4.1.2-py312hd140a38_100.conda + sha256: 9f70e5cbca0ec0af59a05806c8c4c7ccfd121d6b4b1e9d623933df72090275b6 + md5: 73fd2ba5bcba1d273ecce113fb7eabc1 + depends: + - python + - openmpi >=4.1 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/mpi4py?source=hash-mapping + run_exports: + weak: + - mpi4py >=4.1.2,<5.0a0 + size: 889684 + timestamp: 1778930328922 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-2.3.1-py312h89dfda2_0.conda + sha256: a847cc47340a05221f801c62327e6d75d5745caa6d5a9f922338b9d2177def39 + md5: ff6c8866bb34fa7c26ca9303fc2d5f3b + depends: + - ast-serialize >=0.6.0,<1.0.0 + - mypy_extensions >=1.0.0 + - pathspec >=1.0.0 + - python + - python-librt >=0.13.0 + - typing_extensions >=4.6.0 + - psutil >=4.0 + - libgcc >=15 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mypy?source=compressed-mapping + run_exports: {} + size: 23349566 + timestamp: 1786887238291 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nccl-2.30.7.1-h1aa9b5a_0.conda + sha256: f92f617b266c24ce25766750ee45e326cbf572a97af41ca6ccb2d140f6c3859c + md5: d09e75d1fb0481ad255c74a23506696c + depends: + - __glibc >=2.28,<3.0.a0 + - cuda-version >=13,<14.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - nccl >=2.30.7.1,<3.0a0 + size: 239421791 + timestamp: 1781141768144 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nccl-2.30.7.1-h4d09622_0.conda + sha256: 91d73a1f332970c69920cd51bd7fcb746ba427aebb5fd24993bb3fb0c32f8edc + md5: 07c134a9fd671b7666b3941b24056ec5 + depends: + - __glibc >=2.28,<3.0.a0 + - cuda-version >=12,<13.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - nccl >=2.30.7.1,<3.0a0 + size: 301391100 + timestamp: 1781142767879 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_1.conda + sha256: 5d46557214ed184381dafe835b7c94a474a1c3b307a08a250b1ea4779b44ffb3 + md5: ee6c0cd80a60961a1f48aa3e0b91f986 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: X11 AND BSD-3-Clause + purls: [] + run_exports: + weak: + - ncurses >=6.6,<7.0a0 + size: 911196 + timestamp: 1786355078102 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.10.1-h5ef0d04_1.conda + sha256: 9f08df8a8d6660c4c5d8c810da2da2a5b099cd00ca30e1174be6d8df27a82120 + md5: 7b8f8d1226c95f61a51436a657c84770 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - gmp >=6.3.0,<7.0a0 + license: GPL-2.0-or-later OR LGPL-3.0-or-later + purls: [] + run_exports: + weak: + - nettle >=3.10.1,<3.11.0a0 + size: 1052171 + timestamp: 1787065085312 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_1.conda + sha256: 2b5f2e865122f9fc0637f520a7cb22e16b9727b2db6761ee16cb5e6404412c81 + md5: 2db7a395d7dc2b6ed5effaf68fb99443 + depends: + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: {} + size: 186767 + timestamp: 1786713048064 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_2.conda + sha256: 8f8b554c74b032b3e63a8828fb0ecc7ae4f5c5a6bd0afcf75423d5ff79290cb0 + md5: fe93be7dd9209e6ae673962e3031ff51 + constrains: + - nlohmann_json-abi ==3.12.0 + license: MIT + license_family: MIT + purls: [] + run_exports: {} + size: 136372 + timestamp: 1785920438981 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py311h2e04523_0.conda + sha256: 8e8fb64c1a51282e8940d57d116aec54a4d66da59594973ae9c0b35d419b9a81 + md5: 5d4e35d7097b88c8b1455ef9f6ddf511 + depends: + - python + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libblas >=3.9.0,<4.0a0 + - python_abi 3.11.* *_cp311 + - liblapack >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + run_exports: + weak: + - numpy >=1.23,<3 + size: 9389525 + timestamp: 1779169198155 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py312h33ff503_0.conda + sha256: dfcbeadb3e7ad0da7a55a0525884ca34c19584154e13cc4159396b305d1bd445 + md5: 6e31d55ee1110fda83b4f4045f4d73ff + depends: + - python + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - liblapack >=3.9.0,<4.0a0 + - libblas >=3.9.0,<4.0a0 + - python_abi 3.12.* *_cp312 + - libcblas >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + run_exports: + weak: + - numpy >=1.23,<3 + size: 8759520 + timestamp: 1779169200325 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py313hf6604e3_0.conda + sha256: 3740c9bc562db9c6f252f8697c5c7948bb48784346856f6d6308aba72ea4f00b + md5: a5fdb80595ec7912e6b1634b2abd4b50 + depends: + - python + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libcblas >=3.9.0,<4.0a0 + - python_abi 3.13.* *_cp313 + - liblapack >=3.9.0,<4.0a0 + - libblas >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + run_exports: + weak: + - numpy >=1.23,<3 + size: 8864096 + timestamp: 1779169199037 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.5.2-py312he827f4e_1.conda + sha256: be778735f693d6c1e9b877d7a28fd7d9e8c0d695c5b93a4dd5b8ec4a4317ca13 + md5: e70abe6ab4c60ecb6a51e67903bcec07 + depends: + - python + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - libstdcxx >=15 + - liblapack >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - python_abi 3.12.* *_cp312 + - libblas >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - numpy >=1.25,<3 + size: 9212503 + timestamp: 1788129260074 +- conda: https://conda.anaconda.org/conda-forge/linux-64/onednn-3.12-omp_h83de36e_0.conda + sha256: 0555c7f54e7192b30412cdb462adcf2151153c03fc9f20c0d6846a9381efea56 + md5: 1edfb47e2c1cce4978bbebc467999977 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - onednn >=3.12,<4.0a0 + size: 13069211 + timestamp: 1779565995400 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-heb1ab33_2.conda + sha256: 131688a88bea8da92fe418c4558c5073435e2848911bc4c836c3a9dd5994b4aa + md5: a3f3ac7a68d01c198e276dbb99e62032 + depends: + - libgcc >=15 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=15 + - libtiff >=4.7.2,<4.8.0a0 + - libzlib >=1.3.2,<2.0a0 + - libpng >=1.6.58,<1.7.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - openjpeg >=2.5.4,<3.0a0 + size: 391242 + timestamp: 1788425045145 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openmpi-5.0.10-hee33aa4_2.conda + sha256: 20cafe96c3159bd328886552c45561dd52b6cdb844170c54189a1860a88d7997 + md5: 7a082f0e3fe2002e187798fd2ed6b1de + depends: + - mpi 1.0.* openmpi + - libstdcxx >=14 + - libgcc >=14 + - libgfortran5 >=14.4.0 + - libgfortran + - __glibc >=2.17,<3.0.a0 + - libhwloc >=2.13.0,<2.13.1.0a0 + - libzlib >=1.3.2,<2.0a0 + - libpmix >=5.0.8,<6.0a0 + - libnl >=3.11.0,<4.0a0 + - libevent >=2.1.12,<2.1.13.0a0 + - ucx >=1.22.0,<1.23.0a0 + - ucc >=1.8.0,<2.0a0 + - libfabric + - libfabric1 >=1.14.0 + constrains: + - __cuda >=12.0 + - cuda-version >=12.0 + - libprrte ==0.0.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - openmpi >=5.0.10,<6.0a0 + size: 3948388 + timestamp: 1787493907828 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.4-h781a0a9_0.conda + sha256: 4747b2d6a8336f52343bceb8a1ebf41a9e6e665b9d2e3f989972de53a310599e + md5: 16e3034a330cc625f2c685edec60cf4e + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=15 + license: Apache-2.0 + license_family: Apache + purls: [] + run_exports: + weak: + - openssl >=3.6.4,<4.0a0 + size: 3202955 + timestamp: 1787698780103 +- conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py311h5f908af_1.conda + sha256: 54cc90a5fb8f4895ab4bcf7c7f29fa0a65fc7fef8f7c16202e48f793744397f9 + md5: 6bd81661a37295786c9e779d0dd028eb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - libstdcxx >=15 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - typing-extensions >=4.10 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/optree?source=hash-mapping + run_exports: {} + size: 573233 + timestamp: 1788504561764 +- conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py312ha5105d2_1.conda + sha256: 69ff772fb28cab37570502cdead621fc1454fa90bb97e9aff83617395912033d + md5: 2cd722ba7312f819d13ec8a4c2cd9185 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - libstdcxx >=15 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - typing-extensions >=4.10 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/optree?source=hash-mapping + run_exports: {} + size: 579015 + timestamp: 1788504556508 +- conda: https://conda.anaconda.org/conda-forge/linux-64/optree-0.20.0-py313h6bdb861_1.conda + sha256: f72bf4359c00908875c20eefc3328c994111837e33206f5c34c7c029dd770a94 + md5: fc3bae04198dde717798c6dc25044aa6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - libstdcxx >=15 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - typing-extensions >=4.12 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/optree?source=hash-mapping + run_exports: {} + size: 586381 + timestamp: 1788504569784 +- conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.1-h443056b_0.conda + sha256: ae96bc0895a2279f2ea296879e0475333e838cc88754b0c1a4903dd92a7e1b21 + md5: 1280a5f8270f30b89cc8373ecfe8899d + depends: + - tzdata + - libgcc >=14 + - libstdcxx >=14 + - __glibc >=2.17,<3.0.a0 + - snappy >=1.2.2,<1.3.0a0 + - libabseil >=20260526.0,<20260527.0a0 + - libabseil * cxx17* + - libzlib >=1.3.2,<2.0a0 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - orc >=2.3.1,<2.3.2.0a0 + size: 1458252 + timestamp: 1784301236872 +- conda: https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.26.5-h8d769aa_2.conda + sha256: 16bcb050de08f5423b0e898dea9eb08a66ff93c1b347233137ffc17b2ec7e66c + md5: aeb4e6fe52e15c22f44f73476510c005 + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.7.0,<3.8.0a0 + - libgcc >=15 + - libtasn1 >=4.21.0,<5.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - p11-kit >=0.26.5,<0.27.0a0 + size: 3945183 + timestamp: 1788196153960 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.5-py312h8ecdadd_1.conda + sha256: 393e529c0574c020a9b790275af10ff35e21cbb4e12740888bd3f214f2f07034 + md5: 85eb29ade84d1bd97be5ec55607efb00 + depends: + - python + - numpy >=1.26.0 + - python-dateutil >=2.8.2 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - numpy >=1.23,<3 + - python_abi 3.12.* *_cp312 + constrains: + - adbc-driver-postgresql >=1.2.0 + - adbc-driver-sqlite >=1.2.0 + - beautifulsoup4 >=4.12.3 + - blosc >=1.21.3 + - bottleneck >=1.4.2 + - fastparquet >=2024.11.0 + - fsspec >=2024.10.0 + - gcsfs >=2024.10.0 + - html5lib >=1.1 + - hypothesis >=6.116.0 + - jinja2 >=3.1.5 + - lxml >=5.3.0 + - matplotlib >=3.9.3 + - numba >=0.60.0 + - numexpr >=2.10.2 + - odfpy >=1.4.1 + - openpyxl >=3.1.5 + - psycopg2 >=2.9.10 + - pyarrow >=13.0.0 + - pyiceberg >=0.8.1 + - pymysql >=1.1.1 + - pyqt5 >=5.15.9 + - pyreadstat >=1.2.8 + - pytables >=3.10.1 + - pytest >=8.3.4 + - pytest-xdist >=3.6.1 + - python-calamine >=0.3.0 + - pytz >=2024.2 + - pyxlsb >=1.0.10 + - qtpy >=2.4.2 + - scipy >=1.14.1 + - s3fs >=2024.10.0 + - sqlalchemy >=2.0.36 + - tabulate >=0.9.0 + - xarray >=2024.10.0 + - xlrd >=2.0.1 + - xlsxwriter >=3.2.0 + - zstandard >=0.23.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + run_exports: {} + size: 14936796 + timestamp: 1785276227779 +- conda: https://conda.anaconda.org/conda-forge/linux-64/patchelf-0.19.1-hee9eb32_1.conda + sha256: f138da28cd92824eb58ca11b3f9d5d6d32e1cbd31d7f5589ccda1a7398522b6b + md5: 21ce762527ea167059a17516773a8cc4 + depends: + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=15 + - libgcc >=15 + license: GPL-3.0-or-later + license_family: GPL + run_exports: {} + size: 152278 + timestamp: 1787380796884 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda + sha256: 9ebb10a4eb3be51ae67d85c679f5a7a50cb040ed25c783e6331a225ea09991d4 + md5: 06f6113cf1ff4a54b65f87ead132a5f1 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - libgcc >=15 + - libzlib >=1.3.2,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - pcre2 >=10.47,<10.48.0a0 + size: 1218833 + timestamp: 1787294571916 +- conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda + build_number: 7 + sha256: 9ec32b6936b0e37bcb0ed34f22ec3116e75b3c0964f9f50ecea5f58734ed6ce9 + md5: f2cfec9406850991f4e3d960cc9e3321 + depends: + - libgcc-ng >=12 + - libxcrypt >=4.4.36 + license: GPL-1.0-or-later OR Artistic-1.0-Perl + purls: [] + run_exports: + weak: + - perl >=5.32.1,<5.33.0a0 *_perl5 + noarch: + - perl >=5.32.1,<6.0a0 *_perl5 + size: 13344463 + timestamp: 1703310653947 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py311hf303fd3_1.conda + sha256: fe45a4c89b79872c786ef0938645c9400b30dafacaebc6b9f6a34baffcbd5882 + md5: 8559c6ba0b36c42e5271debae17a8bf8 + depends: + - python + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - libxcb >=1.17.0,<2.0a0 + - libtiff >=4.7.2,<4.8.0a0 + - openjpeg >=2.5.4,<3.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - tk >=8.6.13,<8.7.0a0 + - libjpeg-turbo >=3.2.0,<4.0a0 + - lcms2 >=2.19.1,<3.0a0 + - zlib-ng >=2.3.3,<2.4.0a0 + - python_abi 3.11.* *_cp311 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + license: HPND + purls: + - pkg:pypi/pillow?source=compressed-mapping + run_exports: {} + size: 1077454 + timestamp: 1788263909512 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py312h38079b3_1.conda + sha256: 759861dd3f02686c51a9d1a315effef0f43697adf008e69f3574dd05f6a5dda7 + md5: abe0e18aba5d053232155243914a168b + depends: + - python + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - lcms2 >=2.19.1,<3.0a0 + - libjpeg-turbo >=3.2.0,<4.0a0 + - tk >=8.6.13,<8.7.0a0 + - zlib-ng >=2.3.3,<2.4.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - python_abi 3.12.* *_cp312 + - libtiff >=4.7.2,<4.8.0a0 + - openjpeg >=2.5.4,<3.0a0 + - libxcb >=1.17.0,<2.0a0 + license: HPND + purls: + - pkg:pypi/pillow?source=compressed-mapping + run_exports: {} + size: 1059991 + timestamp: 1788263909512 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py313h3b26573_1.conda + sha256: 772d99020ac7e4c8815afceed81fbd9628938c223727827e1f59eed68c76112d + md5: ae7b99b3a8d14d12d9df0a733ddc2419 + depends: + - python + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - openjpeg >=2.5.4,<3.0a0 + - tk >=8.6.13,<8.7.0a0 + - libxcb >=1.17.0,<2.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - libtiff >=4.7.2,<4.8.0a0 + - zlib-ng >=2.3.3,<2.4.0a0 + - lcms2 >=2.19.1,<3.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - python_abi 3.13.* *_cp313 + - libjpeg-turbo >=3.2.0,<4.0a0 + license: HPND + purls: + - pkg:pypi/pillow?source=hash-mapping + run_exports: {} + size: 1072805 + timestamp: 1788263909512 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_3.conda + sha256: 829d8288764282de5a9f7b9169acb75cc7dc0b6c3fe2535cfe87dea3436bbc5d + md5: 0ee5bb30034b081a1386c1e2c98ab0a7 + depends: + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - pixman >=0.46.4,<1.0a0 + size: 376704 + timestamp: 1786106621354 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pkg-config-0.29.2-h1114479_1012.conda + sha256: 018493538ea43c93801e45b56e376c03503b188c2441cd35007ad78c4ccae0d6 + md5: 9ee8e6ea3965b70b4ceb1e25429c5ca2 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + run_exports: {} + size: 141241 + timestamp: 1787956226965 +- conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + sha256: 013669433eb447548f21c3c6b16b2ed64356f726b5f77c1b39d5ba17a8a4b8bc + md5: a83f6a2fdc079e643237887a37460668 + depends: + - __glibc >=2.17,<3.0.a0 + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - zlib + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - prometheus-cpp >=1.3.0,<1.4.0a0 + size: 199544 + timestamp: 1730769112346 +- conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py312h1b36aeb_2.conda + sha256: 74522f28cf6b905f89771b5b3367966280285dca5b5b8cd09f69c3bfe95c637c + md5: e59300b9232e82a351a9390bfdfe72f9 + depends: + - python + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/psutil?source=hash-mapping + run_exports: {} + size: 225441 + timestamp: 1788189998857 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h7cc23a3_1004.conda + sha256: 4a44fd00ea73b79ca2c89b0727b9ccf61c506ead71e67a9abfa4c590042b5a4a + md5: bb66b610707b811e3c65181a6431e7a8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + license: MIT + license_family: MIT + purls: [] + run_exports: {} + size: 9630 + timestamp: 1788381877753 +- conda: https://conda.anaconda.org/conda-forge/linux-64/py-spy-0.4.2-hbe0e3b8_1.conda + sha256: cb23242015d1b3fb9d009e98edf673900811b73a1e16a5e3d74104c96eb172dc + md5: a9b890615f46d689cbadb145415d333a + depends: + - libgcc >=15 + - __glibc >=2.17,<3.0.a0 + - libunwind >=1.8.3,<1.9.0a0 + - liblzma >=5.8.3,<6.0a0 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + purls: [] + run_exports: {} + size: 1909369 + timestamp: 1787924738130 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-25.0.0-py312h7900ff3_0.conda + sha256: 9b6c4aed5da2a3b8f649e1b73596e0867a5506bed9c3aa45dbaedfb674822191 + md5: 6f1918b7565c3cc5ed047a97ea510e55 + depends: + - libarrow-acero 25.0.0.* + - libarrow-dataset 25.0.0.* + - libarrow-substrait 25.0.0.* + - libparquet 25.0.0.* + - pyarrow-core 25.0.0 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: {} + size: 26079 + timestamp: 1784258397971 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-25.0.0-py312h2054cf2_0_cpu.conda + sha256: 8b54b732de45d85198e8e9ce5d5b5642c847f4379f917c64a4de48643a3305ee + md5: aff56abfcef5a031603250b7dc23e9d5 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 25.0.0.* *cpu + - libarrow-compute 25.0.0.* *cpu + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy >=1.23,<3 + - apache-arrow-proc * cpu + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/pyarrow?source=hash-mapping + run_exports: {} + size: 5395858 + timestamp: 1784258391353 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.16-h5f976f7_2_cpython.conda + build_number: 2 + sha256: 35375a255970809e8b0a1c744d56533f4da5339769ef5f5a24fe165ca321fcf3 + md5: 1d34da7fd53578abed31372e70a7ef4e + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.8.1,<3.0a0 + - libffi >=3.7.0,<3.8.0a0 + - libgcc >=15 + - liblzma >=5.8.3,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libpython 3.11.16 h0c77377_2_cpython + - libsqlite >=3.53.4,<4.0a0 + - libuuid >=2.42.3,<3.0a0 + - libxcrypt >=4.4.38 + - libzlib >=1.3.2,<2.0a0 + - ncurses >=6.6,<7.0a0 + - openssl >=3.5.8,<4.0a0 + - readline >=8.3,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.11.* *_cp311 + license: Python-2.0 + purls: [] + run_exports: + weak: + - python_abi 3.11.* *_cp311 + noarch: + - python + size: 23172280 + timestamp: 1788393513780 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.14-h5f976f7_3_cpython.conda + build_number: 3 + sha256: 14c579b1016da04e4c9f1c5c857272d83ec447317d8c4074a07d59de3cef70ef + md5: 98be3cf76eca2e8871f907a03aed3b84 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.8.1,<3.0a0 + - libffi >=3.7.0,<3.8.0a0 + - libgcc >=15 + - liblzma >=5.8.3,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libpython 3.12.14 h0c77377_3_cpython + - libsqlite >=3.53.4,<4.0a0 + - libuuid >=2.42.3,<3.0a0 + - libxcrypt >=4.4.38 + - libzlib >=1.3.2,<2.0a0 + - ncurses >=6.6,<7.0a0 + - openssl >=3.5.8,<4.0a0 + - readline >=8.3,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + purls: [] + run_exports: + weak: + - python_abi 3.12.* *_cp312 + noarch: + - python + size: 23044161 + timestamp: 1788392496306 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.15-hf47f18c_103_cp313.conda + build_number: 103 + sha256: cc18ba39af0d591ac012c1334ac98aa59ec7be389719b4cd80cc0a58a53019de + md5: 641613f2d89da811bc29fa4cde88ef20 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.8.1,<3.0a0 + - libffi >=3.7.0,<3.8.0a0 + - libgcc >=15 + - liblzma >=5.8.3,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libpython 3.13.15 hdc7f604_103_cp313 + - libsqlite >=3.53.4,<4.0a0 + - libuuid >=2.42.3,<3.0a0 + - libzlib >=1.3.2,<2.0a0 + - ncurses >=6.6,<7.0a0 + - openssl >=3.5.8,<4.0a0 + - python_abi 3.13.* *_cp313 + - readline >=8.3,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + license: Python-2.0 + purls: [] + run_exports: + weak: + - python_abi 3.13.* *_cp313 + noarch: + - python + size: 24369771 + timestamp: 1788387840141 + python_site_packages_path: lib/python3.13/site-packages +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-librt-0.15.0-py312h1b36aeb_1.conda + sha256: dc4176b0715a6226663551add60bb4216d2c3e5faafcaf1ac917e9803fa4f7d1 + md5: 37726df0a5491ed021e08006699162e3 + depends: + - python + - libgcc >=15 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/librt?source=compressed-mapping + run_exports: {} + size: 169369 + timestamp: 1788228288554 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.12.1-cpu_mkl_py312_h38523ed_100.conda + sha256: 827e69c59252e91a4f15a9b7892d075a73cb4263cbf0faa38f995c6447a267d5 + md5: ebe0e6778530b8073f04ccdae79d6e94 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - filelock + - fmt >=12.1.0,<12.2.0a0 + - fsspec + - jinja2 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libblas * *mkl + - libcblas >=3.11.0,<4.0a0 + - libgcc >=14 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libstdcxx >=14 + - libtorch 2.12.1 cpu_mkl_h4f7e408_100 + - libuv >=1.52.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - llvm-openmp >=22.1.8 + - mkl >=2026.0.0,<2027.0a0 + - networkx + - numpy >=1.23,<3 + - onednn >=3.12,<4.0a0 + - optree >=0.13.0 + - pybind11 + - pybind11-abi 11 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - setuptools <82 + - sleef >=3.9.0,<4.0a0 + - sympy >=1.13.3 + - typing_extensions >=4.10.0 + constrains: + - pytorch-gpu <0.0a0 + - pytorch-cpu 2.12.1 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/torch?source=project-defined-mapping + run_exports: + weak: + - pytorch >=2.12.1,<2.13.0a0 + - libtorch >=2.12.1,<2.13.0a0 + size: 25642535 + timestamp: 1781833725178 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.12.1-cuda129_mkl_py312_h51dba9f_300.conda + sha256: 79b36b8aab386faab437f2bd74c02658b292f9e48aab36e19e67c51c943b4357 + md5: d0f357b3f25180c177b85e719cd0d2a2 + depends: + - __cuda + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - cuda-cudart >=12.9.79,<13.0a0 + - cuda-cupti >=12.9.79,<13.0a0 + - cuda-nvrtc >=12.9.86,<13.0a0 + - cuda-nvtx >=12.9.79,<13.0a0 + - cuda-version >=12.9,<13 + - filelock + - fmt >=12.1.0,<12.2.0a0 + - fsspec + - jinja2 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libblas * *mkl + - libcblas >=3.11.0,<4.0a0 + - libcublas >=12.9.2.10,<13.0a0 + - libcudnn >=9.10.2.21,<10.0a0 + - libcudss >=0.8.0.10,<0.8.1.0a0 + - libcufft >=11.4.1.4,<12.0a0 + - libcufile >=1.14.1.1,<2.0a0 + - libcurand >=10.3.10.19,<11.0a0 + - libcusolver >=11.7.5.82,<12.0a0 + - libcusparse >=12.5.10.65,<13.0a0 + - libgcc >=14 + - libmagma >=2.10.0,<2.10.1.0a0 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libstdcxx >=14 + - libtorch 2.12.1 cuda129_mkl_h6b8258c_300 + - libuv >=1.52.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - llvm-openmp >=22.1.8 + - mkl >=2026.0.0,<2027.0a0 + - nccl >=2.28.9.1,<3.0a0 + - networkx + - numpy >=1.23,<3 + - onednn >=3.12,<4.0a0 + - optree >=0.13.0 + - pybind11 + - pybind11-abi 11 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - setuptools <82 + - sleef >=3.9.0,<4.0a0 + - sympy >=1.13.3 + - triton 3.7.1 + - typing_extensions >=4.10.0 + constrains: + - pytorch-cpu <0.0a0 + - pytorch-gpu 2.12.1 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/torch?source=project-defined-mapping + run_exports: + weak: + - pytorch >=2.12.1,<2.13.0a0 + - libtorch >=2.12.1,<2.13.0a0 + size: 25908937 + timestamp: 1781848825426 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py311_h249fa5d_102.conda + sha256: 85d39d440e6893377b5c4d34740b005766b3610c87263322e1d8858c1622b147 + md5: 984900ed34b9ac4a39216a107b3ee802 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - filelock + - fmt >=12.1.0,<12.2.0a0 + - fsspec + - jinja2 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libblas * *mkl + - libcblas >=3.11.0,<4.0a0 + - libgcc >=14 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libstdcxx >=14 + - libtorch 2.13.0 cpu_mkl_h40bd1c6_102 + - libuv >=1.52.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - llvm-openmp >=22.1.8 + - mkl >=2026.1.0,<2027.0a0 + - networkx + - numpy >=1.23,<3 + - onednn >=3.12,<4.0a0 + - optree >=0.13.0 + - pybind11 + - pybind11-abi 11 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - setuptools <82 + - sleef >=3.9.0,<4.0a0 + - sympy >=1.13.3 + - typing_extensions >=4.10.0 + constrains: + - pytorch-cpu 2.13.0 + - pytorch-gpu <0.0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/torch?source=project-defined-mapping + run_exports: + weak: + - pytorch >=2.13.0,<2.14.0a0 + - libtorch >=2.13.0,<2.14.0a0 + size: 27390828 + timestamp: 1786375884517 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py312_h999dc20_102.conda + sha256: bfddc2821f141a89a2e8ce05a22db4e1dda638297ff3cfd147fbd79ea0401b5c + md5: b139a0a62b1e6ec36a37282f4f3f0fbf + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - filelock + - fmt >=12.1.0,<12.2.0a0 + - fsspec + - jinja2 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libblas * *mkl + - libcblas >=3.11.0,<4.0a0 + - libgcc >=14 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libstdcxx >=14 + - libtorch 2.13.0 cpu_mkl_h40bd1c6_102 + - libuv >=1.52.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - llvm-openmp >=22.1.8 + - mkl >=2026.1.0,<2027.0a0 + - networkx + - numpy >=1.25,<3 + - onednn >=3.12,<4.0a0 + - optree >=0.13.0 + - pybind11 + - pybind11-abi 11 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - setuptools <82 + - sleef >=3.9.0,<4.0a0 + - sympy >=1.13.3 + - typing_extensions >=4.10.0 + constrains: + - pytorch-cpu 2.13.0 + - pytorch-gpu <0.0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/torch?source=project-defined-mapping + run_exports: + weak: + - pytorch >=2.13.0,<2.14.0a0 + - libtorch >=2.13.0,<2.14.0a0 + size: 27182909 + timestamp: 1786375171404 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cpu_mkl_py313_h80c0f76_102.conda + sha256: 53502d4434ce01df873ed721013ce37fd35c19da107c4405eeb91e9bb1a51501 + md5: 722472ecc10ebaa7780fdc0f5891a65b + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - filelock + - fmt >=12.1.0,<12.2.0a0 + - fsspec + - jinja2 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libblas * *mkl + - libcblas >=3.11.0,<4.0a0 + - libgcc >=14 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libstdcxx >=14 + - libtorch 2.13.0 cpu_mkl_h40bd1c6_102 + - libuv >=1.52.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - llvm-openmp >=22.1.8 + - mkl >=2026.1.0,<2027.0a0 + - networkx + - numpy >=1.25,<3 + - onednn >=3.12,<4.0a0 + - optree >=0.13.0 + - pybind11 + - pybind11-abi 11 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - setuptools <82 + - sleef >=3.9.0,<4.0a0 + - sympy >=1.13.3 + - typing_extensions >=4.10.0 + constrains: + - pytorch-cpu 2.13.0 + - pytorch-gpu <0.0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/torch?source=project-defined-mapping + run_exports: + weak: + - pytorch >=2.13.0,<2.14.0a0 + - libtorch >=2.13.0,<2.14.0a0 + size: 27603751 + timestamp: 1786374470238 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cuda129_mkl_py312_h0509a7e_302.conda + sha256: 81312b79e5bc26da1314b1f8c5b4eb238ee01b016cd98993ba6f5e365eb056c2 + md5: 69d7f944103891f1dd20f34f0cd164ea + depends: + - __cuda + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - cuda-cudart >=12.9.79,<13.0a0 + - cuda-cupti >=12.9.79,<13.0a0 + - cuda-nvrtc >=12.9.86,<13.0a0 + - cuda-nvtx >=12.9.79,<13.0a0 + - cuda-version >=12.9,<13 + - filelock + - fmt >=12.1.0,<12.2.0a0 + - fsspec + - jinja2 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libblas * *mkl + - libcblas >=3.11.0,<4.0a0 + - libcublas >=12.9.2.10,<13.0a0 + - libcudnn >=9.10.2.21,<10.0a0 + - libcudss >=0.8.0.10,<0.8.1.0a0 + - libcufft >=11.4.1.4,<12.0a0 + - libcufile >=1.14.1.1,<2.0a0 + - libcurand >=10.3.10.19,<11.0a0 + - libcusolver >=11.7.5.82,<12.0a0 + - libcusparse >=12.5.10.65,<13.0a0 + - libgcc >=14 + - libmagma >=2.10.0,<2.10.1.0a0 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libstdcxx >=14 + - libtorch 2.13.0 cuda129_mkl_h546cc0b_302 + - libuv >=1.52.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - llvm-openmp >=22.1.8 + - mkl >=2026.1.0,<2027.0a0 + - nccl >=2.28.9.1,<3.0a0 + - networkx + - numpy >=1.25,<3 + - onednn >=3.12,<4.0a0 + - optree >=0.13.0 + - pybind11 + - pybind11-abi 11 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - setuptools <82 + - sleef >=3.9.0,<4.0a0 + - sympy >=1.13.3 + - triton 3.7.1 + - typing_extensions >=4.10.0 + constrains: + - pytorch-cpu <0.0a0 + - pytorch-gpu 2.13.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/torch?source=project-defined-mapping + run_exports: + weak: + - pytorch >=2.13.0,<2.14.0a0 + - libtorch >=2.13.0,<2.14.0a0 + size: 27595450 + timestamp: 1786390195428 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.13.0-cuda130_mkl_py312_hcdc9d04_302.conda + sha256: 432e3a90a75d67725d58e62639d322fbfa9a36024a5daa32b74c0112d475178c + md5: 001eb33662642bf6983329a58e7788d9 + depends: + - __cuda + - __glibc >=2.28,<3.0.a0 + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - cuda-cudart >=13.0.96,<14.0a0 + - cuda-cupti >=13.0.85,<14.0a0 + - cuda-nvrtc >=13.0.88,<14.0a0 + - cuda-nvtx >=13.0.85,<14.0a0 + - cuda-version >=13.0,<14 + - filelock + - fmt >=12.1.0,<12.2.0a0 + - fsspec + - jinja2 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libblas * *mkl + - libcblas >=3.11.0,<4.0a0 + - libcublas >=13.1.1.3,<14.0a0 + - libcudnn >=9.25.0.15,<10.0a0 + - libcudss >=0.8.0.10,<0.8.1.0a0 + - libcufft >=12.0.0.61,<13.0a0 + - libcufile >=1.15.1.6,<2.0a0 + - libcurand >=10.4.0.35,<11.0a0 + - libcusolver >=12.0.4.66,<13.0a0 + - libcusparse >=12.6.3.3,<13.0a0 + - libgcc >=14 + - libmagma >=2.10.0,<2.10.1.0a0 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libstdcxx >=14 + - libtorch 2.13.0 cuda130_mkl_h1ca3d63_302 + - libuv >=1.52.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - llvm-openmp >=22.1.8 + - mkl >=2026.1.0,<2027.0a0 + - nccl >=2.30.7.1,<3.0a0 + - networkx + - numpy >=1.25,<3 + - onednn >=3.12,<4.0a0 + - optree >=0.13.0 + - pybind11 + - pybind11-abi 11 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - setuptools <82 + - sleef >=3.9.0,<4.0a0 + - sympy >=1.13.3 + - triton 3.7.1 + - typing_extensions >=4.10.0 + constrains: + - pytorch-cpu <0.0a0 + - pytorch-gpu 2.13.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/torch?source=project-defined-mapping + run_exports: + weak: + - pytorch >=2.13.0,<2.14.0a0 + - libtorch >=2.13.0,<2.14.0a0 + size: 27465325 + timestamp: 1786386129198 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-gpu-2.12.1-cuda129_mkl_h0d04637_300.conda + sha256: 6962557638794695e9368fec8358913138de6ac42263f4106b0b0d289aa8c90f + md5: e0e4cda52c574ebc52a1433de2f64b42 + depends: + - pytorch 2.12.1 cuda*_mkl*300 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/torch?source=project-defined-mapping + run_exports: {} + size: 55687 + timestamp: 1781849857048 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pytorch-gpu-2.13.0-cuda129_mkl_h0d04637_302.conda + sha256: ed83a69f74ff4d81eee00fbfea410fd644cd5d4079692d61bd5909a7073f608b + md5: d0f6a948121b879b5151cf088d486309 + depends: + - pytorch 2.13.0 cuda*_mkl*302 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/torch?source=project-defined-mapping + run_exports: {} + size: 57190 + timestamp: 1786391217596 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py311h3778330_1.conda + sha256: c9a6cd2c290d7c3d2b30ea34a0ccda30f770e8ddb2937871f2c404faf60d0050 + md5: a24add9a3bababee946f3bc1c829acfe + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + run_exports: {} + size: 206190 + timestamp: 1770223702917 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda + sha256: cb142bfd92f6e55749365ddc244294fa7b64db6d08c45b018ff1c658907bfcbf + md5: 15878599a87992e44c059731771591cb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + run_exports: {} + size: 198293 + timestamp: 1770223620706 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py313h3dea7bd_1.conda + sha256: ef7df29b38ef04ec67a8888a4aa039973eaa377e8c4b59a7be0a1c50cd7e4ac6 + md5: f256753e840c3cd3766488c9437a8f8b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + run_exports: {} + size: 201616 + timestamp: 1770223543730 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.2.0-py312h8a5ba0d_0.conda + noarch: python + sha256: 9e8b94a2c9b4479cac80def117178a1658b089b9e5d4ee64408d2e4ff89fdaba + md5: ceffbc006d87e8f81e750cebd63fd8c4 + depends: + - python + - libstdcxx >=15 + - libgcc >=15 + - __glibc >=2.17,<3.0.a0 + - zeromq >=4.3.5,<4.4.0a0 + - _python_abi3_support 1.* + - cpython >=3.12 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=compressed-mapping + run_exports: {} + size: 214050 + timestamp: 1787300896477 +- conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + sha256: 776363493bad83308ba30bcb88c2552632581b143e8ee25b1982c8c743e73abc + md5: 353823361b1d27eb3960efb076dfcaf6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: LicenseRef-Qhull + purls: [] + run_exports: + weak: + - qhull >=2020.2,<2020.3.0a0 + size: 552937 + timestamp: 1720813982144 +- conda: https://conda.anaconda.org/conda-forge/linux-64/rattler-build-0.74.0-hf01adef_1.conda + sha256: 516a606bdaab6be626036a7a8f5e10db3d3b8a297b03ede0b93222bddce901d9 + md5: 184a4c38cd3b9c5326147484450f14f7 + depends: + - patchelf + - libgcc >=15 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=15 + - openssl >=3.5.8,<4.0a0 + constrains: + - __glibc >=2.17 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 19818945 + timestamp: 1787728727276 +- conda: https://conda.anaconda.org/conda-forge/linux-64/rdma-core-64.0-h192683f_0.conda + sha256: 045de351e6f816f774cc6d04f935a527ffe7e0a46d71b9c058f147a2b70b740e + md5: 6868d036199abfb9969fe738ae59e1b0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libnl >=3.11.0,<4.0a0 + - libstdcxx >=14 + - libsystemd0 >=257.13 + - libudev1 >=257.13 + license: Linux-OpenIB + license_family: BSD + purls: [] + run_exports: + weak: + - rdma-core >=64.0 + size: 1298868 + timestamp: 1788352255868 +- conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h94463f1_2.conda + sha256: 7279908454f0c87b84ebc4aec6924f02f41a105d88420fb35dfaf5ecd976e0f5 + md5: d83f2ee212d217a6d745a00e5be84671 + depends: + - libre2-11 2025.11.05 h60473fc_2 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libre2-11 >=2025.11.5 + - re2 + size: 27397 + timestamp: 1781312576962 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-hd6e31c0_1.conda + sha256: 01b3fe073a66e321970d09e04b388708f8cbdca5cdfbfcb7c9eeb470ad10383d + md5: 69c01c781e7c8190bbdaf79e3848c5ca + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - ncurses >=6.6,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + run_exports: + weak: + - readline >=8.3,<9.0a0 + size: 348899 + timestamp: 1787033801506 +- conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb03c661_2.conda + sha256: 186a5b225077ad5f4656966da947d43307101950751ef4a239b455588756b4e1 + md5: 007602d697e07c11ff9864964eba5ee3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - rhash >=1.4.6,<2.0a0 + size: 194994 + timestamp: 1786731436520 +- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-2026.6.3-py312hc767a74_1.conda + sha256: a47c5947ed7168ff6e9aa8fc09aad93aa74ca42fe04695cd755d9468c433e73e + md5: 590f306bbc6d9fde9353bcd9a19b70dc + depends: + - python + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + purls: + - pkg:pypi/rpds-py?source=compressed-mapping + run_exports: {} + size: 300752 + timestamp: 1788228344574 +- conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.5-h7e3ee7f_1.conda + sha256: 7369ac21f3561e2203f5b1600ef0671270057380783ca4b9e15f679ba25db575 + md5: fa1c00d999e83ec20173c9775f71a1f1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - openssl >=3.5.7,<4.0a0 + license: Apache-2.0 + license_family: Apache + purls: [] + run_exports: + weak: + - s2n >=1.7.5,<1.7.6.0a0 + size: 392607 + timestamp: 1783164766248 +- conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.6-h7e3ee7f_0.conda + sha256: 1e1ccc56fdf3fe82150b4eac1d626c806e612af208fbf40ce3abfe9a2eb2a626 + md5: e112cadcd79412d81496e784884bddf0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - openssl >=3.5.7,<4.0a0 + license: Apache-2.0 + license_family: Apache + purls: [] + run_exports: + weak: + - s2n >=1.7.6,<1.7.7.0a0 + size: 393680 + timestamp: 1784674401024 +- conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py311hbe70eeb_1.conda + sha256: 3ae2ff1d1cc5930de2ca6ac03216118bdf13b2af6098e28e827f1ba25bfcbc4e + md5: 089de2ee37e4e19885c985a4fe4aaf14 + depends: + - __glibc >=2.17,<3.0.a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.3.0 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx >=14 + - numpy <2.7 + - numpy >=1.23,<3 + - numpy >=1.25.2 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + run_exports: {} + size: 17303931 + timestamp: 1779874783665 +- conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py312h54fa4ab_0.conda + sha256: c304dfb0bbf0d824d3706623f6437237d7bfc83941bb7b18f80e05abb10ec79e + md5: f8d242c552b0f7f682451ce95879af5e + depends: + - __glibc >=2.17,<3.0.a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.3.0 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx >=14 + - numpy <2.7 + - numpy >=1.23,<3 + - numpy >=2.0.0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + run_exports: {} + size: 17104066 + timestamp: 1781912972195 +- conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py313h4b8bb8b_0.conda + sha256: 3ffdca726208a7394b2aa9989e5b1718e28a6285329bbc10bea4e92066e14f49 + md5: a32f88181ff9a3451c71be1f17a7c799 + depends: + - __glibc >=2.17,<3.0.a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.3.0 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx >=14 + - numpy <2.7 + - numpy >=1.23,<3 + - numpy >=2.0.0 + - python >=3.13,<3.14.0a0 + - python_abi 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + run_exports: {} + size: 17171066 + timestamp: 1781912954186 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda + sha256: 57afc2ab5bdb24cf979964018dddbc5dfaee130b415e6863765e45aed2175ee4 + md5: e8a0b4f5e82ecacffaa5e805020473cb + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + - libgcc >=14 + - libstdcxx >=14 + license: BSL-1.0 + purls: [] + run_exports: + weak: + - sleef >=3.9.0,<4.0a0 + size: 1951720 + timestamp: 1756274576844 +- conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda + sha256: 48f3f6a76c34b2cfe80de9ce7f2283ecb55d5ed47367ba91e8bb8104e12b8f11 + md5: 98b6c9dc80eb87b2519b97bcf7e578dd + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - snappy >=1.2.2,<1.3.0a0 + size: 45829 + timestamp: 1762948049098 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.52-py312h5253ce2_0.conda + sha256: c6677580087354e02e98fe3d356ca3de3d6f0521da831ea949b7a42e52bfd60d + md5: 3d301c6754633aacf499ac6ee63bd2b8 + depends: + - python + - greenlet !=0.4.17 + - typing-extensions >=4.6.0 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/sqlalchemy?source=compressed-mapping + run_exports: {} + size: 3721699 + timestamp: 1786535232010 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda + sha256: 30cb9355c2fefc20ff1a3d6566b9714d5614086a2524c07721fc344eb20515ae + md5: 7073b15f9364ebc118998601ac6ca6a6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libhwloc >=2.13.0,<2.13.1.0a0 + - libstdcxx >=14 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: {} + size: 182331 + timestamp: 1778673758649 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h1df4ec4_4.conda + build_number: 104 + sha256: a1a241d172c1ccab067ba245206dd048bc3c2d1b84504b53c9468e99adfc16a1 + md5: 676a2f9b1c4fcf57b70aa5c65f6c60d0 + depends: + - libgcc >=15 + - __glibc >=2.17,<3.0.a0 + - libzlib >=1.3.2,<2.0a0 + constrains: + - xorg-libx11 >=1.8.13,<2.0a0 + license: TCL + purls: [] + run_exports: + weak: + - tk >=8.6.13,<8.7.0a0 + size: 3566806 + timestamp: 1787272857910 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.8-py312h4c3975b_0.conda + sha256: 2ea8f8b10e869b675d2fba157b387eaf4eed1696bfc924bb7b28e67d7aa0a947 + md5: 5423c2b8f82d60320e65b9ff30babbdf + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=compressed-mapping + run_exports: {} + size: 869730 + timestamp: 1786226754702 +- conda: https://conda.anaconda.org/conda-forge/linux-64/triton-3.7.1-cuda129py312h811769c_1.conda + sha256: f6057dfe20a473f0b1ab7e1a231ebce774ba934a3c54176efb58bf1133aaa44b + md5: b32d0cc6a3091264c0b61db49ecc8718 + depends: + - python + - setuptools + - cuda-nvcc-tools + - cuda-cuobjdump + - cuda-cudart + - cuda-cupti + - libstdcxx >=14 + - libgcc >=14 + - cuda-version >=12.9,<13 + - __glibc >=2.17,<3.0.a0 + - zstd >=1.5.7,<1.6.0a0 + - cuda-cupti >=12.9.79,<13.0a0 + - python_abi 3.12.* *_cp312 + - libzlib >=1.3.2,<2.0a0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/triton?source=hash-mapping + run_exports: {} + size: 40337080 + timestamp: 1781881966422 +- conda: https://conda.anaconda.org/conda-forge/linux-64/triton-3.7.1-cuda130py312hc6dca4b_1.conda + sha256: eb2c1eb649d262cbe880741bfff47e1755339d285d3c5317ea00621414c73798 + md5: aed2cbe1dbc1e8651787aad24fff18f9 + depends: + - python + - setuptools + - cuda-nvcc-tools + - cuda-cuobjdump + - cuda-cudart + - cuda-cupti + - cuda-version >=13.0,<14 + - __glibc >=2.28,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - libzlib >=1.3.2,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + - cuda-cupti >=13.0.85,<14.0a0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/triton?source=hash-mapping + run_exports: {} + size: 40340701 + timestamp: 1781881962924 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ucc-1.8.0-h539fd1b_2.conda + sha256: 073f75becf0aade3d7a6606609630dd0fef1aa37a9a73a34c8c7ced6b75c5b2e + md5: 9594197df79eb266bf52f4e5d1407d6a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - rdma-core >=63.0 + - ucx >=1.22.0,<1.22.1.0a0 + constrains: + - cuda-cudart + - cuda-version >=12,<13.0a0 + - nccl >=2.30.7.1,<3.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - ucc >=1.8.0,<2.0a0 + size: 12957132 + timestamp: 1785867959443 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ucc-1.8.0-h7a4b9c7_2.conda + sha256: 61399c7f65abf7a16ae71a96574c85eb105d793693e7a5b48223a517e00eb261 + md5: fef385ab71c2eb1917483b90f7968ea7 + depends: + - __glibc >=2.28,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - rdma-core >=63.0 + - ucx >=1.22.0,<1.22.1.0a0 + constrains: + - cuda-cudart + - cuda-version >=13,<14.0a0 + - nccl >=2.30.7.1,<3.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - ucc >=1.8.0,<2.0a0 + size: 10250558 + timestamp: 1785867874503 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ucx-1.22.0-h1527165_0.conda + sha256: d77cfdb2086208c54235d5becca646579800b8cfe12e694abc82230990325f9a + md5: a2f8c579211d751098fd883885520ec8 + depends: + - __glibc >=2.28,<3.0.a0 + - _openmp_mutex >=4.5 + - libgcc >=14 + - libstdcxx >=14 + - rdma-core >=63.0 + constrains: + - cuda-cudart + - cuda-version >=13,<14.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - ucx >=1.22.0,<1.23.0a0 + size: 9435237 + timestamp: 1785789448620 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ucx-1.22.0-hb659a20_0.conda + sha256: 97e6f7a2a7341f3dabd584389b24e58e3983445f0a11f5b11f73f947da443ad2 + md5: df26bd65c3b0060349578809f75ce63b + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + - libgcc >=14 + - libstdcxx >=14 + - rdma-core >=63.0 + constrains: + - cuda-cudart + - cuda-version >=12,<13.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - ucx >=1.22.0,<1.23.0a0 + size: 9572007 + timestamp: 1785789452621 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py312hd9148b4_0.conda + sha256: c975070ac28fe23a5bbb2b8aeca5976b06630eb2de2dc149782f74018bf07ae8 + md5: 55fd03988b1b1bc6faabbfb5b481ecd7 + depends: + - __glibc >=2.17,<3.0.a0 + - cffi + - libgcc >=14 + - libstdcxx >=14 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ukkonen?source=hash-mapping + run_exports: {} + size: 14882 + timestamp: 1769438717830 +- conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py311h49ec1c0_0.conda + sha256: 2bd8ee058dc98e614003591eb221a8b08449768b13aebe76dad8528bf0f5f88b + md5: 2889f0c0b6a6d7a37bd64ec60f4cc210 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/unicodedata2?source=hash-mapping + run_exports: {} + size: 409682 + timestamp: 1770909108616 +- conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda + sha256: 895bbfe9ee25c98c922799de901387d842d7c01cae45c346879865c6a907f229 + md5: 0b6c506ec1f272b685240e70a29261b8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/unicodedata2?source=hash-mapping + run_exports: {} + size: 410641 + timestamp: 1770909099497 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda + sha256: 49b532d1df875c6749d9078b56a76f3f5db49a5abe0ca620b593ed474ef0ebf1 + md5: 85c9442aec283b4e464fa9ecc484a2f3 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - xorg-libice >=1.1.2,<2.0a0 + size: 62517 + timestamp: 1786474410404 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-h0d788c3_1.conda + sha256: ef907caee0665cf3b0f775602cc50e388e3bade8ce22ecade0873ff26604b2fd + md5: aa7459ed9ad086ba11dda843d764b33d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - xorg-libice >=1.1.2,<2.0a0 + - libuuid >=2.42.2,<3.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - xorg-libsm >=1.2.6,<2.0a0 + size: 30739 + timestamp: 1786545374265 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_1.conda + sha256: 68053eebfa9f0d91666786c8fb5839d989aa9b869add92cb8815228bb2d7302c + md5: 8c282bbe4808a3cc80a5c98e9aec1cfc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libxcb >=1.17.0,<2.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - xorg-libx11 >=1.8.13,<2.0a0 + size: 839578 + timestamp: 1787087012372 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_2.conda + sha256: cbf891f6cc1a859347680af1c8562bc6b033bf182a2a3bb536016932be3206de + md5: f06ef439c280a5f90b8bf62355008dbc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - xorg-libxau >=1.0.12,<2.0a0 + size: 16419 + timestamp: 1786381001122 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_2.conda + sha256: c50a16c05ccd7fe7dd6d6cfb539f4e9a491d50f9ed7a5c902fec638f7d0d27be + md5: 2e66c929f3d879708335b6ea4557c838 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - xorg-libxdmcp >=1.1.5,<2.0a0 + size: 21120 + timestamp: 1786381006369 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-h7cc23a3_1.conda + sha256: aa9bbe8b278aacc194e280ff5037f9f9a1f2c5b33ed97de8e7f01cfbe90dda43 + md5: e5b6b28536b81b3f4cb20db4668a4642 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - xorg-libx11 >=1.8.13,<2.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - xorg-libxext >=1.3.7,<2.0a0 + size: 53124 + timestamp: 1787100841900 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb03c661_1.conda + sha256: 6901f91d398811e4ec89d7e20a69abac02a7bfebfaf073338b7ea3d1a99685b7 + md5: e470d224a7a5be1b1d021bded7abb536 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - xorg-libx11 >=1.8.13,<2.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - xorg-libxrender >=0.9.12,<0.10.0a0 + size: 34645 + timestamp: 1787100191192 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-hebe6cf0_3.conda + sha256: d164dfa75ecd538f6fd68765defcc06aa875bc697b9b215362d79a2a73125dd0 + md5: e741576fb8f89821ac7c1c537322a33d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - yaml >=0.2.5,<0.3.0a0 + size: 84936 + timestamp: 1787228426393 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h09e67af_11.conda + sha256: dc9f28dedcb5f35a127fad2d847674d2833369dd616d294e423b8997df31d8a8 + md5: 96b08867e21d4694fa5c2c226e6581b0 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - krb5 >=1.22.2,<1.23.0a0 + - libsodium >=1.0.22,<1.0.23.0a0 + license: MPL-2.0 + license_family: MOZILLA + purls: [] + run_exports: + weak: + - zeromq >=4.3.5,<4.4.0a0 + size: 311184 + timestamp: 1779123989774 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_3.conda + sha256: 16080a1c7724f7d25727cdc23c7658e0cec2db52448c1dc0c33467ee2c6e1c62 + md5: 6acb86426229f96f93e5468d1df3a5e8 + depends: + - __glibc >=2.17,<3.0.a0 + - libzlib 1.3.2 h25fd6f3_3 + license: Zlib + license_family: Other + purls: [] + run_exports: + weak: + - libzlib >=1.3.2,<2.0a0 + size: 96132 + timestamp: 1785362957588 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hce19668_1.conda + sha256: 8b786bb4380fa69a718b08a400040b865bc9207eda337e0a1955717c3c3a9403 + md5: 1726acec19beeed1c764385cd8622405 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15 + - libstdcxx >=15 + license: Zlib + license_family: Other + purls: [] + run_exports: + weak: + - zlib-ng >=2.3.3,<2.4.0a0 + size: 123959 + timestamp: 1786736890973 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda + sha256: 47d682b9f6d6ec9eb1a6e6c3e75ea6273e899e78fb7fc59f81d39745009fbc60 + md5: aa459086047c0e5e27023ab19f8cb86a + depends: + - __glibc >=2.17,<3.0.a0 + - libzlib >=1.3.2,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - zstd >=1.5.7,<1.6.0a0 + size: 601301 + timestamp: 1786599621503 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda + build_number: 20 + sha256: a2527b1d81792a0ccd2c05850960df119c2b6d8f5fdec97f2db7d25dc23b1068 + md5: 468fd3bb9e1f671d36c2cbc677e56f1d + depends: + - libgomp >=7.5.0 + constrains: + - openmp_impl <0.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + strong: + - _openmp_mutex >=4.5 + size: 28926 + timestamp: 1770939656741 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-8_kmp_llvm.conda + build_number: 8 + sha256: 7a5e2f64baac739aa01c68273ccde7020eb4801e6f1d2973f8c6caf1702b0bfa + md5: 9369edb19518c51ba763f7d00c673988 + depends: + - llvm-openmp >=9.0.1 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - _openmp_mutex >=4.5 + size: 8050 + timestamp: 1788046407214 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ast-serialize-0.9.0-py311h8ca180e_0.conda + noarch: python + sha256: 3c40d163cce6d32185d97a17201c15b27e001c0c581a69302cf1099fa4cf7b95 + md5: c650025bc276b3435b12c7669af887cc + depends: + - python >=3.11 + - libgcc >=15 + - _python_abi3_support 1.* + - cpython >=3.11 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ast-serialize?source=hash-mapping + run_exports: {} + size: 1123621 + timestamp: 1788442328287 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.10.4-h03961ac_1.conda + sha256: 6d9fe5b1e2335e7f0364da18a7467e9bea66184b189b1f3e4a103bd7ce74eee5 + md5: 3d7c8f2150a3ae6238f82a03e72771c7 + depends: + - libgcc >=14 + - aws-c-http >=0.11.0,<0.11.1.0a0 + - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 + - aws-c-cal >=0.9.14,<0.9.15.0a0 + - aws-c-io >=0.27.3,<0.27.4.0a0 + - aws-c-common >=0.14.2,<0.14.3.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-c-auth >=0.10.4,<0.10.5.0a0 + size: 144598 + timestamp: 1784086854605 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-auth-0.10.4-h31aafc4_2.conda + sha256: 212285411937be51aaa03d3c1d28f51475d56b500d92b51318be46efc041c92a + md5: 026b88ebd1c322724ad2e7624df616c5 + depends: + - libgcc >=14 + - aws-c-cal >=0.9.15,<0.9.16.0a0 + - aws-c-io >=0.27.5,<0.27.6.0a0 + - aws-c-common >=0.14.3,<0.14.4.0a0 + - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 + - aws-c-http >=0.11.0,<0.11.1.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-auth >=0.10.4,<0.10.5.0a0 + size: 144622 + timestamp: 1785199057528 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.9.14-h6c1c863_4.conda + sha256: ea92667f514ec66e9e9b46a405185a4b36747c9e9c98bb2ecaa585e2ea6b4d76 + md5: 4aa7ed2c75a8d91a34b5be26fee04447 + depends: + - aws-c-common >=0.14.2,<0.14.3.0a0 + - libgcc >=14 + - openssl >=3.5.7,<4.0a0 + license: Apache-2.0 + license_family: Apache + purls: [] + run_exports: + weak: + - aws-c-cal >=0.9.14,<0.9.15.0a0 + size: 60395 + timestamp: 1784043425321 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-cal-0.9.15-he0a0ff2_1.conda + sha256: b824e648f4497755531141dc3b5cf0932567f4927918ea23e84e8a7722047567 + md5: a5232f99e4d2aa06e7d4ac96415a2e79 + depends: + - aws-c-common >=0.14.3,<0.14.4.0a0 + - libgcc >=14 + - openssl >=3.5.7,<4.0a0 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - aws-c-cal >=0.9.15,<0.9.16.0a0 + size: 60153 + timestamp: 1785157817585 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.14.2-he30d5cf_0.conda + sha256: 415574b4d4e78257bb3f03a5deb3791fe9ac3ce8e452dd29957d1cb08d0932e2 + md5: ef1cf9bbfb175c8f30b15c0a045807fd + depends: + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + purls: [] + run_exports: + weak: + - aws-c-common >=0.14.2,<0.14.3.0a0 + size: 269577 + timestamp: 1783637251921 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-common-0.14.3-he30d5cf_0.conda + sha256: 0ea7a42ed8c9b4c8cad15de681c1d246e49a6bd75b611a0449b3268363154f05 + md5: d58692f1ab81d9190695afd8f7dfffde + depends: + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - aws-c-common >=0.14.3,<0.14.4.0a0 + size: 269898 + timestamp: 1784596154747 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.3.2-hbc11874_5.conda + sha256: 516929a3c16581ccf7822755772c6f676e8f24b0936746f6f2f91ed46302a0f9 + md5: cc1d538269bbd5e5379e417a07e673af + depends: + - libgcc >=14 + - aws-c-common >=0.14.3,<0.14.4.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-compression >=0.3.2,<0.3.3.0a0 + size: 23523 + timestamp: 1785157577428 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-compression-0.3.2-hbf34bff_4.conda + sha256: 160b9e94ef5e3edb1c3013e0d47e6eeeebd29197a980e5a03285c414c07ca87b + md5: ccc9c3160d95486f2de5d5efdb08a0a6 + depends: + - libgcc >=14 + - aws-c-common >=0.14.2,<0.14.3.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-c-compression >=0.3.2,<0.3.3.0a0 + size: 23533 + timestamp: 1784042870708 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-event-stream-0.7.1-h423fd5f_4.conda + sha256: 849f96172d9e9da8c9f4913193f383581fce715722e825fbcaebeb43a610e3bc + md5: 0d359b84eeae657d590354b4bf13f804 + depends: + - libstdcxx >=14 + - libgcc >=14 + - aws-c-io >=0.27.3,<0.27.4.0a0 + - aws-c-common >=0.14.2,<0.14.3.0a0 + - aws-checksums >=0.2.10,<0.2.11.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-c-event-stream >=0.7.1,<0.7.2.0a0 + size: 62837 + timestamp: 1784075715343 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.11.0-h299f1a2_5.conda + sha256: ea2b0575c8ac6d3701f31525c6b4265d2b7107e703ffeed1a3568dc45532171e + md5: b662a55678d5cb908b64f2dc47518613 + depends: + - libgcc >=14 + - aws-c-io >=0.27.5,<0.27.6.0a0 + - aws-c-cal >=0.9.15,<0.9.16.0a0 + - aws-c-common >=0.14.3,<0.14.4.0a0 + - aws-c-compression >=0.3.2,<0.3.3.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-http >=0.11.0,<0.11.1.0a0 + size: 220595 + timestamp: 1785186129641 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-http-0.11.0-hb2c4768_4.conda + sha256: 27958eb16db0931da2cbeb238fa6dafa85a844df43ddd2f2aaba33423a620879 + md5: 8e5a8a7f923a502699da9122857f6da9 + depends: + - libgcc >=14 + - aws-c-common >=0.14.2,<0.14.3.0a0 + - aws-c-io >=0.27.3,<0.27.4.0a0 + - aws-c-cal >=0.9.14,<0.9.15.0a0 + - aws-c-compression >=0.3.2,<0.3.3.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-c-http >=0.11.0,<0.11.1.0a0 + size: 220610 + timestamp: 1784075707703 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.27.3-hc846123_1.conda + sha256: f0c6a11599605b2ba91beee54a76324994e1b9b3fe0bcfda9176312497d94fad + md5: e45dc7a3367a5cc5279ac6109453a6c7 + depends: + - libgcc >=14 + - s2n >=1.7.5,<1.7.6.0a0 + - aws-c-cal >=0.9.14,<0.9.15.0a0 + - aws-c-common >=0.14.2,<0.14.3.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-c-io >=0.27.3,<0.27.4.0a0 + size: 188979 + timestamp: 1784054849410 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-io-0.27.5-hd6bac6b_1.conda + sha256: 7b8e3f018d42db7bd6f94ad2e6fa3baa44a9ccc517c765923e537f56d2f98ef8 + md5: d52accd5bce872c54f3604ca4cdc2ef7 + depends: + - libgcc >=14 + - aws-c-cal >=0.9.15,<0.9.16.0a0 + - s2n >=1.7.6,<1.7.7.0a0 + - aws-c-common >=0.14.3,<0.14.4.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-io >=0.27.5,<0.27.6.0a0 + size: 189475 + timestamp: 1785170085970 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-mqtt-0.16.0-hf64e385_2.conda + sha256: 2f0ab01210a1573235283eebb6ef43fc4540c78c9b12536723a99f2c35ba243e + md5: 95ef1f416e1c4a303e99d42882168ca9 + depends: + - libgcc >=14 + - aws-c-common >=0.14.2,<0.14.3.0a0 + - aws-c-io >=0.27.3,<0.27.4.0a0 + - aws-c-http >=0.11.0,<0.11.1.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-c-mqtt >=0.16.0,<0.16.1.0a0 + size: 200289 + timestamp: 1784087579018 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.12.8-h681413d_1.conda + sha256: 2e52c4584c1a1db45dab865b7616ad80a5924ff1343f91724416f2189b4eb111 + md5: da4fba448cece5e841abcc238e47ba9f + depends: + - libgcc >=14 + - aws-c-http >=0.11.0,<0.11.1.0a0 + - aws-c-common >=0.14.2,<0.14.3.0a0 + - openssl >=3.5.7,<4.0a0 + - aws-c-io >=0.27.3,<0.27.4.0a0 + - aws-c-auth >=0.10.4,<0.10.5.0a0 + - aws-checksums >=0.2.10,<0.2.11.0a0 + - aws-c-cal >=0.9.14,<0.9.15.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-c-s3 >=0.12.8,<0.12.9.0a0 + size: 163135 + timestamp: 1784100999745 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-s3-0.13.1-he888730_1.conda + sha256: 7fa7872d401bbb8c5804e39ff510b7b554c2c3c86d597fecfba713c14f29400e + md5: 3c6a1426bf37d6576d659b696d23e104 + depends: + - libgcc >=14 + - aws-c-auth >=0.10.4,<0.10.5.0a0 + - aws-c-http >=0.11.0,<0.11.1.0a0 + - aws-c-io >=0.27.5,<0.27.6.0a0 + - aws-c-cal >=0.9.15,<0.9.16.0a0 + - aws-c-common >=0.14.3,<0.14.4.0a0 + - openssl >=3.5.7,<4.0a0 + - aws-checksums >=0.2.10,<0.2.11.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-s3 >=0.13.1,<0.13.2.0a0 + size: 164599 + timestamp: 1785351308565 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.2.7-hbc11874_3.conda + sha256: 13f3432f5f9fdaf84db33ac06976610f7495db54f134ce396218d6b1a1f082c1 + md5: 155b22146110ad50c07b5988c9411035 + depends: + - libgcc >=14 + - aws-c-common >=0.14.3,<0.14.4.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 + size: 72360 + timestamp: 1785159243486 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-c-sdkutils-0.2.7-hbf34bff_2.conda + sha256: 23900fef809514756bdb6ecabf57ba885043e6b529e8f54cff54c6a686b2df3e + md5: 66caa7d5a2d03be07581008af67ca7a9 + depends: + - libgcc >=14 + - aws-c-common >=0.14.2,<0.14.3.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 + size: 72345 + timestamp: 1784044274788 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.2.10-hbc11874_5.conda + sha256: dee0e78a46a070b687055c25c477af842c4eb86eb9ce2d82bb09bcee264e4b08 + md5: 5d70c0f98a713a576a286b38c0e550d1 + depends: + - libgcc >=14 + - aws-c-common >=0.14.3,<0.14.4.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-checksums >=0.2.10,<0.2.11.0a0 + size: 99971 + timestamp: 1785339185984 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-checksums-0.2.10-hbf34bff_4.conda + sha256: 0ce7c2234ca5220f455e7c12ad10fe99c74d50b692d932548665cbada323db40 + md5: a6ca00a2a9e89bd1963395337e94bf30 + depends: + - libgcc >=14 + - aws-c-common >=0.14.2,<0.14.3.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-checksums >=0.2.10,<0.2.11.0a0 + size: 99946 + timestamp: 1784044256016 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-crt-cpp-0.40.1-h18900c3_3.conda + sha256: 4fa8fa029b442a5499f65bb68c1ac52f87b8e6d9f429eb9a95214d59cfd0d32c + md5: 163e781b8820eff4f86e28d5310a9318 + depends: + - libgcc >=14 + - libstdcxx >=14 + - aws-c-auth >=0.10.4,<0.10.5.0a0 + - aws-c-io >=0.27.3,<0.27.4.0a0 + - aws-c-cal >=0.9.14,<0.9.15.0a0 + - aws-c-common >=0.14.2,<0.14.3.0a0 + - aws-c-event-stream >=0.7.1,<0.7.2.0a0 + - aws-c-http >=0.11.0,<0.11.1.0a0 + - aws-c-mqtt >=0.16.0,<0.16.1.0a0 + - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 + - aws-c-s3 >=0.12.8,<0.12.9.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-crt-cpp >=0.40.1,<0.40.2.0a0 + size: 333899 + timestamp: 1784113243926 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aws-sdk-cpp-1.11.833-h1131a43_9.conda + sha256: 9d377157e9021e583d4b4e17aee05ea7c417d5516aaaaeb5a51ed7ac9675d058 + md5: 2fea7699a12af3e193214e0d820128ec + depends: + - libgcc >=14 + - libstdcxx >=14 + - aws-crt-cpp >=0.40.1,<0.40.2.0a0 + - aws-c-event-stream >=0.7.1,<0.7.2.0a0 + - libzlib >=1.3.2,<2.0a0 + - aws-c-common >=0.14.2,<0.14.3.0a0 + - libcurl >=8.21.0,<9.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-sdk-cpp >=1.11.833,<1.11.834.0a0 + size: 3343033 + timestamp: 1784137273922 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-core-cpp-1.16.3-h412bcfc_0.conda + sha256: 5ba7676afdda3b325068e4da6192561acf4d11ce6352e86c20811043d71d5974 + md5: eb4544865559667708a887e635b8f472 + depends: + - libcurl >=8.19.0,<9.0a0 + - libgcc >=14 + - libstdcxx >=14 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + size: 340347 + timestamp: 1775240498957 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-identity-cpp-1.13.3-hd0001b6_2.conda + sha256: cec5f8f1b866eae6f02110c5b4f2530c5ede3095b5e59431349f7352c8c1b1fb + md5: c30d9e466e546970b50fbbcd335b60a0 + depends: + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + - libgcc >=14 + - libstdcxx >=14 + - openssl >=3.5.7,<4.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - azure-identity-cpp >=1.13.3,<1.13.4.0a0 + size: 231030 + timestamp: 1781269704268 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-blobs-cpp-12.18.0-h2e50874_1.conda + sha256: f9b95610e8432c8d419080d71038d396d50188dfa330e0e7d1402ff3dbd1cd87 + md5: 8de9d169d8ab02da10afbd2e2175282e + depends: + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + - azure-storage-common-cpp >=12.14.0,<12.14.1.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - azure-storage-blobs-cpp >=12.18.0,<12.18.1.0a0 + size: 531661 + timestamp: 1781285567956 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-common-cpp-12.14.0-hacd5e5f_1.conda + sha256: af2eb1e58bdfeaf1fded35625d20b5076191357d55350671ef7c18b34e44e277 + md5: 40cef89c86e33d5d58822827bd9e82a6 + depends: + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libxml2 + - libxml2-16 >=2.14.6 + - openssl >=3.5.7,<4.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - azure-storage-common-cpp >=12.14.0,<12.14.1.0a0 + size: 150668 + timestamp: 1781269527467 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/azure-storage-files-datalake-cpp-12.16.0-hde34f15_1.conda + sha256: 10f09615e3c893f6848a8047a6f6644a6f0cab954a60337fbe96f8104aadc134 + md5: e8a075a1e6067cc8e59d7e408c284851 + depends: + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + - azure-storage-blobs-cpp >=12.18.0,<12.18.1.0a0 + - azure-storage-common-cpp >=12.14.0,<12.14.1.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - azure-storage-files-datalake-cpp >=12.16.0,<12.16.1.0a0 + size: 275540 + timestamp: 1781541799749 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.46.1-default_h5f4c503_102.conda + sha256: eebe159bf600943552e4319ff4ce27b6a2dadf0dcc5443e76dcee9259a408e11 + md5: 58f37d76b8234c69dbf2939d511bea0b + depends: + - ld_impl_linux-aarch64 2.46.1 default_h1979696_102 + - sysroot_linux-aarch64 + - zstd >=1.5.7,<1.6.0a0 + license: GPL-3.0-only + license_family: GPL + run_exports: {} + size: 4677171 + timestamp: 1784214549910 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-1.2.0-h52fc18c_4.conda + sha256: 73cccc8488da976cbdf32e3b5c6182aef6d77c9dfabd0e5f5fa2ca6e03d51921 + md5: 207d4f45f94f6d755a7fe1455e3148d7 + depends: + - brotli-bin 1.2.0 hdc3483e_4 + - libbrotlidec 1.2.0 h011f0d3_4 + - libbrotlienc 1.2.0 hb247b97_4 + - libgcc >=15 + license: MIT + purls: [] + run_exports: + weak: + - libbrotlicommon >=1.2.0,<1.3.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + size: 20666 + timestamp: 1788480313464 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-bin-1.2.0-hdc3483e_4.conda + sha256: fa14795d6f6ee2ab5e1f5de22ab105192a5c01554ab9125e7346530e3704f3cf + md5: ff212e0f634935c1e400dec3e67168c5 + depends: + - libbrotlidec 1.2.0 h011f0d3_4 + - libbrotlienc 1.2.0 hb247b97_4 + - libgcc >=15 + license: MIT + purls: [] + run_exports: {} + size: 21097 + timestamp: 1788480306797 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_10.conda + sha256: 24eacc8a20fd7c4616566178562bef7f9344eb4a8700cfc3180fa75a6ff9d39f + md5: fd544ef1c672d645bf78e5819cbb8f91 + depends: + - libgcc >=14 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + run_exports: + weak: + - bzip2 >=1.0.8,<2.0a0 + size: 194694 + timestamp: 1785906301397 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-ares-1.34.8-h29ee22c_2.conda + sha256: 3838d10a78c206a1a4ec7ff041880b4f9b8ecde3520c911daae9e06baeb8858e + md5: eb80eb38625b8552a099aa88f8ba5db7 + depends: + - libgcc >=15 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - c-ares >=1.34.8,<2.0a0 + size: 241210 + timestamp: 1787169968125 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/c-compiler-2.0.0-h1f08cd5_0.conda + sha256: f48a9cb26eaf043e59a76933a61a62e73e360b2ce7c2045581540e31f826f8a6 + md5: 111808f8dee7e11e1ebe2461d4301edd + depends: + - gcc 15.* + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 6988 + timestamp: 1786642160586 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-hca320e2_3.conda + sha256: 1ac3088ec4ec12b401cd3095dbd178b29651e99bfd25d0a85400624037735d91 + md5: 429852374b814f1fdeee970a3e1512e7 + depends: + - fontconfig >=2.18.3,<3.0a0 + - fonts-conda-ecosystem + - icu >=78.3,<79.0a0 + - libexpat >=2.8.1,<3.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libgcc >=15 + - libglib >=2.88.3,<3.0a0 + - libpng >=1.6.58,<1.7.0a0 + - libstdcxx >=15 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - pixman >=0.46.4,<1.0a0 + - xorg-libice >=1.1.2,<2.0a0 + - xorg-libsm >=1.2.6,<2.0a0 + - xorg-libx11 >=1.8.13,<2.0a0 + - xorg-libxext >=1.3.7,<2.0a0 + - xorg-libxrender >=0.9.12,<0.10.0a0 + license: LGPL-2.1-only or MPL-1.1 + purls: [] + run_exports: + weak: + - cairo >=1.18.4,<2.0a0 + size: 977511 + timestamp: 1788221293457 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/catch2-3.16.0-h45ce4d5_0.conda + sha256: 674ee6e038149d00572feddd7dc27d21f84c36966060850184dada23b1c5e21b + md5: 9c3d4936cdb5a00b8665f3136387d094 + depends: + - libstdcxx >=15 + - libgcc >=15 + license: BSL-1.0 + run_exports: + weak: + - catch2 >=3.16.0,<4.0a0 + size: 651219 + timestamp: 1787658438323 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-2.1.1-py312h563f9cf_3.conda + sha256: 4d82c1db47442fa875fc28a9bb558936ce1eaf6ee7dd75342d2b08c673ef1895 + md5: e24f093fe036550d5e9810fcceff3849 + depends: + - libffi >=3.7.0,<3.8.0a0 + - libgcc >=15 + - pycparser + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: MIT + purls: + - pkg:pypi/cffi?source=compressed-mapping + run_exports: {} + size: 325201 + timestamp: 1788485261662 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cmake-3.31.8-hc9d863e_0.conda + sha256: 91cbfd13132b7253a6ef001292f5cf59deac38d2cbc86d6c1ad6ebf344cd998c + md5: 855e698fd08794a573cd6104be8da4d0 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libcurl >=8.14.1,<9.0a0 + - libexpat >=2.7.1,<3.0a0 + - libgcc >=14 + - liblzma >=5.8.1,<6.0a0 + - libstdcxx >=14 + - libuv >=1.51.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - rhash >=1.4.6,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 20216587 + timestamp: 1757877248575 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/conda-gcc-specs-15.3.0-hbdd0822_4.conda + sha256: d61e8e35090eac2af977f40d9b068fde2c3fdc3494f93230d955947709e4b581 + md5: afa5c705e03c6afce0228ff2283d6309 + depends: + - gcc_impl_linux-aarch64 >=15.3.0,<15.3.1.0a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: {} + size: 32418 + timestamp: 1787617791870 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/contourpy-1.3.3-py312hf18b547_4.conda + sha256: 9c1b308fb3fb3bfd9ed3acbf1373f6f73254b71a5f9373a56f09099c4a93a9e7 + md5: 5527a172fc63ae2916c2aaf50fbef1a5 + depends: + - numpy >=1.25 + - python + - python 3.12.* *_cpython + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/contourpy?source=hash-mapping + run_exports: {} + size: 339097 + timestamp: 1769155976173 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/coverage-7.16.0-py312he7c6268_0.conda + sha256: 657ed7232e91585355c05e333da124db8ea963b55e4f66ad6dfe98f0f264c2c0 + md5: 3aa53c1f698031fb4874c82872bd3660 + depends: + - python + - libgcc >=15 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/coverage?source=hash-mapping + run_exports: {} + size: 416897 + timestamp: 1787966558768 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cxx-compiler-2.0.0-hf41333a_0.conda + sha256: 0616c1e5f97cbcb505f0daa119ca8c9975caca02c84c5bc4ceb0ef65bf7648a3 + md5: ce387759a5f3908b1273247b8660a048 + depends: + - gxx 15.* + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 6970 + timestamp: 1786642161076 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/eigen-5.0.1-hbf0d46f_1.conda + sha256: 0e71401b717fd83177491dd8b4684b1c3b262fa753e6794c7cc71af5bb9ec5b3 + md5: 99a8aca1575446e3c17691e221aa40c6 + license: MPL-2.0 + license_family: MOZILLA + run_exports: {} + size: 1311638 + timestamp: 1788180247246 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fmt-12.1.0-h166da81_1.conda + sha256: 9576231133ef25127cf8855492a6e34a3189e3a8986cc69ebfef6516670d4822 + md5: 2ba56bd59c36644d783ef8a8086ec0e4 + depends: + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - fmt >=12.1.0,<12.2.0a0 + size: 197306 + timestamp: 1785915387774 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.18.3-ha4b22b4_1.conda + sha256: 5f7801b6044ff233943e68f5156d4987fe8447d1be9378fb5c67f7aa009a33e7 + md5: bb629904b3e9326efaa5c39c956f2b63 + depends: + - libexpat >=2.8.1,<3.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libgcc >=15 + - libuuid >=2.42.2,<3.0a0 + - libzlib >=1.3.2,<2.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - fontconfig >=2.18.3,<3.0a0 + - fonts-conda-ecosystem + size: 304159 + timestamp: 1786667327378 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fonttools-4.63.0-py312ha4530ae_0.conda + sha256: e1c4ef9d5d34ac12b2139d9ca2bec9675bb5b6266894d819951b5b333452bb83 + md5: 4922a18cb643859aba71e808609cce6c + depends: + - brotli + - libgcc >=14 + - munkres + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - unicodedata2 >=15.1.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/fonttools?source=hash-mapping + run_exports: {} + size: 2952221 + timestamp: 1778770458588 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fortran-compiler-2.0.0-h2e332f4_0.conda + sha256: ad9f245b65953d936f45a3fbc31e431372d7a202e7f2051bd8ce12f1051c31d4 + md5: 3d22427c8238e7cdf7bab92d64438499 + depends: + - gfortran 15.* + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 6966 + timestamp: 1786642161207 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.14.3-h8af1aa0_2.conda + sha256: 7af9e368efdaf59e0709ae89c2e7f0ce0e1067a857958f367318ff3c27209a64 + md5: f5d76071be867597bab18a0e45d588e1 + depends: + - libfreetype 2.14.3 h8af1aa0_2 + - libfreetype6 2.14.3 h9cc7050_2 + license: GPL-2.0-only OR FTL + purls: [] + run_exports: + weak: + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + size: 174712 + timestamp: 1786640946309 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fribidi-1.0.16-h5bc82ec_2.conda + sha256: d05e07083ca836efadff257f60ef253d38296ea850aa5034bf85bb9b029a9be3 + md5: be4ca084748fe5ceb24ff52486ac802a + depends: + - libgcc >=15 + license: LGPL-2.1-or-later + purls: [] + run_exports: + weak: + - fribidi >=1.0.16,<2.0a0 + size: 63444 + timestamp: 1788385564135 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc-15.3.0-hfdd745d_4.conda + sha256: fc89612ee4e163923ba713a8814114e8c402054e79b85e32b75d1c38031b4362 + md5: 96724903f974e2151a077ec588bf9d7e + depends: + - conda-gcc-specs + - gcc_impl_linux-aarch64 15.3.0 hfe63468_4 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 29466 + timestamp: 1787617883836 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-15.3.0-hfe63468_4.conda + sha256: 6039029f4ce021e0c49fb47824e981ba5d2863498c0855f78a73dc09a75cf151 + md5: a6a25fd37f554f88b36a0d03af7775fa + depends: + - binutils_impl_linux-aarch64 >=2.46.1 + - libgcc >=15.3.0 + - libgcc-devel_linux-aarch64 15.3.0 h6e7e4e0_104 + - libgomp >=15.3.0 + - libsanitizer 15.3.0 he541324_4 + - libstdcxx >=15.3.0 + - libstdcxx-devel_linux-aarch64 15.3.0 h0e8df58_104 + - sysroot_linux-aarch64 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: {} + size: 72956757 + timestamp: 1787617681639 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gflags-2.3.1-h7ac5ae9_0.conda + sha256: ac0c8ebb2e11e638245b1a26cb168468fd4aafc36dd12df8a009f11355360a73 + md5: 3f18cea95a75c9ea2b27315c282579e3 + depends: + - libgcc >=14 + - libstdcxx >=14 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - gflags >=2.3.1,<2.4.0a0 + size: 118758 + timestamp: 1785044710617 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran-15.3.0-hfdd745d_4.conda + sha256: cde72d4c4bb02a5f53529f1df878f97460bdade0752cf74c7e0c38a9a04c3269 + md5: 601f88e28be4407ff07019582ca76c04 + depends: + - conda-gcc-specs + - gcc 15.3.0 hfdd745d_4 + - gcc_impl_linux-aarch64 15.3.0 hfe63468_4 + - gfortran_impl_linux-aarch64 15.3.0 he1101e8_4 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 28843 + timestamp: 1787617899061 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran_impl_linux-aarch64-15.3.0-he1101e8_4.conda + sha256: 7923b29e764754331a0f00c7c9c965b1161969f5d323f7cd105b133f9c6c500c + md5: bcd269bdefaa48b425eac45a3637f3db + depends: + - gcc_impl_linux-aarch64 15.3.0.* + - libgcc >=15.3.0 + - libgfortran5 >=15.3.0 + - libstdcxx >=15.3.0 + - sysroot_linux-aarch64 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: {} + size: 16136856 + timestamp: 1787617823182 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/git-2.55.0-pl5321h06f7e71_1.conda + sha256: 02615f600a0d4242dcedcb7ebd8f1faa02f7136551cc3e804fc879a015237644 + md5: cdbc79af349a0df66596b1f91534e476 + depends: + - libcurl >=8.21.0,<9.0a0 + - libexpat >=2.8.1,<3.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.7,<4.0a0 + - pcre2 >=10.47,<10.48.0a0 + - perl 5.* + constrains: + - __glibc >=2.17 + license: GPL-2.0-or-later and LGPL-2.1-or-later + run_exports: {} + size: 13581417 + timestamp: 1783984665476 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glog-0.7.1-ha2f5727_1.conda + sha256: 007ae9f5f8afc76c9e6cf9fbb00259aa7b9b104cc238bc81f5da405ca80ffff4 + md5: 344bfac751a4186c645dd13458653518 + depends: + - gflags >=2.3.0,<2.4.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - glog >=0.7.1,<0.8.0a0 + size: 153402 + timestamp: 1784094413832 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gmp-6.3.0-h4d6b352_3.conda + sha256: ab165962a7316f269a7bde936aa442bf69f0fed97a497e63ec28f366b4999037 + md5: ce2326e31df1913341036653e1c07baa + depends: + - libstdcxx >=14 + - libgcc >=14 + license: GPL-2.0-or-later OR LGPL-3.0-or-later + purls: [] + run_exports: + weak: + - gmp >=6.3.0,<7.0a0 + size: 457444 + timestamp: 1786629160018 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gmpy2-2.3.1-py312h70c4b35_0.conda + sha256: eb1fe54ab3f7169a051853371a6d61d0cb1ccbf60c8ef08eba7d09a1c2a48e19 + md5: 7277537570c041312f29d00530cf07e8 + depends: + - python + - libgcc >=15 + - mpc >=1.4.0,<2.0a0 + - gmp >=6.3.0,<7.0a0 + - python_abi 3.12.* *_cp312 + - mpfr >=4.2.2,<5.0a0 + license: LGPL-3.0-or-later + license_family: LGPL + purls: + - pkg:pypi/gmpy2?source=hash-mapping + run_exports: {} + size: 320932 + timestamp: 1787066342583 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.15-h7ac5ae9_1.conda + sha256: 5be01914b445dfbde85a4751b1d12b331740e7af68a86e4ef6313ab38a870fdd + md5: c5835ff5788e0d772d67a97bd5fe001b + depends: + - libstdcxx >=14 + - libgcc >=14 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + run_exports: + weak: + - graphite2 >=1.3.15,<2.0a0 + size: 119414 + timestamp: 1786118514013 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx-15.3.0-hfdd745d_4.conda + sha256: 36cd033b6473c8bf782ea7ceee7704b2db43bc2070acb9981620f0e86db7ad8d + md5: a633104932da5d9d0add986193a9b45d + depends: + - conda-gcc-specs + - gcc 15.3.0 hfdd745d_4 + - gxx_impl_linux-aarch64 15.3.0 hcb04d1e_4 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 28835 + timestamp: 1787617914335 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-15.3.0-hcb04d1e_4.conda + sha256: e5a301d88d8902a8954adbf0c4a28b579960bae312d4bd6ba79463a20795a86e + md5: ba4fc57002f3425ed6a36496d299332d + depends: + - gcc_impl_linux-aarch64 15.3.0 hfe63468_4 + - libstdcxx-devel_linux-aarch64 15.3.0 h0e8df58_104 + - sysroot_linux-aarch64 + - tzdata + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: {} + size: 14747440 + timestamp: 1787617855670 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/h5py-3.16.0-nompi_py312h1ad5da3_104.conda + sha256: 295c05d8c3e44acc703ce61424a090b09d10abd3a3517c9f299dd0782576a6ab + md5: 90a4de4867a2a181416cde38cfe5f800 + depends: + - cached-property + - hdf5 >=2.2.0,<3.0a0 + - libgcc >=15 + - numpy >=1.25,<3 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 1335428 + timestamp: 1787109179685 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/hdf5-2.2.0-nompi_hdc8a35d_100.conda + sha256: cd7dea96d0012b4610e130348cee9ef780d61fe11906945934a0a90850010a43 + md5: 7ddb67e2587e01378e591d2222ef7ade + depends: + - aws-c-auth >=0.10.4,<0.10.5.0a0 + - aws-c-common >=0.14.3,<0.14.4.0a0 + - aws-c-http >=0.11.0,<0.11.1.0a0 + - aws-c-io >=0.27.5,<0.27.6.0a0 + - aws-c-s3 >=0.13.1,<0.13.2.0a0 + - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 + - libaec >=1.1.5,<2.0a0 + - libcurl >=8.21.0,<9.0a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.4.0 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.7,<4.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - hdf5 >=2.2.0,<3.0a0 + size: 4401127 + timestamp: 1786233288855 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/hf-xet-1.5.2-py310h160093b_2.conda + noarch: python + sha256: 04dd3253fa1e0d6c47b27886cdc42bbed711b1bf7c2c0be58fe0d56efb825085 + md5: 934e4366e1486e2c75a3dbd58250ef56 + depends: + - python + - libgcc >=14 + - _python_abi3_support 1.* + - cpython >=3.10 + - openssl >=3.5.7,<4.0a0 + constrains: + - __glibc >=2.17 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/hf-xet?source=hash-mapping + run_exports: {} + size: 3460726 + timestamp: 1784665055005 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-py311h3512406_2.conda + sha256: 54d921defd947adb58a90e10203d3bfe6c1f209f5f1a1ad2c6a9f7617f2fb59e + md5: b35bbb1b957440ed742f35fb96eb7f1c + depends: + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - icu >=78.3,<79.0a0 + size: 14688525 + timestamp: 1786545779464 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h5bc82ec_1.conda + sha256: 3999b1472f1e549a0b766428e2823abf20626aac5314b474c9b76bf6eb679def + md5: 6d9be306ecb8dfc9ff46f02cb367d5c2 + depends: + - libgcc >=15 + license: LGPL-2.1-or-later + purls: [] + run_exports: + weak: + - keyutils >=1.6.3,<2.0a0 + size: 129546 + timestamp: 1786739205968 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/kiwisolver-1.5.1-py312he33898b_1.conda + sha256: b2d4aed8ab264a7bd663dcb18e4b7895e7495722e6e3cfb5e01a6b84d2474e5f + md5: 8f9947d646ef06faedb9a0f142753d2a + depends: + - python + - libstdcxx >=15 + - libgcc >=15 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + purls: + - pkg:pypi/kiwisolver?source=hash-mapping + run_exports: {} + size: 81306 + timestamp: 1788506471553 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-h095d8e5_2.conda + sha256: 601d79af94d9562ba70e2d4947034ba159aae293a3c860855335a7c76c14400e + md5: a4d0da122ba952abf76981e76d0d283c + depends: + - keyutils >=1.6.3,<2.0a0 + - libedit >=3.1.20250104,<3.2.0a0 + - libedit >=3.1.20250104,<4.0a0 + - libgcc >=15 + - libstdcxx >=15 + - openssl >=3.5.7,<4.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - krb5 >=1.22.2,<1.23.0a0 + size: 1538590 + timestamp: 1786762058856 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.19.1-h137c43b_2.conda + sha256: 850c544762cc019c9bd75767f30cd30f9c8fab313021b97f53b3a218f1f35668 + md5: 58bc4448c604ca4a3e61ddab4ec333d9 + depends: + - libgcc >=15 + - libjpeg-turbo >=3.2.0,<4.0a0 + - libtiff >=4.7.2,<4.8.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - lcms2 >=2.19.1,<3.0a0 + size: 301950 + timestamp: 1788156074578 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda + sha256: 2c4901f4227b0850328ed0c69f958b30ad2cd18982f7a31c7c1f911827004d08 + md5: 489444d0acb2a579d2a002d85a08c059 + depends: + - zstd >=1.5.7,<1.6.0a0 + constrains: + - binutils_impl_linux-aarch64 2.46.1 + license: GPL-3.0-only + license_family: GPL + purls: [] + run_exports: {} + size: 905305 + timestamp: 1784214534868 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.2.0-h52b7260_0.conda + sha256: 0176a71d64fcb5aec43c9e8ab4ae72faa6c6b0b1cda8f40b65e19429ce13c84d + md5: 9fcfe6be4f752b72be7abc69842ca396 + depends: + - libgcc >=14 + - libstdcxx >=14 + license: Apache-2.0 + license_family: Apache + purls: [] + run_exports: + weak: + - lerc >=4.2.0,<5.0a0 + size: 244850 + timestamp: 1785038308130 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20260526.0-cxx17_hc5e897d_2.conda + sha256: 2f21286b1c8c978c629cf2fd18c6715f15c5c57fa6d9283587b8f66290bfbfc3 + md5: 46a7ae7c040e95909dd43808414747fb + depends: + - libgcc >=14 + - libstdcxx >=14 + constrains: + - abseil-cpp =20260526.0 + - libabseil-static =20260526.0=cxx17* + license: Apache-2.0 + license_family: Apache + purls: [] + run_exports: + weak: + - libabseil >=20260526.0,<20260527.0a0 + - libabseil =*=cxx17* + size: 1460594 + timestamp: 1787216970549 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libaec-1.1.5-hff7e48a_0.conda + sha256: 8b74acb52cda5f4ba91f59c85132f582de5db9dceff4e252f49c2525d14c600c + md5: 345c7bf559743adb5375ee3603911065 + depends: + - libgcc >=14 + - libstdcxx >=14 + license: BSD-2-Clause + license_family: BSD + run_exports: + weak: + - libaec >=1.1.5,<2.0a0 + size: 37745 + timestamp: 1769221878827 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-25.0.0-hf28620a_4_cpu.conda + build_number: 4 + sha256: 715b8b36fd21709d5e73efa129672a98de4777963ea6b17b8b981364d2adcc71 + md5: ddb826d1d56e1ab7fe1cd906a8072a63 + depends: + - aws-crt-cpp >=0.40.1,<0.40.2.0a0 + - aws-sdk-cpp >=1.11.833,<1.11.834.0a0 + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + - azure-identity-cpp >=1.13.3,<1.13.4.0a0 + - azure-storage-blobs-cpp >=12.18.0,<12.18.1.0a0 + - azure-storage-files-datalake-cpp >=12.16.0,<12.16.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libgcc >=14 + - libgoogle-cloud >=3.8.0,<3.9.0a0 + - libgoogle-cloud-storage >=3.8.0,<3.9.0a0 + - libopentelemetry-cpp >=1.27.0,<1.28.0a0 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.3.1,<2.3.2.0a0 + - snappy >=1.2.2,<1.3.0a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - apache-arrow-proc =*=cpu + - arrow-cpp <0.0a0 + - parquet-cpp <0.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - libarrow >=25.0.0,<25.1.0a0 + size: 6135363 + timestamp: 1786313502797 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-acero-25.0.0-hb326ee9_4_cpu.conda + build_number: 4 + sha256: c34750d3ebbe94be004a90f292bc89011bbfc721277eadf97b4222aeee128afd + md5: 9cb586c768b6eb486d1a356334629bef + depends: + - libarrow 25.0.0 hf28620a_4_cpu + - libarrow-compute 25.0.0 hdd99842_4_cpu + - libgcc >=14 + - libstdcxx >=14 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - libarrow-acero >=25.0.0,<25.1.0a0 + size: 550216 + timestamp: 1786313662950 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-compute-25.0.0-hdd99842_4_cpu.conda + build_number: 4 + sha256: 7b88d6f9a5e386ab20d6d229f7edc7c971631c91f195cf0557bcb75ad5f151b0 + md5: 3afdcc262669ce23e9759369ddbbc0e4 + depends: + - libarrow 25.0.0 hf28620a_4_cpu + - libgcc >=14 + - libre2-11 >=2025.11.5 + - libstdcxx >=14 + - libutf8proc >=2.11.3,<2.12.0a0 + - re2 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - libarrow-compute >=25.0.0,<25.1.0a0 + size: 2544166 + timestamp: 1786313597505 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-dataset-25.0.0-hb326ee9_4_cpu.conda + build_number: 4 + sha256: c1824a6419f5faa4024df86b86905922c56e1465abbac8848d0cd37fa6167420 + md5: 575e14ddd055857ac2fd7bc96a7ae37b + depends: + - libarrow 25.0.0 hf28620a_4_cpu + - libarrow-acero 25.0.0 hb326ee9_4_cpu + - libarrow-compute 25.0.0 hdd99842_4_cpu + - libgcc >=14 + - libparquet 25.0.0 h87079af_4_cpu + - libstdcxx >=14 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - libarrow-dataset >=25.0.0,<25.1.0a0 + size: 552071 + timestamp: 1786313705958 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libarrow-substrait-25.0.0-hd99807d_4_cpu.conda + build_number: 4 + sha256: 90f33030625092ff97102836e12177a78e53bf1cb42c7588cd8ad09df7a1548e + md5: bd635208b4fc2d8198d803da4197f962 + depends: + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libarrow 25.0.0 hf28620a_4_cpu + - libarrow-acero 25.0.0 hb326ee9_4_cpu + - libarrow-dataset 25.0.0 hb326ee9_4_cpu + - libgcc >=14 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libstdcxx >=14 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - libarrow-substrait >=25.0.0,<25.1.0a0 + size: 465996 + timestamp: 1786313723004 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-10_haddc8a3_openblas.conda + build_number: 10 + sha256: d5d9c5583906142da757b21348264469f18a66c2250dffc66738632d51049339 + md5: 0aef6d16472137e6b556ecc2208194f6 + depends: + - libopenblas >=0.3.34,<0.3.35.0a0 + - libopenblas >=0.3.34,<1.0a0 + constrains: + - blas 2.310 openblas + - libcblas 3.11.0 10*_openblas + - liblapack 3.11.0 10*_openblas + - liblapacke 3.11.0 10*_openblas + - mkl <2027 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libblas >=3.11.0,<4.0a0 + size: 18102 + timestamp: 1788076934945 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.2.0-h384ecca_4.conda + sha256: 0caa2f9a3c56f139fd574d9300ecc062de96b11b50699024dde0365262f5a02a + md5: 20d76286cd6c6541181ccf57a8dbd990 + depends: + - libgcc >=15 + license: MIT + purls: [] + run_exports: + weak: + - libbrotlicommon >=1.2.0,<1.3.0a0 + size: 80434 + timestamp: 1788480285525 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.2.0-h011f0d3_4.conda + sha256: 4aee7fa5bbbdd446b2c94ddbec121337bb98e20c15c477aaacf2a50cd5337208 + md5: fcf455f3f376d5a881e4c38de3943c31 + depends: + - libbrotlicommon 1.2.0 h384ecca_4 + - libgcc >=15 + license: MIT + purls: [] + run_exports: + weak: + - libbrotlidec >=1.2.0,<1.3.0a0 + size: 33822 + timestamp: 1788480293314 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.2.0-hb247b97_4.conda + sha256: e75639e57bc119cee647a283b27bd87ddb518b4d23df7f26176f4af6d47d79cd + md5: 2b6839131a93ae1148a80aa436906365 + depends: + - libbrotlicommon 1.2.0 h384ecca_4 + - libgcc >=15 + license: MIT + purls: [] + run_exports: + weak: + - libbrotlienc >=1.2.0,<1.3.0a0 + size: 348272 + timestamp: 1788480299628 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcap-2.78-hfcc8634_1.conda + sha256: 6487e7644d062e18d389c11a9a3183e5a71c2652d05fdd88dbd063ad09f7ad4b + md5: 5e347c665a310b4c148bbb02596ae0c3 + depends: + - libgcc >=14 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libcap >=2.78,<2.79.0a0 + size: 108530 + timestamp: 1786025925536 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-10_hd72aa62_openblas.conda + build_number: 10 + sha256: 6a39d1f7de1fda182503896490448f0845bcf4e9420bec50afd9b32769506c3e + md5: 3d2c6a20ca24a60c5c4604a08940b3ae + depends: + - libblas 3.11.0 10_haddc8a3_openblas + constrains: + - blas 2.310 openblas + - liblapack 3.11.0 10*_openblas + - liblapacke 3.11.0 10*_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libcblas >=3.11.0,<4.0a0 + size: 18073 + timestamp: 1788076940165 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcrc32c-1.1.2-h01db608_0.tar.bz2 + sha256: b8b8c57a87da86b3ea24280fd6aa8efaf92f4e684b606bf2db5d3cb06ffbe2ea + md5: 268ee639c17ada0002fb04dd21816cc2 + depends: + - libgcc-ng >=9.4.0 + - libstdcxx-ng >=9.4.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libcrc32c >=1.1.2,<1.2.0a0 + size: 18669 + timestamp: 1633683724891 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.22.0-h86273da_0.conda + sha256: 8634a43ca7161d49b94098d8d27f32040ccf19b5227b37d05826ec8b5729b3c4 + md5: d79a5b16c3aaff5269f9118aa1d9f1ba + depends: + - krb5 >=1.22.2,<1.23.0a0 + - libgcc >=15 + - libnghttp2 >=1.68.1,<2.0a0 + - libpsl >=0.23.1,<0.24.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.8,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + purls: [] + run_exports: + weak: + - libcurl >=8.22.0,<9.0a0 + size: 524318 + timestamp: 1788340661060 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-hfa851ae_1.conda + sha256: 4cb3da1d4ce7540604219d2a016253777da66c1a710c41557bc708aae7f54a75 + md5: 8cdf7f7e4908c9b2cf50c58966f2ff64 + depends: + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libdeflate >=1.25,<1.26.0a0 + size: 71628 + timestamp: 1785908730449 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321hc48eb74_1.conda + sha256: 2d7218da06f1121619335bff25a2669df810dee90d2eb65b17f8b2e6b1c0d372 + md5: 6e06eb2c9fda76721699bcdd759b9c60 + depends: + - ncurses + - libgcc >=14 + - ncurses >=6.6,<7.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libedit >=3.1.20250104,<3.2.0a0 + size: 149007 + timestamp: 1786616643904 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h80f16a2_3.conda + sha256: 4475f79a020e9ff2a5a0308c48cb2970a25d55c3dd724a97ab28bfac3be6cd49 + md5: f679b30a53d410d0b5ae0cb8f5b7397e + depends: + - libgcc >=14 + license: BSD-2-Clause OR GPL-2.0-or-later + license_family: GPL + purls: [] + run_exports: + weak: + - libev >=4.33,<4.34.0a0 + size: 45746 + timestamp: 1785917328690 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda + sha256: 01333cc7d6e6985dd5700b43660d90e9e58049182017fd24862088ecbe1458e4 + md5: 96ae6083cd1ac9f6bc81631ac835b317 + depends: + - libgcc-ng >=12 + - openssl >=3.1.1,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libevent >=2.1.12,<2.1.13.0a0 + size: 438992 + timestamp: 1685726046519 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.1-hfae3067_1.conda + sha256: 20a5726bc8705d91437c9e6ef83b30da64a1719b869656d20a1ee818333ea5ac + md5: fac3b65a605cd253037fdf3daf2de8d9 + depends: + - libgcc >=14 + constrains: + - expat 2.8.1.* + license: MIT + license_family: MIT + purls: [] + run_exports: {} + size: 77649 + timestamp: 1781203572523 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfabric-2.6.0-h8af1aa0_0.conda + sha256: b0a8c7e03897b28b5d18afe3d2a81d22db665cfbc60db580c6d5a5ec2701b832 + md5: d22c0987ebdad5301396bf8bf2003d17 + depends: + - libfabric1 2.6.0 h6b50f16_0 + license: BSD-2-Clause OR GPL-2.0-only + license_family: BSD + run_exports: {} + size: 14418 + timestamp: 1782364086739 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfabric1-2.6.0-h6b50f16_0.conda + sha256: 90f5fd379a36779c54f92dcea2a211b06eedd982c6948a3e9b5baf0132617653 + md5: 385cd929680ecee54788f6e718f55d63 + depends: + - __glibc >=2.28,<3.0.a0 + - libgcc >=14 + - libnl >=3.11.0,<4.0a0 + - rdma-core >=63.0 + license: BSD-2-Clause OR GPL-2.0-only + license_family: BSD + run_exports: {} + size: 802702 + timestamp: 1782364085626 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.7.0-hdaad0be_1.conda + sha256: b1879d78b622c5f4817fd6d77fe7ae3ab7b501542e3c2f4ac77198c54c62c189 + md5: f9e5b3e446b526b34a7e25ecec08efd9 + depends: + - libgcc >=15 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libffi >=3.7.0,<3.8.0a0 + size: 63137 + timestamp: 1787753382033 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_2.conda + sha256: 1e6ba895a397ee4fc1646f21000903ad13d93e9e6d9a7fb4dcef1baa837970bf + md5: 9d7e520ae06d08185ef2d500ff116d30 + depends: + - libfreetype6 >=2.14.3 + license: GPL-2.0-only OR FTL + purls: [] + run_exports: {} + size: 8409 + timestamp: 1786640943558 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-h9cc7050_2.conda + sha256: d29eac57042f2362d4e45c63a4a78d64a30e5284b1da29b99e0c1526671dd4c3 + md5: f7ee9de31f98281a3e451e496fbee3b5 + depends: + - libgcc >=15 + - libpng >=1.6.58,<1.7.0a0 + - libzlib >=1.3.2,<2.0a0 + constrains: + - freetype >=2.14.3 + license: GPL-2.0-only OR FTL + purls: [] + run_exports: {} + size: 445035 + timestamp: 1786640942903 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.2.0-h205dda4_4.conda + sha256: a132d78d49d0fa0a08e9e2a77528a12d974e8e123bc32895c0bd0a737b8abd89 + md5: 2c81f8ce7bda35c7a88c4c044452a97c + depends: + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==16.2.0=*_4 + - libgomp 16.2.0 h8acb6b2_4 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 627810 + timestamp: 1787617756679 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-16.2.0-he9431aa_4.conda + sha256: e8643044040dd8aa88aee26c19e6b78bbbe0ce8a4d04b1c77ee53c71a1efd814 + md5: ad0ce2f7fb2e61219df1561115864483 + depends: + - libgcc 16.2.0 h205dda4_4 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: + strong: + - libgcc + size: 28397 + timestamp: 1787617760661 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-16.2.0-he9431aa_4.conda + sha256: 0052421483b466cf0d807cfae679a1f5604466ab366bc8416b531fb69228069c + md5: 9370835617c4a9c7265fd34e92887bfa + depends: + - libgfortran5 16.2.0 hc864f27_4 + constrains: + - libgfortran-ng ==16.2.0=*_4 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 28365 + timestamp: 1787617782539 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-16.2.0-hc864f27_4.conda + sha256: 79074bbd26f70298321bc449748a620240ae48f32d656a834691c150b4fa6424 + md5: 3d9b36e26eb91cec10459cf8d6e4dbb4 + depends: + - libgcc >=16.2.0 + constrains: + - libgfortran 16.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 1489572 + timestamp: 1787617767130 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.88.3-hb514e8e_2.conda + sha256: 1a1f854a38a4a0247a0193f220f0aa4f16ce964eed91963be4d0e63ca9e029d4 + md5: de44cb5a4ccf6eccf34811b95a1f247b + depends: + - libgcc >=15 + - libiconv >=1.18,<2.0a0 + - pcre2 >=10.47,<10.48.0a0 + - libzlib >=1.3.2,<2.0a0 + - libffi >=3.7.0,<3.8.0a0 + constrains: + - glib >2.66 + license: LGPL-2.1-or-later + purls: [] + run_exports: + weak: + - libglib >=2.88.3,<3.0a0 + size: 4830545 + timestamp: 1788398417264 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.2.0-h8acb6b2_4.conda + sha256: 6d216e6dc9a158b920f6e0c1dfdd6d77575bf79420dadf85d64576298ecb4503 + md5: 727c19b26cd43140e4a90a6f8f1cc31a + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: + strong: + - _openmp_mutex >=4.5 + size: 617987 + timestamp: 1787617685449 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-3.8.0-h2efc11c_0.conda + sha256: 28999fda2990fecd2b7b86da99fa997c2f4bcbe89576e362b8bab4559687ac69 + md5: a20e63a2f4a5639b3cbfcc33ef4d9555 + depends: + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libcurl >=8.21.0,<9.0a0 + - libgcc >=14 + - libgrpc >=1.82.1,<1.83.0a0 + - libopentelemetry-cpp >=1.27.0,<1.28.0a0 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libstdcxx >=14 + - openssl >=3.5.7,<4.0a0 + constrains: + - libgoogle-cloud 3.8.0 *_0 + license: Apache-2.0 + license_family: Apache + purls: [] + run_exports: + weak: + - libgoogle-cloud >=3.8.0,<3.9.0a0 + size: 2629226 + timestamp: 1786225828150 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-storage-3.8.0-h66d5b86_0.conda + sha256: 52951ccafc8c7d747c53b0178b15f23f630976ef05050c4ed90dcc233825becf + md5: cb08cd8e8e0a333ba40e9ceb6e1f33b8 + depends: + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libgcc >=14 + - libgoogle-cloud 3.8.0 h2efc11c_0 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + - openssl + license: Apache-2.0 + license_family: Apache + purls: [] + run_exports: + weak: + - libgoogle-cloud-storage >=3.8.0,<3.9.0a0 + size: 761080 + timestamp: 1786225923718 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgrpc-1.82.1-h05b84e8_0.conda + sha256: 094845d7f466d30e2bb6545a3930b5ec687754839fc2fa0b96543ded54059f29 + md5: 611f046154e9ffa8be2961b1d6180377 + depends: + - c-ares >=1.34.6,<2.0a0 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libgcc >=14 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libre2-11 >=2025.11.5 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.7,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.82.1 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - libgrpc >=1.82.1,<1.83.0a0 + size: 6940885 + timestamp: 1783587003357 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libharfbuzz-14.4.0-h8f7ccb3_1.conda + sha256: 7a27b4011455fef1bbad02f815aaac125348a3a9ac229806dba7befead38376c + md5: 5a2dfb975c0d5a2598e92f695b737d01 + depends: + - cairo >=1.18.4,<2.0a0 + - graphite2 >=1.3.15,<2.0a0 + - icu >=78.3,<79.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libgcc >=15 + - libglib >=2.88.3,<3.0a0 + - libpng >=1.6.58,<1.7.0a0 + - libstdcxx >=15 + - libzlib >=1.3.2,<2.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: {} + size: 1448692 + timestamp: 1788405466554 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libhwloc-2.13.0-default_ha95e27d_1000.conda + sha256: 88888d99e81c93e7331f2eb0fec08b3c4a47a1bfa1c88b3e641f6568569b6261 + md5: 974183f6420938051e2f3208922d057f + depends: + - libgcc >=14 + - libstdcxx >=14 + - libxml2 + - libxml2-16 >=2.14.6 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libhwloc >=2.13.0,<2.13.1.0a0 + size: 2453519 + timestamp: 1770953713701 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h1ea5142_3.conda + sha256: d22c666eb887afd2119aac2110e23a0e817e9391bda99293421f7c46dab1564c + md5: 951b54a36388613a99820b33b997f690 + depends: + - libgcc >=15 + license: LGPL-2.1-only + purls: [] + run_exports: + weak: + - libiconv >=1.18,<2.0a0 + size: 785924 + timestamp: 1787033793216 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.2.0-he30d5cf_1.conda + sha256: c5626ea672be2e59784f9be20dc8ceb7961b8ab0053651ded2dffec64e4b8245 + md5: 8730e25aa7eab80ca86dfb9a6bedf1ba + depends: + - libgcc >=14 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + purls: [] + run_exports: + weak: + - libjpeg-turbo >=3.2.0,<4.0a0 + size: 716519 + timestamp: 1785896318334 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-10_h88aeb00_openblas.conda + build_number: 10 + sha256: 87e604f065f5dd363ba2bb9fb5230b7d7b2de6718b5e09a864b061666b3c5c1f + md5: b4fa79baea29b5217a9848a2c24cad53 + depends: + - libblas 3.11.0 10_haddc8a3_openblas + constrains: + - blas 2.310 openblas + - libcblas 3.11.0 10*_openblas + - liblapacke 3.11.0 10*_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - liblapack >=3.11.0,<3.12.0a0 + size: 18098 + timestamp: 1788076944803 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_1.conda + sha256: f760669fd1cea27f689f411c0d5488e26ce50e382c9b63e4ad348f959850124a + md5: e0e6411a60d00186eec7c73f4118ab67 + depends: + - libgcc >=14 + constrains: + - xz 5.8.3.* + license: 0BSD + purls: [] + run_exports: + weak: + - liblzma >=5.8.3,<6.0a0 + size: 125578 + timestamp: 1786348561649 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.68.1-ha4b982d_1.conda + sha256: 0c28d734512fa2c66a232b2f3968eae7124dbd6ad42c594c752f1d08dfb86195 + md5: ff4b2b7c169c438bf648fb14f369c3b9 + depends: + - c-ares >=1.34.8,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=15 + - libstdcxx >=15 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.7,<4.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libnghttp2 >=1.68.1,<2.0a0 + size: 734829 + timestamp: 1787177407983 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnl-3.11.0-he30d5cf_1.conda + sha256: d5a50ee7a82e8fb98069b51af2e28a2360cd9f67c3fb4376ecea75598f0c3ef6 + md5: 649b8ed2e7639550c891f875dfb01e88 + depends: + - libgcc >=14 + license: LGPL-2.1-or-later + license_family: LGPL + run_exports: + weak: + - libnl >=3.11.0,<4.0a0 + size: 743370 + timestamp: 1787038306943 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda + sha256: c0dc4d84198e3eef1f37321299e48e2754ca83fd12e6284754e3cb231357c3a5 + md5: d5d58b2dc3e57073fe22303f5fed4db7 + depends: + - libgcc >=13 + license: LGPL-2.1-only + license_family: GPL + purls: [] + run_exports: + weak: + - libnsl >=2.0.1,<2.1.0a0 + size: 34831 + timestamp: 1750274211000 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.34-openmp_h2c8b6b3_1.conda + sha256: e8c12b60aa5682e9c9039c8eba746dd3811f822082ef057b551b1d3fb45887af + md5: 26dee567c47d14eae62070931e59a694 + depends: + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - libgcc >=15 + - libgfortran + - libgfortran5 >=15.3.0 + - llvm-openmp >=23.1.0 + constrains: + - openblas >=0.3.34,<0.3.35.0a0 + track_features: + - openblas_threading_openmp + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libopenblas >=0.3.34,<1.0a0 + size: 4923475 + timestamp: 1788055942537 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-1.27.0-hbe47268_1.conda + sha256: 2f906b3c7e56b37fe190dffec64505b81c1a5792ec4e54405ce965b1e3e4e0e5 + md5: a781792f4c25debefa5250a0dbde0d5d + depends: + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libcurl >=8.21.0,<9.0a0 + - libgrpc >=1.82.0,<1.83.0a0 + - libopentelemetry-cpp-headers 1.27.0 h8af1aa0_1 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libzlib >=1.3.2,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.27.0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - libopentelemetry-cpp >=1.27.0,<1.28.0a0 + size: 938402 + timestamp: 1783133113967 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopentelemetry-cpp-headers-1.27.0-h8af1aa0_1.conda + sha256: cc6ad5ecff94772866c24165b0e2b03b5e92f8135446b85a569184b2de8bdd68 + md5: d5a83a188f936ac5b975f0b615359509 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: {} + size: 394189 + timestamp: 1783133095691 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libparquet-25.0.0-h87079af_4_cpu.conda + build_number: 4 + sha256: b74676715864b0722d1d571503f45dc865e0c1b2c0f7da5b6ff1b1fd69dcea6a + md5: 757d3d2ec299ae9058326a96aaaec7a0 + depends: + - libarrow 25.0.0 hf28620a_4_cpu + - libgcc >=14 + - libstdcxx >=14 + - libthrift >=0.22.0,<0.22.1.0a0 + - openssl >=3.5.7,<4.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - libparquet >=25.0.0,<25.1.0a0 + size: 1294290 + timestamp: 1786313648018 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpmix-5.0.8-h83c401c_4.conda + sha256: 6d52176bda6c9e571df1cc40976020a462631a081ed4fbff04d206f91e0297ed + md5: 63c0a757a2358422238fbf25c70508f8 + depends: + - libevent >=2.1.12,<2.1.13.0a0 + - libgcc >=14 + - libhwloc >=2.13.0,<2.13.1.0a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libpmix >=5.0.8,<6.0a0 + size: 728469 + timestamp: 1770963005933 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.58-hf9b7768_1.conda + sha256: bd6e423b08342969689d8893c965aad78244b29724da2168aef3634fa0e1ebd7 + md5: 308ecb7ad60637dc5e95558ab583c5ba + depends: + - libgcc >=15 + - libzlib >=1.3.2,<2.0a0 + license: zlib-acknowledgement + purls: [] + run_exports: + weak: + - libpng >=1.6.58,<1.7.0a0 + size: 333238 + timestamp: 1786616546810 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-7.35.1-h809b94e_3.conda + sha256: 7f085a6a02c3dac7194f8cb44ecdfedab7dcc3c8d86b29846e774a4316d9ec88 + md5: 58dfb4ac83e4599c18406b88a1c458c8 + depends: + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libgcc >=15 + - libstdcxx >=15 + - libzlib >=1.3.2,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libprotobuf >=7.35.1,<7.35.2.0a0 + size: 3844240 + timestamp: 1787657628222 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpsl-0.23.1-hb8431ed_1.conda + sha256: 757f79c182ac3080cf416acd91c7643b8074b8b2e5c1eba0ffc5a16897feb84b + md5: 5ab41e5e70b78eb00ef62cdaa35cd86f + depends: + - libgcc >=15 + - libstdcxx >=15 + - icu >=78.3,<79.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libpsl >=0.23.1,<0.24.0a0 + size: 73118 + timestamp: 1786970733378 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpython-3.12.14-hc3dd739_3_cpython.conda + build_number: 3 + sha256: 5e361dbcaaf246307b6ad48eb1a9e3807330dde9522077a7ca1ab6861faf94c6 + md5: dbdc1c4eec7f4482acfd9d4833a8d384 + depends: + - libgcc >=15 + - libstdcxx >=15 + license: Python-2.0 + purls: [] + run_exports: {} + size: 8235626 + timestamp: 1788392904066 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libraqm-0.11.0-hd2f8911_0.conda + sha256: 03dbcf07e62d7fcb8b810636df1cc88d2c6d6f3cfe72a9b25bca9512708f9091 + md5: b193aa5a8bd7595c537c6e1916b7298d + depends: + - libgcc >=14 + - __glibc >=2.28,<3.0.a0 + - libharfbuzz >=14.2.1 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - fribidi >=1.0.16,<2.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libraqm >=0.11.0,<0.12.0a0 + size: 34049 + timestamp: 1784850270528 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libre2-11-2025.11.05-h149037f_2.conda + sha256: f50695291bfaf2aebe8795caae5e341af9ad3ff6d945c026cf01ca697a6620f4 + md5: f2ff51cd816045533d79c157acaf8e51 + depends: + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libgcc >=14 + - libstdcxx >=14 + constrains: + - re2 2025.11.05.* + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libre2-11 >=2025.11.5 + size: 206553 + timestamp: 1781312515801 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-15.3.0-he541324_4.conda + sha256: fa1493b8ddd58f40ce4ef688a30cf93c0faf736f09821465e83d51d05475cb5c + md5: 82801a6523a59e75c3ca663a80ae810e + depends: + - libgcc >=15.3.0 + - libstdcxx >=15.3.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: + weak: + - libsanitizer 15.3.0 + size: 7569114 + timestamp: 1787617645405 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.4-h399dd60_1.conda + sha256: fae75e68e9dbc3c90dcf93d4bae6315f1330c95aaf1404a721e8468266c23475 + md5: 27e16aa1f45c787aa181549be6f209f4 + depends: + - icu >=78.3,<79.0a0 + - libgcc >=15 + - libzlib >=1.3.2,<2.0a0 + license: blessing + purls: [] + run_exports: + weak: + - libsqlite >=3.53.4,<4.0a0 + size: 972932 + timestamp: 1787051100646 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-h7572e3e_1.conda + sha256: f6fef76c1c8899d7976030871b8cd8016b0a306d2b8519834cd6491d6a42fb82 + md5: 833be3f226277d894df3c7a7131d9532 + depends: + - libgcc >=14 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.7,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libssh2 >=1.11.1,<2.0a0 + size: 315682 + timestamp: 1786713068743 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.2.0-hef695bb_4.conda + sha256: 84d2b667bce6549325243235952110b1849ff2dfd7091a1479108930b88057d5 + md5: 47b6b37e291c14f39bd95f9d340c45f5 + depends: + - libgcc 16.2.0 h205dda4_4 + constrains: + - libstdcxx-ng ==16.2.0=*_4 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 6241792 + timestamp: 1787617775395 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-16.2.0-hdbbeba8_4.conda + sha256: 0f962247a60d3e0ae07b399063ac637a44fbdcb95c8602e5d2920c6612e53f01 + md5: 8d6c3e6616f4e25d05684fbd50c39885 + depends: + - libstdcxx 16.2.0 hef695bb_4 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: + strong: + - libstdcxx + size: 28437 + timestamp: 1787617803748 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsystemd0-257.13-hfcc8634_1.conda + sha256: 7938befc6a09d9f829663ea134b01bea78dabe08d928e9a7caa68e2d726e03c5 + md5: d8981d39a52ab992a033a68927da47e0 + depends: + - libcap >=2.78,<2.79.0a0 + - libgcc >=14 + license: LGPL-2.1-or-later + run_exports: {} + size: 515284 + timestamp: 1780084773602 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libthrift-0.22.0-ha522d1d_2.conda + sha256: c43ccf2e53750a84962c2440359ec54fed01b36838d0a08e36f4b294c7d837a6 + md5: 6ecb1ee3cbccd5c3b9ba044e24515153 + depends: + - libevent >=2.1.12,<2.1.13.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - libthrift >=0.22.0,<0.22.1.0a0 + size: 414117 + timestamp: 1777018976584 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.2-h45f9f85_1.conda + sha256: fa6daf2301dee912def3e74344fae792a8fc2bbbf7880dedee0e93ee8fb98fc5 + md5: c6f35f8f9695623b9055341bc280a642 + depends: + - lerc >=4.2.0,<5.0a0 + - libdeflate >=1.25,<1.26.0a0 + - libgcc >=15 + - libjpeg-turbo >=3.2.0,<4.0a0 + - liblzma >=5.8.3,<6.0a0 + - libstdcxx >=15 + - libwebp-base >=1.6.0,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: HPND + purls: [] + run_exports: + weak: + - libtiff >=4.7.2,<4.8.0a0 + size: 529726 + timestamp: 1787755625893 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtorch-2.12.1-cpu_generic_hb12a5ee_0.conda + sha256: 39c971c0993784e217d43d987cb5f797e03a41e249505e1e5771fba1fdf01c0a + md5: c79c0f29047c71cb69cb43a8074b66cd + depends: + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - fmt >=12.1.0,<12.2.0a0 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc >=14 + - liblapack >=3.9.0,<4.0a0 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libstdcxx >=14 + - libuv >=1.52.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - llvm-openmp >=22.1.8 + - onednn >=3.12,<4.0a0 + - pybind11-abi 11 + - sleef >=3.9.0,<4.0a0 + constrains: + - pytorch-gpu <0.0a0 + - openblas * openmp_* + - libopenblas * openmp_* + - pytorch-cpu 2.12.1 + - pytorch 2.12.1 cpu_generic_*_0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libtorch >=2.12.1,<2.13.0a0 + size: 48248444 + timestamp: 1781832373151 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtorch-2.13.0-cpu_generic_hf6f405e_2.conda + sha256: f28321403d4e8412aa1fa188aa94029cca879e946f6df60fc6da1194aad51189 + md5: 7449dce583fa5c3240bffe1b5978145b + depends: + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - fmt >=12.1.0,<12.2.0a0 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc >=14 + - liblapack >=3.9.0,<4.0a0 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libstdcxx >=14 + - libuv >=1.52.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - llvm-openmp >=22.1.8 + - onednn >=3.12,<4.0a0 + - pybind11-abi 11 + - sleef >=3.9.0,<4.0a0 + constrains: + - libopenblas * openmp_* + - openblas * openmp_* + - pytorch 2.13.0 cpu_generic_*_2 + - pytorch-cpu 2.13.0 + - pytorch-gpu <0.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libtorch >=2.13.0,<2.14.0a0 + size: 49998352 + timestamp: 1786374014531 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libudev1-257.13-hfcc8634_1.conda + sha256: 1963dbd5a5c08390db2321dd2fa5c9df45c0fe68701fce4f9c36141155b4de13 + md5: 67728797901490baae52b3ce8d738d34 + depends: + - libcap >=2.78,<2.79.0a0 + - libgcc >=14 + license: LGPL-2.1-or-later + run_exports: {} + size: 156922 + timestamp: 1780084778404 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libutf8proc-2.11.3-hec6f9f7_0.conda + sha256: a67e1c2355f98befb280bc91990504500ba28a82d5441c9fb9e10015abfd3b14 + md5: afc02d5958046be06b176058e9d630d7 + depends: + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libutf8proc >=2.11.3,<2.12.0a0 + size: 86509 + timestamp: 1768735090367 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42.3-hd6fdeab_0.conda + sha256: 3530c720c8b9dbb5aba0712d77fbb158e98d7a533ba1cf4968d42a98c41b7f24 + md5: b759892402ee563731fbbb43860cae00 + depends: + - libgcc >=15 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libuuid >=2.42.3,<3.0a0 + size: 43358 + timestamp: 1788347735193 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.52.1-h80f16a2_1.conda + sha256: 52f4bc6e340bde53bfe38e45f6cb1080a2d5f8891da9a647087f7cc6a6edfc22 + md5: 8e2136432f02841b9d8b848045f66d7d + depends: + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libuv >=1.52.1,<2.0a0 + size: 457209 + timestamp: 1785914582944 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_1.conda + sha256: 4c64e6843d64876d054a28ecbab70abdf145da3c2cbdaa4a43db26cdf0fd760b + md5: 548943c39851543734ce0d20eeb469b0 + depends: + - libgcc >=14 + constrains: + - libwebp 1.6.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libwebp-base >=1.6.0,<2.0a0 + size: 357551 + timestamp: 1785956962809 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h3f04742_2.conda + sha256: bb1d9aaa885de73c504bd887e1841ad8e9d5b8432bd370b02eaf33067a001dc3 + md5: fa9fad28d04af5225221613038388d95 + depends: + - libgcc >=15 + - pthread-stubs + - xorg-libxau >=1.0.12,<2.0a0 + - xorg-libxdmcp >=1.1.5,<2.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libxcb >=1.17.0,<2.0a0 + size: 401562 + timestamp: 1787885741304 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.38-h80f16a2_0.conda + sha256: d3514900e2121972e435f7803763c1843dad6709e48aa02a2b47c4d481f83be7 + md5: b1a5cb7ff2d8f5911ba1fb6897176098 + depends: + - libgcc >=14 + license: LGPL-2.1-or-later + purls: [] + run_exports: + weak: + - libxcrypt >=4.4.38 + size: 133882 + timestamp: 1785887114864 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-16-2.15.3-h79dcc73_1.conda + sha256: ddc4e8200b34b6d308f7f7060b326086085ddbc6c003ab8539dd48b3917b1f18 + md5: 0678aa203ef38d165a611bd81d5ca8f2 + depends: + - icu >=78.3,<79.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libzlib >=1.3.2,<2.0a0 + constrains: + - libxml2 2.15.3 + license: MIT + license_family: MIT + purls: [] + run_exports: {} + size: 605581 + timestamp: 1787237544809 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.15.3-h869d058_1.conda + sha256: 8d6c8037f5e0b6cb474f98f876c027b4c3c08a002d2639896a2775acb893f729 + md5: da311b13a2af5209b926397cd426f27d + depends: + - icu >=78.3,<79.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libxml2-16 2.15.3 h79dcc73_1 + - libzlib >=1.3.2,<2.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libxml2 + - libxml2-16 >=2.15.3 + size: 48679 + timestamp: 1787237549589 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_3.conda + sha256: 76efa6cc9d7e6f5ee3bbca0939f64054af2bdfb3c3632531f8e633cf6c2ea41e + md5: bd534c2fbe56d8c2ea3b2d8f5e12bca8 + constrains: + - zlib 1.3.2 *_3 + license: Zlib + license_family: Other + purls: [] + run_exports: + weak: + - libzlib >=1.3.2,<2.0a0 + size: 70108 + timestamp: 1785276540870 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/llvm-openmp-23.1.0-hde6636f_0.conda + sha256: 379103e14959c4b81af30ba552b58d03a53bcd9bd49c4501daa7a7461520e28d + md5: 7a284c9939bbc9a08767845151c32baf + constrains: + - intel-openmp <0.0a0 + - openmp 23.1.0|23.1.0.* + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + run_exports: + strong: + - llvm-openmp >=23.1.0 + - _openmp_mutex >=4.5 + - _openmp_mutex * *_llvm + size: 5831253 + timestamp: 1787722301107 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lz4-c-1.10.0-hfb11796_2.conda + sha256: e8392843a18954fef038f2721fde65c4dbe7693fcd07677e5e74fca85b1a690c + md5: 36a6fab65bc51cf71761eb5339d8ea04 + depends: + - libgcc >=15 + - libstdcxx >=15 + license: BSD-2-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - lz4-c >=1.10.0,<1.11.0a0 + size: 218765 + timestamp: 1786717160600 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py312hd077ced_1.conda + sha256: 5919bf53e9f74ee1c6ce35ce13a7cd92741d45385c2d0b3eae48b01c0f11f41a + md5: 1fecdd103b37427ba6041b9b03d657ea + depends: + - libgcc >=14 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + run_exports: {} + size: 26305 + timestamp: 1772446326927 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-base-3.11.1-py312h0683553_2.conda + sha256: 2a6447ea4551d94a09a0cf6665c2b7402f29ebc2a1df13e6bbfe7be7fc33b596 + md5: 381100cdfe0a7b585d7cc6477b7461f8 + depends: + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.28.2 + - freetype + - kiwisolver >=1.3.1 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libgcc >=14 + - libraqm >=0.11.0,<0.12.0a0 + - libstdcxx >=14 + - numpy >=1.25 + - numpy >=1.25,<3 + - packaging >=20.0 + - pillow >=9 + - pyparsing >=3 + - python >=3.12,<3.13.0a0 + - python-dateutil >=2.7 + - python_abi 3.12.* *_cp312 + - qhull >=2020.2,<2020.3.0a0 + - tk >=8.6.13,<8.7.0a0 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/matplotlib?source=hash-mapping + run_exports: {} + size: 8779090 + timestamp: 1785211047525 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpc-1.4.0-ha78d887_1.conda + sha256: 100e20d9b0aa5d4c4ea0318a0d528e6b193de3eb6e5546c7732b27058650f14a + md5: ecffc6dfabb73b06f400dd8f88736f68 + depends: + - gmp >=6.3.0,<7.0a0 + - libgcc >=15 + - mpfr >=4.2.2,<5.0a0 + license: LGPL-3.0-or-later + license_family: LGPL + purls: [] + run_exports: + weak: + - mpc >=1.4.0,<2.0a0 + size: 120758 + timestamp: 1787668063667 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpfr-4.2.2-h4b21e80_1.conda + sha256: f5ada0dadb169f77a1b71393486f4e39986ed8fe3db3f749d20d1fe1d48a1add + md5: df5830aa74e0c5c354ca2f800796493b + depends: + - gmp >=6.3.0,<7.0a0 + - libgcc >=15 + license: LGPL-3.0-only + license_family: LGPL + purls: [] + run_exports: + weak: + - mpfr >=4.2.2,<5.0a0 + size: 1945817 + timestamp: 1787236127178 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mpi4py-4.1.2-py312hb998f61_100.conda + sha256: 3b8fb34f116ac71da55b77d055159da526c52ad2afc9662961f54e23cdd698e5 + md5: 62b22f0db1d7eb54abe228ef75ea1558 + depends: + - python + - openmpi >=4.1 + - python 3.12.* *_cpython + - libgcc >=14 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - mpi4py >=4.1.2,<5.0a0 + size: 821205 + timestamp: 1778930338621 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-2.3.1-py312hd0d9aba_0.conda + sha256: b724ee08e33497e51a5c2cd9bc6a90e72d581ecdca0991c9a6cb4b9c5fb13d62 + md5: 3d397a5391bb1e3084fd83c74c76fea7 + depends: + - ast-serialize >=0.6.0,<1.0.0 + - mypy_extensions >=1.0.0 + - pathspec >=1.0.0 + - python + - python-librt >=0.13.0 + - typing_extensions >=4.6.0 + - psutil >=4.0 + - libgcc >=15 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mypy?source=hash-mapping + run_exports: {} + size: 22068389 + timestamp: 1786887143775 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-h2b6f883_1.conda + sha256: d69a04914139627f0a6bfd19412d6c7f1e37edc896af84a6011e07e8bc1e69fa + md5: c3b4349171ca987ff33a1de61f7b3f96 + depends: + - libgcc >=14 + license: X11 AND BSD-3-Clause + purls: [] + run_exports: + weak: + - ncurses >=6.6,<7.0a0 + size: 955422 + timestamp: 1786355019431 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ninja-1.13.2-hdc560ac_1.conda + sha256: 63d956ff75ca18235cae1d2e814246b011f9c85765416517ab1270aff55027d6 + md5: dc59c099f43cdffa2b92e5f6248be5b3 + depends: + - libstdcxx >=14 + - libgcc >=14 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 182159 + timestamp: 1786713053611 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nlohmann_json-3.12.0-h7ac5ae9_2.conda + sha256: e441cbcffb6a3b0c6c9071a14a2cd08bd175d95dde16c5413e8a678f875baab0 + md5: d246583ab3e0b8d3968fc5abf7592e17 + constrains: + - nlohmann_json-abi ==3.12.0 + license: MIT + license_family: MIT + purls: [] + run_exports: {} + size: 137086 + timestamp: 1785920446447 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.6-py312hce9e0af_0.conda + sha256: 4facc6fe76540d7e6e77b802602f7b1b3aa574a5fa6f406e0d21960858f1f539 + md5: 84ad95777b2f6bc736a6e08e5f02c04e + depends: + - python + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + run_exports: + weak: + - numpy >=1.23,<3 + size: 7839794 + timestamp: 1779169203525 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.5.2-py312hfb93532_1.conda + sha256: 85c24d0d6c6813182259d387933ab26baa37f0a59453c407ca4578912d4f9fd2 + md5: 0b7051ae47cc39391655258591e69b54 + depends: + - python + - libstdcxx >=15 + - libgcc >=15 + - libblas >=3.9.0,<4.0a0 + - python_abi 3.12.* *_cp312 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - numpy >=1.25,<3 + size: 7968038 + timestamp: 1788129258393 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/onednn-3.12-omp_h605b386_0.conda + sha256: ff6c1d53eaa1221a46bb77ac871dc8eea8ef070fb975ce9810329a28d65b523e + md5: 365b9ebd06388b4c7647b4b477cde089 + depends: + - libgcc >=14 + - libstdcxx >=14 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - onednn >=3.12,<4.0a0 + size: 7480320 + timestamp: 1779566014380 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.4-h504851f_2.conda + sha256: d07b190935acda11419bef754a96c2fcdc0171df8c5a34ce81c7883dc195b115 + md5: 0aa78cf1350df254c6b19bee89d6ce2b + depends: + - libgcc >=15 + - libstdcxx >=15 + - libtiff >=4.7.2,<4.8.0a0 + - libpng >=1.6.58,<1.7.0a0 + - libzlib >=1.3.2,<2.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - openjpeg >=2.5.4,<3.0a0 + size: 450421 + timestamp: 1788425080615 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openmpi-5.0.10-hba2b3a9_2.conda + sha256: 693419b643a26829ac4c0f9eae4010f904785bc975e70eab5edeb46a61160ed5 + md5: d14953de68412179c9939656b6a43883 + depends: + - mpi 1.0.* openmpi + - libstdcxx >=14 + - libgcc >=14 + - libgfortran5 >=14.4.0 + - libgfortran + - libfabric + - libfabric1 >=1.14.0 + - libpmix >=5.0.8,<6.0a0 + - libzlib >=1.3.2,<2.0a0 + - libevent >=2.1.12,<2.1.13.0a0 + - ucc >=1.8.0,<2.0a0 + - libnl >=3.11.0,<4.0a0 + - ucx >=1.22.0,<1.23.0a0 + - libhwloc >=2.13.0,<2.13.1.0a0 + constrains: + - __cuda >=12.0 + - cuda-version >=12.0 + - libprrte ==0.0.0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - openmpi >=5.0.10,<6.0a0 + size: 4171478 + timestamp: 1787493910462 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.4-he6ad1d5_0.conda + sha256: a70c05a9baba9b1ce17c7e8b9479029372069b3bf402dbf200bc03696c531bed + md5: 4aa504e081d16263e90c335df5499b4d + depends: + - ca-certificates + - libgcc >=15 + license: Apache-2.0 + license_family: Apache + purls: [] + run_exports: + weak: + - openssl >=3.6.4,<4.0a0 + size: 3712923 + timestamp: 1787698545024 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/optree-0.20.0-py312h579b322_1.conda + sha256: c4da955e212e5979569f7cd7c8f80bb3227863d3180883705f6e1136f5ee2f3e + md5: 949bab1ddaeb702ab8588aa9fdaedfe5 + depends: + - libgcc >=15 + - libstdcxx >=15 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - typing-extensions >=4.10 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/optree?source=hash-mapping + run_exports: {} + size: 538594 + timestamp: 1788504551686 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orc-2.3.1-h1fb4f23_0.conda + sha256: ae94758d3a59924e809788c442b2946f329ae36d4573089d1590c4218f8dc0f7 + md5: e7ad9dc0d832f29a19e2852cd6de00a3 + depends: + - tzdata + - libgcc >=14 + - libstdcxx >=14 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libabseil >=20260526.0,<20260527.0a0 + - libabseil * cxx17* + - libzlib >=1.3.2,<2.0a0 + - snappy >=1.2.2,<1.3.0a0 + - zstd >=1.5.7,<1.6.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - orc >=2.3.1,<2.3.2.0a0 + size: 1440426 + timestamp: 1784301242846 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-3.0.5-py312hf55c4e8_1.conda + sha256: 3c7f80bb9d5637649c48d87a6d53651f77e736ab43624933c95383999fbbb588 + md5: d9efaea64f2bb0b9444ce32bc4a9cb61 + depends: + - python + - numpy >=1.26.0 + - python-dateutil >=2.8.2 + - python 3.12.* *_cpython + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.23,<3 + - python_abi 3.12.* *_cp312 + constrains: + - adbc-driver-postgresql >=1.2.0 + - adbc-driver-sqlite >=1.2.0 + - beautifulsoup4 >=4.12.3 + - blosc >=1.21.3 + - bottleneck >=1.4.2 + - fastparquet >=2024.11.0 + - fsspec >=2024.10.0 + - gcsfs >=2024.10.0 + - html5lib >=1.1 + - hypothesis >=6.116.0 + - jinja2 >=3.1.5 + - lxml >=5.3.0 + - matplotlib >=3.9.3 + - numba >=0.60.0 + - numexpr >=2.10.2 + - odfpy >=1.4.1 + - openpyxl >=3.1.5 + - psycopg2 >=2.9.10 + - pyarrow >=13.0.0 + - pyiceberg >=0.8.1 + - pymysql >=1.1.1 + - pyqt5 >=5.15.9 + - pyreadstat >=1.2.8 + - pytables >=3.10.1 + - pytest >=8.3.4 + - pytest-xdist >=3.6.1 + - python-calamine >=0.3.0 + - pytz >=2024.2 + - pyxlsb >=1.0.10 + - qtpy >=2.4.2 + - scipy >=1.14.1 + - s3fs >=2024.10.0 + - sqlalchemy >=2.0.36 + - tabulate >=0.9.0 + - xarray >=2024.10.0 + - xlrd >=2.0.1 + - xlsxwriter >=3.2.0 + - zstandard >=0.23.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + run_exports: {} + size: 14736673 + timestamp: 1785276234887 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/patchelf-0.19.1-hfb11796_1.conda + sha256: 1055ef142ff6af9711166ea9b30b9d54c63c9f078154d998a63850ec99db5274 + md5: e42be47cbb4f4a0c55ba95cd0c6c9ff6 + depends: + - libgcc >=15 + - libstdcxx >=15 + license: GPL-3.0-or-later + license_family: GPL + run_exports: {} + size: 155619 + timestamp: 1787380792832 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-he574923_1.conda + sha256: 16e5bee11686028d60a495004f99a10c613ada44cc27e330bee18a1b67fb184c + md5: c98763518d0a4c9895e515190afb7dec + depends: + - bzip2 >=1.0.8,<2.0a0 + - libgcc >=15 + - libzlib >=1.3.2,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - pcre2 >=10.47,<10.48.0a0 + size: 1199286 + timestamp: 1787294520352 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda + build_number: 7 + sha256: d78296134263b5bf476cad838ded65451e7162db756f9997c5d06b08122572ed + md5: 17d019cb2a6c72073c344e98e40dfd61 + depends: + - libgcc-ng >=12 + - libxcrypt >=4.4.36 + license: GPL-1.0-or-later OR Artistic-1.0-Perl + run_exports: + weak: + - perl >=5.32.1,<5.33.0a0 *_perl5 + noarch: + - perl >=5.32.1,<6.0a0 *_perl5 + size: 13338804 + timestamp: 1703310557094 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-12.3.0-py312h7f6b78e_1.conda + sha256: f122819ab930afa732e41c3e834bc699ff99da3d79cb8380b5d65b55df61103d + md5: fea7744c33d05351767186f005c65c47 + depends: + - python + - libgcc >=15 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - python_abi 3.12.* *_cp312 + - libtiff >=4.7.2,<4.8.0a0 + - openjpeg >=2.5.4,<3.0a0 + - zlib-ng >=2.3.3,<2.4.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - tk >=8.6.13,<8.7.0a0 + - libjpeg-turbo >=3.2.0,<4.0a0 + - lcms2 >=2.19.1,<3.0a0 + - libxcb >=1.17.0,<2.0a0 + license: HPND + purls: + - pkg:pypi/pillow?source=hash-mapping + run_exports: {} + size: 1016711 + timestamp: 1788263887071 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.46.4-h7ac5ae9_3.conda + sha256: ed718d35c744ceef33063b5686f27b4b8d30d4065485e24efafb248658ee83b5 + md5: c5f34596fc05afb9ccc2782c42bcfcc5 + depends: + - libstdcxx >=14 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - pixman >=0.46.4,<1.0a0 + size: 304657 + timestamp: 1786106625126 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pkg-config-0.29.2-hfbd14cd_1012.conda + sha256: 05bc5117f0b32d626d6b62ccab81d61f2397660d76e184e8625bbb8125f0240e + md5: 3d06988747ca17813ee9a5639f8d6fbe + depends: + - libgcc >=15 + license: GPL-2.0-or-later + license_family: GPL + run_exports: {} + size: 338020 + timestamp: 1787956228046 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/prometheus-cpp-1.3.0-h7938499_0.conda + sha256: 9350d7bbc3982a732ff13a7fd17b585509e3b7d0191ac7b810cc3224868e3648 + md5: 10f4301290e51c49979ff98d1bdf2556 + depends: + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - zlib + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - prometheus-cpp >=1.3.0,<1.4.0a0 + size: 211335 + timestamp: 1730769181127 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-7.2.2-py312h898233f_2.conda + sha256: d992af53a9cef032f935bb50d2b7a3981e667bbcc82da15d70001c10c912ee67 + md5: e61c96e31d79d52e0399df8bd269e797 + depends: + - python + - libgcc >=15 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/psutil?source=hash-mapping + run_exports: {} + size: 226537 + timestamp: 1788189980508 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h5bc82ec_1004.conda + sha256: c66ea2c8f64b815b24344340a8a9d62152359dbf48a6151b1f282fdf35204d83 + md5: ac6610f5c63c18f5a3df229aa5f7ba37 + depends: + - libgcc >=15 + license: MIT + license_family: MIT + purls: [] + run_exports: {} + size: 9592 + timestamp: 1788383332468 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-25.0.0-py312h8025657_0.conda + sha256: 3063ef395335ebe9252a79388461f81f216c663975b4000e8a2ce63edfd7d890 + md5: cb3e4257aeb188eddda9120a3182fc05 + depends: + - libarrow-acero 25.0.0.* + - libarrow-dataset 25.0.0.* + - libarrow-substrait 25.0.0.* + - libparquet 25.0.0.* + - pyarrow-core 25.0.0 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: {} + size: 26128 + timestamp: 1784258307013 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyarrow-core-25.0.0-py312h2cce741_0_cpu.conda + sha256: f376caedaa352b323450852ddd493fdca0fa4096448fce921ab8d8075c1f5285 + md5: b2b528ddd26dbfb87eb27cde096449db + depends: + - libarrow 25.0.0.* *cpu + - libarrow-compute 25.0.0.* *cpu + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy >=1.23,<3 + - apache-arrow-proc * cpu + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/pyarrow?source=hash-mapping + run_exports: {} + size: 5185507 + timestamp: 1784258298673 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.14-h94ad73b_3_cpython.conda + build_number: 3 + sha256: 22678f91f2c4055b8b02cc9d3550ce984b95880f85d6c32d77589aa72b3294e4 + md5: e471fdf47fe89bd6fbc9423e06732f29 + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-aarch64 >=2.36.1 + - libexpat >=2.8.1,<3.0a0 + - libffi >=3.7.0,<3.8.0a0 + - libgcc >=15 + - liblzma >=5.8.3,<6.0a0 + - libnsl >=2.0.1,<2.1.0a0 + - libpython 3.12.14 hc3dd739_3_cpython + - libsqlite >=3.53.4,<4.0a0 + - libuuid >=2.42.3,<3.0a0 + - libxcrypt >=4.4.38 + - libzlib >=1.3.2,<2.0a0 + - ncurses >=6.6,<7.0a0 + - openssl >=3.5.8,<4.0a0 + - readline >=8.3,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + purls: [] + run_exports: + weak: + - python_abi 3.12.* *_cp312 + noarch: + - python + size: 22418400 + timestamp: 1788392934327 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-librt-0.15.0-py312h085bef5_1.conda + sha256: 8be7607be3d299fd3978f4814bc7414bd220606e2d4a984896a0611bb1e28bce + md5: b258f86969c21b76687c0a01e7dc755d + depends: + - python + - python 3.12.* *_cpython + - libgcc >=15 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/librt?source=compressed-mapping + run_exports: {} + size: 171890 + timestamp: 1788228308212 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pytorch-2.12.1-cpu_generic_py312_h9dd5f13_0.conda + sha256: 8956bf3e04eaed1056dd011714dcb50d8c2804aeb7ec40ff6e8a739b5d6abdb2 + md5: 452a1b67f47bc4ff7bd6c48ad0f20667 + depends: + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - filelock + - fmt >=12.1.0,<12.2.0a0 + - fsspec + - jinja2 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc >=14 + - liblapack >=3.9.0,<4.0a0 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libstdcxx >=14 + - libtorch 2.12.1 cpu_generic_hb12a5ee_0 + - libuv >=1.52.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - llvm-openmp >=22.1.8 + - networkx + - nomkl + - numpy >=1.23,<3 + - onednn >=3.12,<4.0a0 + - optree >=0.13.0 + - pybind11 + - pybind11-abi 11 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - setuptools <82 + - sleef >=3.9.0,<4.0a0 + - sympy >=1.13.3 + - typing_extensions >=4.10.0 + constrains: + - pytorch-cpu 2.12.1 + - pytorch-gpu <0.0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/torch?source=project-defined-mapping + run_exports: + weak: + - pytorch >=2.12.1,<2.13.0a0 + - libtorch >=2.12.1,<2.13.0a0 + size: 25373883 + timestamp: 1781834386179 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pytorch-2.13.0-cpu_generic_py312_h556be23_2.conda + sha256: 7f9a4aa81af02f0bc1b051fb49b1c29f7320b61eb42f8e106195795146f338af + md5: 30008330591a50cd186b5fe661d34866 + depends: + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - filelock + - fmt >=12.1.0,<12.2.0a0 + - fsspec + - jinja2 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc >=14 + - liblapack >=3.9.0,<4.0a0 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libstdcxx >=14 + - libtorch 2.13.0 cpu_generic_hf6f405e_2 + - libuv >=1.52.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - llvm-openmp >=22.1.8 + - networkx + - nomkl + - numpy >=1.25,<3 + - onednn >=3.12,<4.0a0 + - optree >=0.13.0 + - pybind11 + - pybind11-abi 11 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - setuptools <82 + - sleef >=3.9.0,<4.0a0 + - sympy >=1.13.3 + - typing_extensions >=4.10.0 + constrains: + - pytorch-cpu 2.13.0 + - pytorch-gpu <0.0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/torch?source=project-defined-mapping + run_exports: + weak: + - pytorch >=2.13.0,<2.14.0a0 + - libtorch >=2.13.0,<2.14.0a0 + size: 26918719 + timestamp: 1786374844301 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py312ha4530ae_1.conda + sha256: 0ba02720b470150a8c6261a86ea4db01dcf121e16a3e3978a84e965d3fe9c39a + md5: 47018c13dbb26186b577fd8bd1823a44 + depends: + - libgcc >=14 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + run_exports: {} + size: 192182 + timestamp: 1770223431156 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/qhull-2020.2-h70be974_5.conda + sha256: 49f777bdf3c5e030a8c7b24c58cdfe9486b51d6ae0001841079a3228bdf9fb51 + md5: bb138086d938e2b64f5f364945793ebf + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: LicenseRef-Qhull + purls: [] + run_exports: + weak: + - qhull >=2020.2,<2020.3.0a0 + size: 554571 + timestamp: 1720813941183 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rattler-build-0.74.0-hc342849_1.conda + sha256: 2689f2449a15e582e39fa3f65c147f79665c4e7b5ea9ef5bde8d7deedf08c4a5 + md5: d6b3a991fe8a780ba727c1fafd5205e0 + depends: + - patchelf + - libstdcxx >=15 + - libgcc >=15 + - openssl >=3.5.8,<4.0a0 + constrains: + - __glibc >=2.17 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 19456494 + timestamp: 1787728741978 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rdma-core-64.0-h1f0f388_0.conda + sha256: 73c71e76bf942b6a073578fcfa476f1d24d8586e4634808ea509095d00a4d581 + md5: 79907cd65e0bf8e426cc1d7e287548ea + depends: + - libgcc >=14 + - libnl >=3.11.0,<4.0a0 + - libstdcxx >=14 + - libsystemd0 >=257.13 + - libudev1 >=257.13 + license: Linux-OpenIB + license_family: BSD + run_exports: + weak: + - rdma-core >=64.0 + size: 1369227 + timestamp: 1788352296856 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/re2-2025.11.05-hfb2350b_2.conda + sha256: ac1763c911f34c861c3b2c8de26434d86cd5b85e9fea3fefb70cba94b6a8c010 + md5: 072c6ce4efe84fe0bd51b4af4aa35fc6 + depends: + - libre2-11 2025.11.05 h149037f_2 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libre2-11 >=2025.11.5 + - re2 + size: 27430 + timestamp: 1781312525166 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-ha7194a6_1.conda + sha256: 80167dcf73a96b6d0c1bb2298d7b8b9bc21b27cc5bf56979f9c548b49a4d1722 + md5: 5b399a7afa10098f2a6b02263181426e + depends: + - libgcc >=15 + - ncurses >=6.6,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + run_exports: + weak: + - readline >=8.3,<9.0a0 + size: 364344 + timestamp: 1787033761576 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rhash-1.4.6-he30d5cf_2.conda + sha256: b4e49255aa581788c28f0a4a19ba49756cea968998c599f40feadcfeb80d15fb + md5: aa87887d8ec28a87ae84d996876e728e + depends: + - libgcc >=14 + license: MIT + license_family: MIT + run_exports: + weak: + - rhash >=1.4.6,<2.0a0 + size: 211434 + timestamp: 1786731457243 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.7.5-h61cb6f2_1.conda + sha256: 5d2d07970e83b069a9155e68f56ef32af2563aad01f61ce697f062d8076f928e + md5: b38fcd3d4d7bffca304425358189726f + depends: + - libgcc >=14 + - openssl >=3.5.7,<4.0a0 + license: Apache-2.0 + license_family: Apache + purls: [] + run_exports: + weak: + - s2n >=1.7.5,<1.7.6.0a0 + size: 359993 + timestamp: 1783164798072 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.7.6-h61cb6f2_0.conda + sha256: 294495b65ea65abad37d89c0f77c42a6288952ff3c896432374a117b5f197b20 + md5: 4850ce2fa851c0f3410039832c8945a6 + depends: + - libgcc >=14 + - openssl >=3.5.7,<4.0a0 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - s2n >=1.7.6,<1.7.7.0a0 + size: 360232 + timestamp: 1784674459752 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/scipy-1.18.0-py312ha7f05e0_0.conda + sha256: 79343875bcc5cce28a54001844b221395b883a3d28fd8d9125dd38a4afab825b + md5: c957cde07f79a2cf5c7e9cdab39fa90b + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.3.0 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx >=14 + - numpy <2.7 + - numpy >=1.23,<3 + - numpy >=2.0.0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + run_exports: {} + size: 17170333 + timestamp: 1781912658149 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sleef-3.9.0-h5bb93e2_0.conda + sha256: 8292f6d40541d136fe3c525062db5f2ec584e442e4c8b60296b630bbe85cadce + md5: b90e82764e7de5a291e263ead7950ad4 + depends: + - _openmp_mutex >=4.5 + - libgcc >=14 + - libstdcxx >=14 + license: BSL-1.0 + purls: [] + run_exports: + weak: + - sleef >=3.9.0,<4.0a0 + size: 1190849 + timestamp: 1756276271706 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.2-he774c54_1.conda + sha256: a8a79c53852fb07286407907402caa5a96b6e22b518c4f010be40647f9ee3726 + md5: 3dec912091fb88614afa0af2712c1362 + depends: + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - snappy >=1.2.2,<1.3.0a0 + size: 47096 + timestamp: 1762948094646 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_hf03c496_4.conda + build_number: 104 + sha256: a1aa0d0f0b3d539644ff992e6dd0facf950c79df58fc37590ce5be84ff5e3f22 + md5: ebaded4b4b74c2cc43a754ded4eed76f + depends: + - libgcc >=15 + - libzlib >=1.3.2,<2.0a0 + constrains: + - xorg-libx11 >=1.8.13,<2.0a0 + license: TCL + purls: [] + run_exports: + weak: + - tk >=8.6.13,<8.7.0a0 + size: 3664220 + timestamp: 1787272859143 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ucc-1.8.0-he2b9832_2.conda + sha256: 1dd90bf994828f40eff2dd904df0837d4d00b2144852f6f58d69328588a8265a + md5: dcc7bc7aa71dc21f5146362adfb845bc + depends: + - libgcc >=14 + - libstdcxx >=14 + - rdma-core >=63.0 + - ucx >=1.22.0,<1.22.1.0a0 + constrains: + - cuda-cudart + - cuda-version >=12,<13.0a0 + - nccl >=2.30.7.1,<3.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - ucc >=1.8.0,<2.0a0 + size: 12838837 + timestamp: 1785867998499 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ucx-1.22.0-h6ab93cb_0.conda + sha256: df67ee7acabbaaa07d397515e3627684f4f38b43cd42f27daa8c67c358ddf384 + md5: 7ed0e37c02246cd41699832f8e33d5f4 + depends: + - _openmp_mutex >=4.5 + - libgcc >=14 + - libstdcxx >=14 + - rdma-core >=63.0 + constrains: + - cuda-cudart + - cuda-version >=12,<13.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - ucx >=1.22.0,<1.23.0a0 + size: 9368524 + timestamp: 1785789504833 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ukkonen-1.1.0-py312h4f740d2_0.conda + sha256: 782101cc2266b2126c44771e4c03658d0c55d933f34b91523d0bdd38ad2f3e10 + md5: 9d8284ec3764a95eff0cde0e70772315 + depends: + - cffi + - libgcc >=14 + - libstdcxx >=14 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ukkonen?source=hash-mapping + run_exports: {} + size: 15682 + timestamp: 1769438785443 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/unicodedata2-17.0.1-py312hcd1a082_0.conda + sha256: c4bd27513664fb76665526e7f7c14ab103ede07558941d7631d9980fa92ab8df + md5: c72e6a7950d859966ae790cc844fcfdf + depends: + - libgcc >=14 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/unicodedata2?source=hash-mapping + run_exports: {} + size: 409407 + timestamp: 1770909146204 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libice-1.1.2-h80f16a2_0.conda + sha256: e56bb636aefe3503a53520a0b7f3737f3a26fe0accf0befffc24d1c0ddd27008 + md5: 0566e37830f85911b141524635939941 + depends: + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - xorg-libice >=1.1.2,<2.0a0 + size: 63847 + timestamp: 1786474771090 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libsm-1.2.6-hf23e593_1.conda + sha256: 4978f89a764b54dc8be7a115b2d57f570f793243f3227653232742ce0946101b + md5: f5f4a1233da463827499fb4e5e1f0172 + depends: + - libgcc >=14 + - xorg-libice >=1.1.2,<2.0a0 + - libuuid >=2.42.2,<3.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - xorg-libsm >=1.2.6,<2.0a0 + size: 31476 + timestamp: 1786546266048 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libx11-1.8.13-h63a1b12_1.conda + sha256: 9ff59d55cbf85561833be3604a8c0a5497b0f13cdf122e8bb490e9cf3138d116 + md5: 8e873e9efc395329b914ee44e305b624 + depends: + - libgcc >=14 + - libxcb >=1.17.0,<2.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - xorg-libx11 >=1.8.13,<2.0a0 + size: 875768 + timestamp: 1787087025456 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_2.conda + sha256: 0822f3a8eb2a54bb41e1133f010e09d4a3242f8f12a372dfff7ad7248c5dbd29 + md5: b03af9d9dfe7aec9e27db74fc41a4ba9 + depends: + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - xorg-libxau >=1.0.12,<2.0a0 + size: 17413 + timestamp: 1786382929588 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_2.conda + sha256: 681465a02be4ac256c05cd5b32ce9812da1563b75be1bfc8884d991454194df3 + md5: 044c398bf4b3b9c01741d8afe4ce1c3e + depends: + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - xorg-libxdmcp >=1.1.5,<2.0a0 + size: 21558 + timestamp: 1786383120543 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxext-1.3.7-h5bc82ec_1.conda + sha256: e2cc4ba2b5291710f9ae3e88d917d778ce7911262450e673ba8a597a5d43490a + md5: 32734d534d08a853f22bdef1d43223b7 + depends: + - libgcc >=15 + - xorg-libx11 >=1.8.13,<2.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - xorg-libxext >=1.3.7,<2.0a0 + size: 53801 + timestamp: 1787103097310 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrender-0.9.12-he30d5cf_1.conda + sha256: 3cbac6f69e4a8634ba6b60cf283cba92606c8c74caa1369b799325f96b2f0cbf + md5: 1bcdaa1fc263291e6f42ff061666f3ae + depends: + - libgcc >=14 + - xorg-libx11 >=1.8.13,<2.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - xorg-libxrender >=0.9.12,<0.10.0a0 + size: 35814 + timestamp: 1787100239228 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h29ee22c_3.conda + sha256: 97e0fbe447c8f8bb1789047f37448062ebecda29bd264fcdf6129b8d08f174c9 + md5: 6c97c1f44a81be1b4d5ba15a06153256 + depends: + - libgcc >=15 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - yaml >=0.2.5,<0.3.0a0 + size: 88597 + timestamp: 1787228457350 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.2-hdc9db2a_3.conda + sha256: 3f3c296477cf26474660942f4d8ec104a8eee2cb1abc7c5bfec9ac1102c66451 + md5: 254c54ac18eca7bf4f865e661306dc43 + depends: + - libzlib 1.3.2 hdc9db2a_3 + license: Zlib + license_family: Other + purls: [] + run_exports: + weak: + - libzlib >=1.3.2,<2.0a0 + size: 100332 + timestamp: 1785276566528 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-ng-2.3.3-h1024f78_1.conda + sha256: a37f07056ac10c7e901cb54241e67af93205c25b84566ad1bce3b19a8088fd69 + md5: 09f81cb51dfb56946193f30225976b70 + depends: + - libgcc >=15 + - libstdcxx >=15 + license: Zlib + license_family: Other + purls: [] + run_exports: + weak: + - zlib-ng >=2.3.3,<2.4.0a0 + size: 125444 + timestamp: 1786736924421 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h9d15635_7.conda + sha256: 427fd14bcb3b8659796fecc682716617409350fb5a98e5b7b47558a10d1a2fc7 + md5: d942e34ac3920ba83f8b2d0169570187 + depends: + - libzlib >=1.3.2,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - zstd >=1.5.7,<1.6.0a0 + size: 615477 + timestamp: 1786599613561 +- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_3.conda + sha256: 2a7204314663eeda5dec482a956f0e2eaf289bd5b9953eaaaad0e81aa64638f2 + md5: 3845f3d75991bae0fb90884662f4327c + depends: + - cpython + - python-gil + license: MIT + license_family: MIT + purls: [] + run_exports: {} + size: 8144 + timestamp: 1784221492234 +- conda: https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda + sha256: 1307719f0d8ee694fc923579a39c0621c23fdaa14ccdf9278a5aac5665ac58e9 + md5: 74ac5069774cdbc53910ec4d631a3999 + depends: + - pygments + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/accessible-pygments?source=hash-mapping + run_exports: {} + size: 1326096 + timestamp: 1734956217254 +- conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda + sha256: 6c4456a138919dae9edd3ac1a74b6fbe5fd66c05675f54df2f8ab8c8d0cc6cea + md5: 1fd9696649f65fd6611fcdb4ffec738a + depends: + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/alabaster?source=hash-mapping + run_exports: {} + size: 18684 + timestamp: 1733750512696 +- conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.15.0-pyh5ded981_0.conda + sha256: 35fefb7c4bc39bca28d8764b4f59bd7b739c47e3af8e5e20ee22621db0c594b3 + md5: 28190db0e223089024a41b06c11af36e + depends: + - exceptiongroup >=1.0.2 + - idna >=2.8 + - python >=3.11 + - typing_extensions >=4.5 + - python + constrains: + - trio >=0.32.0 + - uvloop >=0.22.1 + - winloop >=0.2.3 + license: MIT + license_family: MIT + purls: + - pkg:pypi/anyio?source=compressed-mapping + run_exports: {} + size: 175295 + timestamp: 1788442098937 +- conda: https://conda.anaconda.org/conda-forge/noarch/ase-3.29.0-pyhd8ed1ab_1.conda + sha256: 287dbf2b1b20a5caaa0021887aeba5c7fde20c89879338a4ab84115d972ee76b + md5: aa59c152ba5bcaf269e6782dc1cbd5a7 + depends: + - matplotlib-base + - numpy + - python >=3.10 + - scipy + - typing_extensions + license: LGPL-2.1-or-later + purls: + - pkg:pypi/ase?source=hash-mapping + run_exports: {} + size: 1967089 + timestamp: 1782119236327 +- conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.2-pyhd8ed1ab_0.conda + sha256: fbbd8ce60cbd5c16f3fe559eb644551f94285caff30985ea961ff851c1cf25ac + md5: 89d495168582cb00428dad699d149624 + depends: + - python >=3.10 + constrains: + - astroid >=2,<5 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/asttokens?source=hash-mapping + run_exports: {} + size: 34639 + timestamp: 1783975742052 +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda + sha256: 1b6124230bb4e571b1b9401537ecff575b7b109cc3a21ee019f65e083b8399ab + md5: c6b0543676ecb1fb2d7643941fe375f2 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/attrs?source=hash-mapping + run_exports: {} + size: 64927 + timestamp: 1773935801332 +- conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda + sha256: a14a9ad02101aab25570543a59c5193043b73dc311a25650134ed9e6cb691770 + md5: f1976ce927373500cc19d3c0b2c85177 + depends: + - python >=3.10 + - python + constrains: + - pytz >=2015.7 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/babel?source=hash-mapping + run_exports: {} + size: 7684321 + timestamp: 1772555330347 +- conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.15.0-pyha770c72_0.conda + sha256: aed4b9dcf68ec2a75e5645fed14d77fd884d38d2e52bfa6ef4b278d90cd88781 + md5: 3b261da3fe9b4168738712832410b022 + depends: + - python >=3.10 + - soupsieve >=1.2 + - typing-extensions + license: MIT + license_family: MIT + purls: + - pkg:pypi/beautifulsoup4?source=hash-mapping + run_exports: {} + size: 92704 + timestamp: 1780853175566 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda + sha256: 0a0544cf95f64394fe4959286f5c71f5444ad58feb0602e53becb27448d24da6 + md5: 0f51e2391ade309db462a55611263e9c + depends: + - __unix + license: ISC + purls: [] + run_exports: {} + size: 131780 + timestamp: 1784754889428 +- conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-2.0.1-pyhcf101f3_0.conda + sha256: 39358005c3cc44d8315ed79789b18a960d69365be979970cc6bae8f7a6177703 + md5: 70e764e549c6c25de5e429d6e4a28b39 + depends: + - cached_property >=2.0.1,<2.0.2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/cached-property?source=compressed-mapping + run_exports: {} + size: 3720 + timestamp: 1787678456483 +- conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-2.0.1-pyhcf101f3_0.conda + sha256: 4bd96dab5a434e4ee59fb6910cae704d4c5b453907d4886272a9943d37e42b6f + md5: 256d863ded0f79464391a075944d24a6 + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/cached-property?source=compressed-mapping + run_exports: {} + size: 16597 + timestamp: 1787678456483 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.7.22-pyhd8ed1ab_0.conda + sha256: fb167de4388e64e52aa3907ed099afab944c1fa6e5f74b281a312dae1bcf7f3b + md5: 37e13edbe3b48f1095a9d085ef9cd83b + depends: + - python >=3.10 + license: ISC + purls: + - pkg:pypi/certifi?source=hash-mapping + run_exports: {} + size: 137015 + timestamp: 1784717699092 +- conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda + sha256: aa589352e61bb221351a79e5946d56916e3c595783994884accdb3b97fe9d449 + md5: 381bd45fb7aa032691f3063aff47e3a1 + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cfgv?source=hash-mapping + run_exports: {} + size: 13589 + timestamp: 1763607964133 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.5.1-pyhd8ed1ab_0.conda + sha256: cb60ef3e0631c8bacb4f7057196dee4496091a22baa3bb4b9bccb12c7e1c921b + md5: e0ac3accc64e23e40969d660e5f58ac8 + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/charset-normalizer?source=compressed-mapping + run_exports: {} + size: 64487 + timestamp: 1786835648298 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + sha256: ccc4787f511964f9a1f2d2d2859c91c5d571fb60f7f09d4c4e092c9b7a94e671 + md5: 2c4bd6aeb90bb157456841c3270a0d92 + depends: + - __unix + - python + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/click?source=hash-mapping + run_exports: {} + size: 107155 + timestamp: 1783085363526 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/colorama?source=hash-mapping + run_exports: {} + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda + sha256: 576a44729314ad9e4e5ebe055fbf48beb8116b60e58f9070278985b2b634f212 + md5: 2da13f2b299d8e1995bafbbe9689a2f7 + depends: + - python >=3.9 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/comm?source=hash-mapping + run_exports: {} + size: 14690 + timestamp: 1753453984907 +- conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt21_osx-arm64-21.1.8-hb8825d9_2.conda + sha256: e7fef79b60a612236b2f4ab84e6d0556fa7f670e32ede52f1217a59213e389d6 + md5: 93f5de189aa3dca7d88ae1d16a0c9754 + constrains: + - compiler-rt >=9.0.1 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + run_exports: {} + size: 10226963 + timestamp: 1787374944374 +- conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt22_linux-64-22.1.8-h0e38de2_2.conda + sha256: 904e27f8b3b546bea397e2c68d5c82c6f0a24dbe24def9a7dee714e0b679c586 + md5: 422f14f6a5855c88cbba248e7375e915 + constrains: + - compiler-rt >=9.0.1 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + run_exports: {} + size: 46349778 + timestamp: 1787293680166 +- conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_linux-64-20.1.8-hffcefe0_1.conda + sha256: 790aa3aea6bf79a9a0ef73c888bb5dc9b6782257727dcc63acd320366ee7f26b + md5: f8c27e527fa2a97c9fca43e367461b7f + depends: + - clang 20.1.8.* + constrains: + - clangxx 20.1.8 + - compiler-rt 20.1.8 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + run_exports: {} + size: 49731196 + timestamp: 1757411421407 +- conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_linux-64-22.1.8-ha770c72_2.conda + sha256: 196eb6ea49630770f2ea7278f0ff4a4aa78b412729e8c958cd1d061f68387e65 + md5: 99515a09e96a5a0e33d8779b43c171df + depends: + - compiler-rt22_linux-64 22.1.8 h0e38de2_2 + constrains: + - clang 22.1.8 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + run_exports: {} + size: 16656 + timestamp: 1787293765010 +- conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-arm64-21.1.8-hce30654_2.conda + sha256: 05fded2aca8465080c1f2c6fcbeb0039eff1a1cc84e5ff1b61bab360d317117f + md5: 1756ab5909480865183f5eee080e66dd + depends: + - compiler-rt21_osx-arm64 21.1.8 hb8825d9_2 + constrains: + - clang 21.1.8 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + run_exports: {} + size: 16400 + timestamp: 1787374964124 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.11.16-py311hd8ed1ab_2.conda + noarch: generic + sha256: be18e37b4ab19a72b2ceac449e4ad11e5e18756aeb1c2a5b7f8811bff0c2e030 + md5: 18b8c7456c7a5052ca5d0002957a6f29 + depends: + - python >=3.11,<3.12.0a0 + - python_abi * *_cp311 + license: Python-2.0 + purls: [] + run_exports: {} + size: 48577 + timestamp: 1788392044498 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.14-py312hd8ed1ab_3.conda + noarch: generic + sha256: 1052869d599008850098c033f9568a2e28bb31238705969719be69a87474cc93 + md5: adee9213d9a98d7f8b5627209c8b4ae0 + depends: + - python >=3.12,<3.13.0a0 + - python_abi * *_cp312 + license: Python-2.0 + purls: [] + run_exports: {} + size: 47172 + timestamp: 1788391292962 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.13.15-py313hd8ed1ab_103.conda + noarch: generic + sha256: c46fe2993a44cfa59e2d7673d77ce29c5bbc72b73e2597d58536eff7c196e57c + md5: 23f5019df9a1d2287cb99af4c81ca8d2 + depends: + - python >=3.13,<3.14.0a0 + - python_abi * *_cp313 + license: Python-2.0 + purls: [] + run_exports: {} + size: 49553 + timestamp: 1788386188585 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-12.9.27-ha770c72_0.conda + sha256: 2ee3b9564ca326226e5cda41d11b251482df8e7c757e333d28ec75213c75d126 + md5: 87ff6381e33b76e5b9b179a2cdd005ec + depends: + - cuda-version >=12.9,<12.10.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 1150650 + timestamp: 1746189825236 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cccl_linux-64-13.3.3.4.1-ha770c72_1.conda + sha256: fa44586fc308d0089fb5f014d5b53cbea19a2e83cd7bbd1e19c79140293be9a3 + md5: 199a317645eac1a18745d05dc551ab6e + depends: + - cuda-version >=13.3,<13.4.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 1486700 + timestamp: 1785874560026 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-compiler-12.9.2-hbad6d8a_0.conda + sha256: 94eeda2d8c7580a980fc0126bb90eb7d802a9cac9d48de86bad79987bfa9fc9c + md5: 03ecb59bb24bed699de7a48f0c3c4cb3 + depends: + - __linux + - c-compiler + - cuda-cuobjdump 12.9.82.* + - cuda-cuxxfilt 12.9.82.* + - cuda-nvcc 12.9.86.* + - cuda-nvprune 12.9.82.* + - cxx-compiler + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 21132 + timestamp: 1778770556551 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-compiler-13.3.1-hbad6d8a_0.conda + sha256: 23c0840f82fab2cbe39edcd0de6abf6ba1216e791550fbab07008344a8a21c33 + md5: 234339b52482870d98c1aeebaa580518 + depends: + - __linux + - c-compiler + - cuda-ctadvisor 13.3.33.* + - cuda-cuobjdump 13.3.73.* + - cuda-cuxxfilt 13.3.29.* + - cuda-nvcc 13.3.73.* + - cuda-nvprune 13.3.29.* + - cuda-tileiras 13.3.36.* + - cxx-compiler + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 20476 + timestamp: 1782831988925 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-12.9.86-ha770c72_2.conda + sha256: e6257534c4b4b6b8a1192f84191c34906ab9968c92680fa09f639e7846a87304 + md5: 79d280de61e18010df5997daea4743df + depends: + - cuda-version >=12.9,<12.10.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 94239 + timestamp: 1753975242354 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-crt-dev_linux-64-13.3.73-ha770c72_1.conda + sha256: 1e1036f983ff02151bf72eec86103f3303883eaaa9e752c797f98bfd64cb5e28 + md5: 8862ed846a781454e3901d8ee8c6558b + depends: + - cuda-version >=13.3,<13.4.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 116442 + timestamp: 1787703437645 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-12.9.79-h3f2d84a_0.conda + sha256: ffe86ed0144315b276f18020d836c8ef05bf971054cf7c3eb167af92494080d5 + md5: 86e40eb67d83f1a58bdafdd44e5a77c6 + depends: + - cuda-cccl_linux-64 + - cuda-cudart-static_linux-64 + - cuda-cudart_linux-64 + - cuda-version >=12.9,<12.10.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: + weak: + - cuda-cudart >=12.9.79,<13.0a0 + size: 389140 + timestamp: 1749218427266 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-dev_linux-64-13.3.29-h376f20c_0.conda + sha256: d95f1b404119e3f72edb7ac5dbd4443e2d7d040f7d68c3905c0dd7ad78f11311 + md5: 4165013e8d24dd61774458e6f2e36c32 + depends: + - cuda-cccl_linux-64 + - cuda-cudart-static_linux-64 + - cuda-cudart_linux-64 + - cuda-version >=13.3,<13.4.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: + weak: + - cuda-cudart >=13.3.29,<14.0a0 + size: 405020 + timestamp: 1779898430134 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-12.9.79-h3f2d84a_0.conda + sha256: d435f8a19b59b52ce460ee3a6bfd877288a0d1d645119a6ba60f1c3627dc5032 + md5: b87bf315d81218dd63eb46cc1eaef775 + depends: + - cuda-version >=12.9,<12.10.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 1148889 + timestamp: 1749218381225 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart-static_linux-64-13.3.29-h376f20c_0.conda + sha256: fa920f2c2154ea2ace2d55457e43af8e7bfc2c94fa5ec7276792ad411d1011d1 + md5: 7d4fe2a79d971522b3ad68b772c197eb + depends: + - cuda-version >=13.3,<13.4.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 1126340 + timestamp: 1779898412056 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-12.9.79-h3f2d84a_0.conda + sha256: 6cde0ace2b995b49d0db2eefb7bc30bf00ffc06bb98ef7113632dec8f8907475 + md5: 64508631775fbbf9eca83c84b1df0cae + depends: + - cuda-version >=12.9,<12.10.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 197249 + timestamp: 1749218394213 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-cudart_linux-64-13.3.29-h376f20c_0.conda + sha256: a86028f94acf37b17ca2280734ae9dcc407cdf68a9c400102d323a3b15e52f0b + md5: 10949c6dfe9157fedb19170bd6e0b835 + depends: + - cuda-version >=13.3,<13.4.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 206064 + timestamp: 1779898416941 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-driver-dev_linux-64-12.9.79-h3f2d84a_0.conda + sha256: a15574d966e73135a79d5e6570c87e13accdb44bd432449b5deea71644ad442c + md5: d411828daa36ac84eab210ba3bbe5a64 + depends: + - cuda-version >=12.9,<12.10.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 37714 + timestamp: 1749218405324 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-driver-dev_linux-64-13.3.29-h376f20c_0.conda + sha256: 40e9c9f18311719c249bd8b81e73f1c3f56ef5b31db97ec393a5ab5373264d5e + md5: 50da0977db20840628e946e4bd3b2ecb + depends: + - cuda-version >=13.3,<13.4.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 39968 + timestamp: 1779898421393 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvcc-dev_linux-64-12.9.86-he91c749_2.conda + sha256: a1672a34439a72869de9e011e935d41b62fc8dfb1a2700e85ed8a7a129b79981 + md5: 19d4e090217f0ea89d30bedb7461c048 + depends: + - cuda-crt-dev_linux-64 12.9.86 ha770c72_2 + - cuda-nvvm-dev_linux-64 12.9.86 ha770c72_2 + - cuda-version >=12.9,<12.10.0a0 + - libgcc >=6 + - libnvptxcompiler-dev_linux-64 12.9.86 ha770c72_2 + constrains: + - gcc_impl_linux-64 >=6,<15.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 28121 + timestamp: 1753975535813 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvcc-dev_linux-64-13.3.73-he91c749_1.conda + sha256: 3cb2699a5e2ef6e71da807f171f099b9957514f0a88aac31e780a304983ce6d6 + md5: 6c0f9ff98b17ffdd35a91f016bb68176 + depends: + - cuda-crt-dev_linux-64 13.3.73 ha770c72_1 + - cuda-nvvm-dev_linux-64 13.3.73 ha770c72_1 + - cuda-version >=13.3,<13.4.0a0 + - libgcc >=6 + - libnvptxcompiler-dev_linux-64 13.3.73 ha770c72_1 + constrains: + - gcc_impl_linux-64 >=6,<16.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 29326 + timestamp: 1787703602069 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-12.9.86-ha770c72_2.conda + sha256: 522722dcaffd133e0c7500c69dc70e21ac34d6762dcbaabfe847439f944028f0 + md5: 7b386291414c7eea113d25ac28a33772 + depends: + - cuda-version >=12.9,<12.10.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 27096 + timestamp: 1753975261562 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-nvvm-dev_linux-64-13.3.73-ha770c72_1.conda + sha256: ca8069929ad3540d06cc668cb4d0db9677adae088fbde451764423e73b96feb1 + md5: e091b729c9abfa28c4168653c68baca8 + depends: + - cuda-version >=13.3,<13.4.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 27872 + timestamp: 1787703444057 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-12.9-h4f385c5_3.conda + sha256: 5f5f428031933f117ff9f7fcc650e6ea1b3fef5936cf84aa24af79167513b656 + md5: b6d5d7f1c171cbd228ea06b556cfa859 + constrains: + - cudatoolkit 12.9|12.9.* + - __cuda >=12 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 21578 + timestamp: 1746134436166 +- conda: https://conda.anaconda.org/conda-forge/noarch/cuda-version-13.3-hcbadf70_3.conda + sha256: bd8ee668f416bdd0f6548b2413550ae83d3834665a5be869a2daf99233ec526e + md5: 0fd72afdcc74560b80eb74b78767c454 + constrains: + - __cuda >=13 + - cudatoolkit 13.3|13.3.* + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 22083 + timestamp: 1779891651771 +- conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + sha256: bb47aec5338695ff8efbddbc669064a3b10fe34ad881fb8ad5d64fbfa6910ed1 + md5: 4c2a8fef270f6c69591889b93f9f55c1 + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/cycler?source=hash-mapping + run_exports: {} + size: 14778 + timestamp: 1764466758386 +- conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.3-pyhcf101f3_0.conda + sha256: e2753997b8bd34205f42be01b8bab8037423dc30c02a1ec12de23e5b4c0b0a2e + md5: 58638f77697c4f6726753eb8be34818b + depends: + - python >=3.10 + - python + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/distlib?source=hash-mapping + run_exports: {} + size: 303705 + timestamp: 1781320269259 +- conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.4-pyhd8ed1ab_0.conda + sha256: 0d605569a77350fb681f9ed8d357cc71649b59a304099dc9d09fbeec5e84a65e + md5: d6bd3cd217e62bbd7efe67ff224cd667 + depends: + - python >=3.10 + license: CC-PDDC AND BSD-3-Clause AND BSD-2-Clause AND ZPL-2.1 + purls: + - pkg:pypi/docutils?source=hash-mapping + run_exports: {} + size: 438002 + timestamp: 1766092633160 +- conda: https://conda.anaconda.org/conda-forge/noarch/e3nn-0.6.0-pyhcf101f3_1.conda + sha256: 6f0b58e8427e8399094a8e8fb9b0a74008a73bd82c562842b086ffa7dec7b981 + md5: ff4d702b7a86d1906ab0b35f8420383e + depends: + - opt_einsum_fx >=0.1.4 + - python >=3.10 + - scipy + - sympy + - pytorch >=1.8.0 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/e3nn?source=hash-mapping + run_exports: {} + size: 391463 + timestamp: 1777474663095 +- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + sha256: ee6cf346d017d954255bbcbdb424cddea4d14e4ed7e9813e429db1d795d01144 + md5: 8e662bd460bda79b1ea39194e3c4c9ab + depends: + - python >=3.10 + - typing_extensions >=4.6.0 + license: MIT and PSF-2.0 + purls: + - pkg:pypi/exceptiongroup?source=hash-mapping + run_exports: {} + size: 21333 + timestamp: 1763918099466 +- conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + sha256: 210c8165a58fdbf16e626aac93cc4c14dbd551a01d1516be5ecad795d2422cad + md5: ff9efb7f7469aed3c4a8106ffa29593c + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/executing?source=hash-mapping + run_exports: {} + size: 30753 + timestamp: 1756729456476 +- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.5-pyhd8ed1ab_0.conda + sha256: a52faa011a8176bbbf30c77f76707788be9a9e1a7e30c3753083719c093a15dc + md5: 9b091d04be6b722d4ed7dfee34295dea + depends: + - python >=3.10 + license: Unlicense + purls: + - pkg:pypi/filelock?source=compressed-mapping + run_exports: {} + size: 78858 + timestamp: 1788217445739 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b + md5: 0c96522c6bdaed4b1566d11387caaf45 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: {} + size: 397370 + timestamp: 1566932522327 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c + md5: 34893075a5c9e55cdafac56607368fc6 + license: OFL-1.1 + license_family: Other + purls: [] + run_exports: {} + size: 96530 + timestamp: 1620479909603 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 + md5: 4d59c254e01d9cde7957100457e2d5fb + license: OFL-1.1 + license_family: Other + purls: [] + run_exports: {} + size: 700814 + timestamp: 1620479612257 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 + md5: 49023d73832ef61042f6a237cb2687e7 + license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 + license_family: Other + purls: [] + run_exports: {} + size: 1620504 + timestamp: 1727511233259 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 + md5: fee5683a3f04bd15cbd8318b096a27ab + depends: + - fonts-conda-forge + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: {} + size: 3667 + timestamp: 1566974674465 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 + md5: a7970cd949a077b7cb9696379d338681 + depends: + - font-ttf-ubuntu + - font-ttf-inconsolata + - font-ttf-dejavu-sans-mono + - font-ttf-source-code-pro + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: {} + size: 4059 + timestamp: 1762351264405 +- conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.7.0-pyhd8ed1ab_0.conda + sha256: 3cd1c985695d8114bdba2a4a38c87e86d633fadd7cfe7a6733ebb3fe807fdc86 + md5: b9176565976c773a0739bd83deaf06cc + depends: + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/fsspec?source=hash-mapping + run_exports: {} + size: 151868 + timestamp: 1785325238671 +- conda: https://conda.anaconda.org/conda-forge/noarch/future-1.0.0-pyhd8ed1ab_2.conda + sha256: 45dfd037889b7075c5eb46394f93172de0be0b1624c7f802dd3ecc94b814d8e0 + md5: 1054c53c95d85e35b88143a3eda66373 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/future?source=hash-mapping + run_exports: {} + size: 364561 + timestamp: 1738926525117 +- conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + sha256: 96cac6573fd35ae151f4d6979bab6fbc90cb6b1fb99054ba19eb075da9822fcb + md5: b8993c19b0c32a2f7b66cbb58ca27069 + depends: + - python >=3.10 + - typing_extensions + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/h11?source=hash-mapping + run_exports: {} + size: 39069 + timestamp: 1767729720872 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.4.1-pyhcf101f3_0.conda + sha256: 307dd6ec90140c3cf4171071b0e5e870abec314f4565c1edd5bc433e942cdcc0 + md5: e652ac7756069c456d0da2a922cd7df5 + depends: + - python >=3.10 + - hyperframe >=6.1,<7 + - hpack >=4.2,<5 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/h2?source=hash-mapping + run_exports: {} + size: 100789 + timestamp: 1785796355216 +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + sha256: fdcea5d7cb314485d3907192ef024c704311548c5b0cbeb390cd1951051e29d2 + md5: b395909221b9bd1df066e5930e18855b + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/hpack?source=hash-mapping + run_exports: {} + size: 32884 + timestamp: 1782283986153 +- conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + sha256: 04d49cb3c42714ce533a8553986e1642d0549a05dc5cc48e0d43ff5be6679a5b + md5: 4f14640d58e2cc0aa0819d9d8ba125bb + depends: + - python >=3.9 + - h11 >=0.16 + - h2 >=3,<5 + - sniffio 1.* + - anyio >=4.0,<5.0 + - certifi + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/httpcore?source=hash-mapping + run_exports: {} + size: 49483 + timestamp: 1745602916758 +- conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + sha256: cd0f1de3697b252df95f98383e9edb1d00386bfdd03fdf607fa42fe5fcb09950 + md5: d6989ead454181f4f9bc987d3dc4e285 + depends: + - anyio + - certifi + - httpcore 1.* + - idna + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/httpx?source=hash-mapping + run_exports: {} + size: 63082 + timestamp: 1733663449209 +- conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-1.30.0-pyh5ded981_0.conda + sha256: 37907d42b1d86dcac27be8f9190fe9ef6eed213660966c2f6e85534398a6d558 + md5: b9839627c53930410dc323acabddc275 + depends: + - python >=3.11 + - click >=8.4.2,<9.0.0 + - filelock >=3.10.0 + - fsspec >=2023.5.0 + - hf-xet >=1.5.2,<2.0.0 + - httpx >=0.23.0,<1 + - packaging >=20.9 + - pyyaml >=5.1 + - tqdm >=4.42.1 + - typing_extensions >=4.1.0 + - python + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/huggingface-hub?source=compressed-mapping + run_exports: {} + size: 544027 + timestamp: 1788442719873 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 + md5: 8e6923fc12f1fe8f8c4e5c9f343256ac + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/hyperframe?source=hash-mapping + run_exports: {} + size: 17397 + timestamp: 1737618427549 +- conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda + sha256: 381cedccf0866babfc135d65ee40b778bd20e927d2a5ec810f750c5860a7c5b8 + md5: 84a3233b709a289a4ddd7a2fd27dd988 + depends: + - python >=3.10 + - ukkonen + license: MIT + license_family: MIT + purls: + - pkg:pypi/identify?source=hash-mapping + run_exports: {} + size: 79757 + timestamp: 1776455344188 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.19-pyhcf101f3_0.conda + sha256: 1c35a59c1545ad0fdaddf1fbde7bcfa6ef41a8d68c3a2b0b4a291be00676163e + md5: a39ae05027e9b707742e41b30d296b75 + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/idna?source=compressed-mapping + run_exports: {} + size: 177433 + timestamp: 1787059857580 +- conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.1-pyhd8ed1ab_0.conda + sha256: 4e787f9ccc31053ccea56d98ecd284a4f788988a3f9c4627db72fdd0b127529b + md5: ebc56022e4ef7e74a829be94c53797ca + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/imagesize?source=compressed-mapping + run_exports: {} + size: 21467 + timestamp: 1787649248672 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.1-pyhcf101f3_0.conda + sha256: 95a074a7d3f58b3494c068d4789c364dcb591c56b70ca6b12f149a540f9aeea4 + md5: 77ec68e0aa61c3fff9ecbf840f93d64e + depends: + - python >=3.10 + - zipp >=3.20 + - python + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/importlib-metadata?source=compressed-mapping + run_exports: {} + size: 34920 + timestamp: 1787943971257 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-7.1.0-pyhd8ed1ab_0.conda + sha256: 6a2f86ef0965605d742b5b94229bf8b829258d0a9f640e3651901cc72ef9a0a5 + md5: e3bffa82b874f8b9a2631bddb3869529 + depends: + - importlib_resources >=7.1.0,<7.1.1.0a0 + - python >=3.10 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: {} + size: 10354 + timestamp: 1776068852701 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-7.1.0-pyhd8ed1ab_0.conda + sha256: a563a51aa522998172838e867e6dedcf630bc45796e8612f5a1f6d73e9c8125a + md5: 0ba6225c279baf7ea9473a62ea0ec9ae + depends: + - python >=3.10 + - zipp >=3.1.0 + constrains: + - importlib-resources >=7.1.0,<7.1.1.0a0 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/importlib-resources?source=hash-mapping + run_exports: {} + size: 34809 + timestamp: 1776068839274 +- conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + sha256: e1a9e3b1c8fe62dc3932a616c284b5d8cbe3124bbfbedcf4ce5c828cb166ee19 + md5: 9614359868482abba1bd15ce465e3c42 + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/iniconfig?source=hash-mapping + run_exports: {} + size: 13387 + timestamp: 1760831448842 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.3.0-pyha191276_0.conda + sha256: 305ad9226363ff5f259c404dd9a7508183a2e150739b2adc43db7d817234da66 + md5: 2b47a10e4d98334f8171ff60aea05ff3 + depends: + - __linux + - comm >=0.1.1 + - debugpy >=1.6.5 + - ipython >=7.23.1 + - jupyter_client >=8.9.0 + - jupyter_core >=5.1,!=6.0.* + - matplotlib-inline >=0.1 + - nest-asyncio2 >=1.7.0 + - packaging >=22 + - psutil >=5.7 + - python >=3.10 + - pyzmq >=25 + - tornado >=6.4.1 + - traitlets >=5.4.0 + - python + constrains: + - appnope >=0.1.2 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/ipykernel?source=hash-mapping + run_exports: {} + size: 138635 + timestamp: 1781101665847 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.17.1-pyh53cf698_0.conda + sha256: 0fb38e0685e5065064ac007cf8317ee24b329373c9f80c31eb74c1bfcb0cfe24 + md5: 0e28933e51c1d05c179bfd595ead8aee + depends: + - __unix + - ipython_pygments_lexers >=1.0.0 + - jedi >=0.18.2 + - matplotlib-inline >=0.1.6 + - prompt-toolkit >=3.0.41,<3.1.0 + - psutil >=7 + - pygments >=2.14.0 + - python >=3.11 + - stack_data >=0.6.0 + - traitlets >=5.13.0 + - typing_extensions >=4.6 + - pexpect >4.6 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/ipython?source=compressed-mapping + run_exports: {} + size: 730678 + timestamp: 1788260388285 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda + sha256: 894682a42a7d659ae12878dbcb274516a7031bbea9104e92f8e88c1f2765a104 + md5: bd80ba060603cc228d9d81c257093119 + depends: + - pygments + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/ipython-pygments-lexers?source=hash-mapping + run_exports: {} + size: 13993 + timestamp: 1737123723464 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.9-pyhd8ed1ab_0.conda + sha256: c391fe12c24fce4f8380f44ebdfb62a5ecdbf0ee168e7db7ea9baf3527eec003 + md5: 1efaf89bb5d9a6ff2ce5f84d25678f53 + depends: + - comm >=0.1.3 + - ipython >=6.1.0 + - jupyterlab_widgets >=3.0.17,<3.1.0 + - python >=3.10 + - traitlets >=4.3.1 + - widgetsnbextension >=4.0.16,<4.1.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/ipywidgets?source=compressed-mapping + run_exports: {} + size: 115707 + timestamp: 1787052940568 +- conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.20.0-pyhcf101f3_0.conda + sha256: 744143551c1c7b528b82533fb641b9d7db20b2203abc4c2635c387fa6c089fc3 + md5: c2b3d37aa1411031126036ee76a8a861 + depends: + - python >=3.10 + - parso >=0.8.6,<0.9.0 + - python + license: Apache-2.0 AND MIT + purls: + - pkg:pypi/jedi?source=hash-mapping + run_exports: {} + size: 2715215 + timestamp: 1782251948616 +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + sha256: fc9ca7348a4f25fed2079f2153ecdcf5f9cf2a0bc36c4172420ca09e1849df7b + md5: 04558c96691bed63104678757beb4f8d + depends: + - markupsafe >=2.0 + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jinja2?source=hash-mapping + run_exports: {} + size: 120685 + timestamp: 1764517220861 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_1.conda + sha256: 328756a4555941d57af4a5f553e5d8598e9f3b37db028f557e30f9f0b3086db6 + md5: 204b5ca91eba7738790ecc333facbbbe + depends: + - attrs >=22.2.0 + - jsonschema-specifications >=2023.3.6 + - python >=3.10 + - referencing >=0.28.4 + - rpds-py >=0.25.0 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/jsonschema?source=compressed-mapping + run_exports: {} + size: 82084 + timestamp: 1787579299493 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda + sha256: 0a4f3b132f0faca10c89fdf3b60e15abb62ded6fa80aebfc007d05965192aa04 + md5: 439cd0f567d697b20a8f45cb70a1005a + depends: + - python >=3.10 + - referencing >=0.31.0 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/jsonschema-specifications?source=hash-mapping + run_exports: {} + size: 19236 + timestamp: 1757335715225 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-cache-1.0.1-pyhff2d567_0.conda + sha256: 054d397dd45ed08bffb0976702e553dfb0d0b0a477da9cff36e2ea702e928f48 + md5: b0ee650829b8974202a7abe7f8b81e5a + depends: + - attrs + - click + - importlib-metadata + - nbclient >=0.2 + - nbformat + - python >=3.9 + - pyyaml + - sqlalchemy >=1.3.12,<3 + - tabulate + license: MIT + license_family: MIT + purls: + - pkg:pypi/jupyter-cache?source=hash-mapping + run_exports: {} + size: 31236 + timestamp: 1731777189586 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.10.0-pyhcf101f3_0.conda + sha256: 94f11bbdbac51a68415fb0a8bb441fb3475c0138e778664a3fb48f5698688ebf + md5: 85130259a26c023f53108dc9ab1cfb44 + depends: + - jupyter_core >=5.1 + - python >=3.10 + - python-dateutil >=2.8.2 + - pyzmq >=25.0 + - tornado >=6.4.1 + - traitlets >=5.3 + - typing_extensions >=4.13.0 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-client?source=compressed-mapping + run_exports: {} + size: 118962 + timestamp: 1787929615607 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda + sha256: 1d34b80e5bfcd5323f104dbf99a2aafc0e5d823019d626d0dce5d3d356a2a52a + md5: b38fe4e78ee75def7e599843ef4c1ab0 + depends: + - __unix + - python + - platformdirs >=2.5 + - python >=3.10 + - traitlets >=5.3 + - python + constrains: + - pywin32 >=300 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-core?source=hash-mapping + run_exports: {} + size: 65503 + timestamp: 1760643864586 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.17-pyhcf101f3_0.conda + sha256: 697c4a5b4771e8fbd5a9bbb614899982c7e586eafaf123c210f9d1794436f00a + md5: 1fb3f0d175d6e92f56139fb46a17aa2d + depends: + - python >=3.10 + - python + constrains: + - jupyterlab >=4,<5 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyterlab-widgets?source=compressed-mapping + run_exports: {} + size: 219589 + timestamp: 1787045328396 +- conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + sha256: 41557eeadf641de6aeae49486cef30d02a6912d8da98585d687894afd65b356a + md5: 86d9cba083cd041bfbf242a01a7a1999 + constrains: + - sysroot_linux-64 ==2.28 + license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later + license_family: GPL + purls: [] + run_exports: {} + size: 1278712 + timestamp: 1765578681495 +- conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_9.conda + sha256: 5d224bf4df9bac24e69de41897c53756108c5271a0e5d2d2f66fd4e2fbc1d84b + md5: bb3b7cad9005f2cbf9d169fb30263f3e + constrains: + - sysroot_linux-aarch64 ==2.28 + license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later + license_family: GPL + run_exports: {} + size: 1248134 + timestamp: 1765578613607 +- conda: https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2 + sha256: 5210d31c8f2402dd1ad1b3edcf7a53292b9da5de20cd14d9c243dbf9278b1c4f + md5: 8d67904973263afd2985ba56aa2d6bb4 + depends: + - python + - six + license: MIT + license_family: MIT + purls: + - pkg:pypi/latexcodec?source=hash-mapping + run_exports: {} + size: 18212 + timestamp: 1592937373647 +- conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-21.1.8-h707e725_3.conda + sha256: 35702bbe8e26658df7fd4d31af441c653922356d291d093abfc32bc4b65c7900 + md5: 7daa1a91c6d082f40c55ef41b74692d7 + depends: + - __unix + constrains: + - libcxx-devel 21.1.8 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + run_exports: {} + size: 1103738 + timestamp: 1771995481491 +- conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.4.0-hd9a9cd0_104.conda + sha256: 4189cbf5294ca75aacc79a05969e92f02c300e00798b7f694dcc376e8a4ffc2f + md5: 6c875129a1f367676f6cc0ccc1f2ef28 + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 3092281 + timestamp: 1787617687992 +- conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_120.conda + sha256: a57003c6ea0d7464d06f1e37ac3832faa0578b48e51896c896d83eda01c83d04 + md5: c2d79cd96c64647ada04757c41803c87 + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 3085810 + timestamp: 1784923656707 +- conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.3.0-h2b852eb_104.conda + sha256: 83221295f52a5ac410f092b4fe1415052b8542f76ddf9ee9949a3571d19e1d43 + md5: b206066f9a3900bf869ac1a964686c9c + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 3093906 + timestamp: 1787618317103 +- conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-15.3.0-h6e7e4e0_104.conda + sha256: 7082eeeef07bba617b778348267956db5d0bf84eb5f1b5fe6ada9fee4a6fad85 + md5: 4d59c62b87531bb11393daeb4b750c43 + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: {} + size: 2353577 + timestamp: 1787617542232 +- conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_osx-arm64-15.3.0-h647fcfe_104.conda + sha256: 3c14774cfe4ecf9e55e15a98fe2c532a842ac2d2784e1275faa82366bb913fad + md5: ec1cbcf2f7bb487c4b5596ea10479193 + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: {} + size: 2069546 + timestamp: 1787617514475 +- conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_linux-64-12.9.86-ha770c72_2.conda + sha256: 17952c32eac197a59c119fdf3fb6f08c6a29c225a80bae141ac904ad212b87dd + md5: a66a909acf08924aced622903832a937 + depends: + - cuda-version >=12.9,<12.10.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 14422867 + timestamp: 1753975387297 +- conda: https://conda.anaconda.org/conda-forge/noarch/libnvptxcompiler-dev_linux-64-13.3.73-ha770c72_1.conda + sha256: fbc919f6bff53456580086f6980cf71dbb01abe6b3833e2c3794784e0b37054f + md5: 877d95c63e88fc34739e98b266815ca2 + depends: + - cuda-version >=13.3,<13.4.0a0 + license: LicenseRef-NVIDIA-End-User-License-Agreement + purls: [] + run_exports: {} + size: 11022914 + timestamp: 1787703524254 +- conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.4.0-ha5b54cb_104.conda + sha256: f3b1b74f393579fef4beb5b49d9ae941766ee859175c079f98d347720001db79 + md5: 8ebf32c8b07ce239a7994565b0301b23 + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 20415656 + timestamp: 1787617707715 +- conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_120.conda + sha256: 3cabbd98a31d584517c9d8588f5a5b32b49d9898bcce379f41f6138d5af6d6be + md5: 05a8304d2ab5aa21c7144a114596f669 + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 20731561 + timestamp: 1784923742656 +- conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.3.0-hb2c5482_104.conda + sha256: 42de47979a998f594c378498ebdf2f1c833e6a4611dd2ddda56f1ba2d1515c7f + md5: c428c727fc8697f18a140c676032f8f5 + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 20671212 + timestamp: 1787618340216 +- conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-15.3.0-h0e8df58_104.conda + sha256: 648173a13da532b6599844d49243d40ba9baec655f7ddc5016cc567c89080a87 + md5: 248aa5cadf9dc07c7c893b3acde3da1b + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: {} + size: 17560431 + timestamp: 1787617560373 +- conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.2.0-pyhcf101f3_0.conda + sha256: ffbbb6eace53e7edee1e2e9948e4c8774eb4b382dea185d827865afb7b694c7f + md5: 786c0fa25c80049e9d4b5cd960a5a0b2 + depends: + - python >=3.10 + - uc-micro-py + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/linkify-it-py?source=hash-mapping + run_exports: {} + size: 27991 + timestamp: 1788173299262 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda + sha256: 0c4c35376fe920714390d46e4b8d31c876d65f18e1655899e0763ec25f2a902f + md5: 6d03368f2b2b0a5fb6839df53b2eb5e0 + depends: + - mdurl >=0.1,<1 + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/markdown-it-py?source=hash-mapping + run_exports: {} + size: 69017 + timestamp: 1778169663339 +- conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda + sha256: 35b43d7343f74452307fd018a1cca92b8f68961ff8e2ab6a81ce0a703c9a3764 + md5: 9acc1c385be401d533ff70ef5b50dae6 + depends: + - python >=3.10 + - traitlets + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/matplotlib-inline?source=hash-mapping + run_exports: {} + size: 15725 + timestamp: 1778264403247 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda + sha256: 49db23cbfb1c1d414a14d7540195208b994ebd747beba0f15c903f3a0a2dc446 + md5: ad6821df7a98510117db06e9a833281f + depends: + - markdown-it-py >=2.0.0,<5.0.0 + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mdit-py-plugins?source=hash-mapping + run_exports: {} + size: 50460 + timestamp: 1778692223625 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 + md5: 592132998493b3ff25fd7479396e8351 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mdurl?source=hash-mapping + run_exports: {} + size: 14465 + timestamp: 1733255681319 +- conda: https://conda.anaconda.org/conda-forge/noarch/mpi-1.0.1-openmpi.conda + sha256: e1698675ec83a2139c0b02165f47eaf0701bcab043443d9008fc0f8867b07798 + md5: 78b827d2852c67c68cd5b2c55f31e376 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: {} + size: 6571 + timestamp: 1727683130230 +- conda: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.4.1-pyhd8ed1ab_0.conda + sha256: 5bbf2f8179ec43d34d67ca8e4989d216c1bdb4b749fe6cb40e86ebf88c1b5300 + md5: 2e81b32b805f406d23ba61938a184081 + depends: + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/mpmath?source=hash-mapping + run_exports: {} + size: 464918 + timestamp: 1773662068273 +- conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + sha256: d09c47c2cf456de5c09fa66d2c3c5035aa1fa228a1983a433c47b876aa16ce90 + md5: 37293a85a0f4f77bbd9cf7aaefc62609 + depends: + - python >=3.9 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/munkres?source=hash-mapping + run_exports: {} + size: 15851 + timestamp: 1749895533014 +- conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + sha256: 6ed158e4e5dd8f6a10ad9e525631e35cee8557718f83de7a4e3966b1f772c4b1 + md5: e9c622e0d00fa24a6292279af3ab6d06 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mypy-extensions?source=hash-mapping + run_exports: {} + size: 11766 + timestamp: 1745776666688 +- conda: https://conda.anaconda.org/conda-forge/noarch/myst-nb-1.4.0-pyhcf101f3_0.conda + sha256: c81d0c8c74c3da66808f8da09d8e48f2af2d173d357d45239defaf466838edba + md5: da07c7b1588ad0a44118d28aeb31b6a6 + depends: + - importlib-metadata + - ipykernel + - ipython + - jupyter-cache >=0.5 + - myst-parser >=1.0.0 + - nbclient + - nbformat >=5.0 + - python >=3.10 + - pyyaml + - sphinx >=5 + - typing_extensions + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/myst-nb?source=hash-mapping + run_exports: {} + size: 68766 + timestamp: 1772587444587 +- conda: https://conda.anaconda.org/conda-forge/noarch/myst-parser-5.1.0-pyhd8ed1ab_0.conda + sha256: 94235bc1f769cf35029942ecb2ca796f18e730c1bf5aeef95e72680ebcfacfef + md5: 580615e59fc7c07741e4d2ab052cfc8b + depends: + - docutils >=0.20,<0.23 + - jinja2 + - markdown-it-py >=4.2.0,<4.3.0 + - mdit-py-plugins >=0.6.1,<0.7 + - python >=3.11 + - pyyaml + - sphinx >=8,<10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/myst-parser?source=hash-mapping + run_exports: {} + size: 74888 + timestamp: 1778696564508 +- conda: https://conda.anaconda.org/conda-forge/noarch/nanobind-3.0.1-pyhd8ed1ab_0.conda + sha256: 70e38b5cfdf4aebf4869dfbe11ae5916a87ce8ff79e9a188a0e0b9bded7d70c9 + md5: 67ac83e3530c217431c5ca85955744dd + depends: + - python >=3.10 + constrains: + - nanobind-abi ==22 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/nanobind?source=hash-mapping + run_exports: {} + size: 233710 + timestamp: 1788293984920 +- conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.11.0-pyhcf101f3_1.conda + sha256: e67b9cec57bbf729a13c158abc6f6f9483324a3b3d454198c4df647bf1484163 + md5: 078709c0ef924f3bc331d0a9b5eae3d7 + depends: + - python >=3.10 + - jupyter_client >=7.0.0 + - jupyter_core >=5.4 + - nbformat >=5.2.0 + - traitlets >=5.13 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/nbclient?source=compressed-mapping + run_exports: {} + size: 29971 + timestamp: 1788212974885 +- conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.11.1-pyhcf101f3_0.conda + sha256: d85d76827ff732e1639f50f45e4d7d3387a27abd857b194dcbb5bb4166c2a7c2 + md5: 2fbbf92e1173ae024f0b12759c1e64a1 + depends: + - jsonschema >=2.6 + - jupyter_core >=4.12,!=5.0.* + - python >=3.10 + - python-fastjsonschema >=2.15 + - traitlets >=5.1 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/nbformat?source=compressed-mapping + run_exports: {} + size: 107750 + timestamp: 1787133512599 +- conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio2-1.7.2-pyhcf101f3_0.conda + sha256: e6768ceef038f4d7e083de7e393f5dd7d672b937e2bda570b740f6399b686689 + md5: fcd832bfd4749e9b246112b6894f97fc + depends: + - python >=3.10 + - python + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/nest-asyncio2?source=hash-mapping + run_exports: {} + size: 15903 + timestamp: 1770973502283 +- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + sha256: f6a82172afc50e54741f6f84527ef10424326611503c64e359e25a19a8e4c1c6 + md5: a2c1eeadae7a309daed9d62c96012a2b + depends: + - python >=3.11 + - python + constrains: + - numpy >=1.25 + - scipy >=1.11.2 + - matplotlib-base >=3.8 + - pandas >=2.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/networkx?source=hash-mapping + run_exports: {} + size: 1587439 + timestamp: 1765215107045 +- conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda + sha256: 4fa40e3e13fc6ea0a93f67dfc76c96190afd7ea4ffc1bac2612d954b42cdc3ee + md5: eb52d14a901e23c39e9e7b4a1a5c015f + depends: + - python >=3.10 + - setuptools + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/nodeenv?source=hash-mapping + run_exports: {} + size: 40866 + timestamp: 1766261270149 +- conda: https://conda.anaconda.org/conda-forge/noarch/nomkl-1.0-h5ca1d4c_0.tar.bz2 + sha256: d38542a151a90417065c1a234866f97fd1ea82a81de75ecb725955ab78f88b4b + md5: 9a66894dfd07c4510beb6b3f9672ccc0 + constrains: + - mkl <0.a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: {} + size: 3843 + timestamp: 1582593857545 +- conda: https://conda.anaconda.org/conda-forge/noarch/opt-einsum-3.4.0-hd8ed1ab_1.conda + sha256: 8db3d841c72f184de69e1237b900a2d79c742e30e8378973814543bf987b6bc6 + md5: b94f689d8b1ce7dd212946e0331037ad + depends: + - opt_einsum >=3.4.0,<3.4.1.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: {} + size: 6558 + timestamp: 1733688054327 +- conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_1.conda + sha256: af71aabb2bfa4b2c89b7b06403e5cec23b418452cae9f9772bd7ac3f9ea1ff44 + md5: 52919815cd35c4e1a0298af658ccda04 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/opt-einsum?source=hash-mapping + run_exports: {} + size: 62479 + timestamp: 1733688053334 +- conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum_fx-0.1.4-pyhd8ed1ab_1.conda + sha256: ce86179c307c19643655d2e171c782b006c9eb35dbd501bcb197c4944dad2bda + md5: 00e15f6b5740a25b86dabf22483b002c + depends: + - opt-einsum + - packaging + - python >=3.9 + - pytorch >=1.8.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/opt-einsum-fx?source=hash-mapping + run_exports: {} + size: 17532 + timestamp: 1734789249385 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.3-pyhc364b38_0.conda + sha256: c432626b16768b8dab228bfb706f7060c2d462a21c516d240f68f2f902b5a044 + md5: 936687ed80f295a1f5dbcf8bd34c252c + depends: + - python >=3.9 + - python + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/packaging?source=hash-mapping + run_exports: {} + size: 116363 + timestamp: 1785888127370 +- conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda + sha256: 611882f7944b467281c46644ffde6c5145d1a7730388bcde26e7e86819b0998e + md5: 39894c952938276405a1bd30e4ce2caf + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/parso?source=hash-mapping + run_exports: {} + size: 82472 + timestamp: 1777722955579 +- conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.1.1-pyhd8ed1ab_0.conda + sha256: 6eaee417d33f298db79bc7185ab1208604c0e6cf51dade34cd513c6f9db9c6f3 + md5: 11adc78451c998c0fd162584abfa3559 + depends: + - python >=3.10 + license: MPL-2.0 + license_family: MOZILLA + purls: + - pkg:pypi/pathspec?source=hash-mapping + run_exports: {} + size: 56559 + timestamp: 1777271601895 +- conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda + sha256: 202af1de83b585d36445dc1fda94266697341994d1a3328fabde4989e1b3d07a + md5: d0d408b1f18883a944376da5cf8101ea + depends: + - ptyprocess >=0.5 + - python >=3.9 + license: ISC + purls: + - pkg:pypi/pexpect?source=hash-mapping + run_exports: {} + size: 53561 + timestamp: 1733302019362 +- conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.2.1-pyh8b19718_0.conda + sha256: c205bae42eb11b364fe3663a817cbcbc20a8ef544c6b2ff6f391013487117259 + md5: 77b6cf3b0689d9fc68561df0db9b856d + depends: + - python >=3.10,<3.13.0a0 + - setuptools + - wheel + license: MIT + license_family: MIT + purls: + - pkg:pypi/pip?source=hash-mapping + run_exports: {} + size: 1199593 + timestamp: 1785914492234 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.11.6-pyh5ded981_0.conda + sha256: 8fe66c78f015fecfe096e4ff78a2626c4d926cde9b6951cf3b8e1ff0aaeb0a6c + md5: fb0f75910f804de1d8c6e91f73673d11 + depends: + - python >=3.11 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/platformdirs?source=compressed-mapping + run_exports: {} + size: 27515 + timestamp: 1788271419073 +- conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda + sha256: e14aafa63efa0528ca99ba568eaf506eb55a0371d12e6250aaaa61718d2eb62e + md5: d7585b6550ad04c8c5e21097ada2888e + depends: + - python >=3.9 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/pluggy?source=hash-mapping + run_exports: {} + size: 25877 + timestamp: 1764896838868 +- conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.2-pyha770c72_0.conda + sha256: fc0a0620a8f829c46787a9a13ddbae8b6049f2e77da353a8a2adaa01af0da7e2 + md5: c36b88db560b4e74f294380613f1a239 + depends: + - cfgv >=2.0.0 + - identify >=1.0.0 + - nodeenv >=0.11.1 + - python >=3.10 + - pyyaml >=5.1 + - virtualenv >=20.10.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pre-commit?source=compressed-mapping + run_exports: {} + size: 201879 + timestamp: 1786408353117 +- conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.53-pyha770c72_0.conda + sha256: efe8def2c93aa34cd8d3c9af1dc4c7d312791cf769d8b2b615e32733e6df6051 + md5: 39c92a39517316e5001d645ae63d9ab9 + depends: + - python >=3.10 + - wcwidth + constrains: + - prompt_toolkit 3.0.53 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/prompt-toolkit?source=hash-mapping + run_exports: {} + size: 276081 + timestamp: 1785160613307 +- conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda + sha256: a7713dfe30faf17508ec359e0bc7e0983f5d94682492469bd462cdaae9c64d83 + md5: 7d9daffbb8d8e0af0f769dbbcd173a54 + depends: + - python >=3.9 + license: ISC + purls: + - pkg:pypi/ptyprocess?source=hash-mapping + run_exports: {} + size: 19457 + timestamp: 1733302371990 +- conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + sha256: 71bd24600d14bb171a6321d523486f6a06f855e75e547fa0cb2a0953b02047f0 + md5: 3bfdfb8dbcdc4af1ae3f9a8eb3948f04 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pure-eval?source=hash-mapping + run_exports: {} + size: 16668 + timestamp: 1733569518868 +- conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_1.conda + sha256: 6d8f03c13d085a569fde931892cded813474acbef2e03381a1a87f420c7da035 + md5: 46830ee16925d5ed250850503b5dc3a8 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/py-cpuinfo?source=hash-mapping + run_exports: {} + size: 25766 + timestamp: 1733236452235 +- conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.4-pyh293190f_0.conda + sha256: f213f735f0c2b9bfcc1358c8bdeb0dfcf3614bf2c47aad68227dabea99b0e0d7 + md5: 2e57132f130bffcb5a8b17092b2871bc + depends: + - python >=3.8 + - pybind11-global ==3.0.4 *_0 + - python + constrains: + - pybind11-abi ==11 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pybind11?source=compressed-mapping + run_exports: {} + size: 251088 + timestamp: 1786199539429 +- conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda + sha256: 9e7fe12f727acd2787fb5816b2049cef4604b7a00ad3e408c5e709c298ce8bf1 + md5: f0599959a2447c1e544e216bddf393fa + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - pybind11-abi ==11 + size: 14671 + timestamp: 1752769938071 +- conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.4-pyh648e204_0.conda + sha256: 25e887672e68188a5fa899efdc116acb01d689989493342aac05781ec1f09b81 + md5: e594cb485091100204e0b77cb5709896 + depends: + - python >=3.8 + - __unix + - python + constrains: + - pybind11-abi ==11 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pybind11-global?source=compressed-mapping + run_exports: {} + size: 244363 + timestamp: 1786199539429 +- conda: https://conda.anaconda.org/conda-forge/noarch/pybtex-0.26.1-pyhcf101f3_0.conda + sha256: fd9b0a389b21dc2ccb11925db83a5e9e32652e87971f93c23358d51c3632d96d + md5: b0969b1326b5b9d6094dd1831eb48919 + depends: + - python >=3.10 + - pyyaml >=3.1 + - latexcodec >=1.0.4 + - importlib-metadata + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/pybtex?source=hash-mapping + run_exports: {} + size: 78091 + timestamp: 1775231969598 +- conda: https://conda.anaconda.org/conda-forge/noarch/pybtex-docutils-1.0.3-pyhcf101f3_4.conda + sha256: a0397b8fc65eabd773fe33affb726fe9d16c8f0a8ab7c3493d80c412ef2539a6 + md5: 75f19dd4b0b95ce928286e18c561cb13 + depends: + - python >=3.10 + - setuptools + - docutils >=0.14 + - pybtex >=0.16 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/pybtex-docutils?source=hash-mapping + run_exports: {} + size: 14980 + timestamp: 1765317730499 +- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda + sha256: e27e0473fc6723311a0bd48b89b616fa1b996a2f7a2b555338cbbcfb9c640568 + md5: 9c5491066224083c41b6d5635ed7107b + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pycparser?source=hash-mapping + run_exports: {} + size: 55886 + timestamp: 1779293633166 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.20.0-pyhc364b38_0.conda + sha256: 40664599ee4b5667d31b38538a06a9daad97594d4d2af8084e80cfc35ac86d6d + md5: 4539a6224d84b50aea1bcdcc01ee9802 + depends: + - accessible-pygments + - babel + - beautifulsoup4 + - docutils !=0.17.0 + - jinja2 + - pygments >=2.7 + - python >=3.11 + - requests + - sphinx >=8.2 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pydata-sphinx-theme?source=hash-mapping + run_exports: {} + size: 1312216 + timestamp: 1783604241703 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.21.0-pyhcf101f3_0.conda + sha256: f5f015ff1bc3e1b7fc08eee096b1865234189ae0b82bebdb86a5369116e42fa0 + md5: 2882dee445dfa45b0c5afce3ffb7730a + depends: + - python >=3.10 + - python + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/pygments?source=compressed-mapping + run_exports: {} + size: 959376 + timestamp: 1786995678795 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + sha256: 417fba4783e528ee732afa82999300859b065dc59927344b4859c64aae7182de + md5: 3687cc0b82a8b4c17e1f0eb7e47163d5 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyparsing?source=hash-mapping + run_exports: {} + size: 110893 + timestamp: 1769003998136 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda + sha256: 065ac44591da9abf1ff740feb25929554b920b00d09287a551fcced2c9791092 + md5: d4582021af437c931d7d77ec39007845 + depends: + - python >=3.9 + - tomli >=1.1.0 + license: MIT + license_family: MIT + run_exports: {} + size: 15528 + timestamp: 1733710122949 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 + md5: 461219d1a5bd61342293efa2c0c90eac + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pysocks?source=hash-mapping + run_exports: {} + size: 21085 + timestamp: 1733217331982 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda + sha256: 430051d80765207a7d782b2b188230ba1489d35c6e75fd9903f76cb9fda4af16 + md5: 64c98a12c4e23eb238bf66bbecafdf3c + depends: + - colorama + - pygments >=2.7.2 + - python >=3.10 + - iniconfig >=1.0.1 + - packaging >=22 + - pluggy >=1.5,<2 + - tomli >=1 + - exceptiongroup >=1 + - python + constrains: + - pytest-faulthandler >=2 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytest?source=hash-mapping + run_exports: {} + size: 306724 + timestamp: 1782127176429 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-5.3.0-pyhd8ed1ab_0.conda + sha256: 5f86720b13ac80d2340d0d5f65b45b72d790079236e0d7c8a7a749f498819945 + md5: 5836b95d5e01847377ab6b0bdc89c3fa + depends: + - py-cpuinfo + - pytest >=8.1 + - python >=3.10 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/pytest-benchmark?source=compressed-mapping + run_exports: {} + size: 47700 + timestamp: 1787525337968 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + sha256: 44e42919397bd00bfaa47358a6ca93d4c21493a8c18600176212ec21a8d25ca5 + md5: 67d1790eefa81ed305b89d8e314c7923 + depends: + - coverage >=7.10.6 + - pluggy >=1.2 + - pytest >=7 + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytest-cov?source=hash-mapping + run_exports: {} + size: 29559 + timestamp: 1774139250481 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-randomly-4.1.0-pyhd8ed1ab_0.conda + sha256: c292d7060f043577569b9c257cbef99446a356e1b1f90482e1058c111d5e374b + md5: b869f743e0e40024d14b22e3f6268fe4 + depends: + - pytest + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytest-randomly?source=hash-mapping + run_exports: {} + size: 15440 + timestamp: 1785269179302 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + sha256: 25afa7d9387f2aa151b45eb6adf05f9e9e3f58c8de2bc09be7e85c114118eeb9 + md5: 52a50ca8ea1b3496fbd3261bea8c5722 + depends: + - pytest >=7.0.0 + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytest-timeout?source=hash-mapping + run_exports: {} + size: 20137 + timestamp: 1746533140824 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.6.0-pyhc364b38_0.conda + sha256: d5bad775346fbd21cce7922b29cab2587fe599517654de65c3d2fe50a7126279 + md5: 1e696c762d003f8f4af971b6dccb8c1e + depends: + - python >=3.10 + - colorama + - importlib-metadata >=4.6 + - packaging >=24.0 + - pyproject_hooks + - tomli >=1.1.0 + - python + constrains: + - build <0 + license: MIT + license_family: MIT + run_exports: {} + size: 33461 + timestamp: 1787910624806 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664 + md5: 5b8d21249ff20967101ffa321cab24e8 + depends: + - python >=3.9 + - six >=1.5 + - python + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/python-dateutil?source=hash-mapping + run_exports: {} + size: 233310 + timestamp: 1751104122689 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.6.0-pyhcf101f3_0.conda + sha256: e48089f2927811994b916d31953563097bc7e8d856965fbdeea3b4d407e3b89f + md5: e87738e32eaf5dfa98a5d49f611d6312 + depends: + - python >=3.10 + - filelock >=3.15.4 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/python-discovery?source=compressed-mapping + run_exports: {} + size: 38928 + timestamp: 1787953569064 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.22.2-pyhcf101f3_0.conda + sha256: fc4a704822df22defce49d0fb811fdc036a1fd3b579aeaa601228e9cfd198b3d + md5: aa75b7f096d17621bc307b3025b29461 + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/fastjsonschema?source=compressed-mapping + run_exports: {} + size: 254446 + timestamp: 1786892280524 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.11.16-hd8ed1ab_2.conda + sha256: caec48ea90cf78622e923366d405ec29a419d916cb1690c2319ef76f984b9233 + md5: fab671748c957da704c76efb0686dcdb + depends: + - cpython 3.11.16.* + - python_abi * *_cp311 + license: Python-2.0 + purls: [] + run_exports: {} + size: 48553 + timestamp: 1788392053631 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.14-hd8ed1ab_3.conda + sha256: 7096d98d7dd0cdb9256c5714d7228a8ce7aca3bd014304ea5c1673c259df72ef + md5: 7fafcd204183cfa7c1ae4ad9c2d8d414 + depends: + - cpython 3.12.14.* + - python_abi * *_cp312 + license: Python-2.0 + purls: [] + run_exports: {} + size: 47142 + timestamp: 1788391303150 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.13.15-h4df99d1_103.conda + sha256: ce01f8f3c9fde229b26e0d37b85e1566bb32fcf26750af95d6313b4a369775c3 + md5: 86d251460e192368d2982e5b0dcad798 + depends: + - cpython 3.13.15.* + - python_abi * *_cp313 + license: Python-2.0 + purls: [] + run_exports: {} + size: 49529 + timestamp: 1788386202638 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-9_cp311.conda + build_number: 9 + sha256: bcfbad269758f4617035314fe379ee655bc2d9db5282e7a00d61450b7cefa3cf + md5: 18e91a03be08122180f208723e42a52e + constrains: + - python 3.11.* *_cpython + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: {} + size: 6770 + timestamp: 1788302830198 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-9_cp312.conda + build_number: 9 + sha256: ee9c2922e07afc85fc82d5fa82c9ac2c79da3be3283a5e17bf2f2ae38dbd02fb + md5: 4c32076993e6270825441d059ab5c18b + constrains: + - python 3.12.* *_cpython + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: {} + size: 6751 + timestamp: 1788302823694 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-9_cp313.conda + build_number: 9 + sha256: 9dc0cb6a20ebc7e9bcd8c6868f2bec083c114b0ba20b7118405c036533d5c522 + md5: c5abc97af551bc12d71305852392f75c + constrains: + - python 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: {} + size: 6769 + timestamp: 1788302828005 +- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda + sha256: 0577eedfb347ff94d0f2fa6c052c502989b028216996b45c7f21236f25864414 + md5: 870293df500ca7e18bedefa5838a22ab + depends: + - attrs >=22.2.0 + - python >=3.10 + - rpds-py >=0.7.0 + - typing_extensions >=4.4.0 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/referencing?source=hash-mapping + run_exports: {} + size: 51788 + timestamp: 1760379115194 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda + sha256: 1715246b19c9f85ee022933b4845f2fc14ac9184981b7b7d9b728bec8e9588da + md5: 4a85203c1d80c1059086ae860836ffb9 + depends: + - python >=3.10 + - certifi >=2023.5.7 + - charset-normalizer >=2,<4 + - idna >=2.5,<4 + - urllib3 >=1.26,<3 + - python + constrains: + - chardet >=3.0.2,<8 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/requests?source=hash-mapping + run_exports: {} + size: 68709 + timestamp: 1778851103479 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda + sha256: 3d6ba2c0fcdac3196ba2f0615b4104e532525ffa1335b50a2878be5ff488814a + md5: 0242025a3c804966bf71aa04eee82f66 + depends: + - markdown-it-py >=2.2.0 + - pygments >=2.13.0,<3.0.0 + - python >=3.10 + - typing_extensions >=4.0.0,<5.0.0 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/rich?source=hash-mapping + run_exports: {} + size: 208577 + timestamp: 1775991661559 +- conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda + sha256: 30f3c04fcfb64c44d821d392a4a0b8915650dbd900c8befc20ade8fde8ec6aa2 + md5: 0dc48b4b570931adc8641e55c6c17fe4 + depends: + - python >=3.10 + license: 0BSD OR CC0-1.0 + purls: + - pkg:pypi/roman-numerals?source=hash-mapping + run_exports: {} + size: 13814 + timestamp: 1766003022813 +- conda: https://conda.anaconda.org/conda-forge/noarch/scikit-build-core-1.0.3-pyh04d0eab_0.conda + sha256: 8c01a200a00e60f7ba69d8370ac6572fe85356da7b8cec539349499d86db4315 + md5: 5d9f7061c53e8f854b161c3dd89bf135 + depends: + - python >=3.8 + - exceptiongroup >=1.0 + - importlib-resources >=1.3 + - packaging >=23.2 + - pathspec >=0.12.0 + - tomli >=1.2.2 + - typing_extensions >=4 + - python + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/scikit-build-core?source=hash-mapping + run_exports: {} + size: 339601 + timestamp: 1783871121076 +- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + sha256: 6ecf738d5590bf228f09c4ecd1ea91d811f8e0bd9acdef341bc4d6c36beb13a3 + md5: d629a398d7bf872f9ed7b27ab959de15 + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/setuptools?source=hash-mapping + run_exports: {} + size: 676888 + timestamp: 1770456470072 +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d + md5: 3339e3b65d58accf4ca4fb8748ab16b3 + depends: + - python >=3.9 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/six?source=hash-mapping + run_exports: {} + size: 18455 + timestamp: 1753199211006 +- conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + sha256: dce518f45e24cd03f401cb0616917773159a210c19d601c5f2d4e0e5879d30ad + md5: 03fe290994c5e4ec17293cfb6bdce520 + depends: + - python >=3.10 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/sniffio?source=hash-mapping + run_exports: {} + size: 15698 + timestamp: 1762941572482 +- conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.1.1-pyhd8ed1ab_0.conda + sha256: ad89284ea94821c20ff87e64b948e4afc690cf5202d14c009355b0594cf23aea + md5: 46b6abe31482f6bca064b965696ae807 + depends: + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/snowballstemmer?source=hash-mapping + run_exports: {} + size: 74456 + timestamp: 1780468201547 +- conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.9.2-pyhd8ed1ab_0.conda + sha256: 056d7a2e91e303a9ee37e580f6dde0511fc3fb72476581cc337aacf2cc747613 + md5: ba33e6c8a46ee373fdf6dd8665212778 + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/soupsieve?source=compressed-mapping + run_exports: {} + size: 39439 + timestamp: 1786202135509 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda + sha256: 035ca4b17afca3d53650380dd94c564555b7ec2b4f8818111f98c15c7a991b7b + md5: aabfbc2813712b71ba8beb217a978498 + depends: + - alabaster >=0.7.14 + - babel >=2.13 + - colorama >=0.4.6 + - docutils >=0.21,<0.23 + - imagesize >=1.3 + - jinja2 >=3.1 + - packaging >=23.0 + - pygments >=2.17 + - python >=3.12 + - requests >=2.30.0 + - roman-numerals >=1.0.0 + - snowballstemmer >=2.2 + - sphinxcontrib-applehelp >=1.0.7 + - sphinxcontrib-devhelp >=1.0.6 + - sphinxcontrib-htmlhelp >=2.0.6 + - sphinxcontrib-jsmath >=1.0.1 + - sphinxcontrib-qthelp >=1.0.6 + - sphinxcontrib-serializinghtml >=1.1.9 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/sphinx?source=hash-mapping + run_exports: {} + size: 1584836 + timestamp: 1767271941650 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-book-theme-1.4.0-pyhc364b38_0.conda + sha256: a26e651497288a79d27562a43b89eddd276a49bb4d87f6b5687d4036726ba410 + md5: e307ff5cc407bb90cf4cbaed1f611fa6 + depends: + - pydata-sphinx-theme ==0.20.0 + - python >=3.11 + - sphinx >=8.2 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/sphinx-book-theme?source=hash-mapping + run_exports: {} + size: 258939 + timestamp: 1784555033283 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.7.0-pyhd8ed1ab_0.conda + sha256: 7f8437a97e6311bebf230cfd2ae3c5bdb2230e681c41daebdb894280bf8b4ab6 + md5: 28eddfb8b9ecdd044a6f609f985398a7 + depends: + - python >=3.11 + - sphinx >=7,<10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/sphinx-design?source=hash-mapping + run_exports: {} + size: 931118 + timestamp: 1769032711360 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-fortran-1.1.1-pyhd8ed1ab_1.conda + sha256: cc06e110e831bd9646a4533b377e24cb8737577f841f036ca086132fb485d181 + md5: 400e6ccb8d3c434c28c766f0ee45f554 + depends: + - future + - numpy >=1.0 + - python >=3.9 + - six + - sphinx >=1.0 + license: CECILL-2.1 + purls: + - pkg:pypi/sphinx-fortran?source=hash-mapping + run_exports: {} + size: 37962 + timestamp: 1735719868930 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda + sha256: d7433a344a9ad32a680b881c81b0034bc61618d12c39dd6e3309abeffa9577ba + md5: 16e3f039c0aa6446513e94ab18a8784b + depends: + - python >=3.9 + - sphinx >=5 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/sphinxcontrib-applehelp?source=hash-mapping + run_exports: {} + size: 29752 + timestamp: 1733754216334 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-bibtex-2.7.0-pyhd8ed1ab_0.conda + sha256: 3b9c6273f95302df966a48a267b33ddf78ed6e662c7d578d3e129e259e049314 + md5: 7f562e153eedbdc92f1c3adb019a8792 + depends: + - docutils >=0.20 + - pybtex >=0.25 + - pybtex-docutils >=1.0.2 + - python >=3.10 + - sphinx >=7.4 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/sphinxcontrib-bibtex?source=hash-mapping + run_exports: {} + size: 33489 + timestamp: 1778364472446 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda + sha256: 55d5076005d20b84b20bee7844e686b7e60eb9f683af04492e598a622b12d53d + md5: 910f28a05c178feba832f842155cbfff + depends: + - python >=3.9 + - sphinx >=5 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/sphinxcontrib-devhelp?source=hash-mapping + run_exports: {} + size: 24536 + timestamp: 1733754232002 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda + sha256: c1492c0262ccf16694bdcd3bb62aa4627878ea8782d5cd3876614ffeb62b3996 + md5: e9fb3fe8a5b758b4aff187d434f94f03 + depends: + - python >=3.9 + - sphinx >=5 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/sphinxcontrib-htmlhelp?source=hash-mapping + run_exports: {} + size: 32895 + timestamp: 1733754385092 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda + sha256: 578bef5ec630e5b2b8810d898bbbf79b9ae66d49b7938bcc3efc364e679f2a62 + md5: fa839b5ff59e192f411ccc7dae6588bb + depends: + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/sphinxcontrib-jsmath?source=hash-mapping + run_exports: {} + size: 10462 + timestamp: 1733753857224 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-moderncmakedomain-3.29.0-pyhd8ed1ab_0.conda + sha256: 3173b761c767852166153055b3a44a463d878a9646ab101a4b7eaba088bd92ce + md5: 345d2c008b7619237630651d74eeb879 + depends: + - python >=3.10 + - sphinx >=2 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/sphinxcontrib-moderncmakedomain?source=hash-mapping + run_exports: {} + size: 19256 + timestamp: 1772451038096 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda + sha256: c664fefae4acdb5fae973bdde25836faf451f41d04342b64a358f9a7753c92ca + md5: 00534ebcc0375929b45c3039b5ba7636 + depends: + - python >=3.9 + - sphinx >=5 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/sphinxcontrib-qthelp?source=hash-mapping + run_exports: {} + size: 26959 + timestamp: 1733753505008 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-2.0.0-pyhd8ed1ab_0.conda + sha256: 20b49741065fd7d3fabf98caf6d19b6436badb06b6d41f66b58f1fc2b52f37a1 + md5: f77df1fcf9af03b7287342638befca77 + depends: + - python >=3.10 + - sphinx >=5 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/sphinxcontrib-serializinghtml?source=hash-mapping + run_exports: {} + size: 30640 + timestamp: 1781260357443 +- conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + sha256: 570da295d421661af487f1595045760526964f41471021056e993e73089e9c41 + md5: b1b505328da7a6b246787df4b5a49fbc + depends: + - asttokens + - executing + - pure_eval + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/stack-data?source=hash-mapping + run_exports: {} + size: 26988 + timestamp: 1733569565672 +- conda: https://conda.anaconda.org/conda-forge/noarch/sympy-1.14.0-pyh2585a3b_106.conda + sha256: 1c8057e6875eba958aa8b3c1a072dc9a75d013f209c26fd8125a5ebd3abbec0c + md5: 32d866e43b25275f61566b9391ccb7b5 + depends: + - __unix + - cpython + - gmpy2 >=2.0.8 + - mpmath >=1.1.0,<1.5 + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/sympy?source=hash-mapping + run_exports: {} + size: 4661767 + timestamp: 1771952371059 +- conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + sha256: c47299fe37aebb0fcf674b3be588e67e4afb86225be4b0d452c7eb75c086b851 + md5: 13dc3adbc692664cd3beabd216434749 + depends: + - __glibc >=2.28 + - kernel-headers_linux-64 4.18.0 he073ed8_9 + - tzdata + license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later + license_family: GPL + purls: [] + run_exports: + strong: + - __glibc >=2.28,<3.0.a0 + size: 24008591 + timestamp: 1765578833462 +- conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.28-h585391f_9.conda + sha256: 1bd2db6b2e451247bab103e4a0128cf6c7595dd72cb26d70f7fadd9edd1d1bc3 + md5: fdf07ab944a222ff28c754914fdb0740 + depends: + - __glibc >=2.28 + - kernel-headers_linux-aarch64 4.18.0 h05a177a_9 + - tzdata + license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later + license_family: GPL + run_exports: + strong: + - __glibc >=2.28,<3.0.a0 + size: 23644746 + timestamp: 1765578629426 +- conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.10.0-pyhcf101f3_0.conda + sha256: 3f661e98a09f976775a494488beb3d35ebb00f535b169c6bd891f2e280d55783 + md5: 3b887b7b3468b0f494b4fad40178b043 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/tabulate?source=hash-mapping + run_exports: {} + size: 43964 + timestamp: 1772732795746 +- conda: https://conda.anaconda.org/conda-forge/noarch/textual-8.2.8-pyhcf101f3_0.conda + sha256: 88997e493c8b74b05d8f9bc48133d297d4b5412809c2a2a041e5b40204fdff02 + md5: 89f2b015d7ee36ceaaf03fe687d1bd61 + depends: + - pygments >=2.19.2,<3.0.0 + - typing_extensions >=4.4.0,<5.0.0 + - platformdirs >=3.6.0,<5 + - python >=3.10,<4.0.0 + - markdown-it-py >=2.1.0 + - linkify-it-py >=1,<3 + - mdit-py-plugins + - rich >=14.2.0 + - python + constrains: + - tree_sitter >=0.25.0 + - tree_sitter_languages 1.10.2.* + license: MIT + license_family: MIT + purls: + - pkg:pypi/textual?source=hash-mapping + run_exports: {} + size: 538351 + timestamp: 1782808451993 +- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + sha256: 91cafdb64268e43e0e10d30bd1bef5af392e69f00edd34dfaf909f69ab2da6bd + md5: b5325cf06a000c5b14970462ff5e4d58 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/tomli?source=hash-mapping + run_exports: {} + size: 21561 + timestamp: 1774492402955 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda + sha256: a4d9e9da15b13f1ab047e7db412e2ed564bc615832e80213cf129b973c3abf4a + md5: 00953c3b729e03b0ae21f49fdf3441bb + depends: + - python >=3.10 + - __unix + - python + constrains: + - envwrap >=0.2 + - ipywidgets >=6.0 + license: MPL-2.0 and MIT + purls: + - pkg:pypi/tqdm?source=hash-mapping + run_exports: {} + size: 98184 + timestamp: 1785172528905 +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.16.1-pyhcf101f3_0.conda + sha256: 03dba5917f944c6684ab44c81daacac1624cd148e4b2cae215dcec594a210c48 + md5: a79bf97561232a31447b6246c2153ab5 + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/traitlets?source=hash-mapping + run_exports: {} + size: 116935 + timestamp: 1785761789772 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + sha256: b141933ece3518f6d7b75dfb59451e2f26b405a44c18e2518a83e9a02e09315c + md5: c680b5747e8c4c8f23dca0bb7042a8fc + depends: + - typing_extensions ==4.16.0 pyhcf101f3_0 + license: PSF-2.0 + license_family: PSF + purls: [] + run_exports: {} + size: 94080 + timestamp: 1783002732887 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + sha256: 2d888f90af0686044882c74193ec80a90ec1943145d94a7b1b048958acda1848 + md5: c70ad746c22219b9700931707482992c + depends: + - python >=3.10 + - python + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/typing-extensions?source=hash-mapping + run_exports: {} + size: 52631 + timestamp: 1783002732887 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + sha256: b928c30ddcb0e3f544c6eade8352737e6e610e263276b90232db6a578ef899d8 + md5: fcb489df604d100968b737f2cb6076c6 + license: LicenseRef-Public-Domain + purls: [] + run_exports: {} + size: 118849 + timestamp: 1784250406640 +- conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda + sha256: 9e5a0e70e876fca50de075b1cc6641cdc009a16c18f4d52ab03edb777729a1bc + md5: 4fdd327852ffefc83173a7c029690d0c + depends: + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/uc-micro-py?source=hash-mapping + run_exports: {} + size: 13378 + timestamp: 1772479008776 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda + sha256: feff959a816f7988a0893201aa9727bbb7ee1e9cec2c4f0428269b489eb93fb4 + md5: cbb88288f74dbe6ada1c6c7d0a97223e + depends: + - backports.zstd >=1.0.0 + - brotli-python >=1.2.0 + - h2 >=4,<5 + - pysocks >=1.5.6,<2.0,!=1.5.7 + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/urllib3?source=hash-mapping + run_exports: {} + size: 103560 + timestamp: 1778188657149 +- conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.7.8-pyh5ded981_0.conda + sha256: 872d21e6ff3613d7071070e3cc56eb30504c6fdad702ac80913c6e62e28c9025 + md5: c99437728662f804a7622e2624bfc2df + depends: + - python >=3.11 + - distlib >=0.3.7,<1 + - filelock >=3.24.2,<4 + - platformdirs >=3.9.1,<5 + - python-discovery >=1.6 + - typing_extensions >=4.13.2 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/virtualenv?source=compressed-mapping + run_exports: {} + size: 3895299 + timestamp: 1788296993944 +- conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.8.3-pyhcf101f3_0.conda + sha256: 3b0599d59d70bbe792702d1b5404ac501c9c25bd7b2fd9ccbb5da8ad6587a703 + md5: f62991f907a9830ab003b12d07dd3478 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/wcwidth?source=compressed-mapping + run_exports: {} + size: 146490 + timestamp: 1788174996551 +- conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.48.0-pyhd8ed1ab_0.conda + sha256: ba64b29b6d418024cb565081a1799262cb2780d2534ff4c14f76aa858c4286cd + md5: 9a2124517bfd5d792e0f7b86eefdfeb8 + depends: + - packaging >=24.0 + - python >=3.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/wheel?source=compressed-mapping + run_exports: {} + size: 34528 + timestamp: 1786613220176 +- conda: https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.16-pyhd8ed1ab_0.conda + sha256: bd909d9845ff269f5487a83654d6b8fe220c73148c47d602f4ee9e1283829212 + md5: 4e3aff9f40afb392477584e6a1a45b6f + depends: + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/widgetsnbextension?source=compressed-mapping + run_exports: {} + size: 901988 + timestamp: 1787044664327 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda + sha256: 210bd31c22bb88f5e2a167df24c95bb5f152b2ada7502f9b8c49d1f5366db423 + md5: ba3dcdc8584155c97c648ae9c044b7a3 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/zipp?source=hash-mapping + run_exports: {} + size: 24190 + timestamp: 1779159948016 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-8_kmp_llvm.conda + build_number: 8 + sha256: c7c98ce74f6a7ff25aaa4706d06fa41d63a333add4d697b73aa4d8d2d7ad7651 + md5: a2d706b4a7d603524133037c34f7fb76 + depends: + - llvm-openmp >=9.0.1 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - _openmp_mutex >=4.5 + size: 8016 + timestamp: 1788046437162 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ast-serialize-0.9.0-py311hfcb3ee1_0.conda + noarch: python + sha256: 04132369f1c298002413cbf73b073c1b53c856291f792e2c7b84edba9eefb727 + md5: d45efdf0910b873fa5e403979e1f964c + depends: + - python >=3.11 + - __osx >=11.0 + - _python_abi3_support 1.* + - cpython >=3.11 + constrains: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ast-serialize?source=hash-mapping + run_exports: {} + size: 1105022 + timestamp: 1788442437640 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.4-h0f08c97_1.conda + sha256: 8e503ab875683720c4ddcce216ad2aa96c32b90bc59e9a692c694e07ba4e5d8d + md5: c5d9f5796fb392f0984def10b26f1175 + depends: + - __osx >=11.0 + - aws-c-http >=0.11.0,<0.11.1.0a0 + - aws-c-common >=0.14.2,<0.14.3.0a0 + - aws-c-cal >=0.9.14,<0.9.15.0a0 + - aws-c-io >=0.27.3,<0.27.4.0a0 + - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-c-auth >=0.10.4,<0.10.5.0a0 + size: 117350 + timestamp: 1784086893887 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.4-h436dbe7_2.conda + sha256: bea3d014ebc03803cd18b1df1c7cbeb2fb7cf260126030fe7dc18a6bf674d131 + md5: b9494d6793762d9f9838420c8e73c8d9 + depends: + - __osx >=11.0 + - aws-c-cal >=0.9.15,<0.9.16.0a0 + - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 + - aws-c-common >=0.14.3,<0.14.4.0a0 + - aws-c-io >=0.27.5,<0.27.6.0a0 + - aws-c-http >=0.11.0,<0.11.1.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-auth >=0.10.4,<0.10.5.0a0 + size: 117346 + timestamp: 1785199104682 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.14-hb9ed60c_4.conda + sha256: 9760cd6c5cc16ecd989866e86fea1fbe23bff3279831ce6f13b83afb6f6f2075 + md5: 5f5ba0cd72e15095ede1ad38e8907f5f + depends: + - __osx >=11.0 + - aws-c-common >=0.14.2,<0.14.3.0a0 + license: Apache-2.0 + license_family: Apache + purls: [] + run_exports: + weak: + - aws-c-cal >=0.9.14,<0.9.15.0a0 + size: 45835 + timestamp: 1784043800544 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.15-hdbc54b2_1.conda + sha256: f60b9b4b9693ce86e335c268638c299804ca9cfd7ffb3b96415dcac52c1bd13b + md5: 70d1d0405910b78d06d74a8bba0013d2 + depends: + - __osx >=11.0 + - aws-c-common >=0.14.3,<0.14.4.0a0 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - aws-c-cal >=0.9.15,<0.9.16.0a0 + size: 46154 + timestamp: 1785158287452 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.14.2-h84a0fba_0.conda + sha256: 0cc9a2a36387975a643cc33d7b60db894650efa707ff73a85e93f80f03904c97 + md5: 35d52f06a5eaaa66c62dd37a4d82d780 + depends: + - __osx >=11.0 + license: Apache-2.0 + license_family: Apache + purls: [] + run_exports: + weak: + - aws-c-common >=0.14.2,<0.14.3.0a0 + size: 228084 + timestamp: 1783637822478 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.14.3-h84a0fba_0.conda + sha256: e46cbb8c24626da9792f7eebae86b3e8fa611e039945be15a78a70015eeae17e + md5: 0097da38976713a53acb6332cc9de888 + depends: + - __osx >=11.0 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - aws-c-common >=0.14.3,<0.14.4.0a0 + size: 228913 + timestamp: 1784596525019 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-he8604bc_5.conda + sha256: 857df6c5048c206e4c424100f1a649b7ef5ee3b01cf6207ff3ae35fe61642478 + md5: 139a1ac73d9e111cb3f73d07958a1130 + depends: + - __osx >=11.0 + - aws-c-common >=0.14.3,<0.14.4.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-compression >=0.3.2,<0.3.3.0a0 + size: 21777 + timestamp: 1785157595687 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-hf0b4b85_4.conda + sha256: 8363308db46a84c5d7e9a309aaca8a18541f46f3b6e7b7027479a95ab910e19a + md5: 6e0883cca4143f456e019f751d0b9f3b + depends: + - __osx >=11.0 + - aws-c-common >=0.14.2,<0.14.3.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-c-compression >=0.3.2,<0.3.3.0a0 + size: 21774 + timestamp: 1784042939907 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.7.1-ha581b6a_4.conda + sha256: d1742afa3329b3ea892b5f0a75b36b4217a7c3eb43250e827c56f122343e9317 + md5: 4ce3e032bfa6d72114e481c2dc99e2e2 + depends: + - libcxx >=19 + - __osx >=11.0 + - aws-checksums >=0.2.10,<0.2.11.0a0 + - aws-c-common >=0.14.2,<0.14.3.0a0 + - aws-c-io >=0.27.3,<0.27.4.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-c-event-stream >=0.7.1,<0.7.2.0a0 + size: 54275 + timestamp: 1784075773654 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.11.0-h27f0cb5_4.conda + sha256: 851a01b9e6f0078107549ec1d1545cd27a50a073e4e9599d6f8f4ba69a8cba30 + md5: 9e435c44eafb6aba85f0133f4c579d1c + depends: + - __osx >=11.0 + - aws-c-io >=0.27.3,<0.27.4.0a0 + - aws-c-common >=0.14.2,<0.14.3.0a0 + - aws-c-compression >=0.3.2,<0.3.3.0a0 + - aws-c-cal >=0.9.14,<0.9.15.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-c-http >=0.11.0,<0.11.1.0a0 + size: 177761 + timestamp: 1784075780838 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.11.0-hc1b69ad_5.conda + sha256: 1d8dbd1cea250a1d2d932294bf7e9d5c9e5efc9e09993dc883885e0ff2447fd3 + md5: d7d04ddaf9dae601a9a77c547e7d09ab + depends: + - __osx >=11.0 + - aws-c-cal >=0.9.15,<0.9.16.0a0 + - aws-c-compression >=0.3.2,<0.3.3.0a0 + - aws-c-common >=0.14.3,<0.14.4.0a0 + - aws-c-io >=0.27.5,<0.27.6.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-http >=0.11.0,<0.11.1.0a0 + size: 177804 + timestamp: 1785186207384 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.27.3-ha24efe8_1.conda + sha256: 2b127f1ccd9f022c945363e1e8eb6fd4a5fbc89677ac678abde6dc022ba26765 + md5: c4d73dc09e972a895d5a3dc7ce158be9 + depends: + - __osx >=11.0 + - s2n >=1.7.5,<1.7.6.0a0 + - aws-c-cal >=0.9.14,<0.9.15.0a0 + - aws-c-common >=0.14.2,<0.14.3.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-c-io >=0.27.3,<0.27.4.0a0 + size: 189938 + timestamp: 1784054954272 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.27.5-h8fb7669_1.conda + sha256: 7b346b8bd32c1f013d231922a9413d45c152d5c533c994bb4fb76c5f4e1ad20b + md5: 4fa643897c9481edc41aca4a7597a653 + depends: + - __osx >=11.0 + - aws-c-common >=0.14.3,<0.14.4.0a0 + - s2n >=1.7.6,<1.7.7.0a0 + - aws-c-cal >=0.9.15,<0.9.16.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-io >=0.27.5,<0.27.6.0a0 + size: 190778 + timestamp: 1785170135436 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.16.0-hf1a914d_2.conda + sha256: b352abb6f7cd42bdbbdef647409cf0d94f6edc841151dc3405bf3023b761e65b + md5: 742911742b564828dbaaffaa0f1a21eb + depends: + - __osx >=11.0 + - aws-c-common >=0.14.2,<0.14.3.0a0 + - aws-c-io >=0.27.3,<0.27.4.0a0 + - aws-c-http >=0.11.0,<0.11.1.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-c-mqtt >=0.16.0,<0.16.1.0a0 + size: 158513 + timestamp: 1784087664452 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.12.8-hdc61527_1.conda + sha256: f56014c02923a32cb3387eab782420ff40c9aae68c95cf08bfd2143a5c3c2cdd + md5: ea0e1e78de6375004530dd9f49d7ae46 + depends: + - __osx >=11.0 + - aws-c-http >=0.11.0,<0.11.1.0a0 + - aws-c-common >=0.14.2,<0.14.3.0a0 + - aws-c-io >=0.27.3,<0.27.4.0a0 + - aws-c-auth >=0.10.4,<0.10.5.0a0 + - aws-c-cal >=0.9.14,<0.9.15.0a0 + - aws-checksums >=0.2.10,<0.2.11.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-c-s3 >=0.12.8,<0.12.9.0a0 + size: 133754 + timestamp: 1784101134287 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.13.1-h1fbe2f8_1.conda + sha256: fe906dcd9cfac79c61bf60927f9e9dad328c9fbb9a2204ffb0b3c955c33817f0 + md5: bbdbec4b0952af625b066672514c0eb7 + depends: + - __osx >=11.0 + - aws-checksums >=0.2.10,<0.2.11.0a0 + - aws-c-io >=0.27.5,<0.27.6.0a0 + - aws-c-common >=0.14.3,<0.14.4.0a0 + - aws-c-http >=0.11.0,<0.11.1.0a0 + - aws-c-cal >=0.9.15,<0.9.16.0a0 + - aws-c-auth >=0.10.4,<0.10.5.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-s3 >=0.13.1,<0.13.2.0a0 + size: 134318 + timestamp: 1785351362781 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.7-he8604bc_3.conda + sha256: 16b3cd17f3806866c74fe7fe7badaf511293766f1356b4f491f88eb98ff4da16 + md5: b87573f533751acc5de162eced05e3b1 + depends: + - __osx >=11.0 + - aws-c-common >=0.14.3,<0.14.4.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 + size: 60776 + timestamp: 1785159351292 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.7-hf0b4b85_2.conda + sha256: 3ee2dcefcd45283508a3049bd4f5b508a46c16af906a0c3d351d0f9d81738464 + md5: de81e53b45b103470d3be61984dcc292 + depends: + - __osx >=11.0 + - aws-c-common >=0.14.2,<0.14.3.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 + size: 60771 + timestamp: 1784044312402 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-he8604bc_5.conda + sha256: 1f301d04c67c63b5e31b3ac5deaa20749cb86b6eadff04fdf9c79599ce9dd3d0 + md5: 3864eab4cfa7f8d524d558c52db32708 + depends: + - __osx >=11.0 + - aws-c-common >=0.14.3,<0.14.4.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-checksums >=0.2.10,<0.2.11.0a0 + size: 92236 + timestamp: 1785159288972 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-hf0b4b85_4.conda + sha256: 13313afb01bf4f1c328695724d5b16263810f84d7572f6cb0b4d12f877d7f1d6 + md5: 99cd08b2a8261083e4ad9414cbe737df + depends: + - __osx >=11.0 + - aws-c-common >=0.14.2,<0.14.3.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-checksums >=0.2.10,<0.2.11.0a0 + size: 92225 + timestamp: 1784044297006 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.40.1-h5b5d287_3.conda + sha256: aa4d21bdc3c891d2dca32121ef543aa7f2d8d83868b347207f04ebf65dd5d65d + md5: e850d4d6e349471c50fbed1f55fd3069 + depends: + - libcxx >=19 + - __osx >=11.0 + - aws-c-s3 >=0.12.8,<0.12.9.0a0 + - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 + - aws-c-io >=0.27.3,<0.27.4.0a0 + - aws-c-common >=0.14.2,<0.14.3.0a0 + - aws-c-event-stream >=0.7.1,<0.7.2.0a0 + - aws-c-auth >=0.10.4,<0.10.5.0a0 + - aws-c-http >=0.11.0,<0.11.1.0a0 + - aws-c-mqtt >=0.16.0,<0.16.1.0a0 + - aws-c-cal >=0.9.14,<0.9.15.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-crt-cpp >=0.40.1,<0.40.2.0a0 + size: 275833 + timestamp: 1784113326407 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.833-haa98fb3_9.conda + sha256: 215efb2e64b92094c3229c7d43177873068d0a088d7e94ff2c1447360f17a6c8 + md5: 1748ae5f4015e2fec7009ff36cbfafa0 + depends: + - libcxx >=19 + - __osx >=11.0 + - libcurl >=8.21.0,<9.0a0 + - aws-crt-cpp >=0.40.1,<0.40.2.0a0 + - libzlib >=1.3.2,<2.0a0 + - aws-c-event-stream >=0.7.1,<0.7.2.0a0 + - aws-c-common >=0.14.2,<0.14.3.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - aws-sdk-cpp >=1.11.833,<1.11.834.0a0 + size: 2834544 + timestamp: 1784137336612 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.3-he5ae378_0.conda + sha256: 9645073c4682ad3a334a2b06c5fc0ddc57fc9f0f537cc3123053634c92c28625 + md5: 4f42d997f42a8d34ff74cb677cf0c828 + depends: + - __osx >=11.0 + - libcurl >=8.19.0,<9.0a0 + - libcxx >=19 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + size: 290309 + timestamp: 1775239330289 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.3-h05177fb_2.conda + sha256: d950fb513311a15cd4ae663cdacb2c035122f609a9c790973661b38e0882e40e + md5: e1701f6b2ce6f47aeb6cbfab132403d8 + depends: + - __osx >=11.0 + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + - libcxx >=19 + - openssl >=3.5.7,<4.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - azure-identity-cpp >=1.13.3,<1.13.4.0a0 + size: 168032 + timestamp: 1781268747743 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.18.0-h409340b_1.conda + sha256: 3f096d7cd6fd7788d57887c3d3e48be1ebc5c3a971666ddc0dd8a3493a5b7cb5 + md5: 0948246cb8e514e4ae1cfe7dbb4046c7 + depends: + - __osx >=11.0 + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + - azure-storage-common-cpp >=12.14.0,<12.14.1.0a0 + - libcxx >=19 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - azure-storage-blobs-cpp >=12.18.0,<12.18.1.0a0 + size: 436462 + timestamp: 1781284116423 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.14.0-h7cba3ab_1.conda + sha256: 9a1b6e5284f1f242330dfa1e21408ffd823a76df424108d8c319c2a46df61dba + md5: 2af5d1b5365c4a3de8ed8ec8438fe6ec + depends: + - __osx >=11.0 + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + - libcxx >=19 + - libxml2 + - libxml2-16 >=2.14.6 + - openssl >=3.5.7,<4.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - azure-storage-common-cpp >=12.14.0,<12.14.1.0a0 + size: 128710 + timestamp: 1781268693348 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.16.0-h16bb3af_1.conda + sha256: fb210d8d068df72a68c5fa655cf1f816792e278da3041c485478e7924d6e80eb + md5: 06ba52b8a66fd041f4910b547e3f3da1 + depends: + - __osx >=11.0 + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + - azure-storage-blobs-cpp >=12.18.0,<12.18.1.0a0 + - azure-storage-common-cpp >=12.14.0,<12.14.1.0a0 + - libcxx >=19 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - azure-storage-files-datalake-cpp >=12.16.0,<12.16.1.0a0 + size: 206698 + timestamp: 1781541197750 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.2.0-hf00d406_4.conda + sha256: 14d8592fefabdc35055b857925fd47b375cb202a15a2914e94dfbbed4fd82c64 + md5: e32ad50b0f977e3fa616a578a2643e46 + depends: + - __osx >=11.0 + - brotli-bin 1.2.0 he4a93e4_4 + - libbrotlidec 1.2.0 h5295a6a_4 + - libbrotlienc 1.2.0 h2ddc9cb_4 + license: MIT + purls: [] + run_exports: + weak: + - libbrotlicommon >=1.2.0,<1.3.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + size: 20609 + timestamp: 1788480374173 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.2.0-he4a93e4_4.conda + sha256: f95bc05d7733d1c78a2077e83c5a05235f8b743b6e2e977c688cdba4d56c4537 + md5: d065d0732d02ace747059c3d58338fcd + depends: + - __osx >=11.0 + - libbrotlidec 1.2.0 h5295a6a_4 + - libbrotlienc 1.2.0 h2ddc9cb_4 + license: MIT + purls: [] + run_exports: {} + size: 18849 + timestamp: 1788480367234 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h4e30115_10.conda + sha256: 8ec22f0ba25cbfc2e64d70cf29459eccd7ffdf6436f6a6ff15bbfef799f7d4f6 + md5: b50612e7d190b8061ab4e7dc119cf4d5 + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + run_exports: + weak: + - bzip2 >=1.0.8,<2.0a0 + size: 124965 + timestamp: 1785906749812 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.8-h74c22ad_2.conda + sha256: 82bdd5a3fcada6afef6255a9bf41172f07b362f36e04a354dc2abc0a29bfb756 + md5: 4cc01a374215de38387d45e19c8c5c9c + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - c-ares >=1.34.8,<2.0a0 + size: 197819 + timestamp: 1787169996553 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-compiler-2.0.0-h39478f8_0.conda + sha256: 5ffde45e6a825e82a0cdd73aa2e23cec5febcd7b6953e37037bdab38343203bb + md5: 124b89a32eeeea68a3016366de507ee5 + depends: + - clang 21.* + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 6978 + timestamp: 1786642232392 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.4-h580cee5_3.conda + sha256: 07f86bbc50ff910689afdd8a417df6e329646b9424343f3202e32efda9e08acf + md5: bd8c9c43ff83b23c1aaaaf51f2f889cf + depends: + - __osx >=11.0 + - fontconfig >=2.18.3,<3.0a0 + - fonts-conda-ecosystem + - icu >=78.3,<79.0a0 + - libcxx >=21 + - libexpat >=2.8.1,<3.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libglib >=2.88.3,<3.0a0 + - libpng >=1.6.58,<1.7.0a0 + - libzlib >=1.3.2,<2.0a0 + - pixman >=0.46.4,<1.0a0 + license: LGPL-2.1-only or MPL-1.1 + purls: [] + run_exports: + weak: + - cairo >=1.18.4,<2.0a0 + size: 840110 + timestamp: 1788221324814 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/catch2-3.16.0-hfbe1efa_0.conda + sha256: 7fbbb02deb5e3b2896f7b71fd5f3fc091d2c4e05b6c499ccc137b72487494977 + md5: df1d7061f2d09aa5afa8b54915a47d66 + depends: + - libcxx >=21 + - __osx >=11.0 + license: BSL-1.0 + run_exports: + weak: + - catch2 >=3.16.0,<4.0a0 + size: 521799 + timestamp: 1787658440126 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools-1030.6.3-llvm21_1_h8e84c17_6.conda + sha256: 5325a4044f0292d83c3c91b3a84f5e2d9a90803e404da0d940102499c7101fe2 + md5: 8d4aa8689ae07aac4e26a3dabbd17288 + depends: + - cctools_impl_osx-arm64 1030.6.3 llvm21_1_h2e2604f_6 + - ld64 956.6 llvm21_1_h5d6df6c_6 + - libllvm21 >=21.1.8,<21.2.0a0 + license: APSL-2.0 + license_family: Other + run_exports: {} + size: 24301 + timestamp: 1787724419088 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm21_1_h2e2604f_6.conda + sha256: 018a1c139e1a3f2e2721acfb34e562771797c11b69d12e3c5b862be1c727dbff + md5: ed827e1d36581308d0170ee137d74ced + depends: + - __osx >=11.0 + - ld64_osx-arm64 >=956.6,<956.7.0a0 + - libcxx + - libllvm21 >=21.1.8,<21.2.0a0 + - libzlib >=1.3.2,<2.0a0 + - llvm-tools 21.1.* + - sigtool-codesign + constrains: + - cctools 1030.6.3.* + - clang 21.1.* + - ld64 956.6.* + license: APSL-2.0 + license_family: Other + run_exports: {} + size: 762271 + timestamp: 1787724408080 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm21_1_h8e84c17_6.conda + sha256: 1ec9d0553d93ca6c09a67813bf07f45bf08e760691ca7099f4d8a609cae6b231 + md5: cc7025a3799ad0124025d057af9574a7 + depends: + - cctools_impl_osx-arm64 1030.6.3 llvm21_1_h2e2604f_6 + - ld64_osx-arm64 956.6 llvm21_1_h1a10cc4_6 + constrains: + - cctools 1030.6.3.* + license: APSL-2.0 + license_family: Other + run_exports: {} + size: 23496 + timestamp: 1787724421808 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.1.1-py312hc892d8b_3.conda + sha256: 2fdabfeb8de0e506c55a4fc0cbc57cf2579ad011959d3234ea695f58beb8dce1 + md5: 3361d7efede75a6caa9041cbaa97b4e9 + depends: + - __osx >=11.0 + - libffi >=3.7.0,<3.8.0a0 + - pycparser + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: MIT + purls: + - pkg:pypi/cffi?source=compressed-mapping + run_exports: {} + size: 289165 + timestamp: 1788485306633 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-21-21.1.8-default_h4399b93_6.conda + sha256: 39e371e974b6a8a74cec9f4301bdca51c16573febbfa812f93e8e451c162bf9e + md5: c7b00dddcd694d2adf0d9b53ca3d1136 + depends: + - __osx >=11.0 + - compiler-rt21 21.1.8.* + - libclang-cpp21.1 21.1.8 default_h4399b93_6 + - libcxx >=21.1.8 + - libllvm21 >=21.1.8,<21.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + run_exports: {} + size: 819338 + timestamp: 1787460800427 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-21.1.8-default_cfg_h7f0254a_6.conda + sha256: fa546d1b4bb7bdfe6ded986da678d140cd11f5682dd8e302c69fe7a0f74e24b4 + md5: 4c92f594715cc9a9e13bb52358c5609c + depends: + - cctools + - clang-21 21.1.8.* default_* + - clang_impl_osx-arm64 21.1.8 default_hc11f16d_6 + - ld64 + - ld64_osx-arm64 * llvm21_1_* + - llvm-openmp >=21.1.8 + - llvm-tools 21.1.8.* + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + run_exports: {} + size: 28809 + timestamp: 1787460825258 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-scan-deps-21.1.8-default_h4399b93_6.conda + sha256: 5bf62b02d1903a864a8002d2aa423d62298f5a1b5f5fe309a16749c00e75b177 + md5: 98a490d2b62988b22e1177f8bc80333b + depends: + - __osx >=11.0 + - libclang-cpp21.1 >=21.1.8,<21.2.0a0 + - libclang13 >=21.1.8 + - libcxx >=21.1.8 + - libllvm21 >=21.1.8,<21.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + run_exports: {} + size: 101271 + timestamp: 1787460822516 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_impl_osx-arm64-21.1.8-default_hc11f16d_6.conda + sha256: 612e5f7072e60ed3591f992d6a9039cce234d9f666a8ab6967a2c3c2a8637ea5 + md5: 2862f9e7af5eaa6462a3aca336806d43 + depends: + - cctools_impl_osx-arm64 + - clang-21 21.1.8.* default_* + - compiler-rt 21.1.8.* + - compiler-rt_osx-arm64 21.1.8.* + - ld64_osx-arm64 * llvm21_1_* + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + run_exports: {} + size: 28353 + timestamp: 1787460823809 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx-21.1.8-default_cfg_h7f0254a_6.conda + sha256: 3b4782b875e608368c1af6ceb1c820a3cfa9f999773ef3815b24a83e70be998b + md5: 9f2cb1aecf42ce02e0ce9310f074498a + depends: + - clang 21.1.8 default_cfg_h7f0254a_6 + - clangxx_impl_osx-arm64 21.1.8.* default_* + - libcxx-devel 21.1.* + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + run_exports: {} + size: 28476 + timestamp: 1787460868805 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx_impl_osx-arm64-21.1.8-default_hc11f16d_6.conda + sha256: 6408bd1ec4bfba3a5898288dd04ab80e0b8a7303a56db644658a040cbbc67041 + md5: a908806b23961a3389ef3b5b47692039 + depends: + - clang-21 21.1.8.* default_* + - clang-scan-deps 21.1.8 default_h4399b93_6 + - clang_impl_osx-arm64 21.1.8 default_hc11f16d_6 + - libcxx-devel 21.1.* + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + run_exports: {} + size: 28141 + timestamp: 1787460865775 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cmake-3.31.8-h54ad630_0.conda + sha256: 55f8adaa565e9494aca45cf9b75689354479a179efe088522be345f0c5acca3b + md5: 7a61882f98f88aee01bae8a76d5990ba + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libcurl >=8.14.1,<9.0a0 + - libcxx >=19 + - libexpat >=2.7.1,<3.0a0 + - liblzma >=5.8.1,<6.0a0 + - libuv >=1.51.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - rhash >=1.4.6,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 16632236 + timestamp: 1757877846468 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt-21.1.8-hce30654_2.conda + sha256: 624b8923052bf0cea5ae6ee422f18e73594f76cd4e9b7fc7565f51b256275c92 + md5: 129de7382248e851078a1c4bbde92756 + depends: + - compiler-rt21 21.1.8 hdb3d66b_2 + - libcompiler-rt 21.1.8 hdb3d66b_2 + constrains: + - clang 21.1.8 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + run_exports: {} + size: 16236 + timestamp: 1787374964487 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt21-21.1.8-hdb3d66b_2.conda + sha256: 5557bddc870924ec1a1dd24900672229b5cef3e7b6b14d647d220b5f9810767f + md5: df63e236c76f7b443db681db51a73682 + depends: + - __osx >=11.0 + - compiler-rt21_osx-arm64 21.1.8.* + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + run_exports: {} + size: 99569 + timestamp: 1787374963563 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/conda-gcc-specs-15.3.0-h64e22ab_4.conda + sha256: fd05cc35d5d7d4c4c79d8bb4692f7098d2b4ccaf51b7a94c49535952e527e49b + md5: cbf99bf466ac0c73928b7a739eee4ba5 + depends: + - gcc_impl_osx-arm64 >=15.3.0,<15.3.1.0a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: {} + size: 103457 + timestamp: 1787617615021 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py312h3093aea_4.conda + sha256: fa1b3967c644c1ffaf8beba3d7aee2301a8db32c0e9a56649a0e496cf3abd27c + md5: f9cce0bc86b46533489a994a47d3c7d2 + depends: + - numpy >=1.25 + - python + - python 3.12.* *_cpython + - __osx >=11.0 + - libcxx >=19 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/contourpy?source=hash-mapping + run_exports: {} + size: 286084 + timestamp: 1769156157865 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/coverage-7.16.0-py312hf1f8172_0.conda + sha256: 3448886701e50337465d42bfb11d8e7350dc0e952d4899fef7d11883728882d5 + md5: 2755581efb3e986c40953b40b7d74f88 + depends: + - python + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/coverage?source=hash-mapping + run_exports: {} + size: 414767 + timestamp: 1787965739867 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cxx-compiler-2.0.0-he3883d0_0.conda + sha256: ee789a31c86183e8e3c337cd5c1961c9f5ab27e410d11750fd3d7f686eb322b1 + md5: 726b88cb2cac68266015e3ec3aeb2c6f + depends: + - clangxx 21.* + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 7001 + timestamp: 1786642232883 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/dftd3-python-1.5.0-py312h2bbb03f_0.conda + sha256: aa3061f264d2028806047e85eea31cb8ddd5ba2d934bad86dbddf99399e27f66 + md5: fcc98382e0757c6bafff88f21ddfdd3a + depends: + - __osx >=11.0 + - cffi + - numpy + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - simple-dftd3 >=1.5.0,<1.6.0a0 + license: LGPL-3.0-or-later + license_family: LGPL + purls: + - pkg:pypi/dftd3?source=project-defined-mapping + run_exports: {} + size: 109786 + timestamp: 1786428336899 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/eigen-5.0.1-hdb59ae0_1.conda + sha256: 9a83508883794967291f66ad759a4236ee75809eb8ff6ccc293f1761fa779663 + md5: b2e0c73470c30262968a4dd671ff9eb4 + license: MPL-2.0 + license_family: MOZILLA + run_exports: {} + size: 1313786 + timestamp: 1788180307460 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/fmt-12.1.0-h99e4e11_1.conda + sha256: ca42427b99ff92228e907bed5f10a1df868180997571d29c230faad2c38e35fd + md5: 891b1202d7b835f215e26a4db685ec7c + depends: + - __osx >=11.0 + - libcxx >=19 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - fmt >=12.1.0,<12.2.0a0 + size: 181008 + timestamp: 1785915450316 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.18.3-h81aa574_1.conda + sha256: 004570d35fb0eff73ce3ae49b209a47622d0c2e580dd0dc4c61d59626b386a09 + md5: 8ac8cc3fe744b484de4387703134d8b2 + depends: + - __osx >=11.0 + - libexpat >=2.8.1,<3.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libintl >=0.25.1,<1.0a0 + - libzlib >=1.3.2,<2.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - fontconfig >=2.18.3,<3.0a0 + - fonts-conda-ecosystem + size: 265659 + timestamp: 1786667932256 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.63.0-py312h04c11ed_0.conda + sha256: b78cc8df0d93ac0f0d59cb91cf54cc91effa6c124a78c8d2e8afc8011d9fb320 + md5: 77e64a600d8426c3863942f67491f5fb + depends: + - __osx >=11.0 + - brotli + - munkres + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - unicodedata2 >=15.1.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/fonttools?source=hash-mapping + run_exports: {} + size: 2904377 + timestamp: 1778771054844 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/fortran-compiler-2.0.0-h919a6ed_0.conda + sha256: 3e5d9039be12f3a61424c3aa4ebe16c408c649fb06d2b12f953826195b28539c + md5: 1e1e6b169fd0a2e8829cb4a71cbf8235 + depends: + - gfortran 15.* + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 6988 + timestamp: 1786642233300 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.3-hce30654_2.conda + sha256: 90681f1d0658cb2fd49a074f644eb4774272499290487a4bebb1c4df01d6997b + md5: 2f4cc7dc2e6622591735c49dda1b92aa + depends: + - libfreetype 2.14.3 hce30654_2 + - libfreetype6 2.14.3 h2ed5691_2 + license: GPL-2.0-only OR FTL + purls: [] + run_exports: + weak: + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + size: 175388 + timestamp: 1786641016583 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hb001647_2.conda + sha256: aff7bd01037dfbacb0661ef0435a224fe9fcda1d624895fb336107dd68e5bb34 + md5: b4397592e234554333719778bb01169e + depends: + - __osx >=11.0 + license: LGPL-2.1-or-later + purls: [] + run_exports: + weak: + - fribidi >=1.0.16,<2.0a0 + size: 62379 + timestamp: 1788385614707 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gcc-15.3.0-h500d687_4.conda + sha256: 916ac66f204270201f1a8537ce407b61a8617f60acb717ad82e31dfe5bf6b996 + md5: bff3d9f111f3a30e22940308a9c4044a + depends: + - conda-gcc-specs + - gcc_impl_osx-arm64 15.3.0 hdd9f9fa_4 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 100563 + timestamp: 1787617711006 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gcc_impl_osx-arm64-15.3.0-hdd9f9fa_4.conda + sha256: 72fcf60d427b315958b7087dc3339426750c7a086006d0b8abd6927456ea023b + md5: 3a6d4a437d9decd5e377f85eb6c3d194 + depends: + - cctools_osx-arm64 + - clang + - ld64_osx-arm64 + - libgcc >=15.3.0 + - libgcc-devel_osx-arm64 15.3.0 h647fcfe_104 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: {} + size: 49459853 + timestamp: 1787617556800 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.3.1-h784d473_0.conda + sha256: 3028f8f857d438444d3fb56c9c74d46699cb04e676c6575747cf3ad8d9a308b1 + md5: 96aea99abfaf8d1e7731c03e3f70fb02 + depends: + - libcxx >=19 + - __osx >=11.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - gflags >=2.3.1,<2.4.0a0 + size: 93701 + timestamp: 1785044718935 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gfortran-15.3.0-h500d687_4.conda + sha256: 3a5557b86130e874d17fb30fd8bf46c23dbc55ad16c25d5b25f13db2f82d74f4 + md5: f36075c37f644879c616e5a5dbc0b84e + depends: + - conda-gcc-specs + - gcc 15.3.0 h500d687_4 + - gcc_impl_osx-arm64 15.3.0 hdd9f9fa_4 + - gfortran_impl_osx-arm64 15.3.0 hc97e033_4 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 100118 + timestamp: 1787617729459 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gfortran_impl_osx-arm64-15.3.0-hc97e033_4.conda + sha256: dc0b3826347940480a72e764ee829119e2743c5134329f9f2b72d1e48872cde8 + md5: 7513454fbeae6ddc089b472c27d417e5 + depends: + - gcc_impl_osx-arm64 15.3.0.* + - libgcc >=15.3.0 + - libgfortran5 >=15.3.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: {} + size: 13075884 + timestamp: 1787617657551 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/git-2.55.0-pl5321h545aa0d_1.conda + sha256: 4bb0bfe6b0fcb2830689e2b6b99090b458ad791b6adca570e5d3a322eb912cbc + md5: d041b375de31a576c37b8c52044c94b7 + depends: + - __osx >=11.0 + - libcurl >=8.21.0,<9.0a0 + - libexpat >=2.8.1,<3.0a0 + - libiconv >=1.18,<2.0a0 + - libintl >=0.25.1,<1.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.7,<4.0a0 + - pcre2 >=10.47,<10.48.0a0 + - perl 5.* + constrains: + - __osx >=11.0 + license: GPL-2.0-or-later and LGPL-2.1-or-later + run_exports: {} + size: 13383521 + timestamp: 1783981746666 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-h6f9ecc1_1.conda + sha256: 1ac5991fd354de81baf3892fee0ad09438623698fcad73758521dfe90711ed44 + md5: 68937f90f7930d49e106b94e95d4536c + depends: + - __osx >=11.0 + - gflags >=2.3.0,<2.4.0a0 + - libcxx >=19 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - glog >=0.7.1,<0.8.0a0 + size: 112670 + timestamp: 1784094909098 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-hf5e55b1_3.conda + sha256: 980cb1bbc3656d6f923d44297a2c4ab75f20482b8930c70537fd7f1ef2378894 + md5: bbfa5bd261b68536ddcda39e03d3407f + depends: + - libcxx >=19 + - __osx >=11.0 + license: GPL-2.0-or-later OR LGPL-3.0-or-later + purls: [] + run_exports: + weak: + - gmp >=6.3.0,<7.0a0 + size: 399307 + timestamp: 1786629210135 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmpy2-2.3.1-py312h1af6244_0.conda + sha256: c243b2223294d3527b2ac5104097c0a7c0497c4f50bcfb9845ff7c678c93e615 + md5: 3956cc08242f88c9275ff6962143b2fd + depends: + - python + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + - mpfr >=4.2.2,<5.0a0 + - python_abi 3.12.* *_cp312 + - mpc >=1.4.0,<2.0a0 + license: LGPL-3.0-or-later + license_family: LGPL + purls: + - pkg:pypi/gmpy2?source=hash-mapping + run_exports: {} + size: 253256 + timestamp: 1787066495677 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.15-h784d473_1.conda + sha256: 471f34a187fdb4f2df33e26f2e471b16c239a5b277903f643d9c3a8c9a9f44ec + md5: 0c7b78d9ffff4f5a6ca28d346f734d8f + depends: + - libcxx >=19 + - __osx >=11.0 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + run_exports: + weak: + - graphite2 >=1.3.15,<2.0a0 + size: 86493 + timestamp: 1786118637573 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.16.0-nompi_py312hbcbdda9_104.conda + sha256: 2c16239de94917bee0ed5bd416cdf722c1ca050cf278ebeddd97770e61b74ef1 + md5: b0ddf08f457a4d7f30c2df79917b980a + depends: + - __osx >=11.0 + - cached-property + - hdf5 >=2.2.0,<3.0a0 + - numpy >=1.25,<3 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 1139741 + timestamp: 1787109268389 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-2.2.0-nompi_h7eff4e6_100.conda + sha256: f4628ccb83c2e89baa55c4edbef4c6c8a1b6ff14e3661017796efaaf49c51c6c + md5: abd52e74327b5b8145c950326432d0b2 + depends: + - __osx >=11.0 + - aws-c-auth >=0.10.4,<0.10.5.0a0 + - aws-c-common >=0.14.3,<0.14.4.0a0 + - aws-c-http >=0.11.0,<0.11.1.0a0 + - aws-c-io >=0.27.5,<0.27.6.0a0 + - aws-c-s3 >=0.13.1,<0.13.2.0a0 + - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 + - libaec >=1.1.5,<2.0a0 + - libcurl >=8.21.0,<9.0a0 + - libcxx >=19 + - libgfortran + - libgfortran5 >=14.4.0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.7,<4.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - hdf5 >=2.2.0,<3.0a0 + size: 3731030 + timestamp: 1786234076033 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/hf-xet-1.5.2-py310he76dbf2_2.conda + noarch: python + sha256: 1c91ef5a784a75a274bd55716d6f999d847f18aa976212c10759249f2b92a2c8 + md5: 78730d3fd4b577ac4740add532b5aaec + depends: + - python + - __osx >=11.0 + - _python_abi3_support 1.* + - cpython >=3.10 + - openssl >=3.5.7,<4.0a0 + constrains: + - __osx >=11.0 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/hf-xet?source=hash-mapping + run_exports: {} + size: 3346802 + timestamp: 1784665280334 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-py310h579977c_2.conda + sha256: 6cdb5dee54c72e56ab189fb3ad33cb28533553d42590e7e831160248f4416a43 + md5: a5efc0b42bb8b42e97d0a29ae3e3c187 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - icu >=78.3,<79.0a0 + size: 14070242 + timestamp: 1786545847761 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/jonquil-0.3.2-gfortran_h04795c8_0.conda + sha256: 0a7da05cf55fcfbec807f555a09f1c85d3bbf4a6f8bfc7b822734f853d7af846 + md5: 003ddfb69a316636d6694a76cf624b4a + depends: + - __osx >=11.0 + - libgfortran + - libgfortran5 >=14.3.0 + - toml-f >=0.5.1,<0.6.0a0 gfortran_* + license: Apache-2.0 OR MIT + purls: [] + run_exports: + weak: + - jonquil >=0.3.2,<0.4.0a0 + size: 114901 + timestamp: 1782316564315 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.5.1-py312hee531d8_1.conda + sha256: 167bc4ecd5267b6be80337aab2a8d7a07adaac46f0a032d292c73530d1f910ba + md5: f8bdb45a736f57373e4d581e7a4fc500 + depends: + - python + - __osx >=11.0 + - python 3.12.* *_cpython + - libcxx >=21 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + purls: + - pkg:pypi/kiwisolver?source=hash-mapping + run_exports: {} + size: 66202 + timestamp: 1788505848842 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h34f8a20_2.conda + sha256: aaea1d42b07769920db2af7471ece9399d2613448863da64ad8272998db5db34 + md5: 15235dd10450d67bc25ccafd5b46d2bc + depends: + - __osx >=11.0 + - libcxx >=21 + - libedit >=3.1.20250104,<3.2.0a0 + - libedit >=3.1.20250104,<4.0a0 + - openssl >=3.5.7,<4.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - krb5 >=1.22.2,<1.23.0a0 + size: 1165740 + timestamp: 1786762145768 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.19.1-hce41798_2.conda + sha256: ee92e3ee789881b08a95d254d4dbb54186d31089743eac9bb34df45b33e5b3a2 + md5: 39f3afa677c4f1cd499aec3b1f5c76a9 + depends: + - __osx >=11.0 + - libjpeg-turbo >=3.2.0,<4.0a0 + - libtiff >=4.7.2,<4.8.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - lcms2 >=2.19.1,<3.0a0 + size: 212111 + timestamp: 1788156381412 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-956.6-llvm21_1_h5d6df6c_6.conda + sha256: 0d797d56fd1c37023923a363793cb426452453603f36986a7db671cb77dbda8f + md5: 4a7bce9254a49f75ed4b7a02fcd3891b + depends: + - ld64_osx-arm64 956.6 llvm21_1_h1a10cc4_6 + - libllvm21 >=21.1.8,<21.2.0a0 + constrains: + - cctools 1030.6.3.* + - cctools_osx-arm64 1030.6.3.* + license: APSL-2.0 + license_family: Other + run_exports: {} + size: 21643 + timestamp: 1787724413801 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm21_1_h1a10cc4_6.conda + sha256: 6334685852bd2deb6c30770d5e355966228ae998fb9de513fa0d7bdb8d9d3034 + md5: 7d8a2267ffe4bf8713e289cac7d86e62 + depends: + - __osx >=11.0 + - libcxx + - libllvm21 >=21.1.8,<21.2.0a0 + - sigtool-codesign + - tapi >=1600.0.11.8,<1601.0a0 + constrains: + - cctools 1030.6.3.* + - cctools_impl_osx-arm64 1030.6.3.* + - clang 21.1.* + - ld64 956.6.* + license: APSL-2.0 + license_family: Other + run_exports: {} + size: 984335 + timestamp: 1787724392255 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.2.0-h1eee2c3_0.conda + sha256: c97aa17d16d2ac332ba9f184e82ce8f72dcb10e9a10c5f299030be2d44e191b9 + md5: e429aec4037d5cb8fd34ded9f5dadd39 + depends: + - __osx >=11.0 + - libcxx >=19 + license: Apache-2.0 + license_family: Apache + purls: [] + run_exports: + weak: + - lerc >=4.2.0,<5.0a0 + size: 166477 + timestamp: 1785036480092 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260526.0-cxx17_h4c27e2a_2.conda + sha256: d9c62dae9d8f5bebadf72fcf369c00cc353183cb2521f9fffbf4c2f70b58bef9 + md5: 2aa5e7dc7b5d218908effd2a8c70a8a8 + depends: + - __osx >=11.0 + - libcxx >=19 + constrains: + - abseil-cpp =20260526.0 + - libabseil-static =20260526.0=cxx17* + license: Apache-2.0 + license_family: Apache + purls: [] + run_exports: + weak: + - libabseil >=20260526.0,<20260527.0a0 + - libabseil =*=cxx17* + size: 1277537 + timestamp: 1787217005681 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.5-h8664d51_0.conda + sha256: af9cd8db11eb719e38a3340c88bb4882cf19b5b4237d93845224489fc2a13b46 + md5: 13e6d9ae0efbc9d2e9a01a91f4372b41 + depends: + - __osx >=11.0 + - libcxx >=19 + license: BSD-2-Clause + license_family: BSD + run_exports: + weak: + - libaec >=1.1.5,<2.0a0 + size: 30390 + timestamp: 1769222133373 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-25.0.0-haaed7fe_4_cpu.conda + build_number: 4 + sha256: 3c289bab2a8c4be0ef86363c97c5532dbcc289708b8523d6a3cfef35a2dd0b9b + md5: 6c06263450ab8f5f4580effead8b2ca4 + depends: + - __osx >=12.0 + - aws-crt-cpp >=0.40.1,<0.40.2.0a0 + - aws-sdk-cpp >=1.11.833,<1.11.834.0a0 + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + - azure-identity-cpp >=1.13.3,<1.13.4.0a0 + - azure-storage-blobs-cpp >=12.18.0,<12.18.1.0a0 + - azure-storage-files-datalake-cpp >=12.16.0,<12.16.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libcxx >=21 + - libgoogle-cloud >=3.8.0,<3.9.0a0 + - libgoogle-cloud-storage >=3.8.0,<3.9.0a0 + - libopentelemetry-cpp >=1.27.0,<1.28.0a0 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libzlib >=1.3.2,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.3.1,<2.3.2.0a0 + - snappy >=1.2.2,<1.3.0a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - apache-arrow-proc =*=cpu + - arrow-cpp <0.0a0 + - parquet-cpp <0.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - libarrow >=25.0.0,<25.1.0a0 + size: 4294348 + timestamp: 1786315141730 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-25.0.0-heaff1e6_4_cpu.conda + build_number: 4 + sha256: 154feae16991d0e50d4b4d45291904cfbf1c8c97955237f71a84975b363cdd04 + md5: 5810871245167355126d623aa5ae1096 + depends: + - __osx >=12.0 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libarrow 25.0.0 haaed7fe_4_cpu + - libarrow-compute 25.0.0 h93a2d87_4_cpu + - libcxx >=21 + - libopentelemetry-cpp >=1.27.0,<1.28.0a0 + - libprotobuf >=7.35.1,<7.35.2.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - libarrow-acero >=25.0.0,<25.1.0a0 + size: 519885 + timestamp: 1786315467845 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-25.0.0-h93a2d87_4_cpu.conda + build_number: 4 + sha256: 5b725a3048bd53e9e2cee2577a26724467b35a956cc1207f5bde0321d128dbaf + md5: 1f47858e8a29295f723b63cd318a31c4 + depends: + - __osx >=12.0 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libarrow 25.0.0 haaed7fe_4_cpu + - libcxx >=21 + - libopentelemetry-cpp >=1.27.0,<1.28.0a0 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libre2-11 >=2025.11.5 + - libutf8proc >=2.11.3,<2.12.0a0 + - re2 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - libarrow-compute >=25.0.0,<25.1.0a0 + size: 2228808 + timestamp: 1786315247988 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-25.0.0-heaff1e6_4_cpu.conda + build_number: 4 + sha256: 580382aae415669e2ff4af670db9381462d5d966ecde7d35f041356344b77dd1 + md5: 5d2b0865a12a8a380c4ad11eae754f30 + depends: + - __osx >=12.0 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libarrow 25.0.0 haaed7fe_4_cpu + - libarrow-acero 25.0.0 heaff1e6_4_cpu + - libarrow-compute 25.0.0 h93a2d87_4_cpu + - libcxx >=21 + - libopentelemetry-cpp >=1.27.0,<1.28.0a0 + - libparquet 25.0.0 h0de02aa_4_cpu + - libprotobuf >=7.35.1,<7.35.2.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - libarrow-dataset >=25.0.0,<25.1.0a0 + size: 519748 + timestamp: 1786315616734 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-25.0.0-h2208e57_4_cpu.conda + build_number: 4 + sha256: 4f5d1e1e1ecead58d80472e2965143a4d4daf37d401a527334116caf5b5cff9b + md5: e8627e23ad2343bdd0765b49ad7795df + depends: + - __osx >=12.0 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libarrow 25.0.0 haaed7fe_4_cpu + - libarrow-acero 25.0.0 heaff1e6_4_cpu + - libarrow-dataset 25.0.0 heaff1e6_4_cpu + - libcxx >=21 + - libprotobuf >=7.35.1,<7.35.2.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - libarrow-substrait >=25.0.0,<25.1.0a0 + size: 455505 + timestamp: 1786315676110 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-10_h51639a9_openblas.conda + build_number: 10 + sha256: e5a6dd4210286ae61f868cf70f297e851856b8512776f4efac4e50dba0d57457 + md5: 37ec75f777eac2ee1322e19d64df82e7 + depends: + - libopenblas >=0.3.34,<0.3.35.0a0 + - libopenblas >=0.3.34,<1.0a0 + constrains: + - blas 2.310 openblas + - libcblas 3.11.0 10*_openblas + - liblapack 3.11.0 10*_openblas + - liblapacke 3.11.0 10*_openblas + - mkl <2027 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libblas >=3.11.0,<4.0a0 + size: 18171 + timestamp: 1788076987757 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-h1dcdb26_4.conda + sha256: 8a6e4789a6049dabb41c6fcaf6719232245484d81dfeb199b5abdb95c84c9fc2 + md5: 8f3981871d167a6cd323e636e1929dd4 + depends: + - __osx >=11.0 + license: MIT + purls: [] + run_exports: + weak: + - libbrotlicommon >=1.2.0,<1.3.0a0 + size: 79648 + timestamp: 1788480342707 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-h5295a6a_4.conda + sha256: 4e1f5989561de4546209b42c935795a41fa4265e0b670861480f1adffec623a8 + md5: da537a1643ef3e13bdccf16cca206f2c + depends: + - __osx >=11.0 + - libbrotlicommon 1.2.0 h1dcdb26_4 + license: MIT + purls: [] + run_exports: + weak: + - libbrotlidec >=1.2.0,<1.3.0a0 + size: 29864 + timestamp: 1788480352084 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-h2ddc9cb_4.conda + sha256: 4d2da97825b221054a39f492e4dffe361e1931c8381d0367f1e0598a50d02f34 + md5: 39a25d500b191c16996239c4afa104f1 + depends: + - __osx >=11.0 + - libbrotlicommon 1.2.0 h1dcdb26_4 + license: MIT + purls: [] + run_exports: + weak: + - libbrotlienc >=1.2.0,<1.3.0a0 + size: 295505 + timestamp: 1788480359341 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-10_hb0561ab_openblas.conda + build_number: 10 + sha256: d4d786f18344c6e4a3fddd1ea19e014fa5f7bd33d11f6255b147a79dd00f9327 + md5: 953e30e380c03f058cacffe19bce9dc9 + depends: + - libblas 3.11.0 10_h51639a9_openblas + constrains: + - blas 2.310 openblas + - liblapack 3.11.0 10*_openblas + - liblapacke 3.11.0 10*_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libcblas >=3.11.0,<4.0a0 + size: 18146 + timestamp: 1788076992075 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp21.1-21.1.8-default_h4399b93_6.conda + sha256: 024ea5de27ed275003d2968579aae265059eb2dc8a27d741243d7037d1983f26 + md5: 76123dc601c7fa451a3cd0cffd3dc122 + depends: + - __osx >=11.0 + - libcxx >=21.1.8 + - libllvm21 >=21.1.8,<21.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + run_exports: + weak: + - libclang-cpp21.1 >=21.1.8,<21.2.0a0 + size: 13700434 + timestamp: 1787460755337 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp23.1-23.1.0-default_h79071a4_1.conda + sha256: 6d099276edaca530daddb513e8b8ec26162717f2811730f916cf9cd54c265ffb + md5: 9f779b62a9a86982e7a8e9fb504ed967 + depends: + - libcxx >=23.1.0 + - __osx >=11.0 + - libxml2 + - libxml2-16 >=2.15.3 + - zstd >=1.5.7,<1.6.0a0 + - libzlib >=1.3.2,<2.0a0 + - libllvm23 >=23.1.0,<23.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + run_exports: + weak: + - libclang-cpp23.1 >=23.1.0,<23.2.0a0 + size: 16608953 + timestamp: 1788037688863 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang13-23.1.0-default_h8d85846_1.conda + sha256: 373d69d9f377495616884c1a39158b5ec0f29bafcb2d6da74c10f8464cec8d70 + md5: 7539365b571357b7ed06e18c91235659 + depends: + - libclang-cpp23.1 ==23.1.0 default_h79071a4_1 + - libcxx >=23.1.0 + - __osx >=11.0 + - libxml2 + - libxml2-16 >=2.15.3 + - zstd >=1.5.7,<1.6.0a0 + - libzlib >=1.3.2,<2.0a0 + - libllvm23 >=23.1.0,<23.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + run_exports: + weak: + - libclang13 >=23.1.0 + size: 10616073 + timestamp: 1788037688863 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcompiler-rt-21.1.8-hdb3d66b_2.conda + sha256: 20e87238247ff01824095f96de08980bdf5b80bc81e69e6d27b6786bc20a0262 + md5: 13bb416a04cefad0b5c5870adb461f05 + depends: + - __osx >=11.0 + constrains: + - compiler-rt >=9.0.1 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + run_exports: + weak: + - libcompiler-rt >=21.1.8 + size: 1331133 + timestamp: 1787374959415 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 + sha256: 58477b67cc719060b5b069ba57161e20ba69b8695d154a719cb4b60caf577929 + md5: 32bd82a6a625ea6ce090a81c3d34edeb + depends: + - libcxx >=11.1.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libcrc32c >=1.1.2,<1.2.0a0 + size: 18765 + timestamp: 1633683992603 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.22.0-h6651222_0.conda + sha256: 46def32ec20d4dc6bce75d90fe5f2465a71cc22acef608c5ba37cc392e80e01d + md5: a7234b8d8e19a089dcb1eaaa18de1045 + depends: + - __osx >=11.0 + - krb5 >=1.22.2,<1.23.0a0 + - libnghttp2 >=1.68.1,<2.0a0 + - libpsl >=0.23.1,<0.24.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.8,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + purls: [] + run_exports: + weak: + - libcurl >=8.22.0,<9.0a0 + size: 419925 + timestamp: 1788340708264 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-23.1.0-h55c6f16_0.conda + sha256: d3e5f0b767964af25ef81edffc002f8e822b1a5c55330da1ae3a857f70c4e4ee + md5: 5303ba06fab927399ed8dfb3227b0af8 + depends: + - __osx >=11.0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 575940 + timestamp: 1787698697875 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-devel-21.1.8-h6dc3340_3.conda + sha256: 22b496dc6e766dd2829031cb88bc0e80cf72c27a210558c66af391dcdf78b823 + md5: d56bb1666723b02969644e76712500fa + depends: + - libcxx >=21.1.8 + - libcxx-headers >=21.1.8,<21.1.9.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + run_exports: {} + size: 22099 + timestamp: 1771995679012 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-he7e0567_1.conda + sha256: d896f4aa4ce4c590c2838678cb1917356fdb461d2a189991c0280c818c362172 + md5: 78650d671cb56909bb3e5c13bce310f9 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libdeflate >=1.25,<1.26.0a0 + size: 55727 + timestamp: 1785909153744 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321h26f1114_1.conda + sha256: 257c926f19e32bdb981fc674c76966049b6fc73f706bae58e9fed8757ad1da70 + md5: 843ef89082f368cb889305084d3b483c + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.6,<7.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libedit >=3.1.20250104,<3.2.0a0 + size: 107742 + timestamp: 1786616721640 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h1a92334_3.conda + sha256: c0100064506ae8abb432c5a506d474f10af2cf48c33d62bc221fb28b6d6ff6ac + md5: 19e86c8a6a47e92bb2e70ca12e758c5c + depends: + - __osx >=11.0 + license: BSD-2-Clause OR GPL-2.0-or-later + license_family: GPL + purls: [] + run_exports: + weak: + - libev >=4.33,<4.34.0a0 + size: 39991 + timestamp: 1785917376956 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda + sha256: 8c136d7586259bb5c0d2b913aaadc5b9737787ae4f40e3ad1beaf96c80b919b7 + md5: 1a109764bff3bdc7bdd84088347d71dc + depends: + - openssl >=3.1.1,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libevent >=2.1.12,<2.1.13.0a0 + size: 368167 + timestamp: 1685726248899 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_1.conda + sha256: 5af74261101e3c777399c6294b2b5d290e508153268eb2e9ff99c4d69834612f + md5: a915151d5d3c5bf039f5ccc8402a436f + depends: + - __osx >=11.0 + constrains: + - expat 2.8.1.* + license: MIT + license_family: MIT + purls: [] + run_exports: {} + size: 69362 + timestamp: 1781203631990 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfabric-2.6.0-hce30654_0.conda + sha256: 048eb6e03202b5a6f8ecbcdeb5a3f5ac9702736aa494de6615639d60ff68adc9 + md5: b92a04dd36f41b0d8dfed62ff7812eea + depends: + - libfabric1 2.6.0 h84a0fba_0 + license: BSD-2-Clause OR GPL-2.0-only + license_family: BSD + run_exports: {} + size: 14461 + timestamp: 1782364775970 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfabric1-2.6.0-h84a0fba_0.conda + sha256: 267ab5fe990209b33de220432bcb595a88e6bb642e282bbe433a8edfdc811c1a + md5: 5b0d1d64a7fe7e86900dd1859d2dd4d4 + depends: + - __osx >=11.0 + license: BSD-2-Clause OR GPL-2.0-only + license_family: BSD + run_exports: {} + size: 334671 + timestamp: 1782364772938 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.7.0-h47dc5ef_1.conda + sha256: 2783389a7b9dda04c62cc54c6bbeb03dd3cef24b3fc642715d02a3fa19464a9a + md5: 216bbcc23c11e9695b3db4a8771d76eb + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libffi >=3.7.0,<3.8.0a0 + size: 43637 + timestamp: 1787753403688 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_2.conda + sha256: 19ce8bd320414cb6b9889ecbf48a3ded848b0d1068b76ff6bea099bd7387d6f3 + md5: ee1fc5bba400ff0cae27fbf141a1ae0c + depends: + - libfreetype6 >=2.14.3 + license: GPL-2.0-only OR FTL + purls: [] + run_exports: {} + size: 8367 + timestamp: 1786641013393 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-h2ed5691_2.conda + sha256: d9b203d6484ad491b5b5f33d49a9d7a91189d776a9adae53d2b63af18ec11e6a + md5: 881cfb44ea02cc9849f612725a959660 + depends: + - __osx >=11.0 + - libpng >=1.6.58,<1.7.0a0 + - libzlib >=1.3.2,<2.0a0 + constrains: + - freetype >=2.14.3 + license: GPL-2.0-only OR FTL + purls: [] + run_exports: {} + size: 340923 + timestamp: 1786641012794 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-16.2.0-h3cf6597_4.conda + sha256: 00b8d07ea98344c72c6e332a09b8060f4176849d5fd0eb78dd5b30176ad97ca4 + md5: 408af8d9d5226ff45ff04756ff1aa91e + depends: + - _openmp_mutex + constrains: + - libgcc-ng ==16.2.0=*_4 + - libgomp 16.2.0 4 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 365758 + timestamp: 1787617459249 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-16.2.0-h07b0088_4.conda + sha256: 7582efbbffc6964093afd80e01c2ac60d89aa4e404cac664544675b9d4d1c5e7 + md5: aa6c627acd0f5709d9c79bf708a7b81b + depends: + - libgfortran5 16.2.0 hdb7a957_4 + constrains: + - libgfortran-ng ==16.2.0=*_4 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 99624 + timestamp: 1787617544212 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-16.2.0-hdb7a957_4.conda + sha256: 902719c38c7a390d305435a362dc83893754c3f933569a38347c434cd1c12540 + md5: d54390644d893d50e739b19145aae45f + depends: + - libgcc >=16.2.0 + constrains: + - libgfortran 16.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 554806 + timestamp: 1787617465010 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.3-h89cd0c0_2.conda + sha256: 9c25def7c7f9ab98b265690c80012e917d080538875f9679b46ccd0c042e6201 + md5: 14ef48eb322e0bfb1e5fe31e047359e3 + depends: + - __osx >=11.0 + - libintl >=0.25.1,<1.0a0 + - libzlib >=1.3.2,<2.0a0 + - pcre2 >=10.47,<10.48.0a0 + - libiconv >=1.18,<2.0a0 + - libffi >=3.7.0,<3.8.0a0 + constrains: + - glib >2.66 + license: LGPL-2.1-or-later + purls: [] + run_exports: + weak: + - libglib >=2.88.3,<3.0a0 + size: 4443052 + timestamp: 1787884141804 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-3.8.0-ha595bda_0.conda + sha256: a48050bcf3827e0fc10de5a7d251760b8b84011f3aeea23ae18b5e0ce25aff19 + md5: 4f34ca73f16b37fae583ce16c48b5492 + depends: + - __osx >=12.0 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libcurl >=8.21.0,<9.0a0 + - libcxx >=19 + - libgrpc >=1.82.1,<1.83.0a0 + - libopentelemetry-cpp >=1.27.0,<1.28.0a0 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - openssl >=3.5.7,<4.0a0 + constrains: + - libgoogle-cloud 3.8.0 *_0 + license: Apache-2.0 + license_family: Apache + purls: [] + run_exports: + weak: + - libgoogle-cloud >=3.8.0,<3.9.0a0 + size: 1804429 + timestamp: 1786225612587 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-3.8.0-hc8aed40_0.conda + sha256: 13251d6a72028a13a9d142815b23818a56f6f88a67f9dd5f19a881eb2fcf5636 + md5: 36ba29b4cf02ed97ce269939b750961a + depends: + - __osx >=12.0 + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libcxx >=19 + - libgoogle-cloud 3.8.0 ha595bda_0 + - libzlib >=1.3.2,<2.0a0 + - openssl + license: Apache-2.0 + license_family: Apache + purls: [] + run_exports: + weak: + - libgoogle-cloud-storage >=3.8.0,<3.9.0a0 + size: 541527 + timestamp: 1786225749476 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.82.1-hf3e839d_0.conda + sha256: b9d0f510488074e889ca3cecd2b7490e8e830f7a60e2e91809a90355bf4d1a57 + md5: 5f7f645a15eedc24da7f271dc2086bcf + depends: + - __osx >=12.0 + - c-ares >=1.34.6,<2.0a0 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libcxx >=19 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libre2-11 >=2025.11.5 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.7,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.82.1 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - libgrpc >=1.82.1,<1.83.0a0 + size: 4898235 + timestamp: 1783587327477 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libharfbuzz-14.4.0-hcda0f7c_1.conda + sha256: a13bee65e7bcbc14b228351d3d5ba00d0c17c5840c471ab67a28b8ca930456d3 + md5: 4afba4fae30b467d6c699bb685fa35ce + depends: + - __osx >=11.0 + - cairo >=1.18.4,<2.0a0 + - graphite2 >=1.3.15,<2.0a0 + - icu >=78.3,<79.0a0 + - libcxx >=21 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libglib >=2.88.3,<3.0a0 + - libpng >=1.6.58,<1.7.0a0 + - libzlib >=1.3.2,<2.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: {} + size: 973351 + timestamp: 1788405475876 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libhwloc-2.13.0-default_ha97f43a_1000.conda + sha256: d47c3c030671d196ff1cdd343e93eb2ae0d7b665cb79f8164cc91488796db437 + md5: fed55ddd65a830cb62e78f07cfffcd41 + depends: + - __osx >=11.0 + - libcxx >=19 + - libxml2 + - libxml2-16 >=2.14.6 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libhwloc >=2.13.0,<2.13.1.0a0 + size: 2339152 + timestamp: 1770953916323 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-he4c29f2_3.conda + sha256: 689a14968267f2f97c07112fca5636e7d756036b9aee969911267c20bd3eea1f + md5: 17f4744c0873e9f77ac9b5cd0a27c187 + depends: + - __osx >=11.0 + license: LGPL-2.1-only + purls: [] + run_exports: + weak: + - libiconv >=1.18,<2.0a0 + size: 750816 + timestamp: 1787033961086 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + sha256: 99d2cebcd8f84961b86784451b010f5f0a795ed1c08f1e7c76fbb3c22abf021a + md5: 5103f6a6b210a3912faf8d7db516918c + depends: + - __osx >=11.0 + - libiconv >=1.18,<2.0a0 + license: LGPL-2.1-or-later + purls: [] + run_exports: + weak: + - libintl >=0.25.1,<1.0a0 + size: 90957 + timestamp: 1751558394144 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.2.0-h84a0fba_1.conda + sha256: 05006418f9392c9b723e8428808db106de0350a497832f95f921b85ff1072310 + md5: b2f8c8e5a7651a1d7c05404c3a159517 + depends: + - __osx >=11.0 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + purls: [] + run_exports: + weak: + - libjpeg-turbo >=3.2.0,<4.0a0 + size: 558459 + timestamp: 1785896382474 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-10_hd9741b5_openblas.conda + build_number: 10 + sha256: 09551a3022c0f8151dab85f8b89dc151a635f672c177364139c7bd019459a2b8 + md5: 35ee607ea2e9f75c699158c5f77ef9fd + depends: + - libblas 3.11.0 10_h51639a9_openblas + constrains: + - blas 2.310 openblas + - libcblas 3.11.0 10*_openblas + - liblapacke 3.11.0 10*_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - liblapack >=3.11.0,<3.12.0a0 + size: 18183 + timestamp: 1788076996690 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm21-21.1.8-h759d1ac_1.conda + sha256: 8db5628b9431043d5e07dcdff6f4e2e50b654b9b15f1fb5370523ec5482e0b97 + md5: ecef0bb48f6401ce6e99bedaa24c78be + depends: + - __osx >=11.0 + - libcxx >=21 + - libxml2 + - libxml2-16 >=2.15.3 + - libzlib >=1.3.2,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + run_exports: + weak: + - libllvm21 >=21.1.8,<21.2.0a0 + size: 29629677 + timestamp: 1787364227487 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm23-23.1.0-h759d1ac_0.conda + sha256: da56254c1c055162230f21de04245f61937933d0f590acafbecc0ca74ca27531 + md5: 7847f17735b5ddca320cc556334ff5fb + depends: + - __osx >=11.0 + - libcxx >=21 + - libxml2 + - libxml2-16 >=2.15.3 + - libzlib >=1.3.2,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + run_exports: + weak: + - libllvm23 >=23.1.0,<23.2.0a0 + size: 31566039 + timestamp: 1787708577461 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_1.conda + sha256: 23d0630046a3e8b164d8f80f2b74ed2605af2e7050ab9913018056402fae4311 + md5: 8ab10323068b107661a4b9a4af84f3b5 + depends: + - __osx >=11.0 + constrains: + - xz 5.8.3.* + license: 0BSD + purls: [] + run_exports: + weak: + - liblzma >=5.8.3,<6.0a0 + size: 91720 + timestamp: 1786348695846 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h435687b_1.conda + sha256: 445440d8cccccb6585f71d1eb7c949d64a2af2ced5481d924621424ff3b6a398 + md5: ac9902dcbe0417f50cf95ab2bde062fa + depends: + - __osx >=11.0 + - c-ares >=1.34.8,<2.0a0 + - libcxx >=21 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.7,<4.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libnghttp2 >=1.68.1,<2.0a0 + size: 567024 + timestamp: 1787177422467 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.34-openmp_h4f80526_1.conda + sha256: 45bda47a2fd2e3936cd6da2756f57a5b22af445a6da6cc37a753bd96949721e7 + md5: 0b5dfcfae89beafb81234b90d5d07729 + depends: + - __osx >=11.0 + - libgfortran + - libgfortran5 >=14.4.0 + - llvm-openmp >=19.1.7 + constrains: + - openblas >=0.3.34,<0.3.35.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libopenblas >=0.3.34,<1.0a0 + size: 4315889 + timestamp: 1788055739634 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.27.0-h46c1d2a_1.conda + sha256: 9c1840af12f31643723a7ea7f6bde6a3a394783ced6aa65b75a9fc3ecb84f39f + md5: a6c2fc0c5ddf105b3d3e353c1383a492 + depends: + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libcurl >=8.21.0,<9.0a0 + - libgrpc >=1.82.0,<1.83.0a0 + - libopentelemetry-cpp-headers 1.27.0 hce30654_1 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libzlib >=1.3.2,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.27.0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - libopentelemetry-cpp >=1.27.0,<1.28.0a0 + size: 564868 + timestamp: 1783133075023 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.27.0-hce30654_1.conda + sha256: 01caeebb19f70563f4ab1b97fcdf06af13be8637e9776619c8840b49070b287c + md5: 7f61001d82fd50385d4f9fb57f936e95 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: {} + size: 394664 + timestamp: 1783133038717 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-25.0.0-h0de02aa_4_cpu.conda + build_number: 4 + sha256: 318412a665f7637598aef088a9dbc30c2a52614eebe1bde6e75be76708875271 + md5: ebf0d32466e8875bf91749744b97165a + depends: + - __osx >=12.0 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libarrow 25.0.0 haaed7fe_4_cpu + - libcxx >=21 + - libopentelemetry-cpp >=1.27.0,<1.28.0a0 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libthrift >=0.22.0,<0.22.1.0a0 + - openssl >=3.5.7,<4.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - libparquet >=25.0.0,<25.1.0a0 + size: 1096341 + timestamp: 1786315419506 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpmix-5.0.8-hddb0edd_4.conda + sha256: 038b7e32614e0e7e64507546e87211aec06ecde87b700749b2765d9a9c2f35c8 + md5: bb2e44b80f8b1fb78b846f3e3239efc4 + depends: + - __osx >=11.0 + - libevent >=2.1.12,<2.1.13.0a0 + - libhwloc >=2.13.0,<2.13.1.0a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libpmix >=5.0.8,<6.0a0 + size: 530391 + timestamp: 1770963627741 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-hf5e6511_1.conda + sha256: f88da60b348ee1f3e1a9c20fe02142fdafe889f08da0b1cc33c1f3f14460239d + md5: e0466c58fd07db190b9a81b5e58539f2 + depends: + - __osx >=11.0 + - libzlib >=1.3.2,<2.0a0 + license: zlib-acknowledgement + purls: [] + run_exports: + weak: + - libpng >=1.6.58,<1.7.0a0 + size: 290219 + timestamp: 1786616561185 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-7.35.1-h391e224_3.conda + sha256: 4129c13739e30dfbab8c20594acd8c182de2008f4dfc94d54f52b556eb39050c + md5: 7666c238f885d0c7927607ebfc163f97 + depends: + - __osx >=12.0 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libcxx >=21 + - libzlib >=1.3.2,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libprotobuf >=7.35.1,<7.35.2.0a0 + size: 2877232 + timestamp: 1787657252942 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpsl-0.23.1-hdb0c161_1.conda + sha256: c8c3153df39abedf3413483f672151ad70f1adb0c06c192bdf7ec432c3616b07 + md5: 5d270f716a2b4bc13df9af8612071b17 + depends: + - __osx >=11.0 + - libcxx >=21 + - icu >=78.3,<79.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libpsl >=0.23.1,<0.24.0a0 + size: 72673 + timestamp: 1786970928205 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpython-3.12.14-h4e5ec87_3_cpython.conda + build_number: 3 + sha256: 8077074cff173a979bbd32b79455ba6f1b12468528eac155e96d8550c38770f6 + md5: 7fd5ad6d9d1ae0af3ae9f039a992a148 + depends: + - __osx >=11.0 + - libcxx >=21 + license: Python-2.0 + purls: [] + run_exports: {} + size: 1741765 + timestamp: 1788407528160 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libraqm-0.11.0-h45af499_0.conda + sha256: b110f7f9b2cec61ea793c521950414e00cd64826e18aeb4ab40369acf05c0039 + md5: 46ea0eb4e71bffa35ab7070678bcb053 + depends: + - __osx >=11.0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libharfbuzz >=14.2.1 + - fribidi >=1.0.16,<2.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libraqm >=0.11.0,<0.12.0a0 + size: 31333 + timestamp: 1784850348342 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h5d15848_2.conda + sha256: 06f49291605c379467987989ff08d44b470a23afeb690d7e078517871969bff7 + md5: b750c4f83563c7528634bdcfd28622ce + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libcxx >=19 + constrains: + - re2 2025.11.05.* + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libre2-11 >=2025.11.5 + size: 166043 + timestamp: 1781312641918 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_1.conda + sha256: fcfa03afe31f40dfabf011629d99836adbebbc3ed1b38c7e9eee9ffc7581975b + md5: c70eb797aa92a294b09ef8f41f6bd578 + depends: + - __osx >=11.0 + - openssl >=3.5.7,<4.0a0 + license: MIT + license_family: MIT + run_exports: {} + size: 36651 + timestamp: 1786115069018 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.4-hca69786_1.conda + sha256: 839b31d4830e896b4d315b551d27f2bb08026bc946df04bcc360d8627c3ba2cd + md5: fde96d40ebe9a9cb34e4122380189ddb + depends: + - __osx >=11.0 + - icu >=78.3,<79.0a0 + - libzlib >=1.3.2,<2.0a0 + license: blessing + purls: [] + run_exports: + weak: + - libsqlite >=3.53.4,<4.0a0 + size: 942754 + timestamp: 1787051243846 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-hbf2880b_1.conda + sha256: a056e518c3d2d09fbb1778cea80c0c95338fb24adf1a817bbf90fb484850a304 + md5: d957a8eda98c49b073e8dcfd677c127a + depends: + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.7,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libssh2 >=1.11.1,<2.0a0 + size: 280492 + timestamp: 1786714226814 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h1fb9c8a_2.conda + sha256: 568bb23db02b050c3903bec05edbcab84960c8c7e5a1710dac3109df997ac7f1 + md5: d006875f9a58a44f92aec9a7ebeb7150 + depends: + - __osx >=11.0 + - libcxx >=19 + - libevent >=2.1.12,<2.1.13.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - libthrift >=0.22.0,<0.22.1.0a0 + size: 323017 + timestamp: 1777019893083 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.2-hf67920b_1.conda + sha256: 847d22a86ae28f66d3888702698254d25bb4eac3a0f64c1fabfb1842ac00be4c + md5: b6b191267455bf202af79f973690ed5d + depends: + - __osx >=11.0 + - lerc >=4.2.0,<5.0a0 + - libcxx >=21 + - libdeflate >=1.25,<1.26.0a0 + - libjpeg-turbo >=3.2.0,<4.0a0 + - liblzma >=5.8.3,<6.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: HPND + purls: [] + run_exports: + weak: + - libtiff >=4.7.2,<4.8.0a0 + size: 380645 + timestamp: 1787756067271 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtorch-2.12.1-cpu_generic_h931913c_0.conda + sha256: cc8c74ff5a4d6af96cb67858caa389d81bd6a5fa1c2e3ea65cb3934a5acd3adc + md5: bbb527a3355132af7b08a64893477afc + depends: + - __osx >=12.0 + - fmt >=12.1.0,<12.2.0a0 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=19 + - liblapack >=3.9.0,<4.0a0 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libuv >=1.52.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - llvm-openmp >=19.1.7 + - onednn >=3.12,<4.0a0 + - pybind11-abi 11 + - sleef >=3.9.0,<4.0a0 + constrains: + - libopenblas * openmp_* + - pytorch-cpu 2.12.1 + - pytorch-gpu <0.0a0 + - openblas * openmp_* + - pytorch 2.12.1 cpu_generic_*_0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libtorch >=2.12.1,<2.13.0a0 + size: 32193556 + timestamp: 1781831663606 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtorch-2.13.0-cpu_generic_hf893bd3_2.conda + sha256: 6f644ec2d951d59865aa842cd6081df065c2c61939f61b96ff6cfdddba7cef0c + md5: 2c90ca159b2cd70e9defc68f244d1285 + depends: + - __osx >=12.0 + - fmt >=12.1.0,<12.2.0a0 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=19 + - liblapack >=3.9.0,<4.0a0 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libuv >=1.52.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - llvm-openmp >=19.1.7 + - onednn >=3.12,<4.0a0 + - pybind11-abi 11 + - sleef >=3.9.0,<4.0a0 + constrains: + - libopenblas * openmp_* + - openblas * openmp_* + - pytorch 2.13.0 cpu_generic_*_2 + - pytorch-cpu 2.13.0 + - pytorch-gpu <0.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libtorch >=2.13.0,<2.14.0a0 + size: 33905275 + timestamp: 1786373050531 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.3-h2431656_0.conda + sha256: ae1a82e62cd4e3c18e005ae7ff4358ed72b2bfbfe990d5a6a5587f81e9a100dc + md5: 2255add2f6ae77d0a96624a5cbde6d45 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libutf8proc >=2.11.3,<2.12.0a0 + size: 87916 + timestamp: 1768735311947 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.52.1-h1a92334_1.conda + sha256: 4f47de9de1990efd998edbbd6793f89c8f02ffde987ae8120b1c006acefd2a04 + md5: de09bd0f175611e94f21b28f8c708e80 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libuv >=1.52.1,<2.0a0 + size: 122729 + timestamp: 1785914645797 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h202fb40_1.conda + sha256: 0ff54650d470c7e54cbeffdd53a8c063e055a7bcf784388c0385ce5c4741b0f4 + md5: 168a13e329259710b28277abc1395b8e + depends: + - __osx >=11.0 + constrains: + - libwebp 1.6.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libwebp-base >=1.6.0,<2.0a0 + size: 294522 + timestamp: 1785955350410 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hbffa61f_2.conda + sha256: f55c15b66c8ae27d8e30445193acc049b280eb51a47d6f1753bed5ac2937a217 + md5: 786c0680e77665d1938ce9cdd7cf82a7 + depends: + - __osx >=11.0 + - pthread-stubs + - xorg-libxau >=1.0.12,<2.0a0 + - xorg-libxdmcp >=1.1.5,<2.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libxcb >=1.17.0,<2.0a0 + size: 324234 + timestamp: 1787885764666 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_1.conda + sha256: 2ca61d8287339c726b151fa612e83d2afa1418b89fa17694c873dc231bc9b077 + md5: f86c0b8ac5c866049717b55df1049c2c + depends: + - __osx >=11.0 + - icu >=78.3,<79.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libzlib >=1.3.2,<2.0a0 + constrains: + - libxml2 2.15.3 + license: MIT + license_family: MIT + purls: [] + run_exports: {} + size: 466188 + timestamp: 1787237580766 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-h5654f7c_1.conda + sha256: ff1b70683ccb82f8aa7f3eda53405a2036d849daba4e4e622f330dcd49d37700 + md5: 06a3f8eb5cdde56b2d10b49ae3337954 + depends: + - __osx >=11.0 + - icu >=78.3,<79.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libxml2-16 2.15.3 h5ef1a60_1 + - libzlib >=1.3.2,<2.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libxml2 + - libxml2-16 >=2.15.3 + size: 41264 + timestamp: 1787237585903 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_3.conda + sha256: a18fa5d5bac452401459f966cf0d872224e8080c4ff93c77e168d43ab42ef9d7 + md5: f39288f0ea63ae962e1a2e4f355a0d75 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.2 *_3 + license: Zlib + license_family: Other + purls: [] + run_exports: + weak: + - libzlib >=1.3.2,<2.0a0 + size: 47822 + timestamp: 1785277049190 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-23.1.0-hdb3d66b_0.conda + sha256: 996d3a9de61c8ccc3fcb265938f9845f11868251f38e6db4e7190de3f9a971a2 + md5: 0affff5130a421d11d4d77ffbb00dad7 + depends: + - __osx >=11.0 + constrains: + - intel-openmp <0.0a0 + - openmp 23.1.0|23.1.0.* + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + run_exports: + strong: + - llvm-openmp >=23.1.0 + size: 287808 + timestamp: 1787723323710 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-21-21.1.8-h79441dc_1.conda + sha256: 758cf9c842b4a3678f52c768b66bbfdb812a715601edb9b75c577249d448e33c + md5: 269fcdde9a200135f812c74785c08615 + depends: + - __osx >=11.0 + - libcxx >=21 + - libllvm21 21.1.8 h759d1ac_1 + - libzlib >=1.3.2,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + run_exports: {} + size: 18536625 + timestamp: 1787364291969 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-21.1.8-hdb3d66b_1.conda + sha256: f3ae2d3cc10de67fcee0e72998d4f67cb7c01bdfc428c51f78a7a59dc6f9b0c2 + md5: 50fd053bd7140fd31e79bbc61ecef3f1 + depends: + - __osx >=11.0 + - libllvm21 21.1.8 h759d1ac_1 + - llvm-tools-21 21.1.8 h79441dc_1 + constrains: + - clang 21.1.8 + - clang-tools 21.1.8 + - llvm 21.1.8 + - llvmdev 21.1.8 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + run_exports: {} + size: 89113 + timestamp: 1787364323163 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-hdca3b7d_2.conda + sha256: 1887867b393eb3c2b336deaffcf228574821ea1e0dcb9ef7bf6c9f59cec40f03 + md5: d47f7f3481c6f2fcc4ed22802f61c6dd + depends: + - __osx >=11.0 + - libcxx >=21 + license: BSD-2-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - lz4-c >=1.10.0,<1.11.0a0 + size: 171838 + timestamp: 1786717209785 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py312h04c11ed_1.conda + sha256: 330394fb9140995b29ae215a19fad46fcc6691bdd1b7654513d55a19aaa091c1 + md5: 11d95ab83ef0a82cc2de12c1e0b47fe4 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=hash-mapping + run_exports: {} + size: 25564 + timestamp: 1772445846939 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.11.1-py312h07c8dfe_2.conda + sha256: 43c6f6494d183a3214c9acca05f6c477ace507f48785719c7c315aca4b0654a0 + md5: 6aecfe9840c1b1f5e613792c4720957a + depends: + - __osx >=11.0 + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.28.2 + - freetype + - kiwisolver >=1.3.1 + - libcxx >=19 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libraqm >=0.11.0,<0.12.0a0 + - numpy >=1.25 + - numpy >=1.25,<3 + - packaging >=20.0 + - pillow >=9 + - pyparsing >=3 + - python >=3.12,<3.13.0a0 + - python-dateutil >=2.7 + - python_abi 3.12.* *_cp312 + - qhull >=2020.2,<2020.3.0a0 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/matplotlib?source=hash-mapping + run_exports: {} + size: 8512237 + timestamp: 1785211085233 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mctc-lib-0.5.2-gfortran_h0230218_0.conda + sha256: cfcacb3a72e14b2273e545a4a836a9bf11e0745f80a23a93b2d28b9e2e83bc00 + md5: 598c2c0357e09faba1afb7281309b3f9 + depends: + - __osx >=11.0 + - jonquil >=0.3.0,<0.4.0a0 gfortran_* + - libgfortran + - libgfortran5 >=14.3.0 + - llvm-openmp >=19.1.7 + - toml-f >=0.5.0,<0.6.0a0 gfortran_* + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - mctc-lib >=0.5.2,<0.6.0a0 + size: 695023 + timestamp: 1781337704317 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.4.0-h071a35a_1.conda + sha256: 6238c857d6b6e575bcf26c79367f2faa22573a79ca67ee7f69694634fd865f5e + md5: 9d932443c0f21214dfa9821dc18881e1 + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + - mpfr >=4.2.2,<5.0a0 + license: LGPL-3.0-or-later + license_family: LGPL + purls: [] + run_exports: + weak: + - mpc >=1.4.0,<2.0a0 + size: 85436 + timestamp: 1787668129803 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.2-h72846b0_1.conda + sha256: 6a86fe9c09d708d71508c601dec53fb7a4fbfb23e6f57a590ef832afdca738c4 + md5: 6c990c07502330c3876dfc67d7bb6917 + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + license: LGPL-3.0-only + license_family: LGPL + purls: [] + run_exports: + weak: + - mpfr >=4.2.2,<5.0a0 + size: 350536 + timestamp: 1787236978744 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpi4py-4.1.2-py312h50e9609_100.conda + sha256: e3efbdf631e6a54aefd03b23cd5eefec9ab3a228e50d3fd520877eaebfde41cd + md5: 90862d094fbe045ffba84db96af6c2fd + depends: + - python + - openmpi >=4.1 + - python 3.12.* *_cpython + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - mpi4py >=4.1.2,<5.0a0 + size: 751137 + timestamp: 1778930573954 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-2.3.1-py312h9b6eb38_0.conda + sha256: 65d01830ece31e2a95ab94fb54db0c14d1701fe7c25e27a2b0a127a9c5bee4e6 + md5: 1d26314be01dd7c445760a581623ea15 + depends: + - ast-serialize >=0.6.0,<1.0.0 + - mypy_extensions >=1.0.0 + - pathspec >=1.0.0 + - python + - python-librt >=0.13.0 + - typing_extensions >=4.6.0 + - psutil >=4.0 + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mypy?source=compressed-mapping + run_exports: {} + size: 13041510 + timestamp: 1786887301117 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-he64c551_1.conda + sha256: 7024a48c8c0d0114ed4ab53c76bf9275d50e91ba7cea367a9aead638d3c29c68 + md5: 3dfa0d0316dc246cd44937a557de4501 + depends: + - __osx >=11.0 + license: X11 AND BSD-3-Clause + purls: [] + run_exports: + weak: + - ncurses >=6.6,<7.0a0 + size: 804298 + timestamp: 1786355189145 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.13.2-h3feff0a_1.conda + sha256: 3309eaa32a97afb323edb380563206c660637046eed93886d4b6b1b0ca270076 + md5: db95a98a49313f75abcad60aefa720ed + depends: + - libcxx >=19 + - __osx >=11.0 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 164371 + timestamp: 1786713083876 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.12.0-h784d473_2.conda + sha256: 3c7235b1574907737d09b46b3a0f7f0f5fcafc2380f2c8d02fc55aa23ce47c3c + md5: 0debf38c50bb3ea6f712c87310a00289 + constrains: + - nlohmann_json-abi ==3.12.0 + license: MIT + license_family: MIT + purls: [] + run_exports: {} + size: 137984 + timestamp: 1785920576349 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.6-py312ha003a3f_0.conda + sha256: b09e03dace335a6f303352fc4e167243e04d7026d55008546fa643d224fb0bad + md5: 9f554fdfa902971390975b489e678c03 + depends: + - python + - __osx >=11.0 + - libcxx >=19 + - python_abi 3.12.* *_cp312 + - liblapack >=3.9.0,<4.0a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + run_exports: + weak: + - numpy >=1.23,<3 + size: 6843172 + timestamp: 1779169213435 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.5.2-py312hff34920_1.conda + sha256: 4364ac78aa64779a6e60db322624fef5e6651f438c3643188354ee9183d92112 + md5: 70d3c98af4ea01c4f3db870121d41804 + depends: + - python + - libcxx >=21 + - __osx >=11.0 + - liblapack >=3.9.0,<4.0a0 + - python_abi 3.12.* *_cp312 + - libcblas >=3.9.0,<4.0a0 + - libblas >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - numpy >=1.25,<3 + size: 7098557 + timestamp: 1788129265394 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/onednn-3.12-omp_h95bb4b2_0.conda + sha256: dc6d6eeea55ccf0c5b34b73f5fa966ae8f8fbeb27632225bb4836d14185b397d + md5: ab54feaf0b7ff7f981615a8e012b191c + depends: + - llvm-openmp >=19.1.7 + - libcxx >=19 + - __osx >=11.0 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - onednn >=3.12,<4.0a0 + size: 5754719 + timestamp: 1779566196336 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-h4d1e80c_2.conda + sha256: e71bd04b5d0e39f39a3c039d021d3b76cd65bee3032e7f859ab7082f0ace8be5 + md5: 487d92910109a711fdb77631bf1aabf0 + depends: + - __osx >=11.0 + - libcxx >=21 + - libtiff >=4.7.2,<4.8.0a0 + - libzlib >=1.3.2,<2.0a0 + - libpng >=1.6.58,<1.7.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - openjpeg >=2.5.4,<3.0a0 + size: 377958 + timestamp: 1788425205328 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openmpi-5.0.10-h07cac57_1.conda + sha256: b9fd17b74b6698c6878ee91c73d62eb27d4785f79e2817a55aec1817b1329e48 + md5: a889e6877364e3f7989bb2070659d76f + depends: + - mpi 1.0.* openmpi + - libgfortran + - libgfortran5 >=14.3.0 + - __osx >=11.0 + - libcxx >=19 + - libhwloc >=2.13.0,<2.13.1.0a0 + - libpmix >=5.0.8,<6.0a0 + - libevent >=2.1.12,<2.1.13.0a0 + - libzlib >=1.3.1,<2.0a0 + - libfabric + - libfabric1 >=1.14.0 + constrains: + - libprrte ==0.0.0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - openmpi >=5.0.10,<6.0a0 + size: 2594948 + timestamp: 1772089733369 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.4-h55eecbc_0.conda + sha256: f23239eacd75c4c50705e68fae1aa3292da473e6a3a4abe2330f1e6afa680704 + md5: ae71ab40048c19a389a7dcccb86c2481 + depends: + - __osx >=11.0 + - ca-certificates + license: Apache-2.0 + license_family: Apache + purls: [] + run_exports: + weak: + - openssl >=3.6.4,<4.0a0 + size: 3110142 + timestamp: 1787698648639 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/optree-0.20.0-py312h42f75bc_1.conda + sha256: 8f3b69283afa579c7c950e44f1df36baca0590dc0a184ccdac81980785791b4b + md5: 6f2169dfc35bcf5fe3ee7e863f6d0e96 + depends: + - __osx >=11.0 + - libcxx >=21 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - typing-extensions >=4.10 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/optree?source=hash-mapping + run_exports: {} + size: 499197 + timestamp: 1788504952342 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.3.1-hef2a647_0.conda + sha256: 11b8e71ecdf9d50c9c5249e009b9f7d13d6df68091bd70fe202f3c3c16d0e3d8 + md5: d5626f645bea2fb646e12910c181fc79 + depends: + - tzdata + - __osx >=12.0 + - libcxx >=19 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - zstd >=1.5.7,<1.6.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.2,<1.3.0a0 + - libzlib >=1.3.2,<2.0a0 + - libabseil >=20260526.0,<20260527.0a0 + - libabseil * cxx17* + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: + weak: + - orc >=2.3.1,<2.3.2.0a0 + size: 513679 + timestamp: 1784301269750 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-3.0.5-py312h6510ced_1.conda + sha256: 2cef45eb539621fb181b9682d960157a476729b61094046e44bb8ac167cf3779 + md5: 49c93ebce99da3235ba5bd1a24f7153a + depends: + - python + - numpy >=1.26.0 + - python-dateutil >=2.8.2 + - libcxx >=19 + - python 3.12.* *_cpython + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + - numpy >=1.23,<3 + constrains: + - adbc-driver-postgresql >=1.2.0 + - adbc-driver-sqlite >=1.2.0 + - beautifulsoup4 >=4.12.3 + - blosc >=1.21.3 + - bottleneck >=1.4.2 + - fastparquet >=2024.11.0 + - fsspec >=2024.10.0 + - gcsfs >=2024.10.0 + - html5lib >=1.1 + - hypothesis >=6.116.0 + - jinja2 >=3.1.5 + - lxml >=5.3.0 + - matplotlib >=3.9.3 + - numba >=0.60.0 + - numexpr >=2.10.2 + - odfpy >=1.4.1 + - openpyxl >=3.1.5 + - psycopg2 >=2.9.10 + - pyarrow >=13.0.0 + - pyiceberg >=0.8.1 + - pymysql >=1.1.1 + - pyqt5 >=5.15.9 + - pyreadstat >=1.2.8 + - pytables >=3.10.1 + - pytest >=8.3.4 + - pytest-xdist >=3.6.1 + - python-calamine >=0.3.0 + - pytz >=2024.2 + - pyxlsb >=1.0.10 + - qtpy >=2.4.2 + - scipy >=1.14.1 + - s3fs >=2024.10.0 + - sqlalchemy >=2.0.36 + - tabulate >=0.9.0 + - xarray >=2024.10.0 + - xlrd >=2.0.1 + - xlsxwriter >=3.2.0 + - zstandard >=0.23.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + run_exports: {} + size: 13962363 + timestamp: 1785276448997 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-he63d830_1.conda + sha256: f8c415329b542e1fca1ff2917b80e687c18302dfa0353530668b90cb225b494f + md5: 5ab90033816cbe4097e8a297e5179f67 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - pcre2 >=10.47,<10.48.0a0 + size: 851704 + timestamp: 1787294559157 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda + build_number: 7 + sha256: b0c55040d2994fd6bf2f83786561d92f72306d982d6ea12889acad24a9bf43b8 + md5: ba3cbe93f99e896765422cc5f7c3a79e + license: GPL-1.0-or-later OR Artistic-1.0-Perl + run_exports: + weak: + - perl >=5.32.1,<5.33.0a0 *_perl5 + noarch: + - perl >=5.32.1,<6.0a0 *_perl5 + size: 14439531 + timestamp: 1703311335652 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.3.0-py312hf9dc30a_1.conda + sha256: 9e5feb8a103e24537914d07144b58915916eeedf9eac88216a121d67927b8467 + md5: 198795494b96c4a8cecd06297d0f12f9 + depends: + - python + - __osx >=11.0 + - lcms2 >=2.19.1,<3.0a0 + - libtiff >=4.7.2,<4.8.0a0 + - zlib-ng >=2.3.3,<2.4.0a0 + - libjpeg-turbo >=3.2.0,<4.0a0 + - tk >=8.6.13,<8.7.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - openjpeg >=2.5.4,<3.0a0 + - libxcb >=1.17.0,<2.0a0 + - python_abi 3.12.* *_cp312 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + license: HPND + purls: + - pkg:pypi/pillow?source=hash-mapping + run_exports: {} + size: 983667 + timestamp: 1788263942967 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h784d473_3.conda + sha256: 4779cd57231ce2e96fac643fcbdd4a6f51a57986264545445574e9c4acf526d3 + md5: 9a99c0b60efe41c194d01c182d000733 + depends: + - __osx >=11.0 + - libcxx >=19 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - pixman >=0.46.4,<1.0a0 + size: 198717 + timestamp: 1786106922508 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pkg-config-0.29.2-he0b766d_1012.conda + sha256: 4cd197654f853e64f6d6eccabd3c8be47d56493ecf7f5d299a3172d062db3b2f + md5: c9bc5e0a4298541c38e52c732d3d3aa0 + depends: + - __osx >=11.0 + - libiconv >=1.18,<2.0a0 + license: GPL-2.0-or-later + license_family: GPL + run_exports: {} + size: 273770 + timestamp: 1787956229376 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda + sha256: 851a77ae1a8e90db9b9f3c4466abea7afb52713c3d98ceb0d37ba6ff27df2eff + md5: 7172339b49c94275ba42fec3eaeda34f + depends: + - __osx >=11.0 + - libcurl >=8.10.1,<9.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - zlib + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - prometheus-cpp >=1.3.0,<1.4.0a0 + size: 173220 + timestamp: 1730769371051 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.2.2-py312hbd136b4_2.conda + sha256: 5980a362a3939cf4b7ed883d4dd079442368a6eb966d0f6a93b12ac6d4c6d579 + md5: 01ae68ef8b9600e5b1ac6a96f14ebe13 + depends: + - python + - __osx >=11.0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/psutil?source=hash-mapping + run_exports: {} + size: 236334 + timestamp: 1788190061961 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hb001647_1004.conda + sha256: 3f79452dbda3febaf7053486e4844fa945accf4d74eac4169e2c4d5dc5e4dd0b + md5: f0833c4a0b68798f50935dd83384c705 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + run_exports: {} + size: 9662 + timestamp: 1788382422327 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-25.0.0-py312h1f38498_0.conda + sha256: 6dc62ae41f925b968e8e5c9879f77dee3db89fdb94f6ba49f884f0ad2bb945e6 + md5: e936d3c2f56d36ded597eeea76aeed23 + depends: + - libarrow-acero 25.0.0.* + - libarrow-dataset 25.0.0.* + - libarrow-substrait 25.0.0.* + - libparquet 25.0.0.* + - pyarrow-core 25.0.0 *_0_* + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: APACHE + purls: [] + run_exports: {} + size: 25882 + timestamp: 1784258390841 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-25.0.0-py312h7d9569a_0_cpu.conda + sha256: 3c7ec6354bf8878f8045af7dd97a170300a9cae9ed430de3beb2ce18e8274bef + md5: 34596f53aa0ba292df864cff850e95fb + depends: + - __osx >=11.0 + - libarrow 25.0.0.* *cpu + - libarrow-compute 25.0.0.* *cpu + - libcxx >=21 + - libzlib >=1.3.2,<2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - apache-arrow-proc * cpu + - numpy >=1.23,<3 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/pyarrow?source=hash-mapping + run_exports: {} + size: 4371556 + timestamp: 1784258363255 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.14-hd05a0c4_3_cpython.conda + build_number: 3 + sha256: fee8a2dd8a6ee98d430625d4c0f705e86c1154b1eeae5e10004c3c4d7d536eba + md5: 287a1be640df74bd3e2b9d76b2a7b300 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.8.1,<3.0a0 + - libffi >=3.7.0,<3.8.0a0 + - liblzma >=5.8.3,<6.0a0 + - libpython 3.12.14 h4e5ec87_3_cpython + - libsqlite >=3.53.4,<4.0a0 + - libzlib >=1.3.2,<2.0a0 + - ncurses >=6.6,<7.0a0 + - openssl >=3.5.8,<4.0a0 + - readline >=8.3,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + purls: [] + run_exports: + weak: + - python_abi 3.12.* *_cp312 + noarch: + - python + size: 11705033 + timestamp: 1788407558326 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-librt-0.15.0-py312h7ac3c4f_1.conda + sha256: 94aa71abc82ab24c52252997062b117f63149fce14377958ece828cd79011f6a + md5: b8e9ca60f567b679f76d908dcc51628d + depends: + - python + - __osx >=11.0 + - python 3.12.* *_cpython + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/librt?source=compressed-mapping + run_exports: {} + size: 129888 + timestamp: 1788228436318 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pytorch-2.12.1-cpu_generic_py312_h7a5249f_0.conda + sha256: 538726375bf71a9f7d776eeba3964ff049fa888c79ed93d76319127e2a02559d + md5: 93c511e326295c67ccd7864983a5e87a + depends: + - __osx >=12.0 + - filelock + - fmt >=12.1.0,<12.2.0a0 + - fsspec + - jinja2 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=19 + - liblapack >=3.9.0,<4.0a0 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libtorch 2.12.1 cpu_generic_h931913c_0 + - libuv >=1.52.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - llvm-openmp >=19.1.7 + - networkx + - nomkl + - numpy >=1.23,<3 + - onednn >=3.12,<4.0a0 + - optree >=0.13.0 + - pybind11 + - pybind11-abi 11 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - setuptools <82 + - sleef >=3.9.0,<4.0a0 + - sympy >=1.13.3 + - typing_extensions >=4.10.0 + constrains: + - pytorch-gpu <0.0a0 + - pytorch-cpu 2.12.1 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/torch?source=project-defined-mapping + run_exports: + weak: + - pytorch >=2.12.1,<2.13.0a0 + - libtorch >=2.12.1,<2.13.0a0 + size: 24290214 + timestamp: 1781831799489 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pytorch-2.13.0-cpu_generic_py312_ha1580ae_2.conda + sha256: d12e7e69b9d67f848d387d3d14b036183758ac295884665770aa4f51779d9d81 + md5: 7cec7dceb9d00ac152786a4c1ad2ec56 + depends: + - __osx >=12.0 + - filelock + - fmt >=12.1.0,<12.2.0a0 + - fsspec + - jinja2 + - libabseil * cxx17* + - libabseil >=20260526.0,<20260527.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=19 + - liblapack >=3.9.0,<4.0a0 + - libprotobuf >=7.35.1,<7.35.2.0a0 + - libtorch 2.13.0 cpu_generic_hf893bd3_2 + - libuv >=1.52.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - llvm-openmp >=19.1.7 + - networkx + - nomkl + - numpy >=1.25,<3 + - onednn >=3.12,<4.0a0 + - optree >=0.13.0 + - pybind11 + - pybind11-abi 11 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - setuptools <82 + - sleef >=3.9.0,<4.0a0 + - sympy >=1.13.3 + - typing_extensions >=4.10.0 + constrains: + - pytorch-cpu 2.13.0 + - pytorch-gpu <0.0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/torch?source=project-defined-mapping + run_exports: + weak: + - pytorch >=2.13.0,<2.14.0a0 + - libtorch >=2.13.0,<2.14.0a0 + size: 25803147 + timestamp: 1786373185693 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py312h04c11ed_1.conda + sha256: 737959262d03c9c305618f2d48c7f1691fb996f14ae420bfd05932635c99f873 + md5: 95a5f0831b5e0b1075bbd80fcffc52ac + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + run_exports: {} + size: 187278 + timestamp: 1770223990452 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda + sha256: 873ac689484262a51fd79bc6103c1a1bedbf524924d7f0088fb80703042805e4 + md5: 6483b1f59526e05d7d894e466b5b6924 + depends: + - __osx >=11.0 + - libcxx >=16 + license: LicenseRef-Qhull + purls: [] + run_exports: + weak: + - qhull >=2020.2,<2020.3.0a0 + size: 516376 + timestamp: 1720814307311 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/rattler-build-0.74.0-h74d5219_1.conda + sha256: d20f2a72b7b79a37875da1805f589c702b4912e614b595585a367a82dacc6914 + md5: 9945d3ef00989fa75a80d32e7efe185d + depends: + - __osx >=11.0 + - libcxx >=21 + constrains: + - __osx >=11.0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 17983684 + timestamp: 1787728730450 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-h5d60da5_2.conda + sha256: ba1154085d70e8e8f94cfc38a018a13d1a734ff1bcc2ab384e4fc3e532b23066 + md5: a2578dc92c16ab5b6b183cfcdc8e8b79 + depends: + - libre2-11 2025.11.05 h5d15848_2 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libre2-11 >=2025.11.5 + - re2 + size: 27372 + timestamp: 1781312662146 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h8b90a29_1.conda + sha256: d6782b430e6dce4fe8c7ac118cd988d5a193eb4a7f60741edfaede58016b6110 + md5: 9347fd56a002e6b58946831d48fe62f6 + depends: + - __osx >=11.0 + - ncurses >=6.6,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + run_exports: + weak: + - readline >=8.3,<9.0a0 + size: 314395 + timestamp: 1787033878899 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/rhash-1.4.6-h84a0fba_2.conda + sha256: b4da3ab88c407b4133d39512b3b615d6fb020c89d39f54491862e6731528ab95 + md5: 5cec61f5b18ca8c5bbb1ad2dc5923a8e + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + run_exports: + weak: + - rhash >=1.4.6,<2.0a0 + size: 185483 + timestamp: 1786732022220 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/s2n-1.7.5-h1b28cb6_1.conda + sha256: 47ec36bdd05117c974853a8dbaa9d89605a5f70b592d47c7d198b20252ddf1f4 + md5: 94b3b302cd6c07c5ec68648b25c8c525 + depends: + - __osx >=11.0 + - openssl >=3.5.7,<4.0a0 + license: Apache-2.0 + license_family: Apache + purls: [] + run_exports: + weak: + - s2n >=1.7.5,<1.7.6.0a0 + size: 276705 + timestamp: 1783165153651 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/s2n-1.7.6-h1b28cb6_0.conda + sha256: d2133326625aabcd20a7908bd2783cd207adf1a042c0512b493e49599fd5315a + md5: aa98fac113d87d7501704ad35ed071f2 + depends: + - __osx >=11.0 + - openssl >=3.5.7,<4.0a0 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - s2n >=1.7.6,<1.7.7.0a0 + size: 277238 + timestamp: 1784674786218 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.18.0-py312h4519d97_0.conda + sha256: 708f27ae8ccf62cf714dc5c6f728ae733dc14315c842e935ed7f491d214df2b0 + md5: 5a352ca7e4f49ca6585dd30a4812bd20 + depends: + - __osx >=11.0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=19 + - libgfortran + - libgfortran5 >=14.3.0 + - liblapack >=3.9.0,<4.0a0 + - numpy <2.7 + - numpy >=1.23,<3 + - numpy >=2.0.0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + run_exports: {} + size: 14165071 + timestamp: 1781912652942 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_1.conda + sha256: 7efd6d7d18bf9cc5788bfe1c1e1620d9dbbe00a81c646814929a82ff31944cf3 + md5: a322c0a0d3b5be99ee11f9ccec99b60e + depends: + - __osx >=11.0 + - libsigtool 0.1.3 h98dc951_1 + - openssl >=3.5.7,<4.0a0 + license: MIT + license_family: MIT + run_exports: {} + size: 114653 + timestamp: 1786115093248 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/simple-dftd3-1.5.0-gfortran_h0230218_0.conda + sha256: 28fb2b9eee56960bb1a92c36fc293f6dcdf1d02cca5b92b3dc8c20f3e6dd0249 + md5: 90b058e13bdd4ed0b4f34c99bfe3637d + depends: + - __osx >=11.0 + - libgfortran + - libgfortran5 >=14.4.0 + - llvm-openmp >=19.1.7 + - mctc-lib >=0.5.2,<0.6.0a0 gfortran_* + - toml-f >=0.5.2,<0.6.0a0 gfortran_* + license: LGPL-3.0-or-later + license_family: LGPL + purls: [] + run_exports: + weak: + - simple-dftd3 >=1.5.0,<1.6.0a0 + size: 1070138 + timestamp: 1786373743699 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sleef-3.9.0-hb028509_0.conda + sha256: 799d0578369e67b6d0d6ecdacada411c259629fc4a500b99703c5e85d0a68686 + md5: 68f833178f171cfffdd18854c0e9b7f9 + depends: + - __osx >=11.0 + - libcxx >=19 + - llvm-openmp >=19.1.7 + license: BSL-1.0 + purls: [] + run_exports: + weak: + - sleef >=3.9.0,<4.0a0 + size: 587027 + timestamp: 1756274982526 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.2-hada39a4_1.conda + sha256: cb9305ede19584115f43baecdf09a3866bfcd5bcca0d9e527bd76d9a1dbe2d8d + md5: fca4a2222994acd7f691e57f94b750c5 + depends: + - libcxx >=19 + - __osx >=11.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - snappy >=1.2.2,<1.3.0a0 + size: 38883 + timestamp: 1762948066818 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-hb561403_3.conda + sha256: 9f1cc109e6e57861110e9de6e03beca7fd2b7fbdb46124cccc07990b0844d88a + md5: 0676b8719dd1e9bb1003e59a481c6c3e + depends: + - libcxx >=19.0.0.a0 + - __osx >=11.0 + - ncurses >=6.6,<7.0a0 + license: NCSA + run_exports: {} + size: 200397 + timestamp: 1785906507697 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-hbeba79b_4.conda + sha256: 857d89087ae7f2c328cf256728affcb7343031a148b4af847334d248a9cf564c + md5: 90a01bf394d1c594e0eb9258f967d828 + depends: + - __osx >=11.0 + - libzlib >=1.3.2,<2.0a0 + license: TCL + purls: [] + run_exports: + weak: + - tk >=8.6.13,<8.7.0a0 + size: 3342183 + timestamp: 1787272852357 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/toml-f-0.5.2-gfortran_h04795c8_0.conda + sha256: 6bf87f425e8aa8e2e429483576ebe4b9355555af4595835f0dd2e8ea7350ea6d + md5: b3ae81fad58ce6929d8d4762d6ed5d04 + depends: + - __osx >=11.0 + - libgfortran + - libgfortran5 >=14.3.0 + license: Apache-2.0 OR MIT + purls: [] + run_exports: + weak: + - toml-f >=0.5.2,<0.6.0a0 + size: 450876 + timestamp: 1782552470226 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.1.0-py312h766f71e_0.conda + sha256: 4d047b1d6e0f4bdd8c43e1b772665de9a10c0649a7f158df8193a3a6e7df714f + md5: e80504aa921f5ab11456f27bd9ef5d25 + depends: + - __osx >=11.0 + - cffi + - libcxx >=19 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/ukkonen?source=hash-mapping + run_exports: {} + size: 14733 + timestamp: 1769439379176 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-17.0.1-py312h2bbb03f_0.conda + sha256: e935d0c11581e31e89ce4899a28b16f924d1a3c1af89f18f8a2c5f5728b3107f + md5: 45b836f333fd3e282c16fff7dc82994e + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/unicodedata2?source=hash-mapping + run_exports: {} + size: 415828 + timestamp: 1770909782683 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h84a0fba_2.conda + sha256: 5c5ea38ceec008e4ff40111fc166b04086fca310b0aa9e5bd46f65e6b0dcb71d + md5: 31d71ce1b056f69b6ec67ee0712bdf97 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - xorg-libxau >=1.0.12,<2.0a0 + size: 15124 + timestamp: 1786381585975 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-h84a0fba_2.conda + sha256: 2f6915f0897ace4a1b5d66d0463079f7bc9819b0048c03677e47764f0a743499 + md5: f51e9414bf1b7bb556aac1a0b74a75fe + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - xorg-libxdmcp >=1.1.5,<2.0a0 + size: 19486 + timestamp: 1786381546642 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h74c22ad_3.conda + sha256: 3e78c43207502418fc5fb2317bbbefe5df8b6fc1051d90bdcd1c881c76bb4193 + md5: 31cf6dcc138abe673c9440cd6fe6c6fe + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - yaml >=0.2.5,<0.3.0a0 + size: 77530 + timestamp: 1787228556857 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.2-h8088a28_3.conda + sha256: ab46d85e4fcffff1b1c5cac517afa40b7ae784cf76fc9da1f55f6a6934291eb6 + md5: 2c966485853aa27985fbec7e3fcc4e77 + depends: + - __osx >=11.0 + - libzlib 1.3.2 h8088a28_3 + license: Zlib + license_family: Other + purls: [] + run_exports: + weak: + - libzlib >=1.3.2,<2.0a0 + size: 81744 + timestamp: 1785277062753 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.3-h31dac16_1.conda + sha256: 489a29915a3e1b425cff4df10a448f55bbaaf29d777a0f8a9e381444e6a284f1 + md5: 4621ded2fd5b36f51454d5f81bff4ec1 + depends: + - __osx >=11.0 + - libcxx >=21 + license: Zlib + license_family: Other + purls: [] + run_exports: + weak: + - zlib-ng >=2.3.3,<2.4.0a0 + size: 95857 + timestamp: 1786737243497 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hf451053_7.conda + sha256: da867f5092eb0cb746d353694f0098031fd9817a4ce7d5743121209ae0f406ca + md5: 4ec2684c73812cc2c3d78379384a39cc + depends: + - __osx >=11.0 + - libzlib >=1.3.2,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - zstd >=1.5.7,<1.6.0a0 + size: 433687 + timestamp: 1786599629846 +- pypi: ./benchmark + name: skala-benchmark + requires_dist: + - jinja2 + - markdown-it-py + - markupsafe + - numpy + - pandas + - pyarrow + - pyscf>=2.14,<2.15 + - pyyaml + - scipy + - skala>=2026.9,<2027 + - torch>=2.12,<2.14 + requires_python: '>=3.11,<3.14' +- pypi: ./model + name: skala-model + requires_dist: + - e3nn + - opt-einsum-fx + - skala>=2026.9,<2027 + - torch>=2.12,<2.14 + requires_python: '>=3.11,<3.14' +- pypi: ./skala + name: skala + requires_dist: + - ase + - huggingface-hub + - numpy + - pyscf>=2.14,<2.15 + - pyscf-dispersion>=1.5 ; sys_platform == 'linux' + - dftd3>=1.5,<2 ; sys_platform == 'darwin' + - torch>=2.12,<2.14 + requires_python: '>=3.11,<3.14' +- pypi: https://files.pythonhosted.org/packages/08/52/eefeba09be4ef2a1eb989eb92934561e8e502a6ee3c32654996e4be7e399/types_pyyaml-6.0.12.20260815-py3-none-any.whl + name: types-pyyaml + version: 6.0.12.20260815 + sha256: 6f332212b7e191f3afd5016a713c510b6340593b7ebec573c7d5d20aa5386d3b + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/0a/9b/9053d2a5a6276352b883d57192ce0bed68b1bc2415b35824ea6942c2c999/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + name: pyscf-dispersion + version: 1.5.0 + sha256: 0b246142cadc752c54700564e15dadb22c006be51ac946601c59ddca21235067 + requires_dist: + - pyscf +- pypi: https://files.pythonhosted.org/packages/2f/d4/c6a2b043e33f0dd012486dcebe0593585588d400175d22aad42049c88321/optype-0.17.1-py3-none-any.whl + name: optype + version: 0.17.1 + sha256: 82f2508ca31cb21e53a41648482d890fe1f5c6cb153720551af41161555adaf1 + requires_dist: + - typing-extensions>=4.10 ; python_full_version < '3.13' + - numpy>=1.26,<2.7 ; extra == 'numpy' + - numpy-typing-compat>=20250818.1.25,<20251207 ; extra == 'numpy' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/40/2f/10a2e9ad81bd5c2479a255d18c4f02c734a3a21bf4b36a236ba615919592/pyscf_dispersion-1.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + name: pyscf-dispersion + version: 1.5.0 + sha256: c65aa46f24005794bf8198205a0d83f3431a23333868fbafff43bd82efc2294d + requires_dist: + - pyscf +- pypi: https://files.pythonhosted.org/packages/48/ed/bb4aeb728505b4ce7edd55e9b2e35bcbd99ad0b0cae5c45b59e48b9ed62d/pyscf-2.14.0-py3-none-macosx_11_0_arm64.whl + name: pyscf + version: 2.14.0 + sha256: a4bdc6f4155e258d78c90b4de0c88ab9260a45801264d6c471c3beec83a4da4c + requires_dist: + - numpy>=1.13,!=1.16,!=1.17 + - scipy>=1.6.0 + - h5py>=2.7 + - setuptools + - psutil ; sys_platform == 'win32' + - pyscf-forge ; extra == 'forge' + - pyberny>=0.6.2 ; extra == 'geomopt' + - geometric>=0.9.7.2 ; extra == 'geomopt' + - pyscf-qsdopt ; extra == 'geomopt' + - pyscf-doci ; extra == 'doci' + - pyscf-properties ; extra == 'properties' + - pyscf-semiempirical ; extra == 'semiempirical' + - cppe ; extra == 'cppe' + - pyqmc ; extra == 'pyqmc' + - basis-set-exchange ; extra == 'bse' + - pyscf-dispersion ; extra == 'dispersion' + - coupled-cluster-py ; extra == 'ccpy' + - pyscf[bse,ccpy,cppe,dispersion,doci,forge,geomopt,properties,pyqmc,semiempirical] ; extra == 'all' + - pyscf-cornell-shci ; extra == 'cornell-shci' + - pyscf-nao ; extra == 'nao' + - pyscf-fciqmc ; extra == 'fciqmcscf' + - pyscf-tblis ; extra == 'tblis' + - pyscf-icmpspt ; extra == 'icmpspt' + - pyscf-shciscf ; extra == 'shciscf' + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/4d/57/f53eb30c38aa4eeabddc3bddf283f4c10616de65d95fcd1f43900721f425/geometric-1.1.1.tar.gz + name: geometric + version: 1.1.1 + sha256: c712c4102bb9db4afab4c7a482289a13d04989735cc1430c89ebb73d587d1d8b + requires_dist: + - numpy>=1.11 + - networkx + - six + - scipy +- pypi: https://files.pythonhosted.org/packages/52/a0/c1f604538ff6db22a0690be2dc44ab59178e115f63c917794e529356ab23/h5py-3.16.0-cp311-cp311-manylinux_2_28_x86_64.whl + name: h5py + version: 3.16.0 + sha256: fb1720028d99040792bb2fb31facb8da44a6f29df7697e0b84f0d79aff2e9bd3 + requires_dist: + - numpy>=1.21.2 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/5a/3e/d7ead2933f8434f264ac8e092c7f3793f982450e4ffa6a6c82fc60014508/gpu4pyscf_cuda13x-1.8.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + name: gpu4pyscf-cuda13x + version: 1.8.1 + sha256: 7b0f675e8595e256f9f39289cda244065979503b741cfafa5c752a655ad695e2 + requires_dist: + - pyscf>=2.8.0 + - pyscf-dispersion + - cupy-cuda13x>=13.0,!=13.4.0 + - geometric + - gpu4pyscf-libxc-cuda13x==0.8.1 + - packaging +- pypi: https://files.pythonhosted.org/packages/60/c2/959caec5c46f484b5f8bb6def4b0cf7a45ba6acda26f12b75142d98cc5ae/pandas_stubs-3.0.5.260730-py3-none-any.whl + name: pandas-stubs + version: 3.0.5.260730 + sha256: 60e90e3e1eda6937e337e243cbe6217e151c11137cd7eddf832af537c7310bfd + requires_dist: + - numpy>=1.23.5 + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/63/7c/5c2892e6bc0628a2ccf4e938e1e2db22794657ccb374672d66e20d73839e/numpy_typing_compat-20251206.2.4-py3-none-any.whl + name: numpy-typing-compat + version: 20251206.2.4 + sha256: a82e723bd20efaa4cf2886709d4264c144f1f2b609bda83d1545113b7e47a5b5 + requires_dist: + - numpy>=2.4rc1,<2.5 + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/63/b5/ff337f8db80e67c464846a7d10f7f6bc1039c40a2c8b57ecb90d6b0c11d9/gpu4pyscf_libxc_cuda12x-0.8.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + name: gpu4pyscf-libxc-cuda12x + version: 0.8.1 + sha256: c788f2ca50ef036076754e6167169c957834885430bfc2e23e3b8111942c686a +- pypi: https://files.pythonhosted.org/packages/65/6c/eea1d03e475217aea95b1d52aee09c97575d05bbc592c39c085b71dab89f/pyarrow_stubs-20.0.0.20260819-py3-none-any.whl + name: pyarrow-stubs + version: 20.0.0.20260819 + sha256: 297e60b6e5314739c082b4757d090d8be6047465510eb0684ca954ef7ea58be3 + requires_dist: + - pyarrow>=20 + requires_python: '>=3.9,<4' +- pypi: https://files.pythonhosted.org/packages/7c/5b/65124de2dbaf2e85109f611a41947e39acd6dd938751c04b4c4d7bf6fc82/cupy_cuda12x-14.2.0-cp312-cp312-manylinux2014_x86_64.whl + name: cupy-cuda12x + version: 14.2.0 + sha256: f82141761f2c81905d49387464ae29438887956d99063381c93a1d5d1b7d32e8 + requires_dist: + - numpy>=2.0,<2.6 + - cuda-pathfinder==1.*,>=1.3.4 + - scipy>=1.14,<1.18 ; extra == 'all' + - cython>=3,!=3.2.6 ; extra == 'all' + - optuna>=2.0 ; extra == 'all' + - packaging ; extra == 'test' + - pytest>=7.2 ; extra == 'test' + - hypothesis>=6.37.2,<6.55.0 ; extra == 'test' + - mpmath ; extra == 'test' + - cuda-toolkit[cublas,cudart,cufft,curand,cusolver,cusparse,nvrtc]==12.* ; extra == 'ctk' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/7e/bf/c4c25e97552320451afdcd459d4b6e0b715459594e998b23051c06db64c3/cupy_cuda13x-14.2.0-cp312-cp312-manylinux2014_x86_64.whl + name: cupy-cuda13x + version: 14.2.0 + sha256: 9aafadbe29db3d4285026044aafeb28f2a3de4bd0df70718ec6892b7d27a4ded + requires_dist: + - numpy>=2.0,<2.6 + - cuda-pathfinder==1.*,>=1.3.4 + - scipy>=1.14,<1.18 ; extra == 'all' + - cython>=3,!=3.2.6 ; extra == 'all' + - optuna>=2.0 ; extra == 'all' + - packaging ; extra == 'test' + - pytest>=7.2 ; extra == 'test' + - hypothesis>=6.37.2,<6.55.0 ; extra == 'test' + - mpmath ; extra == 'test' + - cuda-toolkit[cublas,cudart,cufft,curand,cusolver,cusparse,nvrtc]==13.* ; extra == 'ctk' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/81/1d/4fcbbf1ad89454d67ef227af32fe07a86a2bdc746c4cf245e105e227e64a/gpu4pyscf_libxc_cuda13x-0.8.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + name: gpu4pyscf-libxc-cuda13x + version: 0.8.1 + sha256: 4d95110689dbcd9cf371e6f2fc812d4a520d8ebda1cf8665ca97d805853d26d6 +- pypi: https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + name: pyscf + version: 2.14.0 + sha256: 37b0bccc55450311a55318cd643e851353331ddeab4fc0c0065e83c905e41502 + requires_dist: + - numpy>=1.13,!=1.16,!=1.17 + - scipy>=1.6.0 + - h5py>=2.7 + - setuptools + - psutil ; sys_platform == 'win32' + - pyscf-forge ; extra == 'forge' + - pyberny>=0.6.2 ; extra == 'geomopt' + - geometric>=0.9.7.2 ; extra == 'geomopt' + - pyscf-qsdopt ; extra == 'geomopt' + - pyscf-doci ; extra == 'doci' + - pyscf-properties ; extra == 'properties' + - pyscf-semiempirical ; extra == 'semiempirical' + - cppe ; extra == 'cppe' + - pyqmc ; extra == 'pyqmc' + - basis-set-exchange ; extra == 'bse' + - pyscf-dispersion ; extra == 'dispersion' + - coupled-cluster-py ; extra == 'ccpy' + - pyscf[bse,ccpy,cppe,dispersion,doci,forge,geomopt,properties,pyqmc,semiempirical] ; extra == 'all' + - pyscf-cornell-shci ; extra == 'cornell-shci' + - pyscf-nao ; extra == 'nao' + - pyscf-fciqmc ; extra == 'fciqmcscf' + - pyscf-tblis ; extra == 'tblis' + - pyscf-icmpspt ; extra == 'icmpspt' + - pyscf-shciscf ; extra == 'shciscf' + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/89/84/06281c82d4d1686fde1ac6b0f307c50918f1c0151062445ab3b6fa5a921d/h5py-3.16.0-cp312-cp312-manylinux_2_28_aarch64.whl + name: h5py + version: 3.16.0 + sha256: ff24039e2573297787c3063df64b60aab0591980ac898329a08b0320e0cf2527 + requires_dist: + - numpy>=1.21.2 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/89/f2/24c58dad0c33ab417c5a090695a6788292d5d4edceae59bad055e5377e92/pyscf-2.14.0-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl + name: pyscf + version: 2.14.0 + sha256: 2c01234a5480e545e5e156d1fabe9b97264bf87ee274c62d14478ab9fe644100 + requires_dist: + - numpy>=1.13,!=1.16,!=1.17 + - scipy>=1.6.0 + - h5py>=2.7 + - setuptools + - psutil ; sys_platform == 'win32' + - pyscf-forge ; extra == 'forge' + - pyberny>=0.6.2 ; extra == 'geomopt' + - geometric>=0.9.7.2 ; extra == 'geomopt' + - pyscf-qsdopt ; extra == 'geomopt' + - pyscf-doci ; extra == 'doci' + - pyscf-properties ; extra == 'properties' + - pyscf-semiempirical ; extra == 'semiempirical' + - cppe ; extra == 'cppe' + - pyqmc ; extra == 'pyqmc' + - basis-set-exchange ; extra == 'bse' + - pyscf-dispersion ; extra == 'dispersion' + - coupled-cluster-py ; extra == 'ccpy' + - pyscf[bse,ccpy,cppe,dispersion,doci,forge,geomopt,properties,pyqmc,semiempirical] ; extra == 'all' + - pyscf-cornell-shci ; extra == 'cornell-shci' + - pyscf-nao ; extra == 'nao' + - pyscf-fciqmc ; extra == 'fciqmcscf' + - pyscf-tblis ; extra == 'tblis' + - pyscf-icmpspt ; extra == 'icmpspt' + - pyscf-shciscf ; extra == 'shciscf' + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/99/a7/6ed6f987f79d6442e553841ddd45439aa90a3992d8e009ccd47e46901814/gpu4pyscf_cuda12x-1.8.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + name: gpu4pyscf-cuda12x + version: 1.8.1 + sha256: 42dd9c619ff587dd393232d39c8894950956bace29d83765ce630bf7ad5d686c + requires_dist: + - pyscf>=2.8.0 + - pyscf-dispersion + - cupy-cuda12x>=13.0,!=13.4.0 + - geometric + - gpu4pyscf-libxc-cuda12x==0.8.1 + - packaging +- pypi: https://files.pythonhosted.org/packages/9d/e6/22df83f82f9bc26cb1c42265cf14d34d4908dba2a0f261bd7b28244acb00/cuda_pathfinder-1.8.1-py3-none-any.whl + name: cuda-pathfinder + version: 1.8.1 + sha256: ae0137ff9e56ea97499bcbf54f5f2778ec25f3266715ac86da192a795af982a8 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/9e/e9/1a19e42cd43cc1365e127db6aae85e1c671da1d9a5d746f4d34a50edb577/h5py-3.16.0-cp312-cp312-manylinux_2_28_x86_64.whl + name: h5py + version: 3.16.0 + sha256: dfc21898ff025f1e8e67e194965a95a8d4754f452f83454538f98f8a3fcb207e + requires_dist: + - numpy>=1.21.2 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/b0/42/c84efcc1d4caebafb1ecd8be4643f39c85c47a80fe254d92b8b43b1eadaf/h5py-3.16.0-cp312-cp312-macosx_11_0_arm64.whl + name: h5py + version: 3.16.0 + sha256: 42b012933a83e1a558c673176676a10ce2fd3759976a0fedee1e672d1e04fc9d + requires_dist: + - numpy>=1.21.2 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/bd/98/ef2b6fe2903e377cbe870c3b2800d62552f1e3dbe81ce49e1923c53d1c5c/h5py-3.16.0-cp313-cp313-manylinux_2_28_x86_64.whl + name: h5py + version: 3.16.0 + sha256: 9300ad32dea9dfc5171f94d5f6948e159ed93e4701280b0f508773b3f582f402 + requires_dist: + - numpy>=1.21.2 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/e1/26/d4bc2ba3427a623f79a6c10c8f427c7a55b56eb8b3eddc369319d97f741b/scipy_stubs-1.17.1.5-py3-none-any.whl + name: scipy-stubs + version: 1.17.1.5 + sha256: 58ebf054a86c000c72e8982e121c4ead0d3d9ba7a6c38aa5fa71b07f96a427fd + requires_dist: + - optype[numpy]>=0.14.0,<0.18 + - scipy>=1.17.1,<1.18 ; extra == 'scipy' + requires_python: '>=3.11' diff --git a/pixi.toml b/pixi.toml index 79c56f00..6ea7e8df 100644 --- a/pixi.toml +++ b/pixi.toml @@ -176,7 +176,7 @@ fortran-compiler = "*" FC = "$CONDA_PREFIX/bin/gfortran" [feature.skalaxc-core.dependencies] -catch2 = "2.*" +catch2 = "3.*" eigen = ">=5,<6" git = "*" hdf5 = "*" From a413451c128b6a862a031f8dda345764c7bf54af Mon Sep 17 00:00:00 2001 From: jenswehner Date: Fri, 4 Sep 2026 15:29:49 +0200 Subject: [PATCH 18/33] Strengthen SkalaXC behavioral contracts --- SkalaXC/README.md | 5 +- SkalaXC/include/skalaxc/skalaxc.hpp | 62 +++++------------ SkalaXC/python/src/bindings/module.cxx | 12 +--- .../src/bindings/stubgen-common.patterns | 1 - SkalaXC/python/src/skalaxc/__init__.py | 2 - SkalaXC/python/tests/test_integration.py | 5 -- SkalaXC/tests/skala_openmp_test.cxx | 69 +++++++++++-------- SkalaXC/tests/skalaxc_public_api_test.cxx | 18 +---- 8 files changed, 66 insertions(+), 108 deletions(-) diff --git a/SkalaXC/README.md b/SkalaXC/README.md index a39dfe34..463972bc 100644 --- a/SkalaXC/README.md +++ b/SkalaXC/README.md @@ -116,7 +116,10 @@ The public boundary exposes **zero** GauXC / LibTorch symbols or types: `std::vector` with `3 * natoms` atom-major `xyz` values. Overloads also write potentials into pre-sized `nbf × nbf` matrices and gradients into a pre-sized `std::vector` under the same column-major and atom-major - contracts. `SkalaSettings` selects the model when the integrator is + contracts. Matrix types must expose contiguous `double` storage through + `data()` in column-major order; row-major and strided matrix types are not + supported. Nuclear gradients always include molecular-weight derivatives. + `SkalaSettings` selects the model when the integrator is constructed. The integrator loads and owns that TorchScript module for its lifetime, so subsequent evaluations neither reload it nor use a process-wide model cache. diff --git a/SkalaXC/include/skalaxc/skalaxc.hpp b/SkalaXC/include/skalaxc/skalaxc.hpp index 7d2042f9..c6262b36 100644 --- a/SkalaXC/include/skalaxc/skalaxc.hpp +++ b/SkalaXC/include/skalaxc/skalaxc.hpp @@ -460,21 +460,6 @@ struct DiagnosticsSnapshot { } }; -/** @brief Base XC integrator settings (mirrors GauXC::IntegratorSettingsXC). */ -struct IntegratorSettingsXC { - virtual ~IntegratorSettingsXC() = default; -}; - -/** - * @brief XC-gradient settings (mirrors GauXC::IntegratorSettingsEXC_GRAD). - * - * SkalaXC supports only @c include_weight_derivatives == true (the GauXC - * default); requesting @c false throws from XCIntegrator::eval_exc_grad. - */ -struct IntegratorSettingsEXC_GRAD : public IntegratorSettingsXC { - bool include_weight_derivatives = true; ///< Include molecular-weight terms. -}; - /** * @brief Skala ML functional selector. * @@ -751,6 +736,10 @@ class SKALAXC_EXPORT MolecularWeightsFactory { * to/from the non-template evaluation core (detail::IntegratorCore). Only the * host UKS methods SkalaXC supports are exposed. * + * @pre MatrixType stores contiguous @c double values in column-major order and + * exposes @c rows(), @c cols(), and @c data(). Row-major and strided matrix + * types are unsupported. + * * @warning An integrator instance is not safe for concurrent calls, moves, or * destruction. Serialize access to a shared instance or use one integrator per * calling thread. Distinct instances may execute concurrently. @@ -796,17 +785,14 @@ class XCIntegrator { * @brief Evaluate the UKS ML XC energy and potential (scalar, z). * @param Ps Scalar density matrix in column-major storage. * @param Pz Spin-density matrix in column-major storage. - * @param settings XC evaluation settings. * @return XC energy, scalar potential matrix, and spin potential matrix. */ - exc_vxc_type_uks eval_exc_vxc( - const MatrixType& Ps, const MatrixType& Pz, - const IntegratorSettingsXC& settings = IntegratorSettingsXC{}) { + exc_vxc_type_uks eval_exc_vxc(const MatrixType& Ps, const MatrixType& Pz) { require_core(); const std::int64_t n = core_->nbf(); MatrixType VXCs(n, n); MatrixType VXCz(n, n); - const value_type EXC = eval_exc_vxc(Ps, Pz, VXCs, VXCz, settings); + const value_type EXC = eval_exc_vxc(Ps, Pz, VXCs, VXCz); return std::make_tuple(EXC, std::move(VXCs), std::move(VXCz)); } @@ -816,16 +802,12 @@ class XCIntegrator { * @param Pz Spin-density matrix in column-major storage. * @param VXCs Pre-sized `nbf` by `nbf` scalar potential output. * @param VXCz Pre-sized `nbf` by `nbf` spin potential output. - * @param settings XC evaluation settings. * @return XC energy. * @throws Exception If the integrator is uninitialized or a matrix extent is * invalid. Extents are validated before either output is modified. */ - value_type eval_exc_vxc( - const MatrixType& Ps, const MatrixType& Pz, MatrixType& VXCs, - MatrixType& VXCz, - const IntegratorSettingsXC& settings = IntegratorSettingsXC{}) { - (void)settings; + value_type eval_exc_vxc(const MatrixType& Ps, const MatrixType& Pz, + MatrixType& VXCs, MatrixType& VXCz) { require_core(); const std::int64_t n = core_->nbf(); check_square(Ps, n, "density"); @@ -839,15 +821,13 @@ class XCIntegrator { * @brief Evaluate the UKS ML XC nuclear gradient (atom-major xyz). * @param Ps Scalar density matrix in column-major storage. * @param Pz Spin-density matrix in column-major storage. - * @param settings XC-gradient evaluation settings. - * @return XC nuclear gradient with exactly three values per atom. + * @return XC nuclear gradient with exactly three values per atom, including + * molecular-weight derivatives. */ - exc_grad_type eval_exc_grad( - const MatrixType& Ps, const MatrixType& Pz, - const IntegratorSettingsXC& settings = IntegratorSettingsXC{}) { + exc_grad_type eval_exc_grad(const MatrixType& Ps, const MatrixType& Pz) { require_core(); exc_grad_type gradient(static_cast(3 * core_->natoms())); - eval_exc_grad(Ps, Pz, gradient, settings); + eval_exc_grad(Ps, Pz, gradient); return gradient; } @@ -856,23 +836,13 @@ class XCIntegrator { * @param Ps Scalar density matrix in column-major storage. * @param Pz Spin-density matrix in column-major storage. * @param gradient Pre-sized `3 * natoms` atom-major xyz output. - * @param settings XC-gradient evaluation settings. * @throws Exception If the integrator is uninitialized, an input matrix - * extent is invalid, the gradient extent is invalid, or unsupported settings - * are requested. Inputs and output extent are validated before the output is - * modified. + * extent is invalid, or the gradient extent is invalid. Inputs and output + * extent are validated before the output is modified. */ - void eval_exc_grad( - const MatrixType& Ps, const MatrixType& Pz, exc_grad_type& gradient, - const IntegratorSettingsXC& settings = IntegratorSettingsXC{}) { + void eval_exc_grad(const MatrixType& Ps, const MatrixType& Pz, + exc_grad_type& gradient) { require_core(); - if (const auto* g = - dynamic_cast(&settings)) { - if (!g->include_weight_derivatives) - throw Exception( - "SkalaXC eval_exc_grad supports include_weight_derivatives=true " - "only"); - } const std::int64_t n = core_->nbf(); check_square(Ps, n, "density"); check_square(Pz, n, "density"); diff --git a/SkalaXC/python/src/bindings/module.cxx b/SkalaXC/python/src/bindings/module.cxx index 2ffa3404..07abf769 100644 --- a/SkalaXC/python/src/bindings/module.cxx +++ b/SkalaXC/python/src/bindings/module.cxx @@ -293,10 +293,6 @@ NB_MODULE(_skalaxc, module) { .def(nb::init<>()) .def_rw("weight_algorithm", &SkalaXC::MolecularWeightsSettings::weight_alg); - nb::class_(module, "GradientSettings") - .def(nb::init<>()) - .def_rw("include_weight_derivatives", - &SkalaXC::IntegratorSettingsEXC_GRAD::include_weight_derivatives); nb::class_(module, "TimingValue") .def_ro("last_nanoseconds", &SkalaXC::TimingValue::last_nanoseconds) @@ -572,22 +568,18 @@ NB_MODULE(_skalaxc, module) { .def( "eval_exc_grad", [](PythonIntegrator& integrator, const InputMatrix& scalar_density, - const InputMatrix& spin_density, - const SkalaXC::IntegratorSettingsEXC_GRAD* settings) { + const InputMatrix& spin_density) { Matrix scalar = matrix_view(scalar_density, integrator.nbf); Matrix spin = matrix_view(spin_density, integrator.nbf); - const SkalaXC::IntegratorSettingsEXC_GRAD default_settings{}; auto result = [&] { nb::gil_scoped_release release; - return integrator.value.eval_exc_grad( - scalar, spin, settings ? *settings : default_settings); + return integrator.value.eval_exc_grad(scalar, spin); }(); return move_gradient_to_numpy(std::move(result), integrator.natoms); }, "scalar_density"_a, "spin_density"_a, - "settings"_a.none() = nb::none(), "Evaluate the UKS XC nuclear gradient. Releases the Python GIL; " "do not call concurrently on the same instance.") .def("diagnostics", diff --git a/SkalaXC/python/src/bindings/stubgen-common.patterns b/SkalaXC/python/src/bindings/stubgen-common.patterns index 9b35f945..583551e6 100644 --- a/SkalaXC/python/src/bindings/stubgen-common.patterns +++ b/SkalaXC/python/src/bindings/stubgen-common.patterns @@ -16,5 +16,4 @@ _skalaxc.XCIntegrator.eval_exc_grad: self, scalar_density: np.ndarray[tuple[int, int], np.dtype[np.float64]], spin_density: np.ndarray[tuple[int, int], np.dtype[np.float64]], - settings: GradientSettings = ..., ) -> np.ndarray[tuple[int, int], np.dtype[np.float64]]: ... \ No newline at end of file diff --git a/SkalaXC/python/src/skalaxc/__init__.py b/SkalaXC/python/src/skalaxc/__init__.py index a0ab882e..9fc8927b 100644 --- a/SkalaXC/python/src/skalaxc/__init__.py +++ b/SkalaXC/python/src/skalaxc/__init__.py @@ -78,7 +78,6 @@ def _cuda_versions_compatible(build_version: str, runtime_version: str) -> bool: DomainBatchMode, ExecutionSpace, Functional, - GradientSettings, LoadBalancer, LoadBalancerFactory, MolecularWeights, @@ -125,7 +124,6 @@ def _cuda_versions_compatible(build_version: str, runtime_version: str) -> bool: "DomainBatchMode", "ExecutionSpace", "Functional", - "GradientSettings", "LoadBalancer", "LoadBalancerFactory", "MolGrid", diff --git a/SkalaXC/python/tests/test_integration.py b/SkalaXC/python/tests/test_integration.py index 32007ec5..5c17e301 100644 --- a/SkalaXC/python/tests/test_integration.py +++ b/SkalaXC/python/tests/test_integration.py @@ -214,8 +214,3 @@ def test_gradient_is_atom_major_and_tracks_diagnostics() -> None: diagnostics.timing(skalaxc.TimingMetric.TOTAL_EXC_GRADIENT).status == skalaxc.TimingStatus.COMPLETE ) - - settings = skalaxc.GradientSettings() - settings.include_weight_derivatives = False - with pytest.raises(skalaxc.SkalaXCError, match="weight_derivatives"): - integrator.eval_exc_grad(scalar_density, spin_density, settings) diff --git a/SkalaXC/tests/skala_openmp_test.cxx b/SkalaXC/tests/skala_openmp_test.cxx index 5406cc1d..dc76beb5 100644 --- a/SkalaXC/tests/skala_openmp_test.cxx +++ b/SkalaXC/tests/skala_openmp_test.cxx @@ -11,6 +11,7 @@ #include #include #include +#include #include #ifdef SKALAXC_HAS_OPENMP @@ -38,17 +39,18 @@ class OpenMPSettingsGuard { int max_threads_; }; -} // namespace -#endif +using Matrix = Eigen::MatrixXd; -TEST_CASE("OpenMP thread counts preserve host EXC, VXC, and gradients", - "[skala][openmp]") { -#ifdef SKALAXC_HAS_OPENMP - using Matrix = Eigen::MatrixXd; - const std::string fixture = - std::string(SKALAXC_GAUXC_REF_DATA_PATH) + "/h2o2_def2-tzvp.hdf5"; - const auto system = SkalaXC::test::load_molecular_system(fixture); - const auto density = SkalaXC::test::load_uks_density(fixture, "/DENSITY", ""); +struct HostEvaluation { + std::tuple exc_vxc; + std::vector gradient; + SkalaXC::DiagnosticsSnapshot diagnostics; +}; + +HostEvaluation evaluate(const SkalaXC::test::MolecularSystem& system, + const SkalaXC::test::UksDensity& density, + int thread_count) { + omp_set_num_threads(thread_count); auto grid = SkalaXC::test::make_molgrid( system.molecule, SkalaXC::AtomicGridSizeDefault::FineGrid); SkalaXC::RuntimeEnvironment runtime{SKALAXC_MPI_CODE(MPI_COMM_WORLD)}; @@ -65,34 +67,45 @@ TEST_CASE("OpenMP thread counts preserve host EXC, VXC, and gradients", auto integrator = integrator_factory.get_instance( SkalaXC::functional_type("TPSS"), load_balancer); + auto exc_vxc = integrator.eval_exc_vxc(density.scalar, density.spin); + auto gradient = integrator.eval_exc_grad(density.scalar, density.spin); + return {std::move(exc_vxc), std::move(gradient), integrator.diagnostics()}; +} + +} // namespace +#endif + +TEST_CASE("OpenMP thread counts preserve host EXC, VXC, and gradients", + "[skala][openmp]") { +#ifdef SKALAXC_HAS_OPENMP OpenMPSettingsGuard restore_openmp_settings; - omp_set_num_threads(1); - const auto single_thread = - integrator.eval_exc_vxc(density.scalar, density.spin); - const auto single_thread_gradient = - integrator.eval_exc_grad(density.scalar, density.spin); - omp_set_num_threads(2); - const auto two_threads = - integrator.eval_exc_vxc(density.scalar, density.spin); - const auto two_thread_gradient = - integrator.eval_exc_grad(density.scalar, density.spin); + const std::string fixture = + std::string(SKALAXC_GAUXC_REF_DATA_PATH) + "/h2o2_def2-tzvp.hdf5"; + const auto system = SkalaXC::test::load_molecular_system(fixture); + const auto density = SkalaXC::test::load_uks_density(fixture, "/DENSITY", ""); + const auto single_thread = evaluate(system, density, 1); + const auto two_threads = evaluate(system, density, 2); + + REQUIRE(single_thread.diagnostics.openmp_threads == 1); + REQUIRE(two_threads.diagnostics.openmp_threads == 2); const double exc_error = - std::abs(std::get<0>(single_thread) - std::get<0>(two_threads)) / - std::max(1.0, std::abs(std::get<0>(single_thread))); + std::abs(std::get<0>(single_thread.exc_vxc) - + std::get<0>(two_threads.exc_vxc)) / + std::max(1.0, std::abs(std::get<0>(single_thread.exc_vxc))); const double scalar_error = SkalaXC::test::matrix_error_per_basis( - std::get<1>(single_thread), std::get<1>(two_threads)); + std::get<1>(single_thread.exc_vxc), std::get<1>(two_threads.exc_vxc)); const double spin_error = SkalaXC::test::matrix_error_per_basis( - std::get<2>(single_thread), std::get<2>(two_threads)); - REQUIRE(single_thread_gradient.size() == two_thread_gradient.size()); + std::get<2>(single_thread.exc_vxc), std::get<2>(two_threads.exc_vxc)); + REQUIRE(single_thread.gradient.size() == two_threads.gradient.size()); double gradient_error = 0.0; - for (std::size_t i = 0; i < single_thread_gradient.size(); ++i) { + for (std::size_t i = 0; i < single_thread.gradient.size(); ++i) { const double difference = - single_thread_gradient[i] - two_thread_gradient[i]; + single_thread.gradient[i] - two_threads.gradient[i]; gradient_error += difference * difference; } gradient_error = std::sqrt(gradient_error) / - static_cast(single_thread_gradient.size()); + static_cast(single_thread.gradient.size()); CHECK(exc_error <= 1e-12); CHECK(scalar_error <= 1e-12); CHECK(spin_error <= 1e-12); diff --git a/SkalaXC/tests/skalaxc_public_api_test.cxx b/SkalaXC/tests/skalaxc_public_api_test.cxx index f91e365e..f0b49817 100644 --- a/SkalaXC/tests/skalaxc_public_api_test.cxx +++ b/SkalaXC/tests/skalaxc_public_api_test.cxx @@ -299,18 +299,6 @@ bool gradient_api_works(const std::string& fixture) { translation[i % 3] += gradient[i]; } - // SkalaXC supports only weight-derivative-inclusive gradients; requesting - // otherwise must be rejected. - bool rejects_no_weight_derivatives = false; - SkalaXC::IntegratorSettingsEXC_GRAD no_weight_derivatives; - no_weight_derivatives.include_weight_derivatives = false; - try { - (void)built.integrator.eval_exc_grad(density.scalar, density.spin, - no_weight_derivatives); - } catch (const SkalaXC::Exception&) { - rejects_no_weight_derivatives = true; - } - const auto diagnostics = built.integrator.diagnostics(); const bool diagnostics_valid = diagnostics.exc_gradient_calls == 2 && @@ -319,9 +307,9 @@ bool gradient_api_works(const std::string& fixture) { diagnostics.timing(SkalaXC::TimingMetric::GradientAssembly).status == SkalaXC::TimingStatus::Complete; - return diagnostics_valid && rejects_no_weight_derivatives && - std::sqrt(squared_norm) > 1e-3 && std::abs(translation[0]) < 1e-10 && - std::abs(translation[1]) < 1e-10 && std::abs(translation[2]) < 1e-10; + return diagnostics_valid && std::sqrt(squared_norm) > 1e-3 && + std::abs(translation[0]) < 1e-10 && std::abs(translation[1]) < 1e-10 && + std::abs(translation[2]) < 1e-10; } bool diagnostics_api_works(const std::string& fixture) { From 967d7ab713bbd43e8b4b5cb44a2e83998f84fa78 Mon Sep 17 00:00:00 2001 From: jenswehner Date: Fri, 4 Sep 2026 15:55:53 +0200 Subject: [PATCH 19/33] Make SkalaXC test selection fail closed --- .github/workflows/skalaxc-ci.yml | 20 +++++++++++--------- .github/workflows/skalaxc-cuda.yml | 2 ++ pixi.toml | 10 +++++----- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/.github/workflows/skalaxc-ci.yml b/.github/workflows/skalaxc-ci.yml index 1838f7f0..b8f562dd 100644 --- a/.github/workflows/skalaxc-ci.yml +++ b/.github/workflows/skalaxc-ci.yml @@ -117,6 +117,7 @@ jobs: run: >- ctest --test-dir SkalaXC/build-ci-${{ matrix.name }} + --no-tests=error --output-on-failure - name: Install @@ -135,7 +136,8 @@ jobs: - name: Test installed consumers run: | cmake --build SkalaXC/build-installed-consumers-${{ matrix.name }} - ctest --test-dir SkalaXC/build-installed-consumers-${{ matrix.name }} --output-on-failure + ctest --test-dir SkalaXC/build-installed-consumers-${{ matrix.name }} \ + --no-tests=error --output-on-failure sanitizer: name: gcc-asan-ubsan @@ -169,19 +171,18 @@ jobs: -DSKALAXC_ENABLE_SANITIZERS=ON - name: Build sanitizer tests - run: >- - cmake --build SkalaXC/build-ci-sanitizer - --target skalaxc_unit_test skalaxc_c_api_test + run: cmake --build SkalaXC/build-ci-sanitizer - - name: Test repeated evaluation and C boundary + - name: Test with sanitizers env: ASAN_OPTIONS: detect_leaks=1:halt_on_error=1 UBSAN_OPTIONS: halt_on_error=1:print_stacktrace=1 SKALAXC_MODEL_PATH: ${{ github.workspace }}/SkalaXC/build-ci-sanitizer/data/skala_models - run: | - SkalaXC/build-ci-sanitizer/tests/skalaxc_unit_test '[skala][stress]' - ctest --test-dir SkalaXC/build-ci-sanitizer \ - -R '^skalaxc_c_api$' --output-on-failure + run: >- + ctest + --test-dir SkalaXC/build-ci-sanitizer + --no-tests=error + --output-on-failure clang-release: name: clang-22-release @@ -230,4 +231,5 @@ jobs: run: >- ctest --test-dir SkalaXC/build-ci-clang-release + --no-tests=error --output-on-failure diff --git a/.github/workflows/skalaxc-cuda.yml b/.github/workflows/skalaxc-cuda.yml index 2d0678f4..5e8c5357 100644 --- a/.github/workflows/skalaxc-cuda.yml +++ b/.github/workflows/skalaxc-cuda.yml @@ -178,6 +178,7 @@ jobs: ctest \ --test-dir SkalaXC/build-cuda-runtime-${{ matrix.version }} \ -R '^(skalaxc_c_api|skalaxc_fortran)$' \ + --no-tests=error \ --output-on-failure - name: Test GPU4PySCF-SkalaXC parity @@ -253,4 +254,5 @@ jobs: ctest --test-dir SkalaXC/build-cuda-mpi-${{ matrix.version }} -R '^skalaxc_unit_mpi\.(cuda_idle_rank|cuda_subcommunicator)$' + --no-tests=error --output-on-failure diff --git a/pixi.toml b/pixi.toml index 6ea7e8df..e86b8d02 100644 --- a/pixi.toml +++ b/pixi.toml @@ -282,14 +282,14 @@ platforms = ["linux-64"] [feature.skalaxc-core.tasks] skalaxc-configure-host = { cmd = "cmake -S SkalaXC -B SkalaXC/build-pixi-host -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$PIXI_PROJECT_ROOT/SkalaXC/install-pixi-host -DSKALAXC_BUILD_FORTRAN=ON -DSKALAXC_BUILD_TESTS=ON -DSKALAXC_BUILD_EXAMPLES=ON -DSKALAXC_DOWNLOAD_MODELS=ON -DSKALAXC_ENABLE_CUDA=OFF -DSKALAXC_ENABLE_MPI=OFF -DSKALAXC_ENABLE_OPENMP=ON -DSKALAXC_ENABLE_SANITIZERS=OFF" } skalaxc-build-host = { cmd = "cmake --build SkalaXC/build-pixi-host --parallel 2", depends-on = ["skalaxc-configure-host"] } -skalaxc-test-host = { cmd = "ctest --test-dir SkalaXC/build-pixi-host --output-on-failure", depends-on = ["skalaxc-build-host"], env = { OMP_NUM_THREADS = "4", SKALAXC_TEST_SEED = "20260729" } } -skalaxc-test-abi = { cmd = "ctest --test-dir SkalaXC/build-pixi-host -R 'skalaxc_abi\\.(exported_symbols|c_consumer_dependencies)' --output-on-failure", depends-on = ["skalaxc-build-host"], env = { OMP_NUM_THREADS = "4" } } +skalaxc-test-host = { cmd = "ctest --test-dir SkalaXC/build-pixi-host --no-tests=error --output-on-failure", depends-on = ["skalaxc-build-host"], env = { OMP_NUM_THREADS = "4", SKALAXC_TEST_SEED = "20260729" } } +skalaxc-test-abi = { cmd = "ctest --test-dir SkalaXC/build-pixi-host -R 'skalaxc_abi\\.(exported_symbols|c_consumer_dependencies)' --no-tests=error --output-on-failure", depends-on = ["skalaxc-build-host"], env = { OMP_NUM_THREADS = "4" } } skalaxc-install-core = { cmd = "cmake -E rm -rf SkalaXC/install-pixi-core && cmake --install SkalaXC/build-pixi-host --prefix SkalaXC/install-pixi-core --component Core", depends-on = ["skalaxc-build-host"] } skalaxc-install-full = { cmd = "cmake -E rm -rf SkalaXC/install-pixi-full && cmake --install SkalaXC/build-pixi-host --prefix SkalaXC/install-pixi-full", depends-on = ["skalaxc-build-host"] } -skalaxc-test-installed-core = { cmd = "cmake -E rm -rf SkalaXC/build-pixi-consumer-core && cmake -S SkalaXC/tests/installed -B SkalaXC/build-pixi-consumer-core -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=$PIXI_PROJECT_ROOT/SkalaXC/install-pixi-core -DSKALAXC_TEST_FORTRAN=OFF -DSKALAXC_EXPECT_FORTRAN_UNAVAILABLE=ON && cmake --build SkalaXC/build-pixi-consumer-core --parallel 2 && ctest --test-dir SkalaXC/build-pixi-consumer-core --output-on-failure", depends-on = ["skalaxc-install-core"], env = { OMP_NUM_THREADS = "4" } } -skalaxc-test-installed-full = { cmd = "cmake -E rm -rf SkalaXC/build-pixi-consumer-full && cmake -S SkalaXC/tests/installed -B SkalaXC/build-pixi-consumer-full -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=$PIXI_PROJECT_ROOT/SkalaXC/install-pixi-full -DSKALAXC_TEST_FORTRAN=ON -DSKALAXC_EXPECT_FORTRAN_UNAVAILABLE=OFF && cmake --build SkalaXC/build-pixi-consumer-full --parallel 2 && ctest --test-dir SkalaXC/build-pixi-consumer-full --output-on-failure", depends-on = ["skalaxc-install-full"], env = { OMP_NUM_THREADS = "4" } } +skalaxc-test-installed-core = { cmd = "cmake -E rm -rf SkalaXC/build-pixi-consumer-core && cmake -S SkalaXC/tests/installed -B SkalaXC/build-pixi-consumer-core -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=$PIXI_PROJECT_ROOT/SkalaXC/install-pixi-core -DSKALAXC_TEST_FORTRAN=OFF -DSKALAXC_EXPECT_FORTRAN_UNAVAILABLE=ON && cmake --build SkalaXC/build-pixi-consumer-core --parallel 2 && ctest --test-dir SkalaXC/build-pixi-consumer-core --no-tests=error --output-on-failure", depends-on = ["skalaxc-install-core"], env = { OMP_NUM_THREADS = "4" } } +skalaxc-test-installed-full = { cmd = "cmake -E rm -rf SkalaXC/build-pixi-consumer-full && cmake -S SkalaXC/tests/installed -B SkalaXC/build-pixi-consumer-full -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=$PIXI_PROJECT_ROOT/SkalaXC/install-pixi-full -DSKALAXC_TEST_FORTRAN=ON -DSKALAXC_EXPECT_FORTRAN_UNAVAILABLE=OFF && cmake --build SkalaXC/build-pixi-consumer-full --parallel 2 && ctest --test-dir SkalaXC/build-pixi-consumer-full --no-tests=error --output-on-failure", depends-on = ["skalaxc-install-full"], env = { OMP_NUM_THREADS = "4" } } skalaxc-configure-sanitizer = { cmd = "cmake -S SkalaXC -B SkalaXC/build-pixi-sanitizer -G Ninja -DCMAKE_BUILD_TYPE=Debug -DSKALAXC_BUILD_FORTRAN=OFF -DSKALAXC_BUILD_TESTS=ON -DSKALAXC_BUILD_EXAMPLES=OFF -DSKALAXC_DOWNLOAD_MODELS=ON -DSKALAXC_ENABLE_CUDA=OFF -DSKALAXC_ENABLE_MPI=OFF -DSKALAXC_ENABLE_OPENMP=OFF -DSKALAXC_ENABLE_SANITIZERS=ON" } -skalaxc-test-sanitizer = { cmd = "cmake --build SkalaXC/build-pixi-sanitizer --target skalaxc_unit_test --parallel 2 && SkalaXC/build-pixi-sanitizer/tests/skalaxc_unit_test '[skala][stress]'", depends-on = ["skalaxc-configure-sanitizer"], env = { OMP_NUM_THREADS = "4", ASAN_OPTIONS = "detect_leaks=1:halt_on_error=1", UBSAN_OPTIONS = "halt_on_error=1:print_stacktrace=1", SKALAXC_MODEL_PATH = "$PIXI_PROJECT_ROOT/SkalaXC/build-pixi-sanitizer/data/skala_models" } } +skalaxc-test-sanitizer = { cmd = "cmake --build SkalaXC/build-pixi-sanitizer --parallel 2 && ctest --test-dir SkalaXC/build-pixi-sanitizer --no-tests=error --output-on-failure", depends-on = ["skalaxc-configure-sanitizer"], env = { OMP_NUM_THREADS = "4", ASAN_OPTIONS = "detect_leaks=1:halt_on_error=1", UBSAN_OPTIONS = "halt_on_error=1:print_stacktrace=1", SKALAXC_MODEL_PATH = "$PIXI_PROJECT_ROOT/SkalaXC/build-pixi-sanitizer/data/skala_models" } } skalaxc-configure-clang-tidy = { cmd = "cmake -S SkalaXC -B SkalaXC/build-pixi-clang-tidy -G Ninja -DCMAKE_BUILD_TYPE=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DSKALAXC_BUILD_FORTRAN=OFF -DSKALAXC_BUILD_TESTS=OFF -DSKALAXC_BUILD_EXAMPLES=ON -DSKALAXC_DOWNLOAD_MODELS=OFF -DSKALAXC_ENABLE_CUDA=OFF -DSKALAXC_ENABLE_MPI=OFF -DSKALAXC_ENABLE_OPENMP=ON -DSKALAXC_ENABLE_SANITIZERS=OFF" } skalaxc-clang-tidy = { cmd = "run-clang-tidy -p SkalaXC/build-pixi-clang-tidy -j 2 -config-file SkalaXC/.clang-tidy -header-filter '^.*/SkalaXC/(include|src|tests|examples)/' '^.*/SkalaXC/(src|tests|examples)/.*\\.(cc|cpp|cxx)$'", depends-on = ["skalaxc-configure-clang-tidy"] } skalaxc-doxygen = { cmd = "cmake -DSKALAXC_DOXYGEN_SOURCE_DIR=$PIXI_PROJECT_ROOT/SkalaXC -DSKALAXC_DOXYGEN_BINARY_DIR=$PIXI_PROJECT_ROOT/SkalaXC/build-pixi-doxygen -DSKALAXC_DOXYGEN_PROJECT_VERSION=development -P SkalaXC/cmake/skalaxc-doxygen.cmake && doxygen SkalaXC/build-pixi-doxygen/Doxyfile" } From dca053534d8c526873f5608996adb11f9fa6c410 Mon Sep 17 00:00:00 2001 From: jenswehner Date: Fri, 4 Sep 2026 16:04:53 +0200 Subject: [PATCH 20/33] Add chlorine functional parity coverage --- SkalaXC/tests/README.md | 2 +- SkalaXC/tests/skala_traditional_integration_test.cxx | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/SkalaXC/tests/README.md b/SkalaXC/tests/README.md index da395307..abcd6720 100644 --- a/SkalaXC/tests/README.md +++ b/SkalaXC/tests/README.md @@ -13,7 +13,7 @@ not be merged merely because they evaluate the same model and fixture. | Private units | `*_unit_test.cxx`, tags such as `[reorder]`, `[array-view]`, `[diagnostics]` | Reordering, semantic array views, atomic-domain assignment, model metadata, diagnostics, and MPI wrappers. | | Build features | CTest `skalaxc_config.hdf5_feature` | Generated public/internal headers and installed-package metadata agree for HDF5-enabled and HDF5-disabled builds. | | Host numerical integration | `skala_host_test.cxx`, `skala_openmp_test.cxx`, `skala_stress_test.cxx` | LDA/PBE/TPSS EXC, scalar/z VXC, gradients, batching, OpenMP consistency, numerical derivatives, repeated evaluation, and bounded memory growth. | -| Traditional-functional parity | `skala_traditional_integration_test.cxx` | Public SkalaXC results against GauXC/ExchCXX for six molecules, three models, random UKS densities, and serial/MPI execution. | +| Traditional-functional parity | `skala_traditional_integration_test.cxx` | Public SkalaXC results against GauXC/ExchCXX for seven molecules through chlorine, three models, random UKS densities, and serial/MPI execution. | | CUDA parity | `skala_device_test.cxx` and `test_pyscf_skalaxc_gpu_parity.py` | Native LDA/PBE host-device gradient parity, TPSS EXC/VXC, lightweight batching/stream/MPI infrastructure checks, and dedicated GPU4PySCF–SkalaXC neural-gradient parity. TPSS CUDA-gradient coverage is deferred until its TensorExpr trace is retraced for lower sm_120 register pressure. | | Public C++ consumer | CTest `skalaxc_public_api` | Installed-style header use, PIMPL isolation, owning outputs, state/error contracts, gradients, settings, batching, and diagnostics. | | Public C consumer | CTest `skalaxc_c_api` | Opaque handles, status codes, column-major caller-owned buffers, validation, gradients, and diagnostics. | diff --git a/SkalaXC/tests/skala_traditional_integration_test.cxx b/SkalaXC/tests/skala_traditional_integration_test.cxx index d1809a98..6720f0eb 100644 --- a/SkalaXC/tests/skala_traditional_integration_test.cxx +++ b/SkalaXC/tests/skala_traditional_integration_test.cxx @@ -364,7 +364,7 @@ TEST_CASE("SkalaXC baselines reproduce GauXC traditional functionals", const std::string basis_path = std::string(SKALAXC_TEST_BASIS_PATH) + "/cc-pvdz.g94"; - // Six small (3-4 atom) molecules; every element appears in cc-pVDZ. + // Seven small (2-4 atom) molecules; every element appears in cc-pVDZ. const std::vector molecules = { {"h2o", {{8, 0.0000, 0.0000, 0.1173}, @@ -393,6 +393,7 @@ TEST_CASE("SkalaXC baselines reproduce GauXC traditional functionals", {8, 0.0000, 0.0000, 0.6742}, {1, 0.0000, 0.9337, -1.1109}, {1, 0.0000, -0.9337, -1.1109}}}, + {"hcl", {{1, 0.0000, 0.0000, 0.0000}, {17, 0.0000, 0.0000, 1.2746}}}, }; const std::vector functionals = { From ff8c84f37b20045278ec915255ea04d18255e100 Mon Sep 17 00:00:00 2001 From: jenswehner Date: Fri, 4 Sep 2026 16:13:13 +0200 Subject: [PATCH 21/33] Clarify SkalaXC API compatibility contracts --- SkalaXC/README.md | 33 +++++++++++++++++++-------------- SkalaXC/tests/README.md | 2 +- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/SkalaXC/README.md b/SkalaXC/README.md index 463972bc..1adb9386 100644 --- a/SkalaXC/README.md +++ b/SkalaXC/README.md @@ -1,10 +1,11 @@ # SkalaXC SkalaXC is a standalone machine-learning exchange–correlation (XC) functional -library. It reuses GauXC's internal numerical machinery (grid, load balancer, collocation / local work - driver, molecular weights, HDF5 I/O), **without** using GauXC's public - `XCIntegrator` XC API, and exposes its **own ABI-isolated public API** (C++, C, and Fortran) for ML XC - evaluation. No GauXC or LibTorch type ever crosses the SkalaXC boundary. +library. It reuses GauXC's internal numerical machinery (grid, load balancer, +collocation / local work driver, molecular weights, HDF5 I/O), **without** +using GauXC's public `XCIntegrator` XC API, and exposes its own +dependency-isolated public APIs (C++, C, and Fortran) for ML XC evaluation. No +GauXC or LibTorch type ever crosses the SkalaXC boundary. The complete validated capability is **host (CPU)** evaluation of the **unrestricted (UKS)** ML XC energy, potential, and nuclear gradient for the @@ -107,7 +108,7 @@ file. If rank zero cannot read the model, it broadcasts the error message so that all ranks fail consistently instead of leaving non-root ranks blocked in an MPI collective. Every rank still needs enough memory for its local model. -### 3. Strict ABI isolation (C, C++, and Fortran) +### 3. Dependency and symbol isolation (C, C++, and Fortran) The public boundary exposes **zero** GauXC / LibTorch symbols or types: - **C++** — strict PIMPL: `SkalaXC::XCIntegrator` holds only a forward-declared `unique_ptr`; all GauXC/Torch usage is confined to the `.cxx` TUs. Its @@ -119,11 +120,14 @@ The public boundary exposes **zero** GauXC / LibTorch symbols or types: contracts. Matrix types must expose contiguous `double` storage through `data()` in column-major order; row-major and strided matrix types are not supported. Nuclear gradients always include molecular-weight derivatives. - `SkalaSettings` selects the model when the integrator is + `SkalaXC::functional_type` selects the model when the integrator is constructed. The integrator loads and owns that TorchScript module for its lifetime, so subsequent evaluations neither reload it nor use a process-wide - model cache. -- **C** — opaque handle (`skalaxc_calculator_t`) + status codes + POD only. + model cache. This C++ API also exposes standard-library types and + `SkalaXC::Exception`; consumers must use a compatible compiler and C++ + standard-library ABI. Cross-toolchain C++ ABI compatibility is not + guaranteed. +- **C** — opaque handle (`skalaxc_xc_integrator_t`) + status codes + POD only. - **Fortran** — `iso_c_binding` wrapper over the C API; binds only to SkalaXC opaque handles. Assumed-shape array wrappers reject noncontiguous storage and extents that do not match the native molecule, basis, matrix, or gradient @@ -139,9 +143,10 @@ The public boundary exposes **zero** GauXC / LibTorch symbols or types: `libskalaxc.so`; Eigen expressions are compiled only in private translation units. Everything is compiled `-fvisibility=hidden` and a linker **version script** (`cmake/skalaxc-exports.map`) plus - `--exclude-libs,ALL` export **only** `skalaxc_*` / `SkalaXC::*` symbols. This - prevents ODR / symbol-interposition clashes if the host application links its - own (possibly different) GauXC or LibTorch. + `--exclude-libs,ALL` export only the public C entry points and the mangled C++ + definitions selected by the `SkalaXC` namespace allowlist. This prevents ODR + / symbol-interposition clashes if the host application links its own + (possibly different) GauXC or LibTorch. Consumers therefore need **only** this repository's public headers and `libskalaxc` — not GauXC, LibTorch, or Eigen. @@ -543,7 +548,7 @@ and numerical tolerance rationale. CUDA builds also run TPSS device EXC/VXC and PBE device-gradient evaluations through the pure C and Fortran black-box tests. -The black-box tests double as ABI-isolation proofs: they are given no GauXC +The black-box tests double as dependency-isolation proofs: they are given no GauXC include dirs and do not link GauXC/LibTorch, so a successful compile+link is itself part of the test. @@ -569,10 +574,10 @@ the integrator; evaluation calls provide only densities and output storage. --- -## Verifying ABI isolation +## Verifying exported-symbol isolation ```bash -# Only skalaxc_* / SkalaXC::* symbols are exported (no GauXC/torch): +# Only the public C API and mangled SkalaXC C++ definitions are exported: nm -D --defined-only build/src/libskalaxc.so.0.1.0 | grep -Ev 'skalaxc|SkalaXC' # → empty # A pure-C consumer links only the SkalaXC C surface: diff --git a/SkalaXC/tests/README.md b/SkalaXC/tests/README.md index abcd6720..7b44b438 100644 --- a/SkalaXC/tests/README.md +++ b/SkalaXC/tests/README.md @@ -15,7 +15,7 @@ not be merged merely because they evaluate the same model and fixture. | Host numerical integration | `skala_host_test.cxx`, `skala_openmp_test.cxx`, `skala_stress_test.cxx` | LDA/PBE/TPSS EXC, scalar/z VXC, gradients, batching, OpenMP consistency, numerical derivatives, repeated evaluation, and bounded memory growth. | | Traditional-functional parity | `skala_traditional_integration_test.cxx` | Public SkalaXC results against GauXC/ExchCXX for seven molecules through chlorine, three models, random UKS densities, and serial/MPI execution. | | CUDA parity | `skala_device_test.cxx` and `test_pyscf_skalaxc_gpu_parity.py` | Native LDA/PBE host-device gradient parity, TPSS EXC/VXC, lightweight batching/stream/MPI infrastructure checks, and dedicated GPU4PySCF–SkalaXC neural-gradient parity. TPSS CUDA-gradient coverage is deferred until its TensorExpr trace is retraced for lower sm_120 register pressure. | -| Public C++ consumer | CTest `skalaxc_public_api` | Installed-style header use, PIMPL isolation, owning outputs, state/error contracts, gradients, settings, batching, and diagnostics. | +| Public C++ consumer | CTest `skalaxc_public_api` | Installed-style header use, PIMPL isolation, owning outputs, state/error contracts, gradients, batching, and diagnostics. | | Public C consumer | CTest `skalaxc_c_api` | Opaque handles, status codes, column-major caller-owned buffers, validation, gradients, and diagnostics. | | Public Fortran consumer | CTest `skalaxc_fortran` and `skalaxc_fortran_assignment.*` | `iso_c_binding`, move-only handle ownership, caller-owned arrays, diagnostics, and gradients. | | Binary boundary | CTest `skalaxc_abi.exported_symbols` and `skalaxc_abi.c_consumer_dependencies` | Export allowlist and absence of private GauXC/LibTorch dependencies from a C consumer. | From a18c979bdd95166a685d649e798c2a3e31ca2989 Mon Sep 17 00:00:00 2001 From: jenswehner Date: Fri, 4 Sep 2026 16:31:20 +0200 Subject: [PATCH 22/33] Document SkalaXC contributor workflow --- CONTRIBUTING.md | 63 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9cfb6298..e273ca59 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -42,11 +42,69 @@ Named compatibility environments cover Python 3.11 through 3.13, PySCF 2.14, PyTorch 2.12 and 2.13, GPU4PySCF 1.8.1, and CUDA 12 and 13. Keep `pixi.lock` synchronized with changes to `pixi.toml` or any component `pyproject.toml`. -SkalaXC development uses the same root workspace. Its host environment is -locked for Linux x86-64, Linux ARM64, and macOS ARM64: +## SkalaXC development + +SkalaXC development uses the root Pixi workspace. Its host environment is +locked for Linux x86-64, Linux ARM64, and macOS ARM64. Initialize the GauXC +submodule and install the environment once: ```bash +git submodule update --init SkalaXC/external/GauXC pixi install --locked -e skalaxc-host +``` + +Configure and build the native C++ and C APIs, the Fortran binding, tests, and +consumer examples: + +```bash +pixi run -e skalaxc-host cmake \ + -S SkalaXC \ + -B SkalaXC/build-contrib \ + -G Ninja \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX="$PWD/SkalaXC/install-contrib" \ + -DSKALAXC_BUILD_FORTRAN=ON \ + -DSKALAXC_BUILD_TESTS=ON \ + -DSKALAXC_BUILD_EXAMPLES=ON \ + -DSKALAXC_DOWNLOAD_MODELS=ON \ + -DSKALAXC_ENABLE_CUDA=OFF \ + -DSKALAXC_ENABLE_MPI=OFF \ + -DSKALAXC_ENABLE_OPENMP=ON +pixi run -e skalaxc-host cmake --build SkalaXC/build-contrib --parallel 2 +``` + +Run every native CTest registration, including the C and Fortran binding +tests, then install the native package. The fixed seed makes the randomly +generated UKS density matrices reproducible, so numerical failures can be +replayed locally and compared directly with CI: + +```bash +OMP_NUM_THREADS=4 SKALAXC_TEST_SEED=20260729 \ + pixi run -e skalaxc-host ctest \ + --test-dir SkalaXC/build-contrib \ + --no-tests=error \ + --output-on-failure +pixi run -e skalaxc-host cmake --install SkalaXC/build-contrib +``` + +Build the Python binding against that exact native installation and run its +tests. `SkalaXC_DIR` must be absolute so scikit-build cannot select another +SkalaXC package: + +```bash +pixi run -e skalaxc-host env \ + SkalaXC_DIR="$PWD/SkalaXC/install-contrib/lib/cmake/SkalaXC" \ + SKALAXC_PYTHON_LAYOUT=WHEEL \ + python -m pip install SkalaXC/python \ + --no-build-isolation --no-deps --force-reinstall +OMP_NUM_THREADS=4 pixi run -e skalaxc-host \ + pytest -v SkalaXC/python/tests/ +``` + +The checked-in Pixi tasks remain the shortest way to exercise the standard +host build and the focused static-analysis/documentation checks: + +```bash OMP_NUM_THREADS=4 pixi run -e skalaxc-host skalaxc-test-host pixi run -e skalaxc-host-clang skalaxc-clang-tidy pixi run -e skalaxc-tools skalaxc-doxygen @@ -56,7 +114,6 @@ CUDA 12 and 13 use the custom platforms `linux-64-cuda12` and `linux-64-cuda13`; pass the matching platform with `-p` to both `pixi install` and `pixi run`. - ## Model development The torch model in `model/src/skala_model` serves as a representation of what our From 26732ada3ff79696de3718127edafb012e0f8516 Mon Sep 17 00:00:00 2001 From: jenswehner Date: Sun, 6 Sep 2026 22:58:57 +0200 Subject: [PATCH 23/33] Fix PySCF SkalaXC gradient parity tests --- tests/test_pyscf_skalaxc_gpu_parity.py | 61 +++++++++++++++++--------- tests/test_pyscf_skalaxc_parity.py | 61 +++++++++++++++----------- 2 files changed, 76 insertions(+), 46 deletions(-) diff --git a/tests/test_pyscf_skalaxc_gpu_parity.py b/tests/test_pyscf_skalaxc_gpu_parity.py index 85d91fc4..8b7f2c2a 100644 --- a/tests/test_pyscf_skalaxc_gpu_parity.py +++ b/tests/test_pyscf_skalaxc_gpu_parity.py @@ -32,10 +32,10 @@ pytest.importorskip("gpu4pyscf", reason="GPU4PySCF is not available") DEVICE_EXECUTION_SPACE = skalaxc.ExecutionSpace.DEVICE -from skala.gpu4pyscf.gradients import ( # noqa: E402 - nuc_grad_from_veff, - veff_and_expl_nuc_grad, -) +import cupy as cp # noqa: E402 +from gpu4pyscf import dft as gpu_dft # noqa: E402 +from skala.gpu4pyscf import SkalaKS # noqa: E402 +from skala.gpu4pyscf.gradients import SkalaUKSGradient # noqa: E402 from skala.gpu4pyscf.grids import SkalaGrids # noqa: E402 from skala.pyscf.xc_integrator import XCIntegrator # noqa: E402 @@ -74,17 +74,38 @@ def molecule() -> gto.Mole: @pytest.fixture(scope="module") -def density(molecule: gto.Mole) -> npt.NDArray[np.float64]: +def reference_mean_field(molecule: gto.Mole) -> scf.uhf.UHF: mean_field = scf.UHF(molecule) mean_field.chkfile = None mean_field.conv_tol = 1e-12 mean_field.kernel() assert mean_field.converged - result = np.asarray(mean_field.make_rdm1(), dtype=np.float64) + return mean_field + + +@pytest.fixture(scope="module") +def density( + molecule: gto.Mole, reference_mean_field: scf.uhf.UHF +) -> npt.NDArray[np.float64]: + result = np.asarray(reference_mean_field.make_rdm1(), dtype=np.float64) assert result.shape == (2, molecule.nao_nr(), molecule.nao_nr()) return result +@pytest.fixture(scope="module") +def hartree_gradient( + molecule: gto.Mole, reference_mean_field: scf.uhf.UHF +) -> npt.NDArray[np.float64]: + mean_field = gpu_dft.UKS(molecule) + mean_field.xc = "0*LDA" + mean_field.mo_coeff = cp.asarray(reference_mean_field.mo_coeff) + mean_field.mo_occ = cp.asarray(reference_mean_field.mo_occ) + mean_field.mo_energy = cp.asarray(reference_mean_field.mo_energy) + return np.asarray( + cp.asnumpy(mean_field.nuc_grad_method().kernel()), dtype=np.float64 + ) + + @pytest.fixture(scope="module") def gpu4pyscf_grid(molecule: gto.Mole) -> SkalaGrids: grid = SkalaGrids(molecule) @@ -129,21 +150,16 @@ def _fixed_density_xc_gradient( functional: ExcFunctionalBase, molecule: gto.Mole, grid: SkalaGrids, - density: npt.NDArray[np.float64], + reference_mean_field: scf.uhf.UHF, + hartree_gradient: npt.NDArray[np.float64], ) -> npt.NDArray[np.float64]: - density_tensor = torch.as_tensor(density, device="cuda:0") - effective_potential, explicit_gradient = veff_and_expl_nuc_grad( - functional, - molecule, - grid, - density_tensor, - ) - contracted_gradient = 2 * nuc_grad_from_veff( - molecule, - effective_potential, - density_tensor, - ) - return (contracted_gradient + explicit_gradient).detach().cpu().numpy() + mean_field = SkalaKS(molecule, functional, with_dftd3=False) + mean_field.grids = grid + mean_field.mo_coeff = cp.asarray(reference_mean_field.mo_coeff) + mean_field.mo_occ = cp.asarray(reference_mean_field.mo_occ) + mean_field.mo_energy = cp.asarray(reference_mean_field.mo_energy) + total_gradient = SkalaUKSGradient(mean_field).kernel() + return np.asarray(cp.asnumpy(total_gradient), dtype=np.float64) - hartree_gradient def _release_torch_cache() -> None: @@ -211,12 +227,15 @@ def test_gpu_exc_gradient_parity( molecule: gto.Mole, density: npt.NDArray[np.float64], gpu4pyscf_grid: SkalaGrids, + reference_mean_field: scf.uhf.UHF, + hartree_gradient: npt.NDArray[np.float64], ) -> None: gpu4pyscf_gradient = _fixed_density_xc_gradient( functional_case.functional, molecule, gpu4pyscf_grid, - density, + reference_mean_field, + hartree_gradient, ) _release_torch_cache() diff --git a/tests/test_pyscf_skalaxc_parity.py b/tests/test_pyscf_skalaxc_parity.py index ddd21cb5..cbd51000 100644 --- a/tests/test_pyscf_skalaxc_parity.py +++ b/tests/test_pyscf_skalaxc_parity.py @@ -12,7 +12,8 @@ import torch from skala.functional import FunctionalArtifact, load_functional from skala.functional.base import ExcFunctionalBase -from skala.pyscf.gradients import veff_and_expl_nuc_grad +from skala.pyscf import SkalaKS +from skala.pyscf.gradients import SkalaUKSGradient from skala.pyscf.grids import SkalaGrids from skala.pyscf.xc_integrator import XCIntegrator @@ -55,17 +56,36 @@ def molecule() -> gto.Mole: @pytest.fixture(scope="module") -def density(molecule: gto.Mole) -> npt.NDArray[np.float64]: +def reference_mean_field(molecule: gto.Mole) -> scf.uhf.UHF: mean_field = scf.UHF(molecule) mean_field.chkfile = None mean_field.conv_tol = 1e-12 mean_field.kernel() assert mean_field.converged - result = np.asarray(mean_field.make_rdm1(), dtype=np.float64) + return mean_field + + +@pytest.fixture(scope="module") +def density( + molecule: gto.Mole, reference_mean_field: scf.uhf.UHF +) -> npt.NDArray[np.float64]: + result = np.asarray(reference_mean_field.make_rdm1(), dtype=np.float64) assert result.shape == (2, molecule.nao_nr(), molecule.nao_nr()) return result +@pytest.fixture(scope="module") +def hartree_gradient( + molecule: gto.Mole, reference_mean_field: scf.uhf.UHF +) -> npt.NDArray[np.float64]: + mean_field = dft.UKS(molecule) + mean_field.xc = "0*LDA" + mean_field.mo_coeff = reference_mean_field.mo_coeff + mean_field.mo_occ = reference_mean_field.mo_occ + mean_field.mo_energy = reference_mean_field.mo_energy + return np.asarray(mean_field.nuc_grad_method().kernel(), dtype=np.float64) + + @pytest.fixture(scope="module") def pyscf_grid(molecule: gto.Mole) -> SkalaGrids: grid = SkalaGrids(molecule) @@ -120,28 +140,16 @@ def _fixed_density_xc_gradient( functional: ExcFunctionalBase, molecule: gto.Mole, grid: SkalaGrids, - density: npt.NDArray[np.float64], + reference_mean_field: scf.uhf.UHF, + hartree_gradient: npt.NDArray[np.float64], ) -> npt.NDArray[np.float64]: - density_tensor = torch.from_numpy(density.copy()) - effective_potential, explicit_gradient = veff_and_expl_nuc_grad( - functional, - molecule, - grid, - density_tensor, - ) - contracted_gradient = torch.empty( - (molecule.natm, 3), dtype=effective_potential.dtype - ) - for atom_index, (_, _, ao_start, ao_end) in enumerate(molecule.aoslice_by_atom()): - contracted_gradient[atom_index] = ( - torch.einsum( - "...xij,...ij->x", - effective_potential[..., ao_start:ao_end, :], - density_tensor[..., ao_start:ao_end, :], - ) - * 2 - ) - return (contracted_gradient + explicit_gradient).numpy() + mean_field = SkalaKS(molecule, functional, with_dftd3=False) + mean_field.grids = grid + mean_field.mo_coeff = reference_mean_field.mo_coeff + mean_field.mo_occ = reference_mean_field.mo_occ + mean_field.mo_energy = reference_mean_field.mo_energy + total_gradient = SkalaUKSGradient(mean_field).kernel() + return np.asarray(total_gradient, dtype=np.float64) - hartree_gradient def test_pyscf_conversion_matches_skalaxc_layout(molecule: gto.Mole) -> None: @@ -199,12 +207,15 @@ def test_exc_gradient_parity( molecule: gto.Mole, density: npt.NDArray[np.float64], pyscf_grid: SkalaGrids, + reference_mean_field: scf.uhf.UHF, + hartree_gradient: npt.NDArray[np.float64], ) -> None: pyscf_gradient = _fixed_density_xc_gradient( functional_case.functional, molecule, pyscf_grid, - density, + reference_mean_field, + hartree_gradient, ) scalar_density, spin_density = uks_density_channels(density) From c4609c8ce8a1131649e2eda791b681d646f888da Mon Sep 17 00:00:00 2001 From: jenswehner Date: Sun, 6 Sep 2026 23:18:27 +0200 Subject: [PATCH 24/33] harden tests --- SkalaXC/src/CMakeLists.txt | 6 + SkalaXC/tests/CMakeLists.txt | 5 +- SkalaXC/tests/README.md | 16 +- SkalaXC/tests/skala_device_test.cxx | 18 ++- SkalaXC/tests/skala_host_mpi_test.cxx | 9 +- .../skala_traditional_integration_test.cxx | 150 ++++++++++++++++-- SkalaXC/tests/skalaxc_c_api_test.c | 56 ++++++- SkalaXC/tests/skalaxc_fortran_test.F90 | 42 ++++- SkalaXC/tests/skalaxc_public_api_test.cxx | 11 +- 9 files changed, 275 insertions(+), 38 deletions(-) diff --git a/SkalaXC/src/CMakeLists.txt b/SkalaXC/src/CMakeLists.txt index d852440b..9a99892d 100644 --- a/SkalaXC/src/CMakeLists.txt +++ b/SkalaXC/src/CMakeLists.txt @@ -132,6 +132,12 @@ foreach(_skalaxc_interface_property INTERFACE_LINK_LIBRARIES) get_target_property(_skalaxc_interface_value skalaxc ${_skalaxc_interface_property}) + if(_skalaxc_interface_property STREQUAL "INTERFACE_INCLUDE_DIRECTORIES") + list(REMOVE_ITEM _skalaxc_interface_value + "$" + "$" + "$") + endif() if(_skalaxc_interface_value MATCHES "[Gg]au[Xx][Cc]|[Tt]orch|c10|[Ee]igen|[Ee]xch[Cc][Xx]|[Ii]ntegrator[Xx][Xx]|[Nn]lohmann") message(FATAL_ERROR diff --git a/SkalaXC/tests/CMakeLists.txt b/SkalaXC/tests/CMakeLists.txt index 61343f13..7db87ec1 100644 --- a/SkalaXC/tests/CMakeLists.txt +++ b/SkalaXC/tests/CMakeLists.txt @@ -147,7 +147,7 @@ target_compile_definitions(skalaxc_unit_test PRIVATE # `skalaxc_unit_test "[skala][gradient-numerical]"`. catch_discover_tests(skalaxc_unit_test TEST_PREFIX "skalaxc_unit." - TEST_SPEC "~[mpi-only]" + TEST_SPEC "~[mpi-only],[gradient-numerical]" PROPERTIES ENVIRONMENT "SKALAXC_MODEL_PATH=${SKALAXC_MODEL_PATH}") # The traditional-integration test is written to validate the replicated MPI path @@ -250,6 +250,9 @@ endif() if(SKALAXC_HAS_HDF5 AND HDF5_FOUND AND HDF5_C_LIBRARIES) add_executable(skalaxc_c_api_test skalaxc_c_api_test.c) target_link_libraries(skalaxc_c_api_test PRIVATE skalaxc ${HDF5_C_LIBRARIES}) + if(UNIX) + target_link_libraries(skalaxc_c_api_test PRIVATE m) + endif() target_include_directories(skalaxc_c_api_test PRIVATE ${HDF5_INCLUDE_DIRS}) if(SKALAXC_ENABLE_MPI) find_package(MPI REQUIRED COMPONENTS C) diff --git a/SkalaXC/tests/README.md b/SkalaXC/tests/README.md index 7b44b438..fdde2891 100644 --- a/SkalaXC/tests/README.md +++ b/SkalaXC/tests/README.md @@ -25,6 +25,12 @@ public bindings. Positive aggressive-batching equivalence is covered at the private host/device and public C++ layers; it is not repeated in each language binding. +Both language suites compare scalar and spin potentials against `/VXC_SCALAR` +and `/VXC_Z` using the golden-host tolerances below. Output buffers start as NaN +so unwritten elements fail the finite-value checks. Both potential channels +must also be symmetric. These He fixtures have near-zero spin potentials, so +they do not establish accuracy for a nonzero spin response. + HDF5 support is enabled by default. With `SKALAXC_ENABLE_HDF5=OFF`, fixture- driven host/device tests and the C, C++, and Fortran numerical consumer tests are not built. Constructed-system units, traditional-functional parity, the @@ -83,8 +89,9 @@ checks that SkalaXC always uses GauXC's master CUDA stream internally and restores a non-default caller Torch stream after successful and failed evaluations. -`[gradient-numerical]` is tagged `[.slow]`, so it runs only when selected -explicitly. Cases tagged `[mpi-only]` are excluded from single-process Catch +`[gradient-numerical]` is tagged `[.slow]`, so direct Catch runs must select it +explicitly. CTest discovery explicitly includes it in the normal host CI suite +when HDF5 is enabled. Cases tagged `[mpi-only]` are excluded from single-process Catch discovery and are available through these MPI-enabled CTest registrations: | CTest name | Ranks | Coverage | @@ -165,6 +172,11 @@ local diagnosis and exact replay: | `SKALAXC_TEST_DENSITY_DIR=` | Replay `density__{scalar,z}.mtx` files emitted after a mismatch. | | `SKALAXC_TEST_VERBOSE=1` | Print per-molecule/model numerical errors on rank zero. | +Failure dumps use these same names in the test's working directory. Replay +evaluates only molecules with a saved pair, so a single failed molecule is +sufficient. An incomplete pair, invalid matrix extents, or a directory with no +matching pairs fails the test rather than passing silently. + On failure, preserve the printed seed in the issue or pull request. Store a replay density only when it adds a stable regression case that a seed cannot reproduce. diff --git a/SkalaXC/tests/skala_device_test.cxx b/SkalaXC/tests/skala_device_test.cxx index 417769e5..611177ef 100644 --- a/SkalaXC/tests/skala_device_test.cxx +++ b/SkalaXC/tests/skala_device_test.cxx @@ -150,10 +150,15 @@ TEST_CASE("Skala CUDA reproduces host semilocal nuclear gradients", const auto device = evaluate_gradient( device_runtime, SkalaXC::ExecutionSpace::Device, system.molecule, system.basis, model, scalar_density, spin_density, true); - REQUIRE(device.size() == host.size()); + REQUIRE(host.size() == 3 * system.molecule.natoms()); + REQUIRE(device.size() == 3 * system.molecule.natoms()); double max_error = 0.0; - for (std::size_t index = 0; index < host.size(); ++index) + for (std::size_t index = 0; index < host.size(); ++index) { + INFO("gradient component=" << index); + REQUIRE(std::isfinite(host[index])); + REQUIRE(std::isfinite(device[index])); max_error = std::max(max_error, std::abs(device[index] - host[index])); + } INFO("maximum gradient component error=" << max_error); CHECK(max_error <= 1e-6); } @@ -445,11 +450,16 @@ TEST_CASE("Skala CUDA uses the runtime MPI subcommunicator", std::get<1>(device), std::get<1>(host)); const double spin_error = SkalaXC::test::matrix_error_per_basis( std::get<2>(device), std::get<2>(host)); - REQUIRE(device_gradient.size() == host_gradient.size()); + REQUIRE(host_gradient.size() == 3 * system.molecule.natoms()); + REQUIRE(device_gradient.size() == 3 * system.molecule.natoms()); double gradient_error = 0.0; - for (std::size_t index = 0; index < host_gradient.size(); ++index) + for (std::size_t index = 0; index < host_gradient.size(); ++index) { + INFO("gradient component=" << index); + REQUIRE(std::isfinite(host_gradient[index])); + REQUIRE(std::isfinite(device_gradient[index])); gradient_error = std::max(gradient_error, std::abs(device_gradient[index] - host_gradient[index])); + } INFO("subcommunicator color=" << color); INFO("CUDA device=" << device_settings.device_id); diff --git a/SkalaXC/tests/skala_host_mpi_test.cxx b/SkalaXC/tests/skala_host_mpi_test.cxx index 6a32ebf7..937a68fd 100644 --- a/SkalaXC/tests/skala_host_mpi_test.cxx +++ b/SkalaXC/tests/skala_host_mpi_test.cxx @@ -91,12 +91,17 @@ TEST_CASE("Skala host evaluation uses the runtime MPI subcommunicator", subcomm_result.scalar_potential, self_result.scalar_potential); const double spin_error = SkalaXC::test::matrix_error_per_basis( subcomm_result.spin_potential, self_result.spin_potential); - REQUIRE(subcomm_result.gradient.size() == self_result.gradient.size()); + REQUIRE(subcomm_result.gradient.size() == 3 * system.molecule.natoms()); + REQUIRE(self_result.gradient.size() == 3 * system.molecule.natoms()); double gradient_error = 0.0; - for (std::size_t index = 0; index < self_result.gradient.size(); ++index) + for (std::size_t index = 0; index < self_result.gradient.size(); ++index) { + INFO("gradient component=" << index); + REQUIRE(std::isfinite(subcomm_result.gradient[index])); + REQUIRE(std::isfinite(self_result.gradient[index])); gradient_error = std::max( gradient_error, std::abs(subcomm_result.gradient[index] - self_result.gradient[index])); + } INFO("subcommunicator color=" << color); CHECK(exc_error <= 1e-10); diff --git a/SkalaXC/tests/skala_traditional_integration_test.cxx b/SkalaXC/tests/skala_traditional_integration_test.cxx index 6720f0eb..f3b53927 100644 --- a/SkalaXC/tests/skala_traditional_integration_test.cxx +++ b/SkalaXC/tests/skala_traditional_integration_test.cxx @@ -59,7 +59,10 @@ #include #include #include +#include #include +#include +#include #include #include #include @@ -198,22 +201,50 @@ struct DensityPair { Eigen::MatrixXd Ps, Pz; }; +std::string density_file_base(const std::filesystem::path& directory, + const std::string& name) { + return (directory / ("density_" + name)).string(); +} + +void save_density(const std::filesystem::path& directory, + const std::string& name, const DensityPair& density) { + const auto base = density_file_base(directory, name); + if (!density.Ps.allFinite() || !density.Pz.allFinite()) + throw std::runtime_error("Cannot save non-finite densities to " + base); + if (!Eigen::saveMarketDense(density.Ps, base + "_scalar.mtx") || + !Eigen::saveMarketDense(density.Pz, base + "_z.mtx")) + throw std::runtime_error("Failed to save densities to " + base + + "_{scalar,z}.mtx"); +} + /** * @brief Generate (or replay from disk) the density pair for one molecule. * @param name Molecule label used for replay/dump file names. * @param nbf Number of AO basis functions. * @param rng Seeded generator (advanced only when generating). * @param replay_dir If non-null, load densities from this directory instead. + * @return No value if neither replay file exists for this molecule. */ -DensityPair make_density(const std::string& name, int nbf, std::mt19937_64& rng, - const char* replay_dir) { +std::optional make_density(const std::string& name, int nbf, + std::mt19937_64& rng, + const char* replay_dir) { DensityPair d; if (replay_dir) { - const std::string base = std::string(replay_dir) + "/density_" + name; + const auto base = density_file_base(replay_dir, name); + const bool has_scalar = std::filesystem::exists(base + "_scalar.mtx"); + const bool has_spin = std::filesystem::exists(base + "_z.mtx"); + if (!has_scalar && !has_spin) return std::nullopt; + if (!has_scalar || !has_spin) + throw std::runtime_error("Incomplete replay density pair: " + base + + "_{scalar,z}.mtx"); if (!Eigen::loadMarketDense(d.Ps, base + "_scalar.mtx") || !Eigen::loadMarketDense(d.Pz, base + "_z.mtx")) throw std::runtime_error("Failed to load replay densities from " + base + "_{scalar,z}.mtx"); + if (d.Ps.rows() != nbf || d.Ps.cols() != nbf || d.Pz.rows() != nbf || + d.Pz.cols() != nbf || !d.Ps.allFinite() || !d.Pz.allFinite()) + throw std::runtime_error("Invalid replay density matrices: " + base + + "_{scalar,z}.mtx"); return d; } d.Ps = random_spd(nbf, rng); @@ -348,6 +379,85 @@ std::uint64_t choose_seed(const GauXC::RuntimeEnvironment& rt) { } // namespace +TEST_CASE("Traditional density dumps support partial replay", + "[skala][density-replay]") { + struct TemporaryDirectory { + std::filesystem::path path; + + TemporaryDirectory() { + std::random_device random; + do { + path = std::filesystem::temp_directory_path() / + ("skalaxc-density-replay-" + std::to_string(random())); + } while (!std::filesystem::create_directory(path)); + } + + ~TemporaryDirectory() { + std::error_code error; + std::filesystem::remove_all(path, error); + } + } temporary; + + const auto directory = temporary.path.string(); + std::mt19937_64 rng(20260729); + const auto generated = make_density("hcn", 3, rng, nullptr); + REQUIRE(generated.has_value()); + const auto rng_before_replay = rng; + + SECTION("missing molecules do not generate replacement densities") { + CHECK_FALSE(make_density("h2o", 3, rng, directory.c_str()).has_value()); + } + + SECTION("a failure dump can be replayed without other molecules") { + save_density(temporary.path, "hcn", *generated); + REQUIRE(std::filesystem::exists(temporary.path / "density_hcn_scalar.mtx")); + REQUIRE(std::filesystem::exists(temporary.path / "density_hcn_z.mtx")); + CHECK_FALSE(make_density("h2o", 3, rng, directory.c_str()).has_value()); + const auto replayed = make_density("hcn", 3, rng, directory.c_str()); + REQUIRE(replayed.has_value()); + CHECK(replayed->Ps.isApprox(generated->Ps, 1e-14)); + CHECK(replayed->Pz.isApprox(generated->Pz, 1e-14)); + CHECK_FALSE(make_density("hcl", 3, rng, directory.c_str()).has_value()); + } + + SECTION("a missing scalar or spin file is rejected") { + save_density(temporary.path, "hcn", *generated); + SECTION("missing scalar") { + REQUIRE( + std::filesystem::remove(temporary.path / "density_hcn_scalar.mtx")); + } + SECTION("missing spin") { + REQUIRE(std::filesystem::remove(temporary.path / "density_hcn_z.mtx")); + } + CHECK_THROWS_AS(make_density("hcn", 3, rng, directory.c_str()), + std::runtime_error); + } + + SECTION("wrong matrix extents are rejected before evaluation") { + DensityPair invalid = *generated; + SECTION("scalar extent") { invalid.Ps = Eigen::MatrixXd::Zero(2, 3); } + SECTION("spin extent") { invalid.Pz = Eigen::MatrixXd::Zero(3, 2); } + save_density(temporary.path, "hcn", invalid); + CHECK_THROWS_AS(make_density("hcn", 3, rng, directory.c_str()), + std::runtime_error); + } + + SECTION("non-finite densities are rejected before writing") { + DensityPair invalid = *generated; + SECTION("NaN scalar density") { + invalid.Ps(0, 0) = std::numeric_limits::quiet_NaN(); + } + SECTION("infinite spin density") { + invalid.Pz(0, 0) = std::numeric_limits::infinity(); + } + CHECK_THROWS_AS(save_density(temporary.path, "hcn", invalid), + std::runtime_error); + CHECK(std::filesystem::is_empty(temporary.path)); + } + + CHECK(rng == rng_before_replay); +} + TEST_CASE("SkalaXC baselines reproduce GauXC traditional functionals", "[skala][traditional-integration]") { // The reference path uses GauXC's runtime; the Skala path uses SkalaXC's own @@ -411,14 +521,18 @@ TEST_CASE("SkalaXC baselines reproduce GauXC traditional functionals", const double vxc_tol = 2e-5; const double grad_tol = 1e-4; + std::size_t evaluated_molecules = 0; for (const auto& mol_case : molecules) { const GauXC::Molecule mol = make_molecule(mol_case.atoms); GauXC::BasisSet basis = GauXC::parse_basis(mol, basis_path, GauXC::SphericalType(true)); const int nbf = static_cast(basis.nbf()); - const DensityPair density = + const auto selected_density = make_density(mol_case.name, nbf, rng, replay_dir); + if (!selected_density) continue; + const DensityPair& density = *selected_density; + ++evaluated_molecules; // A positive semidefinite scalar density guarantees a nonnegative on-grid // density; verify it explicitly rather than trusting diagonal dominance. @@ -437,13 +551,27 @@ TEST_CASE("SkalaXC baselines reproduce GauXC traditional functionals", const ReferenceResult ref = evaluate_reference( rt, mol, mg, basis, fun_case.exchcxx_id, density.Ps, density.Pz); + INFO("molecule=" << mol_case.name + << " functional=" << fun_case.skala_model + << " nbf=" << nbf << " seed=" << seed); + REQUIRE(std::isfinite(skala.exc)); + REQUIRE(std::isfinite(ref.exc)); + REQUIRE(skala.vxc_scalar.allFinite()); + REQUIRE(ref.vxc_scalar.allFinite()); + REQUIRE(skala.vxc_z.allFinite()); + REQUIRE(ref.vxc_z.allFinite()); + const double exc_err = rel_err(skala.exc, ref.exc); const double vxcs_err = matrix_rel_err(skala.vxc_scalar, ref.vxc_scalar); const double vxcz_err = matrix_rel_err(skala.vxc_z, ref.vxc_z); double grad_abs_err = 0.0, grad_max = 0.0; - REQUIRE(skala.gradient.size() == ref.gradient.size()); + REQUIRE(skala.gradient.size() == 3 * mol.size()); + REQUIRE(ref.gradient.size() == 3 * mol.size()); for (std::size_t i = 0; i < ref.gradient.size(); ++i) { + INFO("gradient component=" << i); + REQUIRE(std::isfinite(skala.gradient[i])); + REQUIRE(std::isfinite(ref.gradient[i])); grad_abs_err = std::max(grad_abs_err, std::abs(skala.gradient[i] - ref.gradient[i])); grad_max = std::max(grad_max, std::abs(ref.gradient[i])); @@ -461,10 +589,8 @@ TEST_CASE("SkalaXC baselines reproduce GauXC traditional functionals", const bool ok = exc_err < exc_tol && vxcs_err < vxc_tol && vxcz_err < vxc_tol && grad_err < grad_tol; if (!ok && is_root && !replay_dir) { - const std::string base = - std::string("skalaxc_integration_fail_density_") + mol_case.name; - Eigen::saveMarketDense(density.Ps, base + "_scalar.mtx"); - Eigen::saveMarketDense(density.Pz, base + "_z.mtx"); + const auto base = density_file_base(".", mol_case.name); + save_density(".", mol_case.name, density); std::cerr << "[skala][traditional-integration] MISMATCH for " << mol_case.name << " / " << fun_case.skala_model << ". Reproduce with SKALAXC_TEST_SEED=" << seed @@ -472,9 +598,6 @@ TEST_CASE("SkalaXC baselines reproduce GauXC traditional functionals", << base << "_{scalar,z}.mtx\n"; } - INFO("molecule=" << mol_case.name - << " functional=" << fun_case.skala_model - << " nbf=" << nbf << " seed=" << seed); INFO("EXC_skala=" << skala.exc << " EXC_ref=" << ref.exc); INFO("exc_rel_err=" << exc_err << " vxcs_rel_err=" << vxcs_err << " vxcz_rel_err=" << vxcz_err @@ -485,4 +608,7 @@ TEST_CASE("SkalaXC baselines reproduce GauXC traditional functionals", CHECK(grad_err < grad_tol); } } + INFO("No matching replay density pairs in " + << (replay_dir ? replay_dir : "")); + REQUIRE(evaluated_molecules > 0); } diff --git a/SkalaXC/tests/skalaxc_c_api_test.c b/SkalaXC/tests/skalaxc_c_api_test.c index d29618e6..fbb1b9c7 100644 --- a/SkalaXC/tests/skalaxc_c_api_test.c +++ b/SkalaXC/tests/skalaxc_c_api_test.c @@ -546,9 +546,11 @@ static int run_case(const char* path, const char* model, const char* name, skalaxc_functional_t func = NULL; skalaxc_xc_integrator_t xc = NULL; double *Ps = NULL, *Pz = NULL, *VXCs = NULL, *VXCz = NULL; - double exc_ref = 0.0, exc = 0.0, sym_err = 0.0, denom, rel_err; + double *VXCs_ref = NULL, *VXCz_ref = NULL; + double exc_ref = 0.0, exc = NAN, sym_err = 0.0, denom, rel_err; + double vxcs_error = 0.0, vxcz_error = 0.0; int64_t nbf = 0, i, j; - size_t n2 = 0; + size_t n2 = 0, index; hid_t file = -1; int rc = 1; skalaxc_status_t st; @@ -571,14 +573,22 @@ static int run_case(const char* path, const char* model, const char* name, Pz = (double*)calloc(n2, sizeof(double)); VXCs = (double*)calloc(n2, sizeof(double)); VXCz = (double*)calloc(n2, sizeof(double)); - if (!Ps || !Pz || !VXCs || !VXCz) { + VXCs_ref = (double*)calloc(n2, sizeof(double)); + VXCz_ref = (double*)calloc(n2, sizeof(double)); + if (!Ps || !Pz || !VXCs || !VXCz || !VXCs_ref || !VXCz_ref) { printf("[FAIL] %s : out of memory\n", name); goto cleanup; } + for (index = 0; index < n2; ++index) { + VXCs[index] = NAN; + VXCz[index] = NAN; + } file = H5Fopen(path, H5F_ACC_RDONLY, H5P_DEFAULT); if (file < 0 || read_doubles(file, "/DENSITY_SCALAR", Ps) || read_doubles(file, "/DENSITY_Z", Pz) || + read_doubles(file, "/VXC_SCALAR", VXCs_ref) || + read_doubles(file, "/VXC_Z", VXCz_ref) || read_doubles(file, "/EXC", &exc_ref)) { printf("[FAIL] %s : HDF5 read failed\n", name); goto cleanup; @@ -592,22 +602,50 @@ static int run_case(const char* path, const char* model, const char* name, goto cleanup; } + if (!isfinite(exc) || !isfinite(exc_ref)) { + printf("[FAIL] %s : non-finite energy or reference\n", name); + goto cleanup; + } + for (index = 0; index < n2; ++index) { + double scalar_difference, spin_difference; + if (!isfinite(VXCs[index]) || !isfinite(VXCz[index]) || + !isfinite(VXCs_ref[index]) || !isfinite(VXCz_ref[index])) { + printf("[FAIL] %s : non-finite potential or reference at index %zu\n", + name, index); + goto cleanup; + } + scalar_difference = VXCs[index] - VXCs_ref[index]; + spin_difference = VXCz[index] - VXCz_ref[index]; + vxcs_error += scalar_difference * scalar_difference; + vxcz_error += spin_difference * spin_difference; + } + vxcs_error = sqrt(vxcs_error) / (double)nbf; + vxcz_error = sqrt(vxcz_error) / (double)nbf; + for (i = 0; i < nbf; ++i) for (j = 0; j < nbf; ++j) { double d = fabs(VXCs[i * nbf + j] - VXCs[j * nbf + i]); if (d > sym_err) sym_err = d; + d = fabs(VXCz[i * nbf + j] - VXCz[j * nbf + i]); + if (d > sym_err) sym_err = d; } denom = fabs(exc_ref) > 1.0 ? fabs(exc_ref) : 1.0; rel_err = fabs(exc - exc_ref) / denom; - if (rel_err < 1e-5 && sym_err < 1e-10) { - printf("[PASS] %s : nbf=%lld EXC=%.10f (ref %.10f, rel %.2e) sym=%.2e\n", - name, (long long)nbf, exc, exc_ref, rel_err, sym_err); + if (rel_err < 1e-5 && sym_err < 1e-10 && vxcs_error < 1e-7 && + vxcz_error < 1e-10) { + printf( + "[PASS] %s : nbf=%lld EXC=%.10f (ref %.10f, rel %.2e) sym=%.2e " + "vxcs=%.2e vxcz=%.2e\n", + name, (long long)nbf, exc, exc_ref, rel_err, sym_err, vxcs_error, + vxcz_error); rc = 0; } else { - printf("[FAIL] %s : EXC=%.10f ref=%.10f rel=%.2e sym=%.2e\n", name, exc, - exc_ref, rel_err, sym_err); + printf( + "[FAIL] %s : EXC=%.10f ref=%.10f rel=%.2e sym=%.2e " + "vxcs=%.2e vxcz=%.2e\n", + name, exc, exc_ref, rel_err, sym_err, vxcs_error, vxcz_error); rc = 1; } @@ -617,6 +655,8 @@ static int run_case(const char* path, const char* model, const char* name, free(Pz); free(VXCs); free(VXCz); + free(VXCs_ref); + free(VXCz_ref); skalaxc_xc_integrator_destroy(xc); skalaxc_functional_destroy(func); skalaxc_molecular_weights_destroy(mw); diff --git a/SkalaXC/tests/skalaxc_fortran_test.F90 b/SkalaXC/tests/skalaxc_fortran_test.F90 index 5a6d65a0..ba7dc0fd 100644 --- a/SkalaXC/tests/skalaxc_fortran_test.F90 +++ b/SkalaXC/tests/skalaxc_fortran_test.F90 @@ -13,7 +13,7 @@ program skalaxc_fortran_test use, intrinsic :: iso_c_binding - use, intrinsic :: ieee_arithmetic, only: ieee_is_finite + use, intrinsic :: ieee_arithmetic, only: ieee_is_finite, ieee_value, ieee_quiet_nan use skalaxc #ifdef SKALAXC_HAS_MPI use mpi @@ -462,7 +462,9 @@ integer function run_case(path, model, name, execution_space, & type(skalaxc_functional_t) :: func type(skalaxc_xc_integrator_t) :: xc real(c_double), allocatable :: Ps(:), Pz(:), VXCs(:), VXCz(:), one(:) + real(c_double), allocatable :: VXCs_ref(:), VXCz_ref(:) real(c_double) :: exc, exc_ref, rel_err, denom, sym_err, d + real(c_double) :: vxcs_error, vxcz_error integer(c_int) :: status integer(c_int64_t) :: nbf, n2, i, j integer(hid_t) :: file_id @@ -490,13 +492,23 @@ integer function run_case(path, model, name, execution_space, & end if nbf = xc%nbf() + if (nbf <= 0) then + write (*, '(A,A,A)') '[FAIL] ', trim(name), ' : nbf <= 0' + return + end if n2 = nbf*nbf - allocate (Ps(n2), Pz(n2), VXCs(n2), VXCz(n2), one(1)) + allocate (Ps(n2), Pz(n2), VXCs(n2), VXCz(n2), one(1), & + VXCs_ref(n2), VXCz_ref(n2)) + exc = ieee_value(0.0_c_double, ieee_quiet_nan) + VXCs = exc + VXCz = exc call h5fopen_f(path, H5F_ACC_RDONLY_F, file_id, e) ok = (e == 0) if (ok) ok = read_dset(file_id, '/DENSITY_SCALAR', Ps, [int(n2, hsize_t)]) if (ok) ok = read_dset(file_id, '/DENSITY_Z', Pz, [int(n2, hsize_t)]) + if (ok) ok = read_dset(file_id, '/VXC_SCALAR', VXCs_ref, [int(n2, hsize_t)]) + if (ok) ok = read_dset(file_id, '/VXC_Z', VXCz_ref, [int(n2, hsize_t)]) if (ok) ok = read_dset(file_id, '/EXC', one, [1_hsize_t]) if (e == 0) call h5fclose_f(file_id, e) if (.not. ok) then @@ -512,6 +524,18 @@ integer function run_case(path, model, name, execution_space, & return end if + if (.not. ieee_is_finite(exc) .or. .not. ieee_is_finite(exc_ref) .or. & + .not. all(ieee_is_finite(VXCs)) .or. & + .not. all(ieee_is_finite(VXCz)) .or. & + .not. all(ieee_is_finite(VXCs_ref)) .or. & + .not. all(ieee_is_finite(VXCz_ref))) then + write (*, '(A,A,A)') '[FAIL] ', trim(name), & + ' : non-finite energy, potential, or reference' + return + end if + vxcs_error = sqrt(sum((VXCs - VXCs_ref)**2))/real(nbf, c_double) + vxcz_error = sqrt(sum((VXCz - VXCz_ref)**2))/real(nbf, c_double) + if (timing_enabled) then status = xc%diagnostics(diagnostics) active_rank = diagnostics%tasks > 0_c_int64_t .and. & @@ -571,20 +595,24 @@ integer function run_case(path, model, name, execution_space, & do i = 1, nbf d = abs(VXCs((j - 1)*nbf + i) - VXCs((i - 1)*nbf + j)) if (d > sym_err) sym_err = d + d = abs(VXCz((j - 1)*nbf + i) - VXCz((i - 1)*nbf + j)) + if (d > sym_err) sym_err = d end do end do denom = max(1.0_c_double, abs(exc_ref)) rel_err = abs(exc - exc_ref)/denom - if (rel_err < 1e-5_c_double .and. sym_err < 1e-10_c_double) then - write (*, '(A,A,A,I0,A,ES20.10,A,ES10.2,A,ES10.2)') '[PASS] ', & + if (rel_err < 1e-5_c_double .and. sym_err < 1e-10_c_double .and. & + vxcs_error < 1e-7_c_double .and. vxcz_error < 1e-10_c_double) then + write (*, '(A,A,A,I0,A,ES20.10,4(A,ES10.2))') '[PASS] ', & trim(name), ' : nbf=', nbf, ' EXC=', exc, ' rel=', rel_err, & - ' sym=', sym_err + ' sym=', sym_err, ' vxcs=', vxcs_error, ' vxcz=', vxcz_error rc = 0 else - write (*, '(A,A,A,ES20.10,A,ES10.2,A,ES10.2)') '[FAIL] ', trim(name), & - ' : EXC=', exc, ' rel=', rel_err, ' sym=', sym_err + write (*, '(A,A,A,ES20.10,4(A,ES10.2))') '[FAIL] ', trim(name), & + ' : EXC=', exc, ' rel=', rel_err, ' sym=', sym_err, & + ' vxcs=', vxcs_error, ' vxcz=', vxcz_error end if end function run_case diff --git a/SkalaXC/tests/skalaxc_public_api_test.cxx b/SkalaXC/tests/skalaxc_public_api_test.cxx index f0b49817..dec0f790 100644 --- a/SkalaXC/tests/skalaxc_public_api_test.cxx +++ b/SkalaXC/tests/skalaxc_public_api_test.cxx @@ -242,7 +242,10 @@ bool caller_owned_potential_api_works(const std::string& fixture) { spin.setConstant(-2.0); const double caller_owned_exc = built.integrator.eval_exc_vxc(density.scalar, density.spin, scalar, spin); - if (std::abs(caller_owned_exc - allocated_exc) > 1e-12 || + if (!std::isfinite(allocated_exc) || !std::isfinite(caller_owned_exc) || + !allocated_scalar.allFinite() || !allocated_spin.allFinite() || + !scalar.allFinite() || !spin.allFinite() || + std::abs(caller_owned_exc - allocated_exc) > 1e-12 || (scalar - allocated_scalar).cwiseAbs().maxCoeff() > 1e-12 || (spin - allocated_spin).cwiseAbs().maxCoeff() > 1e-12) return false; @@ -275,8 +278,12 @@ bool gradient_api_works(const std::string& fixture) { const auto aggressive_gradient = aggressive.integrator.eval_exc_grad(density.scalar, density.spin); if (gradient.size() != static_cast(3 * natoms)) return false; + if (caller_owned_gradient.size() != gradient.size()) return false; for (std::size_t i = 0; i < gradient.size(); ++i) - if (std::abs(caller_owned_gradient[i] - gradient[i]) > 1e-12) return false; + if (!std::isfinite(caller_owned_gradient[i]) || + !std::isfinite(gradient[i]) || + std::abs(caller_owned_gradient[i] - gradient[i]) > 1e-12) + return false; if (aggressive_gradient.size() != gradient.size()) return false; std::vector invalid_gradient(gradient.size() + 1, 19.0); From a60032cf00f85ddf303bdd17c3b6627210fde187 Mon Sep 17 00:00:00 2001 From: jenswehner Date: Sun, 6 Sep 2026 23:57:01 +0200 Subject: [PATCH 25/33] Fix Python container value access and assignment --- SkalaXC/python/README.md | 12 ++++++ SkalaXC/python/src/bindings/module.cxx | 38 ++++++++++------ SkalaXC/python/tests/test_values.py | 60 ++++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 14 deletions(-) create mode 100644 SkalaXC/python/tests/test_values.py diff --git a/SkalaXC/python/README.md b/SkalaXC/python/README.md index b0e23dc8..364b12bf 100644 --- a/SkalaXC/python/README.md +++ b/SkalaXC/python/README.md @@ -32,6 +32,18 @@ library was built with `SKALAXC_ENABLE_HDF5=ON` (the default), reported as `skalaxc.HDF5_ENABLED`. HDF5-disabled builds construct molecules and basis sets through `Atom`, `Shell`, and `append()` instead. +Indexing a `Molecule` or `BasisSet` returns an independent value, which remains +valid after appending elements or deleting the container. Replace an element +explicitly with item assignment; modifying a retrieved atom does not modify +the molecule: + +```python +atom = molecule[0] +atom.x = new_x +molecule[0] = atom +basis[0] = replacement_shell +``` + ```python import h5py import numpy as np diff --git a/SkalaXC/python/src/bindings/module.cxx b/SkalaXC/python/src/bindings/module.cxx index 07abf769..8708b043 100644 --- a/SkalaXC/python/src/bindings/module.cxx +++ b/SkalaXC/python/src/bindings/module.cxx @@ -357,13 +357,18 @@ NB_MODULE(_skalaxc, module) { molecule.push_back(atom); }) .def("__len__", &SkalaXC::Molecule::natoms) - .def( - "__getitem__", - [](SkalaXC::Molecule& molecule, std::size_t index) -> SkalaXC::Atom& { - if (index >= molecule.size()) throw nb::index_error(); - return molecule[index]; - }, - nb::rv_policy::reference_internal) + .def("__getitem__", + [](const SkalaXC::Molecule& molecule, + std::size_t index) -> SkalaXC::Atom { + if (index >= molecule.size()) throw nb::index_error(); + return molecule[index]; + }) + .def("__setitem__", + [](SkalaXC::Molecule& molecule, std::size_t index, + const SkalaXC::Atom& atom) { + if (index >= molecule.size()) throw nb::index_error(); + molecule[index] = atom; + }) .def_prop_ro("natoms", &SkalaXC::Molecule::natoms); nb::class_(module, "Shell") @@ -428,13 +433,18 @@ NB_MODULE(_skalaxc, module) { const Shell& shell) { basis.push_back(shell); }) .def("__len__", [](const SkalaXC::BasisSet& basis) { return basis.size(); }) - .def( - "__getitem__", - [](SkalaXC::BasisSet& basis, std::size_t index) -> Shell& { - if (index >= basis.size()) throw nb::index_error(); - return basis[index]; - }, - nb::rv_policy::reference_internal) + .def("__getitem__", + [](const SkalaXC::BasisSet& basis, + std::size_t index) -> Shell { + if (index >= basis.size()) throw nb::index_error(); + return basis[index]; + }) + .def("__setitem__", + [](SkalaXC::BasisSet& basis, std::size_t index, + const Shell& shell) { + if (index >= basis.size()) throw nb::index_error(); + basis[index] = shell; + }) .def_prop_ro("nshells", &SkalaXC::BasisSet::nshells) .def_prop_ro("nbf", &SkalaXC::BasisSet::nbf) .def_prop_ro("nbf_cart", &SkalaXC::BasisSet::nbf_cart) diff --git a/SkalaXC/python/tests/test_values.py b/SkalaXC/python/tests/test_values.py new file mode 100644 index 00000000..d2ed5a01 --- /dev/null +++ b/SkalaXC/python/tests/test_values.py @@ -0,0 +1,60 @@ +import pytest +import skalaxc + + +def test_molecule_items_are_independent_values() -> None: + molecule = skalaxc.Molecule() + molecule.append(skalaxc.Atom(1, 1.0, 2.0, 3.0)) + atom = molecule[0] + atom.x = 4.0 + assert molecule[0].x == 1.0 + + molecule[0] = atom + atom.x = 5.0 + assert molecule[0].x == 4.0 + for _ in range(128): + molecule.append(skalaxc.Atom(2, 0.0, 0.0, 0.0)) + assert (atom.atomic_number, atom.x, atom.y, atom.z) == (1, 5.0, 2.0, 3.0) + del molecule + assert atom.x == 5.0 + + +def test_basis_items_are_independent_values() -> None: + basis = skalaxc.BasisSet() + basis.append(skalaxc.Shell(0, True, [1.0], [0.5], [0.0, 1.0, 2.0])) + shell = basis[0] + basis[0] = skalaxc.Shell(1, True, [2.0], [0.75], [3.0, 4.0, 5.0]) + assert shell.angular_momentum == 0 + assert basis[0].angular_momentum == 1 + for _ in range(128): + basis.append(shell) + del basis + assert shell.nprim == 1 + assert shell.exponents == [1.0] + assert shell.coefficients == [0.5] + assert shell.center == [0.0, 1.0, 2.0] + + +def test_container_index_bounds() -> None: + molecule = skalaxc.Molecule() + basis = skalaxc.BasisSet() + atom = skalaxc.Atom(1, 0.0, 0.0, 0.0) + shell = skalaxc.Shell(0, True, [1.0], [1.0], [0.0, 0.0, 0.0]) + with pytest.raises(IndexError): + _ = molecule[0] + with pytest.raises(IndexError): + molecule[0] = atom + with pytest.raises(IndexError): + _ = basis[0] + with pytest.raises(IndexError): + basis[0] = shell + molecule.append(atom) + basis.append(shell) + with pytest.raises(IndexError): + _ = molecule[1] + with pytest.raises(IndexError): + molecule[1] = atom + with pytest.raises(IndexError): + _ = basis[1] + with pytest.raises(IndexError): + basis[1] = shell From 575ca43fb8dca872603a879f197ebcdee9ee2a11 Mon Sep 17 00:00:00 2001 From: jenswehner Date: Mon, 7 Sep 2026 00:04:27 +0200 Subject: [PATCH 26/33] Remove unsupported LKO molecular weights from public APIs --- SkalaXC/README.md | 4 ++++ SkalaXC/include/skalaxc/c/enums.h | 7 +++---- SkalaXC/include/skalaxc/skalaxc.hpp | 4 +++- SkalaXC/python/src/bindings/module.cxx | 3 +-- SkalaXC/python/tests/test_values.py | 6 ++++++ SkalaXC/src/c-api/skalaxc_c_api.cxx | 2 -- SkalaXC/src/fortran/skalaxc.F90 | 5 +---- SkalaXC/src/skalaxc_api.cxx | 3 +-- SkalaXC/tests/skalaxc_c_api_test.c | 9 +++++++++ SkalaXC/tests/skalaxc_fortran_test.F90 | 13 +++++++++++++ SkalaXC/tests/skalaxc_public_api_test.cxx | 9 +++++++-- 11 files changed, 48 insertions(+), 17 deletions(-) diff --git a/SkalaXC/README.md b/SkalaXC/README.md index 1adb9386..99b8d2c8 100644 --- a/SkalaXC/README.md +++ b/SkalaXC/README.md @@ -12,6 +12,10 @@ The complete validated capability is **host (CPU)** evaluation of the LDA, GGA, and kinetic-energy-dependent meta-GGA Skala models. An optional CUDA backend is available with the limitations described below. +Host molecular weights support Becke and SSF (the default); CUDA supports SSF. +LKO is not exposed: GauXC lacks its nuclear weight derivatives and reorders +tasks in a way that invalidates SkalaXC's raw-weight indexing. + --- ## Layout and naming diff --git a/SkalaXC/include/skalaxc/c/enums.h b/SkalaXC/include/skalaxc/c/enums.h index 17b2574d..4201325d 100644 --- a/SkalaXC/include/skalaxc/c/enums.h +++ b/SkalaXC/include/skalaxc/c/enums.h @@ -69,10 +69,9 @@ enum SkalaXC_DomainBatchMode { * @brief XC weight partitioning scheme (mirrors SkalaXC::XCWeightAlg). */ enum SkalaXC_XCWeightAlg { - SkalaXC_XCWeightAlg_NOTPARTITIONED, ///< Weights are not partitioned - SkalaXC_XCWeightAlg_Becke, ///< Becke partitioning - SkalaXC_XCWeightAlg_SSF, ///< Stratmann-Scuseria-Frisch (default) - SkalaXC_XCWeightAlg_LKO ///< Laqua-Kussmann-Ochsenfeld + SkalaXC_XCWeightAlg_NOTPARTITIONED = 0, ///< Weights are not partitioned + SkalaXC_XCWeightAlg_Becke = 1, ///< Becke partitioning + SkalaXC_XCWeightAlg_SSF = 2 ///< Stratmann-Scuseria-Frisch (default) }; #ifdef __cplusplus diff --git a/SkalaXC/include/skalaxc/skalaxc.hpp b/SkalaXC/include/skalaxc/skalaxc.hpp index c6262b36..8e0de816 100644 --- a/SkalaXC/include/skalaxc/skalaxc.hpp +++ b/SkalaXC/include/skalaxc/skalaxc.hpp @@ -352,7 +352,9 @@ enum class PruningScheme { Unpruned, Robust, Treutler }; enum class ExecutionSpace { Host, Device }; /** @brief XC weight partitioning scheme (mirrors GauXC::XCWeightAlg). */ -enum class XCWeightAlg { NOTPARTITIONED, Becke, SSF, LKO }; +// LKO lacks nuclear weight derivatives and reorders tasks, breaking alignment +// with SkalaXC's separately stored raw quadrature weights. +enum class XCWeightAlg { NOTPARTITIONED = 0, Becke = 1, SSF = 2 }; // =========================================================================== // Settings value types (mirror GauXC). diff --git a/SkalaXC/python/src/bindings/module.cxx b/SkalaXC/python/src/bindings/module.cxx index 8708b043..3a151787 100644 --- a/SkalaXC/python/src/bindings/module.cxx +++ b/SkalaXC/python/src/bindings/module.cxx @@ -258,8 +258,7 @@ NB_MODULE(_skalaxc, module) { nb::enum_(module, "XCWeightAlgorithm") .value("NOT_PARTITIONED", SkalaXC::XCWeightAlg::NOTPARTITIONED) .value("BECKE", SkalaXC::XCWeightAlg::Becke) - .value("SSF", SkalaXC::XCWeightAlg::SSF) - .value("LKO", SkalaXC::XCWeightAlg::LKO); + .value("SSF", SkalaXC::XCWeightAlg::SSF); nb::enum_(module, "TimingStatus") .value("UNAVAILABLE", SkalaXC::TimingStatus::Unavailable) .value("PENDING", SkalaXC::TimingStatus::Pending) diff --git a/SkalaXC/python/tests/test_values.py b/SkalaXC/python/tests/test_values.py index d2ed5a01..603d0c90 100644 --- a/SkalaXC/python/tests/test_values.py +++ b/SkalaXC/python/tests/test_values.py @@ -2,6 +2,12 @@ import skalaxc +def test_supported_weight_algorithms() -> None: + assert skalaxc.XCWeightAlgorithm.BECKE.value == 1 + assert skalaxc.XCWeightAlgorithm.SSF.value == 2 + assert not hasattr(skalaxc.XCWeightAlgorithm, "LKO") + + def test_molecule_items_are_independent_values() -> None: molecule = skalaxc.Molecule() molecule.append(skalaxc.Atom(1, 1.0, 2.0, 3.0)) diff --git a/SkalaXC/src/c-api/skalaxc_c_api.cxx b/SkalaXC/src/c-api/skalaxc_c_api.cxx index 161146cd..f8ade8b7 100644 --- a/SkalaXC/src/c-api/skalaxc_c_api.cxx +++ b/SkalaXC/src/c-api/skalaxc_c_api.cxx @@ -213,8 +213,6 @@ SkalaXC::XCWeightAlg to_weight(const enum SkalaXC_XCWeightAlg& a) { return SkalaXC::XCWeightAlg::NOTPARTITIONED; case SkalaXC_XCWeightAlg_Becke: return SkalaXC::XCWeightAlg::Becke; - case SkalaXC_XCWeightAlg_LKO: - return SkalaXC::XCWeightAlg::LKO; case SkalaXC_XCWeightAlg_SSF: return SkalaXC::XCWeightAlg::SSF; default: diff --git a/SkalaXC/src/fortran/skalaxc.F90 b/SkalaXC/src/fortran/skalaxc.F90 index 1a497ea5..9b99ccd4 100644 --- a/SkalaXC/src/fortran/skalaxc.F90 +++ b/SkalaXC/src/fortran/skalaxc.F90 @@ -143,7 +143,7 @@ module skalaxc & skalaxc_domainbatchmode = skalaxc_domainbatchmode_enum() public :: skalaxc_xcweightalg_notpartitioned, skalaxc_xcweightalg_becke, & - & skalaxc_xcweightalg_ssf, skalaxc_xcweightalg_lko + & skalaxc_xcweightalg_ssf enum, bind(c) !> @brief Weights are not partitioned enumerator :: skalaxc_xcweightalg_notpartitioned @@ -151,8 +151,6 @@ module skalaxc enumerator :: skalaxc_xcweightalg_becke !> @brief Stratmann-Scuseria-Frisch (default) enumerator :: skalaxc_xcweightalg_ssf - !> @brief Laqua-Kussmann-Ochsenfeld - enumerator :: skalaxc_xcweightalg_lko end enum !> @brief Named-constant bundle (e.g. skalaxc_xcweightalg%ssf). @@ -160,7 +158,6 @@ module skalaxc integer(c_int) :: notpartitioned = skalaxc_xcweightalg_notpartitioned integer(c_int) :: becke = skalaxc_xcweightalg_becke integer(c_int) :: ssf = skalaxc_xcweightalg_ssf - integer(c_int) :: lko = skalaxc_xcweightalg_lko end type skalaxc_xcweightalg_enum type(skalaxc_xcweightalg_enum), parameter, public :: & & skalaxc_xcweightalg = skalaxc_xcweightalg_enum() diff --git a/SkalaXC/src/skalaxc_api.cxx b/SkalaXC/src/skalaxc_api.cxx index 295c3965..a1417bfd 100644 --- a/SkalaXC/src/skalaxc_api.cxx +++ b/SkalaXC/src/skalaxc_api.cxx @@ -246,8 +246,6 @@ GauXC::XCWeightAlg to_gauxc(XCWeightAlg a) { return GauXC::XCWeightAlg::Becke; case XCWeightAlg::SSF: return GauXC::XCWeightAlg::SSF; - case XCWeightAlg::LKO: - return GauXC::XCWeightAlg::LKO; } throw Exception("Unknown SkalaXC XCWeightAlg"); } @@ -471,6 +469,7 @@ MolecularWeightsFactory::MolecularWeightsFactory( : ex_(ex), kernel_name_(std::move(kernel_name)), settings_(settings) {} MolecularWeights MolecularWeightsFactory::get_instance() { + (void)to_gauxc(settings_.weight_alg); #ifndef SKALAXC_HAS_CUDA if (ex_ == ExecutionSpace::Device) throw Exception("SkalaXC was built without CUDA support"); diff --git a/SkalaXC/tests/skalaxc_c_api_test.c b/SkalaXC/tests/skalaxc_c_api_test.c index fbb1b9c7..8cd212db 100644 --- a/SkalaXC/tests/skalaxc_c_api_test.c +++ b/SkalaXC/tests/skalaxc_c_api_test.c @@ -283,6 +283,15 @@ static int run_invalid_enum_contracts(const char* path, int* total) { check_invalid_enum("weight execution space", status, output == NULL, "invalid execution space", total); } + { + skalaxc_molecular_weights_t output = NULL; + status = skalaxc_molecular_weights_create( + SkalaXC_ExecutionSpace_Host, (enum SkalaXC_XCWeightAlg)3, &output); + failures += + check_invalid_enum("removed weight algorithm", status, output == NULL, + "invalid XC weight algorithm", total); + skalaxc_molecular_weights_destroy(output); + } { skalaxc_molecular_weights_t output = (skalaxc_molecular_weights_t)&sentinel; status = skalaxc_molecular_weights_create( diff --git a/SkalaXC/tests/skalaxc_fortran_test.F90 b/SkalaXC/tests/skalaxc_fortran_test.F90 index ba7dc0fd..e570df8b 100644 --- a/SkalaXC/tests/skalaxc_fortran_test.F90 +++ b/SkalaXC/tests/skalaxc_fortran_test.F90 @@ -50,6 +50,19 @@ program skalaxc_fortran_test failures = 0 total = 0 + block + type(skalaxc_molecular_weights_t) :: weights + integer(c_int) :: status + status = weights%create(skalaxc_executionspace%host, 3_c_int) + if (status == SKALAXC_INVALID_ARGUMENT .and. .not. weights%is_valid()) then + write (*, '(A)') '[PASS] removed weight algorithm rejected' + else + write (*, '(A)') '[FAIL] removed weight algorithm rejected' + failures = failures + 1 + end if + total = total + 1 + end block + block character(len=:), allocatable :: version version = skalaxc_version() diff --git a/SkalaXC/tests/skalaxc_public_api_test.cxx b/SkalaXC/tests/skalaxc_public_api_test.cxx index dec0f790..70b8275d 100644 --- a/SkalaXC/tests/skalaxc_public_api_test.cxx +++ b/SkalaXC/tests/skalaxc_public_api_test.cxx @@ -437,11 +437,16 @@ int main() { SkalaXC::AtomicGridSizeDefault::SuperFineGrid, SkalaXC::XCWeightAlg::Becke}, true}, - {"treutler/mhl/gm3/lko-weights", + {"treutler/mhl/gm3/ssf-weights", {SkalaXC::PruningScheme::Treutler, 256, SkalaXC::RadialQuad::MurrayHandyLaming, - SkalaXC::AtomicGridSizeDefault::GM3, SkalaXC::XCWeightAlg::LKO}, + SkalaXC::AtomicGridSizeDefault::GM3, SkalaXC::XCWeightAlg::SSF}, true}, + {"removed weight algorithm rejected", + {SkalaXC::PruningScheme::Unpruned, 512, SkalaXC::RadialQuad::MuraKnowles, + SkalaXC::AtomicGridSizeDefault::FineGrid, + static_cast(3)}, + false}, {"unpruned/treutler-ahlrichs/gm5/ssf", {SkalaXC::PruningScheme::Unpruned, 64, SkalaXC::RadialQuad::TreutlerAhlrichs, From 7d99b5f413b34c1a6aa60a835f5cee9dae2cecaf Mon Sep 17 00:00:00 2001 From: jenswehner Date: Mon, 7 Sep 2026 00:57:15 +0200 Subject: [PATCH 27/33] Coordinate MPI evaluation failures across runtime ranks --- SkalaXC/README.md | 17 +- SkalaXC/src/device/skala_device_driver.cxx | 662 +++++++++--------- SkalaXC/src/host/collective_error.hpp | 75 ++ SkalaXC/src/host/skala_host_driver.cxx | 228 +++--- SkalaXC/tests/CMakeLists.txt | 9 + SkalaXC/tests/README.md | 4 +- SkalaXC/tests/skala_host_mpi_test.cxx | 63 ++ SkalaXC/tests/skala_mpi_subcomm_unit_test.cxx | 71 ++ 8 files changed, 689 insertions(+), 440 deletions(-) create mode 100644 SkalaXC/src/host/collective_error.hpp diff --git a/SkalaXC/README.md b/SkalaXC/README.md index 99b8d2c8..c9e8f605 100644 --- a/SkalaXC/README.md +++ b/SkalaXC/README.md @@ -100,9 +100,20 @@ MPI rank. That rank constructs its features, runs its own model and autograd, maps the derivatives back to local tasks, and assembles local AO or nuclear-gradient contributions. OpenMP parallelizes atomic-grid generation and screening; the CUDA backend keeps collocation and assembly work on the selected -device. MPI communication is reserved for the final EXC, VXC, electron-count, -and gradient reductions; model inputs and derivatives are not gathered or -scattered. +device. MPI communication during evaluation consists of a failure-status +agreement followed by the final EXC, VXC, electron-count, and gradient reductions; +model inputs and derivatives are not gathered or scattered. + +All ranks, including idle ranks, participate in the failure-status agreement +after local work. If a rank-local exception reaches the evaluation handler, the +lowest failing runtime rank broadcasts its error message (up to 2047 bytes), and +every rank reports failure instead of entering the numerical reductions. Outputs +from a failed evaluation must not be used. In serial execution, the original +exception propagates through the usual public API error translation. +Callers must invoke the same evaluation on every rank with valid integrator +handles, buffer layouts, and extents: argument errors raised before the handler +remain rank-local. This mechanism does not recover from process crashes, MPI +failures, or exceptions escaping OpenMP worker regions. During integrator construction, rank zero of the runtime communicator resolves and reads the selected TorchScript archive. SkalaXC broadcasts the archive diff --git a/SkalaXC/src/device/skala_device_driver.cxx b/SkalaXC/src/device/skala_device_driver.cxx index 093e393f..fab1eb16 100644 --- a/SkalaXC/src/device/skala_device_driver.cxx +++ b/SkalaXC/src/device/skala_device_driver.cxx @@ -9,6 +9,7 @@ #include "device/model_grid_exchange.hpp" #include "device/xc_device_aos_data.hpp" #include "exceptions.hpp" +#include "host/collective_error.hpp" #include "host/mpi_wrapper.hpp" #include "host/skala_util.hpp" #include "skala_model.hpp" @@ -178,175 +179,180 @@ SkalaDeviceDriver::~SkalaDeviceDriver() noexcept = default; double SkalaDeviceDriver::eval_exc_vxc_uks( ConstColMajorMatrixMap scalar_density, ConstColMajorMatrixMap spin_density, ColMajorMatrixMap scalar_potential, ColMajorMatrixMap spin_potential) { - activate_cuda_device(device_id_); - auto runtime = GauXC::detail::as_device_runtime(lb_.runtime()); - const c10::cuda::CUDAStreamGuard stream_guard( - torch_stream_for_runtime(runtime, device_id_)); - diagnostics_.increment_exc_vxc_calls(); - const auto& basis = lb_.basis(); - const Eigen::Index basis_size = basis.nbf(); - if (!valid_ao_matrix(scalar_density, basis_size) || - !valid_ao_matrix(spin_density, basis_size) || - !valid_ao_matrix(scalar_potential, basis_size) || - !valid_ao_matrix(spin_potential, basis_size)) - SKALAXC_EXCEPTION( - "UKS density and potential matrices must be dense nbf x nbf " - "column-major views"); - log_evaluation_start("exc_vxc", scalar_density, spin_density); - - auto* device_lwd = dynamic_cast(lwd_.get()); - if (!device_lwd) SKALAXC_EXCEPTION("Expected a LocalDeviceWorkDriver"); - auto device_data = device_lwd->create_device_data(runtime); - auto* aos_data = dynamic_cast(device_data.get()); - if (!aos_data) SKALAXC_EXCEPTION("Expected Scheme1 CUDA device data"); - - GauXC::integrator_term_tracker terms; - terms.exc_vxc = true; - terms.ks_scheme = GauXC::UKS; - terms.xc_approx = model_approximation(*model_); - const bool is_mgga = model_->is_mgga(); - const bool needs_gradient = model_->is_gga() || is_mgga; - - auto& tasks = lb_.get_tasks(); - GauXC::BasisSetMap basis_map(basis, lb_.molecule()); - device_data->populate_submat_maps(basis.nbf(), tasks.begin(), tasks.end(), - basis_map); - device_data->reset_allocations(); - device_data->allocate_static_data_exc_vxc(basis.nbf(), basis.nshells(), terms, - true); - device_data->send_static_data_density_basis( - scalar_density.data(), basis.nbf(), spin_density.data(), basis.nbf(), - nullptr, 0, nullptr, 0, basis); - device_data->zero_exc_vxc_integrands(terms); - - const auto model_device = - c10::Device(c10::DeviceType::CUDA, device_id_.raw()); - FeatureDict local_features = model_grid_exchange_->prepare_features( - model_->feature_keys(), model_device); - - auto task_it = tasks.begin(); - while (task_it != tasks.end()) { - const auto batch_begin = task_it; - task_it = - device_data->generate_buffers(terms, basis_map, task_it, tasks.end()); - if (needs_gradient) - device_lwd->eval_collocation_gradient(device_data.get()); - else - device_lwd->eval_collocation(device_data.get()); - - const bool need_xmat_gradient = is_mgga; - for (const auto density : {GauXC::DEN_S, GauXC::DEN_Z}) { - device_lwd->eval_xmat(1.0, device_data.get(), need_xmat_gradient, - density); + double exc_value = 0.0; + mpi::collective_try(lb_.runtime(), [&] { + activate_cuda_device(device_id_); + auto runtime = GauXC::detail::as_device_runtime(lb_.runtime()); + const c10::cuda::CUDAStreamGuard stream_guard( + torch_stream_for_runtime(runtime, device_id_)); + diagnostics_.increment_exc_vxc_calls(); + const auto& basis = lb_.basis(); + const Eigen::Index basis_size = basis.nbf(); + if (!valid_ao_matrix(scalar_density, basis_size) || + !valid_ao_matrix(spin_density, basis_size) || + !valid_ao_matrix(scalar_potential, basis_size) || + !valid_ao_matrix(spin_potential, basis_size)) + SKALAXC_EXCEPTION( + "UKS density and potential matrices must be dense nbf x nbf " + "column-major views"); + log_evaluation_start("exc_vxc", scalar_density, spin_density); + + auto* device_lwd = dynamic_cast(lwd_.get()); + if (!device_lwd) SKALAXC_EXCEPTION("Expected a LocalDeviceWorkDriver"); + auto device_data = device_lwd->create_device_data(runtime); + auto* aos_data = dynamic_cast(device_data.get()); + if (!aos_data) SKALAXC_EXCEPTION("Expected Scheme1 CUDA device data"); + + GauXC::integrator_term_tracker terms; + terms.exc_vxc = true; + terms.ks_scheme = GauXC::UKS; + terms.xc_approx = model_approximation(*model_); + const bool is_mgga = model_->is_mgga(); + const bool needs_gradient = model_->is_gga() || is_mgga; + + auto& tasks = lb_.get_tasks(); + GauXC::BasisSetMap basis_map(basis, lb_.molecule()); + device_data->populate_submat_maps(basis.nbf(), tasks.begin(), tasks.end(), + basis_map); + device_data->reset_allocations(); + device_data->allocate_static_data_exc_vxc(basis.nbf(), basis.nshells(), + terms, true); + device_data->send_static_data_density_basis( + scalar_density.data(), basis.nbf(), spin_density.data(), basis.nbf(), + nullptr, 0, nullptr, 0, basis); + device_data->zero_exc_vxc_integrands(terms); + + const auto model_device = + c10::Device(c10::DeviceType::CUDA, device_id_.raw()); + FeatureDict local_features = model_grid_exchange_->prepare_features( + model_->feature_keys(), model_device); + + auto task_it = tasks.begin(); + while (task_it != tasks.end()) { + const auto batch_begin = task_it; + task_it = + device_data->generate_buffers(terms, basis_map, task_it, tasks.end()); + if (needs_gradient) + device_lwd->eval_collocation_gradient(device_data.get()); + else + device_lwd->eval_collocation(device_data.get()); + + const bool need_xmat_gradient = is_mgga; + for (const auto density : {GauXC::DEN_S, GauXC::DEN_Z}) { + device_lwd->eval_xmat(1.0, device_data.get(), need_xmat_gradient, + density); + if (is_mgga) + device_lwd->eval_vvars_mgga(device_data.get(), density, false); + else if (model_->is_gga()) + device_lwd->eval_vvars_gga(device_data.get(), density); + else + device_lwd->eval_vvars_lda(device_data.get(), density); + } if (is_mgga) - device_lwd->eval_vvars_mgga(device_data.get(), density, false); + device_lwd->eval_uvars_mgga(device_data.get(), GauXC::UKS, false); else if (model_->is_gga()) - device_lwd->eval_vvars_gga(device_data.get(), density); + device_lwd->eval_uvars_gga(device_data.get(), GauXC::UKS); else - device_lwd->eval_vvars_lda(device_data.get(), density); - } - if (is_mgga) - device_lwd->eval_uvars_mgga(device_data.get(), GauXC::UKS, false); - else if (model_->is_gga()) - device_lwd->eval_uvars_gga(device_data.get(), GauXC::UKS); - else - device_lwd->eval_uvars_lda(device_data.get(), GauXC::UKS); - - model_grid_exchange_->pack_post_uvars_features( - *aos_data, - types::TaskIndex{static_cast( - std::distance(tasks.begin(), batch_begin))}, - local_features); - } + device_lwd->eval_uvars_lda(device_data.get(), GauXC::UKS); - FeatureDict local_potentials = model_grid_exchange_->prepare_local_potentials( - needs_gradient, is_mgga, model_device); - at::Tensor exc_value_device = torch::zeros( - {1}, torch::TensorOptions().dtype(torch::kFloat64).device(model_device)); - std::vector finite_checks; - std::size_t batch_index = 0; - for (const auto& batch : model_grid_exchange_->local_batches()) { - FeatureDict features = model_grid_exchange_->prepare_local_batch_features( - batch, local_features, lb_.molecule(), model_->feature_keys(), - model_device, false); - for (const auto& item : features) { - const auto& tensor = item.value(); - if (tensor.is_floating_point()) - finite_checks.push_back({"model feature '" + item.key() + - "' in batch " + - std::to_string(batch_index), - model_tensor_finite_check(tensor)}); - } - auto exc = - evaluate_cuda_model_energy(*model_, features, device_id_, batch_index); - finite_checks.push_back( - {"model energy in batch " + std::to_string(batch_index), - model_tensor_finite_check(exc)}); - exc.backward(); - for (const auto& item : features) { - const auto gradient = item.value().grad(); - if (gradient.defined()) - finite_checks.push_back({"model gradient for feature '" + item.key() + - "' in batch " + - std::to_string(batch_index), - model_tensor_finite_check(gradient)}); - } - { - at::NoGradGuard no_grad; - exc_value_device.add_(exc.detach()); + model_grid_exchange_->pack_post_uvars_features( + *aos_data, + types::TaskIndex{static_cast( + std::distance(tasks.begin(), batch_begin))}, + local_features); } - model_grid_exchange_->store_local_batch_potentials( - batch, needs_gradient, is_mgga, features, local_potentials); - diagnostics_.record_model_batch(types::DomainCount{batch.atoms.size()}); - ++batch_index; - } - const at::Tensor all_model_values_finite = - aggregate_finite_checks(finite_checks); - - task_it = tasks.begin(); - while (task_it != tasks.end()) { - const auto batch_begin = task_it; - task_it = - device_data->generate_buffers(terms, basis_map, task_it, tasks.end()); - model_grid_exchange_->unpack_potentials( - *aos_data, - types::TaskIndex{static_cast( - std::distance(tasks.begin(), batch_begin))}, - local_potentials); - if (needs_gradient) - device_lwd->eval_collocation_gradient(device_data.get()); - else - device_lwd->eval_collocation(device_data.get()); - - std::int32_t max_points = 0; - std::int32_t max_basis = 0; - for (const auto& task : aos_data->host_device_tasks) { - max_points = std::max(max_points, static_cast(task.npts)); - max_basis = std::max(max_basis, - static_cast(task.bfn_screening.nbe)); + + FeatureDict local_potentials = + model_grid_exchange_->prepare_local_potentials(needs_gradient, is_mgga, + model_device); + at::Tensor exc_value_device = torch::zeros( + {1}, + torch::TensorOptions().dtype(torch::kFloat64).device(model_device)); + std::vector finite_checks; + std::size_t batch_index = 0; + for (const auto& batch : model_grid_exchange_->local_batches()) { + FeatureDict features = model_grid_exchange_->prepare_local_batch_features( + batch, local_features, lb_.molecule(), model_->feature_keys(), + model_device, false); + for (const auto& item : features) { + const auto& tensor = item.value(); + if (tensor.is_floating_point()) + finite_checks.push_back({"model feature '" + item.key() + + "' in batch " + + std::to_string(batch_index), + model_tensor_finite_check(tensor)}); + } + auto exc = evaluate_cuda_model_energy(*model_, features, device_id_, + batch_index); + finite_checks.push_back( + {"model energy in batch " + std::to_string(batch_index), + model_tensor_finite_check(exc)}); + exc.backward(); + for (const auto& item : features) { + const auto gradient = item.value().grad(); + if (gradient.defined()) + finite_checks.push_back({"model gradient for feature '" + item.key() + + "' in batch " + + std::to_string(batch_index), + model_tensor_finite_check(gradient)}); + } + { + at::NoGradGuard no_grad; + exc_value_device.add_(exc.detach()); + } + model_grid_exchange_->store_local_batch_potentials( + batch, needs_gradient, is_mgga, features, local_potentials); + diagnostics_.record_model_batch(types::DomainCount{batch.atoms.size()}); + ++batch_index; } - for (const auto density : {GauXC::DEN_S, GauXC::DEN_Z}) { - zmat_skala_vxc(aos_data->host_device_tasks.size(), max_basis, max_points, - aos_data->aos_stack.device_tasks, terms.xc_approx, density, - device_data->queue()); - if (is_mgga) - device_lwd->eval_mmat_mgga_vxc(device_data.get(), GauXC::UKS, false, - density); - device_lwd->inc_vxc(device_data.get(), density, is_mgga); + const at::Tensor all_model_values_finite = + aggregate_finite_checks(finite_checks); + + task_it = tasks.begin(); + while (task_it != tasks.end()) { + const auto batch_begin = task_it; + task_it = + device_data->generate_buffers(terms, basis_map, task_it, tasks.end()); + model_grid_exchange_->unpack_potentials( + *aos_data, + types::TaskIndex{static_cast( + std::distance(tasks.begin(), batch_begin))}, + local_potentials); + if (needs_gradient) + device_lwd->eval_collocation_gradient(device_data.get()); + else + device_lwd->eval_collocation(device_data.get()); + + std::int32_t max_points = 0; + std::int32_t max_basis = 0; + for (const auto& task : aos_data->host_device_tasks) { + max_points = std::max(max_points, static_cast(task.npts)); + max_basis = std::max(max_basis, + static_cast(task.bfn_screening.nbe)); + } + for (const auto density : {GauXC::DEN_S, GauXC::DEN_Z}) { + zmat_skala_vxc(aos_data->host_device_tasks.size(), max_basis, + max_points, aos_data->aos_stack.device_tasks, + terms.xc_approx, density, device_data->queue()); + if (is_mgga) + device_lwd->eval_mmat_mgga_vxc(device_data.get(), GauXC::UKS, false, + density); + device_lwd->inc_vxc(device_data.get(), density, is_mgga); + } } - } - device_lwd->symmetrize_vxc(device_data.get(), GauXC::DEN_S); - device_lwd->symmetrize_vxc(device_data.get(), GauXC::DEN_Z); - - double device_exc = 0.0; - double electron_count = 0.0; - device_data->retrieve_exc_vxc_integrands( - &device_exc, &electron_count, scalar_potential.data(), basis.nbf(), - spin_potential.data(), basis.nbf(), nullptr, 0, nullptr, 0); - runtime.device_backend()->master_queue_synchronize(); - validate_finite_checks(finite_checks, all_model_values_finite); - double exc_value = exc_value_device.item(); + device_lwd->symmetrize_vxc(device_data.get(), GauXC::DEN_S); + device_lwd->symmetrize_vxc(device_data.get(), GauXC::DEN_Z); + + double device_exc = 0.0; + double electron_count = 0.0; + device_data->retrieve_exc_vxc_integrands( + &device_exc, &electron_count, scalar_potential.data(), basis.nbf(), + spin_potential.data(), basis.nbf(), nullptr, 0, nullptr, 0); + runtime.device_backend()->master_queue_synchronize(); + validate_finite_checks(finite_checks, all_model_values_finite); + exc_value = exc_value_device.item(); + }); #ifdef GAUXC_HAS_MPI if (lb_.runtime().comm_size() > 1) { mpi::allreduce_sum(scalar_potential, lb_.runtime()); @@ -364,179 +370,183 @@ double SkalaDeviceDriver::eval_exc_vxc_uks( void SkalaDeviceDriver::eval_exc_grad_uks(ConstColMajorMatrixMap scalar_density, ConstColMajorMatrixMap spin_density, RowMajorMatrixMap gradient) { - activate_cuda_device(device_id_); - auto runtime = GauXC::detail::as_device_runtime(lb_.runtime()); - const c10::cuda::CUDAStreamGuard stream_guard( - torch_stream_for_runtime(runtime, device_id_)); - diagnostics_.increment_exc_gradient_calls(); - const auto& basis = lb_.basis(); - const Eigen::Index basis_size = basis.nbf(); - if (!valid_ao_matrix(scalar_density, basis_size) || - !valid_ao_matrix(spin_density, basis_size) || - gradient.rows() != static_cast(lb_.molecule().size()) || - gradient.cols() != direction_dimension || gradient.innerStride() != 1 || - gradient.outerStride() != direction_dimension) - SKALAXC_EXCEPTION("Invalid density matrix or atom-major gradient view"); - log_evaluation_start("exc_gradient", scalar_density, spin_density); - - auto* device_lwd = dynamic_cast(lwd_.get()); - if (!device_lwd) SKALAXC_EXCEPTION("Expected a LocalDeviceWorkDriver"); - auto device_data = device_lwd->create_device_data(runtime); - auto* aos_data = dynamic_cast(device_data.get()); - if (!aos_data) SKALAXC_EXCEPTION("Expected Scheme1 CUDA device data"); - - GauXC::integrator_term_tracker terms; - terms.exc_grad = true; - terms.weights = true; - terms.ks_scheme = GauXC::UKS; - terms.xc_approx = model_approximation(*model_); - const bool is_mgga = model_->is_mgga(); - const bool needs_gradient = model_->is_gga() || is_mgga; - - auto& tasks = lb_.get_tasks(); - GauXC::BasisSetMap basis_map(basis, lb_.molecule()); - device_data->populate_submat_maps(basis.nbf(), tasks.begin(), tasks.end(), - basis_map); - device_data->reset_allocations(); - device_data->allocate_static_data_exc_grad(basis.nbf(), basis.nshells(), - lb_.molecule().size(), terms); - device_data->send_static_data_density_basis( - scalar_density.data(), basis.nbf(), spin_density.data(), basis.nbf(), - nullptr, 0, nullptr, 0, basis); - device_data->allocate_static_data_weights(lb_.molecule().size()); - device_data->send_static_data_weights(lb_.molecule(), lb_.molmeta()); - device_data->zero_exc_grad_integrands(); - - const auto model_device = - c10::Device(c10::DeviceType::CUDA, device_id_.raw()); - FeatureDict local_features = model_grid_exchange_->prepare_features( - model_->feature_keys(), model_device); - auto task_it = tasks.begin(); - while (task_it != tasks.end()) { - const auto batch_begin = task_it; - task_it = - device_data->generate_buffers(terms, basis_map, task_it, tasks.end()); - if (needs_gradient) - device_lwd->eval_collocation_hessian(device_data.get()); - else - device_lwd->eval_collocation_gradient(device_data.get()); - - const bool need_xmat_gradient = needs_gradient; - for (const auto density : {GauXC::DEN_S, GauXC::DEN_Z}) { - device_lwd->eval_xmat(1.0, device_data.get(), need_xmat_gradient, - density); + mpi::collective_try(lb_.runtime(), [&] { + activate_cuda_device(device_id_); + auto runtime = GauXC::detail::as_device_runtime(lb_.runtime()); + const c10::cuda::CUDAStreamGuard stream_guard( + torch_stream_for_runtime(runtime, device_id_)); + diagnostics_.increment_exc_gradient_calls(); + const auto& basis = lb_.basis(); + const Eigen::Index basis_size = basis.nbf(); + if (!valid_ao_matrix(scalar_density, basis_size) || + !valid_ao_matrix(spin_density, basis_size) || + gradient.rows() != static_cast(lb_.molecule().size()) || + gradient.cols() != direction_dimension || gradient.innerStride() != 1 || + gradient.outerStride() != direction_dimension) + SKALAXC_EXCEPTION("Invalid density matrix or atom-major gradient view"); + log_evaluation_start("exc_gradient", scalar_density, spin_density); + + auto* device_lwd = dynamic_cast(lwd_.get()); + if (!device_lwd) SKALAXC_EXCEPTION("Expected a LocalDeviceWorkDriver"); + auto device_data = device_lwd->create_device_data(runtime); + auto* aos_data = dynamic_cast(device_data.get()); + if (!aos_data) SKALAXC_EXCEPTION("Expected Scheme1 CUDA device data"); + + GauXC::integrator_term_tracker terms; + terms.exc_grad = true; + terms.weights = true; + terms.ks_scheme = GauXC::UKS; + terms.xc_approx = model_approximation(*model_); + const bool is_mgga = model_->is_mgga(); + const bool needs_gradient = model_->is_gga() || is_mgga; + + auto& tasks = lb_.get_tasks(); + GauXC::BasisSetMap basis_map(basis, lb_.molecule()); + device_data->populate_submat_maps(basis.nbf(), tasks.begin(), tasks.end(), + basis_map); + device_data->reset_allocations(); + device_data->allocate_static_data_exc_grad(basis.nbf(), basis.nshells(), + lb_.molecule().size(), terms); + device_data->send_static_data_density_basis( + scalar_density.data(), basis.nbf(), spin_density.data(), basis.nbf(), + nullptr, 0, nullptr, 0, basis); + device_data->allocate_static_data_weights(lb_.molecule().size()); + device_data->send_static_data_weights(lb_.molecule(), lb_.molmeta()); + device_data->zero_exc_grad_integrands(); + + const auto model_device = + c10::Device(c10::DeviceType::CUDA, device_id_.raw()); + FeatureDict local_features = model_grid_exchange_->prepare_features( + model_->feature_keys(), model_device); + auto task_it = tasks.begin(); + while (task_it != tasks.end()) { + const auto batch_begin = task_it; + task_it = + device_data->generate_buffers(terms, basis_map, task_it, tasks.end()); + if (needs_gradient) + device_lwd->eval_collocation_hessian(device_data.get()); + else + device_lwd->eval_collocation_gradient(device_data.get()); + + const bool need_xmat_gradient = needs_gradient; + for (const auto density : {GauXC::DEN_S, GauXC::DEN_Z}) { + device_lwd->eval_xmat(1.0, device_data.get(), need_xmat_gradient, + density); + if (is_mgga) + device_lwd->eval_vvars_mgga(device_data.get(), density, false); + else if (model_->is_gga()) + device_lwd->eval_vvars_gga(device_data.get(), density); + else + device_lwd->eval_vvars_lda(device_data.get(), density); + } if (is_mgga) - device_lwd->eval_vvars_mgga(device_data.get(), density, false); + device_lwd->eval_uvars_mgga(device_data.get(), GauXC::UKS, false); else if (model_->is_gga()) - device_lwd->eval_vvars_gga(device_data.get(), density); + device_lwd->eval_uvars_gga(device_data.get(), GauXC::UKS); else - device_lwd->eval_vvars_lda(device_data.get(), density); + device_lwd->eval_uvars_lda(device_data.get(), GauXC::UKS); + model_grid_exchange_->pack_post_uvars_features( + *aos_data, + types::TaskIndex{static_cast( + std::distance(tasks.begin(), batch_begin))}, + local_features); } - if (is_mgga) - device_lwd->eval_uvars_mgga(device_data.get(), GauXC::UKS, false); - else if (model_->is_gga()) - device_lwd->eval_uvars_gga(device_data.get(), GauXC::UKS); - else - device_lwd->eval_uvars_lda(device_data.get(), GauXC::UKS); - model_grid_exchange_->pack_post_uvars_features( - *aos_data, - types::TaskIndex{static_cast( - std::distance(tasks.begin(), batch_begin))}, - local_features); - } - FeatureDict local_potentials = model_grid_exchange_->prepare_local_potentials( - needs_gradient, is_mgga, model_device); - at::Tensor local_dE_dw = - model_grid_exchange_->prepare_local_dE_dw(model_device); - std::vector finite_checks; - const auto& local_batches = model_grid_exchange_->local_batches(); - for (std::size_t batch_index = 0; batch_index < local_batches.size(); - ++batch_index) { - const auto& batch = local_batches[batch_index]; - FeatureDict features = model_grid_exchange_->prepare_local_batch_features( - batch, local_features, lb_.molecule(), model_->feature_keys(), - model_device, true); - auto energy = - evaluate_cuda_model_energy(*model_, features, device_id_, batch_index); - finite_checks.push_back( - {"model energy in batch " + std::to_string(batch_index), - model_tensor_finite_check(energy)}); - energy.backward(); - for (const auto& item : features) { - const auto& tensor = item.value(); - if (tensor.is_floating_point()) - finite_checks.push_back({"model feature '" + item.key() + - "' in batch " + - std::to_string(batch_index), - model_tensor_finite_check(tensor)}); - const auto gradient = tensor.grad(); - if (gradient.defined()) - finite_checks.push_back({"model gradient for feature '" + item.key() + - "' in batch " + - std::to_string(batch_index), - model_tensor_finite_check(gradient)}); - } - auto dE_dw = - model_dE_dw(features, device_id_, batch.point_count.raw(), batch_index); - finite_checks.push_back( - {"model dE/dw in batch " + std::to_string(batch_index), - model_tensor_finite_check(dE_dw)}); - model_grid_exchange_->store_local_batch_potentials( - batch, needs_gradient, is_mgga, features, local_potentials); - model_grid_exchange_->store_local_batch_dE_dw(batch, dE_dw, local_dE_dw); - model_grid_exchange_->accumulate_local_geometry_gradients( - batch_index, features, *aos_data); - diagnostics_.record_model_batch(types::DomainCount{batch.atoms.size()}); - } - const at::Tensor all_model_values_finite = - aggregate_finite_checks(finite_checks); - - task_it = tasks.begin(); - while (task_it != tasks.end()) { - const auto batch_begin = task_it; - task_it = - device_data->generate_buffers(terms, basis_map, task_it, tasks.end()); - const types::TaskIndex first_task{ - static_cast(std::distance(tasks.begin(), batch_begin))}; - model_grid_exchange_->unpack_potentials(*aos_data, first_task, - local_potentials); - if (needs_gradient) - device_lwd->eval_collocation_hessian(device_data.get()); - else - device_lwd->eval_collocation_gradient(device_data.get()); - - for (const auto density : {GauXC::DEN_S, GauXC::DEN_Z}) { - device_lwd->eval_xmat(1.0, device_data.get(), needs_gradient, density); - device_lwd->save_xmat(device_data.get(), needs_gradient, density); + FeatureDict local_potentials = + model_grid_exchange_->prepare_local_potentials(needs_gradient, is_mgga, + model_device); + at::Tensor local_dE_dw = + model_grid_exchange_->prepare_local_dE_dw(model_device); + std::vector finite_checks; + const auto& local_batches = model_grid_exchange_->local_batches(); + for (std::size_t batch_index = 0; batch_index < local_batches.size(); + ++batch_index) { + const auto& batch = local_batches[batch_index]; + FeatureDict features = model_grid_exchange_->prepare_local_batch_features( + batch, local_features, lb_.molecule(), model_->feature_keys(), + model_device, true); + auto energy = evaluate_cuda_model_energy(*model_, features, device_id_, + batch_index); + finite_checks.push_back( + {"model energy in batch " + std::to_string(batch_index), + model_tensor_finite_check(energy)}); + energy.backward(); + for (const auto& item : features) { + const auto& tensor = item.value(); + if (tensor.is_floating_point()) + finite_checks.push_back({"model feature '" + item.key() + + "' in batch " + + std::to_string(batch_index), + model_tensor_finite_check(tensor)}); + const auto gradient = tensor.grad(); + if (gradient.defined()) + finite_checks.push_back({"model gradient for feature '" + item.key() + + "' in batch " + + std::to_string(batch_index), + model_tensor_finite_check(gradient)}); + } + auto dE_dw = model_dE_dw(features, device_id_, batch.point_count.raw(), + batch_index); + finite_checks.push_back( + {"model dE/dw in batch " + std::to_string(batch_index), + model_tensor_finite_check(dE_dw)}); + model_grid_exchange_->store_local_batch_potentials( + batch, needs_gradient, is_mgga, features, local_potentials); + model_grid_exchange_->store_local_batch_dE_dw(batch, dE_dw, local_dE_dw); + model_grid_exchange_->accumulate_local_geometry_gradients( + batch_index, features, *aos_data); + diagnostics_.record_model_batch(types::DomainCount{batch.atoms.size()}); } + const at::Tensor all_model_values_finite = + aggregate_finite_checks(finite_checks); + + task_it = tasks.begin(); + while (task_it != tasks.end()) { + const auto batch_begin = task_it; + task_it = + device_data->generate_buffers(terms, basis_map, task_it, tasks.end()); + const types::TaskIndex first_task{ + static_cast(std::distance(tasks.begin(), batch_begin))}; + model_grid_exchange_->unpack_potentials(*aos_data, first_task, + local_potentials); + if (needs_gradient) + device_lwd->eval_collocation_hessian(device_data.get()); + else + device_lwd->eval_collocation_gradient(device_data.get()); - std::int32_t max_points = 0; - for (const auto& task : aos_data->host_device_tasks) - max_points = std::max(max_points, static_cast(task.npts)); - if (needs_gradient) - transform_skala_vxc_for_grad(aos_data->host_device_tasks.size(), - max_points, aos_data->aos_stack.device_tasks, - device_data->queue()); - - if (is_mgga) - device_lwd->inc_exc_grad_mgga(device_data.get(), GauXC::UKS, false, true); - else if (model_->is_gga()) - device_lwd->inc_exc_grad_gga(device_data.get(), GauXC::UKS, true); - else - device_lwd->inc_exc_grad_lda(device_data.get(), GauXC::UKS, true); - - model_grid_exchange_->prepare_weight_derivatives(*aos_data, first_task, - local_dE_dw); - device_lwd->eval_weight_1st_deriv_contracted(device_data.get(), - lb_.state().weight_alg); - } + for (const auto density : {GauXC::DEN_S, GauXC::DEN_Z}) { + device_lwd->eval_xmat(1.0, device_data.get(), needs_gradient, density); + device_lwd->save_xmat(device_data.get(), needs_gradient, density); + } + + std::int32_t max_points = 0; + for (const auto& task : aos_data->host_device_tasks) + max_points = std::max(max_points, static_cast(task.npts)); + if (needs_gradient) + transform_skala_vxc_for_grad( + aos_data->host_device_tasks.size(), max_points, + aos_data->aos_stack.device_tasks, device_data->queue()); + + if (is_mgga) + device_lwd->inc_exc_grad_mgga(device_data.get(), GauXC::UKS, false, + true); + else if (model_->is_gga()) + device_lwd->inc_exc_grad_gga(device_data.get(), GauXC::UKS, true); + else + device_lwd->inc_exc_grad_lda(device_data.get(), GauXC::UKS, true); + + model_grid_exchange_->prepare_weight_derivatives(*aos_data, first_task, + local_dE_dw); + device_lwd->eval_weight_1st_deriv_contracted(device_data.get(), + lb_.state().weight_alg); + } - gradient.setZero(); - double electron_count = 0.0; - device_data->retrieve_exc_grad_integrands(gradient.data(), &electron_count); - runtime.device_backend()->master_queue_synchronize(); - validate_finite_checks(finite_checks, all_model_values_finite); + gradient.setZero(); + double electron_count = 0.0; + device_data->retrieve_exc_grad_integrands(gradient.data(), &electron_count); + runtime.device_backend()->master_queue_synchronize(); + validate_finite_checks(finite_checks, all_model_values_finite); + }); #ifdef GAUXC_HAS_MPI if (lb_.runtime().comm_size() > 1) mpi::allreduce_sum(gradient, lb_.runtime()); diff --git a/SkalaXC/src/host/collective_error.hpp b/SkalaXC/src/host/collective_error.hpp new file mode 100644 index 00000000..8173ac42 --- /dev/null +++ b/SkalaXC/src/host/collective_error.hpp @@ -0,0 +1,75 @@ +#pragma once + +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace SkalaXC::mpi { + +/** + * @brief Run rank-local work and collectively report evaluation failures. + * + * All ranks in the runtime communicator must participate in every corresponding + * call, even when their local work is empty. Ranks may arrive at different + * times, but must not skip or reorder calls. After local work finishes, ranks + * agree on success before the caller proceeds to numerical reductions. On + * failure, the lowest failing runtime rank broadcasts its error message + * (truncated to 2047 bytes), and every rank throws SkalaXC::Exception. + * Single-rank calls rethrow the original exception instead. + * + * @tparam Function Callable accepting no arguments; its return value is + * ignored. + * @param runtime Runtime defining the communicator used for error coordination. + * @param function Rank-local work that must not perform MPI collectives. + * @throws SkalaXC::Exception If any rank fails in a multi-rank call. + * @note Only exceptions reaching the calling thread are caught. OpenMP worker + * exceptions, process failures, and errors before entering this function are + * not handled. + */ +template +void collective_try(const GauXC::RuntimeEnvironment& runtime, + Function&& function) { + std::exception_ptr exception; + try { + std::forward(function)(); + } catch (...) { + exception = std::current_exception(); + } + +#ifdef GAUXC_HAS_MPI + if (runtime.comm_size() > 1) { + int failing_rank = + exception ? runtime.comm_rank() : std::numeric_limits::max(); + MPI_Allreduce(MPI_IN_PLACE, &failing_rank, 1, MPI_INT, MPI_MIN, + runtime.comm()); + if (failing_rank != std::numeric_limits::max()) { + std::array message{}; + if (runtime.comm_rank() == failing_rank) { + try { + std::rethrow_exception(exception); + } catch (const std::exception& error) { + std::snprintf(message.data(), message.size(), "%s", error.what()); + } catch (...) { + std::snprintf(message.data(), message.size(), "%s", "unknown error"); + } + } + MPI_Bcast(message.data(), static_cast(message.size()), MPI_CHAR, + failing_rank, runtime.comm()); + throw Exception("Runtime rank " + std::to_string(failing_rank) + + " evaluation failed: " + message.data()); + } + return; + } +#else + (void)runtime; +#endif + if (exception) std::rethrow_exception(exception); +} + +} // namespace SkalaXC::mpi \ No newline at end of file diff --git a/SkalaXC/src/host/skala_host_driver.cxx b/SkalaXC/src/host/skala_host_driver.cxx index b8728780..04d809ea 100644 --- a/SkalaXC/src/host/skala_host_driver.cxx +++ b/SkalaXC/src/host/skala_host_driver.cxx @@ -9,6 +9,7 @@ * is never reordered (atom ordering is applied through an index permutation). */ #include "skala_host_driver.hpp" +#include "collective_error.hpp" #include "component_matrix_map.hpp" #include "exceptions.hpp" #include "model_grid_exchange.hpp" @@ -388,55 +389,58 @@ double SkalaHostDriver::eval_exc_vxc_uks(ConstColMajorMatrixMap scalar_density, auto& tasks = lb_.get_tasks(); auto rt = lb_.runtime(); double N_EL = 0.0; + double EXC = 0.0; - const auto& feature_keys = model_->feature_keys(); - const bool is_gga = model_->is_gga(); - const bool is_mgga = model_->is_mgga(); - - // Local features: collocation -> xmat -> uvvar. - { - detail::HostTimingScope timer(diagnostics_, - TimingMetric::FeatureConstruction); - pre_skala_local_work_(basis, scalar_density, spin_density, N_EL, is_gga, - is_mgga, false); - } + mpi::collective_try(rt, [&] { + const auto& feature_keys = model_->feature_keys(); + const bool is_gga = model_->is_gga(); + const bool is_mgga = model_->is_mgga(); - double EXC = 0.0; - for (const auto& batch : model_grid_exchange_->local_batches()) { - FeatureDict features_dict; + // Local features: collocation -> xmat -> uvvar. { detail::HostTimingScope timer(diagnostics_, - TimingMetric::ModelBatchPacking); - features_dict = model_grid_exchange_->prepare_local_features( - batch, tasks, task_features_, raw_weights_, lb_.molecule(), - feature_keys); + TimingMetric::FeatureConstruction); + pre_skala_local_work_(basis, scalar_density, spin_density, N_EL, is_gga, + is_mgga, false); } - diagnostics_.record_model_batch(types::DomainCount{batch.atoms.size()}); - at::Tensor exc; - { - detail::HostTimingScope timer(diagnostics_, TimingMetric::ModelForward); - exc = evaluate_model_energy(*model_, features_dict, - c10::Device(c10::DeviceType::CPU)); - validate_model_tensor_finite(exc, "host model energy"); - } - { - detail::HostTimingScope timer(diagnostics_, TimingMetric::ModelBackward); - exc.backward(); + + for (const auto& batch : model_grid_exchange_->local_batches()) { + FeatureDict features_dict; + { + detail::HostTimingScope timer(diagnostics_, + TimingMetric::ModelBatchPacking); + features_dict = model_grid_exchange_->prepare_local_features( + batch, tasks, task_features_, raw_weights_, lb_.molecule(), + feature_keys); + } + diagnostics_.record_model_batch(types::DomainCount{batch.atoms.size()}); + at::Tensor exc; + { + detail::HostTimingScope timer(diagnostics_, TimingMetric::ModelForward); + exc = evaluate_model_energy(*model_, features_dict, + c10::Device(c10::DeviceType::CPU)); + validate_model_tensor_finite(exc, "host model energy"); + } + { + detail::HostTimingScope timer(diagnostics_, + TimingMetric::ModelBackward); + exc.backward(); + } + EXC += exc.item().to(); + { + detail::HostTimingScope timer(diagnostics_, + TimingMetric::PotentialMapping); + model_grid_exchange_->distribute_local_potentials( + batch, is_gga || is_mgga, is_mgga, features_dict, task_potentials_); + } } - EXC += exc.item().to(); + { - detail::HostTimingScope timer(diagnostics_, - TimingMetric::PotentialMapping); - model_grid_exchange_->distribute_local_potentials( - batch, is_gga || is_mgga, is_mgga, features_dict, task_potentials_); + detail::HostTimingScope timer(diagnostics_, TimingMetric::AOAssembly); + post_skala_local_work_(basis, scalar_potential, spin_potential, is_gga, + is_mgga, false); } - } - - { - detail::HostTimingScope timer(diagnostics_, TimingMetric::AOAssembly); - post_skala_local_work_(basis, scalar_potential, spin_potential, is_gga, - is_mgga, false); - } + }); #ifdef GAUXC_HAS_MPI if (rt.comm_size() > 1) { @@ -478,88 +482,92 @@ void SkalaHostDriver::eval_exc_grad_uks(ConstColMajorMatrixMap scalar_density, TimingMetric::TotalEXCGradient); diagnostics_.increment_exc_gradient_calls(); - const auto& feature_keys = model_->feature_keys(); - const bool is_gga = model_->is_gga(); - const bool is_mgga = model_->is_mgga(); - double N_EL = 0.0; - { - detail::HostTimingScope timer(diagnostics_, - TimingMetric::FeatureConstruction); - pre_skala_local_work_(basis, scalar_density, spin_density, N_EL, is_gga, - is_mgga, false); - } + mpi::collective_try(rt, [&] { + const auto& feature_keys = model_->feature_keys(); + const bool is_gga = model_->is_gga(); + const bool is_mgga = model_->is_mgga(); - gradient.setZero(); - for (const auto& batch : model_grid_exchange_->local_batches()) { - FeatureDict features_dict; { detail::HostTimingScope timer(diagnostics_, - TimingMetric::ModelBatchPacking); - features_dict = model_grid_exchange_->prepare_local_features( - batch, tasks, task_features_, raw_weights_, lb_.molecule(), - feature_keys); - } - diagnostics_.record_model_batch(types::DomainCount{batch.atoms.size()}); - const auto points_key = feat_map().at(SKALA_FEATURE::POINTS); - const auto coords_key = feat_map().at(SKALA_FEATURE::COORDS); - const auto weights_key = feat_map().at(SKALA_FEATURE::WEIGHTS); - if (features_dict.find(points_key) != features_dict.end()) - features_dict.at(points_key).requires_grad_(true); - if (features_dict.find(coords_key) != features_dict.end()) - features_dict.at(coords_key).requires_grad_(true); - features_dict.at(weights_key).requires_grad_(true); - - at::Tensor exc; - { - detail::HostTimingScope timer(diagnostics_, TimingMetric::ModelForward); - exc = evaluate_model_energy(*model_, features_dict, - c10::Device(c10::DeviceType::CPU)); - validate_model_tensor_finite(exc, "host model energy"); + TimingMetric::FeatureConstruction); + pre_skala_local_work_(basis, scalar_density, spin_density, N_EL, is_gga, + is_mgga, false); } - { - detail::HostTimingScope timer(diagnostics_, TimingMetric::ModelBackward); - exc.backward(); - } - - auto dE_dw_cpu = validated_model_gradient(features_dict.at(weights_key), - "host model dE/dw"); - validate_model_tensor_finite(dE_dw_cpu, "host model dE/dw"); - std::vector dE_dw_values( - static_cast(batch.point_count.raw())); - std::memcpy(dE_dw_values.data(), dE_dw_cpu.data_ptr(), - dE_dw_values.size() * sizeof(double)); - { - detail::HostTimingScope timer(diagnostics_, - TimingMetric::GradientAssembly); - if (features_dict.find(points_key) != features_dict.end()) { - auto point_grad = features_dict.at(points_key).grad(); - model_grid_exchange_->accumulate_local_point_gradient(batch, point_grad, - gradient); + gradient.setZero(); + for (const auto& batch : model_grid_exchange_->local_batches()) { + FeatureDict features_dict; + { + detail::HostTimingScope timer(diagnostics_, + TimingMetric::ModelBatchPacking); + features_dict = model_grid_exchange_->prepare_local_features( + batch, tasks, task_features_, raw_weights_, lb_.molecule(), + feature_keys); + } + diagnostics_.record_model_batch(types::DomainCount{batch.atoms.size()}); + const auto points_key = feat_map().at(SKALA_FEATURE::POINTS); + const auto coords_key = feat_map().at(SKALA_FEATURE::COORDS); + const auto weights_key = feat_map().at(SKALA_FEATURE::WEIGHTS); + if (features_dict.find(points_key) != features_dict.end()) + features_dict.at(points_key).requires_grad_(true); + if (features_dict.find(coords_key) != features_dict.end()) + features_dict.at(coords_key).requires_grad_(true); + features_dict.at(weights_key).requires_grad_(true); + + at::Tensor exc; + { + detail::HostTimingScope timer(diagnostics_, TimingMetric::ModelForward); + exc = evaluate_model_energy(*model_, features_dict, + c10::Device(c10::DeviceType::CPU)); + validate_model_tensor_finite(exc, "host model energy"); + } + { + detail::HostTimingScope timer(diagnostics_, + TimingMetric::ModelBackward); + exc.backward(); } - if (features_dict.find(coords_key) != features_dict.end()) { - auto coords_grad = features_dict.at(coords_key).grad(); - model_grid_exchange_->accumulate_local_coordinate_gradient( - batch, coords_grad, gradient); + auto dE_dw_cpu = validated_model_gradient(features_dict.at(weights_key), + "host model dE/dw"); + validate_model_tensor_finite(dE_dw_cpu, "host model dE/dw"); + std::vector dE_dw_values( + static_cast(batch.point_count.raw())); + std::memcpy(dE_dw_values.data(), dE_dw_cpu.data_ptr(), + dE_dw_values.size() * sizeof(double)); + + { + detail::HostTimingScope timer(diagnostics_, + TimingMetric::GradientAssembly); + if (features_dict.find(points_key) != features_dict.end()) { + auto point_grad = features_dict.at(points_key).grad(); + model_grid_exchange_->accumulate_local_point_gradient( + batch, point_grad, gradient); + } + + if (features_dict.find(coords_key) != features_dict.end()) { + auto coords_grad = features_dict.at(coords_key).grad(); + model_grid_exchange_->accumulate_local_coordinate_gradient( + batch, coords_grad, gradient); + } + } + { + detail::HostTimingScope timer(diagnostics_, + TimingMetric::PotentialMapping); + model_grid_exchange_->distribute_local_potentials( + batch, is_gga || is_mgga, is_mgga, features_dict, task_potentials_); + model_grid_exchange_->distribute_local_dE_dw( + batch, std::move(dE_dw_values), task_potentials_); } } + { detail::HostTimingScope timer(diagnostics_, - TimingMetric::PotentialMapping); - model_grid_exchange_->distribute_local_potentials( - batch, is_gga || is_mgga, is_mgga, features_dict, task_potentials_); - model_grid_exchange_->distribute_local_dE_dw( - batch, std::move(dE_dw_values), task_potentials_); + TimingMetric::GradientAssembly); + exc_grad_local_work_(scalar_density, spin_density, gradient, is_gga, + is_mgga); } - } - - { - detail::HostTimingScope timer(diagnostics_, TimingMetric::GradientAssembly); - exc_grad_local_work_(scalar_density, spin_density, gradient, is_gga, - is_mgga); - } + }); #ifdef GAUXC_HAS_MPI if (rt.comm_size() > 1) { diff --git a/SkalaXC/tests/CMakeLists.txt b/SkalaXC/tests/CMakeLists.txt index 7db87ec1..c7cd1524 100644 --- a/SkalaXC/tests/CMakeLists.txt +++ b/SkalaXC/tests/CMakeLists.txt @@ -156,6 +156,15 @@ catch_discover_tests(skalaxc_unit_test # on a four-slot CI runner without oversubscription. if(SKALAXC_ENABLE_MPI) find_package(MPI REQUIRED COMPONENTS CXX) + add_test(NAME skalaxc_unit_mpi.evaluation_errors + COMMAND ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} 3 + ${MPIEXEC_PREFLAGS} $ + "[host-evaluation-errors],[collective-errors]" --order lex --rng-seed 12345 + ${MPIEXEC_POSTFLAGS}) + set_tests_properties(skalaxc_unit_mpi.evaluation_errors PROPERTIES + TIMEOUT 60 + ENVIRONMENT + "OMP_NUM_THREADS=4;SKALAXC_MODEL_PATH=${SKALAXC_MODEL_PATH}") add_test(NAME skalaxc_unit_mpi.subcommunicator COMMAND ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} 3 ${MPIEXEC_PREFLAGS} $ diff --git a/SkalaXC/tests/README.md b/SkalaXC/tests/README.md index fdde2891..a253d216 100644 --- a/SkalaXC/tests/README.md +++ b/SkalaXC/tests/README.md @@ -100,6 +100,7 @@ discovery and are available through these MPI-enabled CTest registrations: | `skalaxc_unit_mpi.host_subcommunicator` | 4 | Full host TPSS EXC/VXC/gradient isolation between two communicators. | | `skalaxc_unit_mpi.atomic_domain_ownership` | 3 | Exactly one owner per complete atomic domain. | | `skalaxc_unit_mpi.model_broadcast` | 3 | Runtime-rank-zero model loading, broadcast, and error propagation. | +| `skalaxc_unit_mpi.evaluation_errors` | 3 | Idle-rank evaluation failures, error messages, and communicator reuse, including split communicators; 60-second timeout. | | `skalaxc_unit_mpi.traditional_integration` | 3 | Replicated SkalaXC/GauXC parity. | | `skalaxc_unit_mpi.cuda_idle_rank` | 3 | CUDA evaluation when one rank owns no atomic domain. | | `skalaxc_unit_mpi.cuda_subcommunicator` | 4 | CUDA isolation between two runtime communicators. | @@ -113,7 +114,8 @@ OMP_NUM_THREADS=4 pixi run -e skalaxc-host ctest \ -R '^skalaxc_unit_mpi\.host_subcommunicator$' --output-on-failure ``` -Multi-rank registrations set `OMP_NUM_THREADS=1` to avoid oversubscription. +Multi-rank registrations generally set `OMP_NUM_THREADS=1` to avoid oversubscription. +The focused evaluation-error regression uses `OMP_NUM_THREADS=4`. Use the project's normal OpenMP thread setting for serial tests. ## Fixtures and provenance diff --git a/SkalaXC/tests/skala_host_mpi_test.cxx b/SkalaXC/tests/skala_host_mpi_test.cxx index 937a68fd..e1dd72b4 100644 --- a/SkalaXC/tests/skala_host_mpi_test.cxx +++ b/SkalaXC/tests/skala_host_mpi_test.cxx @@ -8,6 +8,8 @@ #include #include +#include +#include #include #include @@ -54,6 +56,67 @@ HostEvaluation evaluate_host(const SkalaXC::RuntimeEnvironment& runtime, } // namespace +TEST_CASE("Host evaluation errors reach idle ranks", + "[skala][mpi][host-evaluation-errors]") { +#ifdef SKALAXC_HAS_MPI + MPI_Comm communicator = MPI_COMM_WORLD; + SECTION("world communicator") {} + SECTION("split communicator") { + int world_rank = 0; + MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); + MPI_Comm_split(MPI_COMM_WORLD, world_rank % 2, -world_rank, &communicator); + } +#endif + { + SkalaXC::RuntimeEnvironment runtime{SKALAXC_MPI_CODE(communicator)}; + auto system = SkalaXC::test::make_rotated_h2_sto3g_system(0.0); + system.molecule.resize(1); + system.basis.resize(1); + auto grid = SkalaXC::test::make_molgrid( + system.molecule, SkalaXC::AtomicGridSizeDefault::FineGrid); + auto load_balancer = + SkalaXC::LoadBalancerFactory(SkalaXC::ExecutionSpace::Host) + .get_instance(runtime, system.molecule, grid, system.basis); + SkalaXC::MolecularWeightsFactory(SkalaXC::ExecutionSpace::Host, "Default", + {}) + .get_instance() + .modify_weights(load_balancer); + auto integrator = + SkalaXC::XCIntegratorFactory(SkalaXC::ExecutionSpace::Host) + .get_instance(SkalaXC::functional_type("LDA"), load_balancer); + const Matrix invalid = + Matrix::Constant(1, 1, std::numeric_limits::quiet_NaN()); + const Matrix spin = Matrix::Zero(1, 1); + for (const bool gradient : {false, true}) { + std::string error; + try { + if (gradient) + (void)integrator.eval_exc_grad(invalid, spin); + else + (void)integrator.eval_exc_vxc(invalid, spin); + } catch (const SkalaXC::Exception& exception) { + error = exception.what(); + } + CHECK(error.find("NaN") != std::string::npos); +#ifdef SKALAXC_HAS_MPI + int failures = error.empty() ? 0 : 1; + MPI_Allreduce(MPI_IN_PLACE, &failures, 1, MPI_INT, MPI_SUM, communicator); + CHECK(failures == runtime.comm_size()); +#endif + } + const Matrix valid = Matrix::Constant(1, 1, 0.5); + CHECK(std::isfinite(std::get<0>(integrator.eval_exc_vxc(valid, spin)))); + const auto gradient = integrator.eval_exc_grad(valid, spin); + const bool finite_gradient = + std::all_of(gradient.begin(), gradient.end(), + [](double value) { return std::isfinite(value); }); + CHECK(finite_gradient); + } +#ifdef SKALAXC_HAS_MPI + if (communicator != MPI_COMM_WORLD) MPI_Comm_free(&communicator); +#endif +} + TEST_CASE("Skala host evaluation uses the runtime MPI subcommunicator", "[skala][mpi][host-subcomm][mpi-only]") { #ifdef SKALAXC_HAS_MPI diff --git a/SkalaXC/tests/skala_mpi_subcomm_unit_test.cxx b/SkalaXC/tests/skala_mpi_subcomm_unit_test.cxx index d2274d85..7afab0b7 100644 --- a/SkalaXC/tests/skala_mpi_subcomm_unit_test.cxx +++ b/SkalaXC/tests/skala_mpi_subcomm_unit_test.cxx @@ -1,5 +1,6 @@ #include +#include "collective_error.hpp" #include "model_grid_exchange.hpp" #include "mpi_wrapper.hpp" #include "skala_util.hpp" @@ -10,8 +11,78 @@ #include #include +#include +#include #include +TEST_CASE("Collective evaluation errors preserve communicator agreement", + "[skala][mpi][collective-errors]") { +#ifdef GAUXC_HAS_MPI + MPI_Comm communicator = MPI_COMM_WORLD; + SECTION("world communicator") {} + SECTION("split communicator") { + int world_rank = 0; + MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); + MPI_Comm_split(MPI_COMM_WORLD, world_rank % 2, -world_rank, &communicator); + } +#endif + { + GauXC::RuntimeEnvironment runtime{GAUXC_MPI_CODE(communicator)}; + int calls = 0; + SkalaXC::mpi::collective_try(runtime, [&] { ++calls; }); + REQUIRE(calls == 1); + for (const std::string scenario : + {"non-root", "all-ranks", "long", "unknown"}) { + INFO("scenario=" << scenario); + const int failing_rank = + scenario == "all-ranks" ? 0 : runtime.comm_size() - 1; + std::string message; + bool caught_standard = false; + bool caught_unknown = false; + try { + SkalaXC::mpi::collective_try(runtime, [&] { + if (scenario != "all-ranks" && runtime.comm_rank() != failing_rank) + return; + if (scenario == "unknown") throw std::uint64_t{42}; + throw std::runtime_error( + scenario == "long" + ? std::string(4096, 'x') + : "failure-" + std::to_string(runtime.comm_rank())); + }); + } catch (const std::exception& error) { + caught_standard = true; + message = error.what(); + } catch (std::uint64_t value) { + caught_unknown = value == 42; + } + if (runtime.comm_size() > 1) { + const auto detail = scenario == "unknown" ? "unknown error" + : scenario == "long" + ? std::string(2047, 'x') + : "failure-" + std::to_string(failing_rank); + REQUIRE(caught_standard); + REQUIRE(message == "Runtime rank " + std::to_string(failing_rank) + + " evaluation failed: " + detail); + } else if (scenario == "unknown") { + REQUIRE(caught_unknown); + } else { + REQUIRE(caught_standard); + REQUIRE(message == + (scenario == "long" ? std::string(4096, 'x') : "failure-0")); + } +#ifdef GAUXC_HAS_MPI + int participants = 1; + MPI_Allreduce(MPI_IN_PLACE, &participants, 1, MPI_INT, MPI_SUM, + communicator); + REQUIRE(participants == runtime.comm_size()); +#endif + } + } +#ifdef GAUXC_HAS_MPI + if (communicator != MPI_COMM_WORLD) MPI_Comm_free(&communicator); +#endif +} + TEST_CASE("Eigen MPI collectives use runtime communicator", "[skala][mpi][subcomm][mpi-wrapper][mpi-only]") { #ifdef GAUXC_HAS_MPI From 616eb6da79b3cf9205a7d8f933690d7d65fbb084 Mon Sep 17 00:00:00 2001 From: jenswehner Date: Mon, 7 Sep 2026 01:03:51 +0200 Subject: [PATCH 28/33] Reject kinetic-density models without gradient features --- SkalaXC/README.md | 4 +++ SkalaXC/src/skala_model.cxx | 4 +++ SkalaXC/tests/skala_model_unit_test.cxx | 41 +++++++++++++++++++++++++ 3 files changed, 49 insertions(+) diff --git a/SkalaXC/README.md b/SkalaXC/README.md index c9e8f605..c3b8398c 100644 --- a/SkalaXC/README.md +++ b/SkalaXC/README.md @@ -12,6 +12,10 @@ The complete validated capability is **host (CPU)** evaluation of the LDA, GGA, and kinetic-energy-dependent meta-GGA Skala models. An optional CUDA backend is available with the limitations described below. +Model archives declaring the kinetic-density feature `kin` must also declare +the density-gradient feature `grad`. Kinetic-only models are rejected during +integrator construction; the bundled TPSS and Skala models declare both. + Host molecular weights support Becke and SSF (the default); CUDA supports SSF. LKO is not exposed: GauXC lacks its nuclear weight derivatives and reorders tasks in a way that invalidates SkalaXC's raw-weight indexing. diff --git a/SkalaXC/src/skala_model.cxx b/SkalaXC/src/skala_model.cxx index f0842c30..5081ffeb 100644 --- a/SkalaXC/src/skala_model.cxx +++ b/SkalaXC/src/skala_model.cxx @@ -123,6 +123,10 @@ struct SkalaModel::Impl { if (key == feat_map().at(SKALA_FEATURE::TAU)) is_mgga = true; if (key == feat_map().at(SKALA_FEATURE::DDEN)) is_gga = true; } + if (is_mgga && !is_gga) + SKALAXC_EXCEPTION( + "Models requesting 'kin' must also declare 'grad'; " + "kinetic-only models are not currently supported"); if (is_mgga) is_gga = false; module.eval(); diff --git a/SkalaXC/tests/skala_model_unit_test.cxx b/SkalaXC/tests/skala_model_unit_test.cxx index 7fa161ad..689d9fd6 100644 --- a/SkalaXC/tests/skala_model_unit_test.cxx +++ b/SkalaXC/tests/skala_model_unit_test.cxx @@ -310,6 +310,47 @@ TEST_CASE("Skala model loading validates paths and metadata", CHECK_THROWS(SkalaXC::SkalaModel(unsupported_features.string())); } +TEST_CASE("Kinetic-density models must also declare density gradients", + "[skala][model-loading][kinetic-model-contract]") { + TempModelDirectory temporary; + torch::jit::script::Module module("KineticDensityFunctional"); + module.define(R"JIT( +def get_exc(self, mol: Dict[str, Tensor]) -> Tensor: + return ((mol["density"] + mol["kin"]).sum(0) * mol["grid_weights"]).sum() +)JIT"); + const auto path = temporary.path() / "kinetic.fun"; + + SECTION("kinetic-only metadata is rejected") { + save_with_metadata(module, path, "2", + R"(["density", "kin", "grid_weights"])"); + REQUIRE_THROWS_WITH( + SkalaXC::SkalaModel(path.string()), + Catch::Matchers::ContainsSubstring( + "Models requesting 'kin' must also declare 'grad'")); + } + + SECTION("both features are accepted regardless of order") { + for (const std::string metadata : + {R"(["density", "kin", "grad", "grid_weights"])", + R"(["density", "grad", "kin", "grid_weights"])"}) { + save_with_metadata(module, path, "2", metadata); + const SkalaXC::SkalaModel model(path.string()); + REQUIRE(model.is_mgga()); + REQUIRE_FALSE(model.is_gga()); + } + } + + SECTION("bundled meta-GGA models remain supported") { + for (const auto* filename : {"tpss.fun", "skala-1.1.fun"}) { + const auto model_path = + std::filesystem::path(SKALAXC_MODEL_PATH) / filename; + const SkalaXC::SkalaModel model(model_path.string()); + REQUIRE(model.is_mgga()); + REQUIRE_FALSE(model.is_gga()); + } + } +} + TEST_CASE("Bundled models expose integrated energy and dE/dw", "[skala][model-integrated-energy]") { const auto model_directory = std::filesystem::path(SKALAXC_MODEL_PATH); From b3dfb549ce277a0d55670936c5431f7706b42912 Mon Sep 17 00:00:00 2001 From: jenswehner Date: Wed, 9 Sep 2026 23:52:58 +0200 Subject: [PATCH 29/33] reduce gpu4pyscf memory requirements --- tests/test_pyscf_skalaxc_gpu_parity.py | 46 +++++++++++++++++--------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/tests/test_pyscf_skalaxc_gpu_parity.py b/tests/test_pyscf_skalaxc_gpu_parity.py index 8b7f2c2a..bd770072 100644 --- a/tests/test_pyscf_skalaxc_gpu_parity.py +++ b/tests/test_pyscf_skalaxc_gpu_parity.py @@ -2,6 +2,7 @@ """Fixed-density parity tests between GPU4PySCF Skala and SkalaXC CUDA.""" +import gc import hashlib from collections.abc import Generator from dataclasses import dataclass @@ -43,7 +44,6 @@ @dataclass(frozen=True) class FunctionalCase: name: str - functional: ExcFunctionalBase model: str tolerances: ParityTolerances @@ -59,6 +59,7 @@ class FunctionalCase: # backward. Keep its EXC/VXC coverage and use neural Skala for the primary # kinetic-density gradient path until TPSS is retraced with a smaller kernel. GRADIENT_FUNCTIONAL_NAMES = ("lda", "pbe", "skala-1.1") +GPU4PYSCF_MAX_MEMORY_MB = 512 @pytest.fixture(scope="module") @@ -97,13 +98,17 @@ def hartree_gradient( molecule: gto.Mole, reference_mean_field: scf.uhf.UHF ) -> npt.NDArray[np.float64]: mean_field = gpu_dft.UKS(molecule) + mean_field.max_memory = GPU4PYSCF_MAX_MEMORY_MB mean_field.xc = "0*LDA" mean_field.mo_coeff = cp.asarray(reference_mean_field.mo_coeff) mean_field.mo_occ = cp.asarray(reference_mean_field.mo_occ) mean_field.mo_energy = cp.asarray(reference_mean_field.mo_energy) - return np.asarray( + result = np.asarray( cp.asnumpy(mean_field.nuc_grad_method().kernel()), dtype=np.float64 ) + del mean_field + _release_gpu_memory() + return result @pytest.fixture(scope="module") @@ -121,9 +126,6 @@ def functional_case( request: pytest.FixtureRequest, ) -> FunctionalCase: name = str(request.param) - device = torch.device("cuda:0") - loaded_functional = load_functional(name, device=device) - assert isinstance(loaded_functional, ExcFunctionalBase) if name == "skala-1.1": model_path = skalaxc.MODEL_DIR / "skala-1.1-cuda.fun" with model_path.open("rb") as model_file: @@ -134,7 +136,6 @@ def functional_case( model = name.upper() return FunctionalCase( name, - loaded_functional, model, GPU_TOLERANCES[name], ) @@ -154,6 +155,7 @@ def _fixed_density_xc_gradient( hartree_gradient: npt.NDArray[np.float64], ) -> npt.NDArray[np.float64]: mean_field = SkalaKS(molecule, functional, with_dftd3=False) + mean_field.max_memory = GPU4PYSCF_MAX_MEMORY_MB mean_field.grids = grid mean_field.mo_coeff = cp.asarray(reference_mean_field.mo_coeff) mean_field.mo_occ = cp.asarray(reference_mean_field.mo_occ) @@ -162,16 +164,17 @@ def _fixed_density_xc_gradient( return np.asarray(cp.asnumpy(total_gradient), dtype=np.float64) - hartree_gradient -def _release_torch_cache() -> None: +def _release_gpu_memory() -> None: + gc.collect() torch.cuda.synchronize() torch.cuda.empty_cache() @pytest.fixture(autouse=True) -def release_torch_cache_after_test() -> Generator[None, None, None]: +def release_gpu_memory_after_test() -> Generator[None, None, None]: """Release unused CUDA allocator blocks between parameterized cases.""" yield - _release_torch_cache() + _release_gpu_memory() @pytest.mark.parametrize("functional_case", FUNCTIONAL_NAMES, indirect=True) @@ -181,15 +184,23 @@ def test_gpu_exc_vxc_parity( density: npt.NDArray[np.float64], gpu4pyscf_grid: SkalaGrids, ) -> None: + functional = load_functional(functional_case.name, device=torch.device("cuda:0")) + assert isinstance(functional, ExcFunctionalBase) density_tensor = torch.as_tensor(density, device="cuda:0") - gpu4pyscf_result = XCIntegrator( - functional_case.functional, + gpu4pyscf_integrator = XCIntegrator( + functional, device=torch.device("cuda:0"), - )(molecule, gpu4pyscf_grid, density_tensor) + ) + gpu4pyscf_result = gpu4pyscf_integrator( + molecule, + gpu4pyscf_grid, + density_tensor, + max_memory=GPU4PYSCF_MAX_MEMORY_MB, + ) gpu4pyscf_energy = gpu4pyscf_result.energy.item() gpu4pyscf_potential = gpu4pyscf_result.potential.detach().cpu().numpy() - del gpu4pyscf_result, density_tensor - _release_torch_cache() + del functional, gpu4pyscf_integrator, gpu4pyscf_result, density_tensor + _release_gpu_memory() scalar_density, spin_density = uks_density_channels(density) integrator = make_skalaxc_integrator( @@ -230,14 +241,17 @@ def test_gpu_exc_gradient_parity( reference_mean_field: scf.uhf.UHF, hartree_gradient: npt.NDArray[np.float64], ) -> None: + functional = load_functional(functional_case.name, device=torch.device("cuda:0")) + assert isinstance(functional, ExcFunctionalBase) gpu4pyscf_gradient = _fixed_density_xc_gradient( - functional_case.functional, + functional, molecule, gpu4pyscf_grid, reference_mean_field, hartree_gradient, ) - _release_torch_cache() + del functional + _release_gpu_memory() scalar_density, spin_density = uks_density_channels(density) integrator = make_skalaxc_integrator( From 8f789ea0d8381b1982dd5e63e246984a77a6a5c7 Mon Sep 17 00:00:00 2001 From: jenswehner Date: Thu, 10 Sep 2026 00:38:32 +0200 Subject: [PATCH 30/33] fix parit tests --- tests/test_pyscf_skalaxc_gpu_parity.py | 3 ++- tests/test_pyscf_skalaxc_parity.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/test_pyscf_skalaxc_gpu_parity.py b/tests/test_pyscf_skalaxc_gpu_parity.py index bd770072..f9bec24e 100644 --- a/tests/test_pyscf_skalaxc_gpu_parity.py +++ b/tests/test_pyscf_skalaxc_gpu_parity.py @@ -97,9 +97,10 @@ def density( def hartree_gradient( molecule: gto.Mole, reference_mean_field: scf.uhf.UHF ) -> npt.NDArray[np.float64]: + # GPU4PySCF 1.8.1 ignores the coefficient of a single-term ``0*LDA``. mean_field = gpu_dft.UKS(molecule) mean_field.max_memory = GPU4PYSCF_MAX_MEMORY_MB - mean_field.xc = "0*LDA" + mean_field.xc = "" mean_field.mo_coeff = cp.asarray(reference_mean_field.mo_coeff) mean_field.mo_occ = cp.asarray(reference_mean_field.mo_occ) mean_field.mo_energy = cp.asarray(reference_mean_field.mo_energy) diff --git a/tests/test_pyscf_skalaxc_parity.py b/tests/test_pyscf_skalaxc_parity.py index cbd51000..574ae526 100644 --- a/tests/test_pyscf_skalaxc_parity.py +++ b/tests/test_pyscf_skalaxc_parity.py @@ -79,7 +79,7 @@ def hartree_gradient( molecule: gto.Mole, reference_mean_field: scf.uhf.UHF ) -> npt.NDArray[np.float64]: mean_field = dft.UKS(molecule) - mean_field.xc = "0*LDA" + mean_field.xc = "" mean_field.mo_coeff = reference_mean_field.mo_coeff mean_field.mo_occ = reference_mean_field.mo_occ mean_field.mo_energy = reference_mean_field.mo_energy From 62aff37fe27dd457e9dc8e6e43e2340edfb640eb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 10 Sep 2026 21:40:38 +0000 Subject: [PATCH 31/33] Fix MPI gradient tensor conversion Co-authored-by: JensWehner <12139113+JensWehner@users.noreply.github.com> --- SkalaXC/src/host/mpi_wrapper.cxx | 35 ++++++++------------------------ 1 file changed, 8 insertions(+), 27 deletions(-) diff --git a/SkalaXC/src/host/mpi_wrapper.cxx b/SkalaXC/src/host/mpi_wrapper.cxx index ba629eb5..9dac6bdf 100644 --- a/SkalaXC/src/host/mpi_wrapper.cxx +++ b/SkalaXC/src/host/mpi_wrapper.cxx @@ -54,17 +54,7 @@ SpinGradientRecordMatrix permute_point_records( } at::Tensor point_records_to_torch(const SpinGradientRecordMatrix& records) { - auto options = - torch::TensorOptions().dtype(torch::kFloat64).device(torch::kCPU); - if (records.rows() == 0) - return torch::empty({spin_dimension, direction_dimension, 0}, options) - .requires_grad_(true); - return torch::from_blob(const_cast(records.data()), - {spin_dimension, direction_dimension, records.rows()}, - {direction_dimension, 1, spin_gradient_dimension}, - options) - .clone() - .requires_grad_(true); + return SkalaXC::spin_gradient_to_torch(unpack_point_records(records), true); } void validate_torch_gradient(const at::Tensor& tensor, @@ -86,10 +76,7 @@ at::Tensor spin_gradient_to_torch(const SpinGradient& gradient) { SpinGradient torch_to_spin_gradient(const at::Tensor& tensor, Eigen::Index expected_points) { validate_torch_gradient(tensor, expected_points); - auto point_major = tensor.detach().cpu().permute({2, 0, 1}).contiguous(); - Eigen::Map records( - point_major.data_ptr(), expected_points, spin_gradient_dimension); - return unpack_point_records(records); + return SkalaXC::spin_gradient_from_torch(tensor); } void broadcast_string(std::string& value, const GauXC::RuntimeEnvironment& rt, @@ -159,26 +146,20 @@ SpinGradient scatter_torch_gradient( throw std::invalid_argument("Local gradient point count is invalid"); if (rt.comm_size() == 1) { validate_torch_gradient(root_tensor, local_points); - auto point_major = - root_tensor.detach().cpu().permute({2, 0, 1}).contiguous(); - Eigen::Map records( - point_major.data_ptr(), local_points, spin_gradient_dimension); - return unpack_point_records( - permute_point_records(records, atom_to_rank_permutation)); + return unpack_point_records(permute_point_records( + pack_point_records(SkalaXC::spin_gradient_from_torch(root_tensor)), + atom_to_rank_permutation)); } #ifdef GAUXC_HAS_MPI SpinGradientRecordMatrix rank_ordered_records; - at::Tensor point_major; const auto component_layout = point_layout.scaled(spin_gradient_dimension); if (rt.comm_rank() == root) { const auto global_points = point_layout.extent(); validate_torch_gradient(root_tensor, global_points); - point_major = root_tensor.detach().cpu().permute({2, 0, 1}).contiguous(); - Eigen::Map atom_ordered_records( - point_major.data_ptr(), global_points, spin_gradient_dimension); - rank_ordered_records = - permute_point_records(atom_ordered_records, atom_to_rank_permutation); + rank_ordered_records = permute_point_records( + pack_point_records(SkalaXC::spin_gradient_from_torch(root_tensor)), + atom_to_rank_permutation); } SpinGradientRecordMatrix local_records(local_points, spin_gradient_dimension); From 7cbebde884af026d6ac1a7d4c1a3c311b186b3ea Mon Sep 17 00:00:00 2001 From: jenswehner Date: Fri, 11 Sep 2026 05:21:01 +0200 Subject: [PATCH 32/33] made indexing cleaner --- SkalaXC/src/device/cuda/kernels/model_grid.cu | 44 ++-- SkalaXC/src/device/cuda/kernels/skala.cu | 85 +++---- .../src/device/cuda/kernels/skala_exc_grad.cu | 29 +-- .../src/device/cuda/kernels/spin_channels.cuh | 83 ++++++ SkalaXC/src/host/derivative_component_map.hpp | 119 +++++++++ SkalaXC/src/host/model_grid_exchange.cxx | 24 +- SkalaXC/src/host/skala_host_driver.cxx | 237 +++++++++--------- SkalaXC/src/host/spin_gradient.hpp | 79 ++++++ SkalaXC/tests/skala_device_test.cxx | 113 ++++++++- SkalaXC/tests/spin_gradient_unit_test.cxx | 205 +++++++++++++++ 10 files changed, 786 insertions(+), 232 deletions(-) create mode 100644 SkalaXC/src/host/derivative_component_map.hpp diff --git a/SkalaXC/src/device/cuda/kernels/model_grid.cu b/SkalaXC/src/device/cuda/kernels/model_grid.cu index 97a3d500..2715b8d0 100644 --- a/SkalaXC/src/device/cuda/kernels/model_grid.cu +++ b/SkalaXC/src/device/cuda/kernels/model_grid.cu @@ -12,6 +12,8 @@ #include +#include + namespace SkalaXC { namespace { @@ -23,15 +25,11 @@ __device__ cuda::AlphaBetaChannels post_uvars_density( __device__ cuda::ScalarZChannels post_uvars_density_gradient( const GauXC::XCDeviceTask& task, std::size_t point, - std::int64_t direction) { - switch (direction) { - case 0: - return {task.dden_sx[point], task.dden_zx[point]}; - case 1: - return {task.dden_sy[point], task.dden_zy[point]}; - default: - return {task.dden_sz[point], task.dden_zz[point]}; - } + cuda::Direction direction) { + return {cuda::density_gradient(task, cuda::PauliChannel::Scalar, + direction)[point], + cuda::density_gradient(task, cuda::PauliChannel::SpinZ, + direction)[point]}; } __device__ cuda::AlphaBetaChannels post_uvars_kinetic( @@ -56,6 +54,7 @@ __global__ void pack_post_uvars_model_grid_features_kernel( const std::int64_t* point_offsets, std::int64_t total_points, double* density, double* density_gradient, double* kinetic, double* grid_coordinates, double* grid_weights) { + using cuda::Direction; const std::size_t task_index = blockIdx.y; if (task_index >= task_count) return; @@ -72,14 +71,15 @@ __global__ void pack_post_uvars_model_grid_features_kernel( density[total_points + destination] = density_alpha_beta.beta; } if (density_gradient) { - for (std::int64_t direction = 0; direction < 3; ++direction) { + for (const auto direction : {Direction::X, Direction::Y, Direction::Z}) { const auto gradient_scalar_z = post_uvars_density_gradient(task, point, direction); const auto gradient_alpha_beta = cuda::scalar_z_to_alpha_beta( gradient_scalar_z.scalar, gradient_scalar_z.spin_z); - density_gradient[direction * total_points + destination] = + const auto component = static_cast(direction); + density_gradient[component * total_points + destination] = gradient_alpha_beta.alpha; - density_gradient[(3 + direction) * total_points + destination] = + density_gradient[(3 + component) * total_points + destination] = gradient_alpha_beta.beta; } } @@ -111,6 +111,8 @@ __global__ void unpack_model_grid_potentials_kernel( const std::int64_t* point_offsets, std::int64_t total_points, const double* density_potential, const double* density_gradient_potential, const double* kinetic_potential) { + using cuda::Direction; + using cuda::SpinChannel; const std::size_t task_index = blockIdx.y; if (task_index >= task_count) return; @@ -124,16 +126,14 @@ __global__ void unpack_model_grid_potentials_kernel( task.vrho_pos[point] = density_potential[source]; task.vrho_neg[point] = density_potential[total_points + source]; if (density_gradient_potential) { - task.gamma_pp[point] = density_gradient_potential[source]; - task.gamma_pm[point] = density_gradient_potential[total_points + source]; - task.gamma_mm[point] = - density_gradient_potential[2 * total_points + source]; - task.vgamma_pp[point] = - density_gradient_potential[3 * total_points + source]; - task.vgamma_pm[point] = - density_gradient_potential[4 * total_points + source]; - task.vgamma_mm[point] = - density_gradient_potential[5 * total_points + source]; + for (const auto channel : {SpinChannel::Alpha, SpinChannel::Beta}) { + for (const auto direction : {Direction::X, Direction::Y, Direction::Z}) { + const auto component = static_cast(channel) * 3 + + static_cast(direction); + cuda::gradient_potential(task, channel, direction)[point] = + density_gradient_potential[component * total_points + source]; + } + } } if (kinetic_potential) { task.vtau_pos[point] = kinetic_potential[source]; diff --git a/SkalaXC/src/device/cuda/kernels/skala.cu b/SkalaXC/src/device/cuda/kernels/skala.cu index 7f07a86a..0818192e 100644 --- a/SkalaXC/src/device/cuda/kernels/skala.cu +++ b/SkalaXC/src/device/cuda/kernels/skala.cu @@ -19,6 +19,7 @@ #include "exceptions.hpp" #include "spin_channels.cuh" #include +#include namespace SkalaXC { @@ -78,6 +79,8 @@ __global__ void zmat_lda_vxc_skala_kernel(size_t ntasks, template __global__ void zmat_gga_vxc_skala_kernel(size_t ntasks, XCDeviceTask* tasks_device) { + using cuda::Direction; + using cuda::SpinChannel; const int batch_idx = blockIdx.z; if (batch_idx >= ntasks) return; @@ -86,17 +89,7 @@ __global__ void zmat_gga_vxc_skala_kernel(size_t ntasks, const auto npts = task.npts; const auto nbf = task.bfn_screening.nbe; - const double* dden_x_grad_a = task.gamma_pp; - const double* dden_x_grad_b = task.vgamma_pp; - const double* dden_y_grad_a = task.gamma_pm; - const double* dden_y_grad_b = task.vgamma_pm; - const double* dden_z_grad_a = task.gamma_mm; - const double* dden_z_grad_b = task.vgamma_mm; - const auto* basis_eval_device = task.bf; - const auto* dbasis_x_eval_device = task.dbfx; - const auto* dbasis_y_eval_device = task.dbfy; - const auto* dbasis_z_eval_device = task.dbfz; auto* z_matrix_device = task.zmat; @@ -109,29 +102,23 @@ __global__ void zmat_gga_vxc_skala_kernel(size_t ntasks, const auto density_scalar_z = cuda::alpha_beta_to_scalar_z( task.vrho_pos[tid_x], task.vrho_neg[tid_x]); - const auto x_scalar_z = cuda::alpha_beta_to_scalar_z(dden_x_grad_a[tid_x], - dden_x_grad_b[tid_x]); - const auto y_scalar_z = cuda::alpha_beta_to_scalar_z(dden_y_grad_a[tid_x], - dden_y_grad_b[tid_x]); - const auto z_scalar_z = cuda::alpha_beta_to_scalar_z(dden_z_grad_a[tid_x], - dden_z_grad_b[tid_x]); - double density_potential = density_scalar_z.scalar; - double x_fact = x_scalar_z.scalar; - double y_fact = y_scalar_z.scalar; - double z_fact = z_scalar_z.scalar; - - if constexpr (den_selector == DEN_Z) { + if constexpr (den_selector == DEN_Z) density_potential = density_scalar_z.spin_z; - x_fact = x_scalar_z.spin_z; - y_fact = y_scalar_z.spin_z; - z_fact = z_scalar_z.spin_z; + + double gradient_contribution = 0.0; + for (const auto direction : {Direction::X, Direction::Y, Direction::Z}) { + const auto potential = cuda::alpha_beta_to_scalar_z( + cuda::gradient_potential(task, SpinChannel::Alpha, direction)[tid_x], + cuda::gradient_potential(task, SpinChannel::Beta, direction)[tid_x]); + double factor = potential.scalar; + if constexpr (den_selector == DEN_Z) factor = potential.spin_z; + gradient_contribution += + factor * cuda::basis_derivative(task, direction)[ibfoff]; } z_matrix_device[ibfoff] = - x_fact * dbasis_x_eval_device[ibfoff] + - y_fact * dbasis_y_eval_device[ibfoff] + - z_fact * dbasis_z_eval_device[ibfoff] + + gradient_contribution + 0.5 * density_potential * basis_eval_device[ibfoff]; } } @@ -146,6 +133,8 @@ __global__ void zmat_gga_vxc_skala_kernel(size_t ntasks, template __global__ void zmat_mgga_vxc_skala_kernel(size_t ntasks, XCDeviceTask* tasks_device) { + using cuda::Direction; + using cuda::SpinChannel; const int batch_idx = blockIdx.z; if (batch_idx >= ntasks) return; @@ -157,17 +146,7 @@ __global__ void zmat_mgga_vxc_skala_kernel(size_t ntasks, const double* vlapl_pos_device = task.vlapl_pos; const double* vlapl_neg_device = task.vlapl_neg; - const double* dden_x_grad_a = task.gamma_pp; - const double* dden_x_grad_b = task.vgamma_pp; - const double* dden_y_grad_a = task.gamma_pm; - const double* dden_y_grad_b = task.vgamma_pm; - const double* dden_z_grad_a = task.gamma_mm; - const double* dden_z_grad_b = task.vgamma_mm; - const auto* basis_eval_device = task.bf; - const auto* dbasis_x_eval_device = task.dbfx; - const auto* dbasis_y_eval_device = task.dbfy; - const auto* dbasis_z_eval_device = task.dbfz; const auto* d2basis_lapl_eval_device = task.d2bflapl; auto* z_matrix_device = task.zmat; @@ -181,28 +160,22 @@ __global__ void zmat_mgga_vxc_skala_kernel(size_t ntasks, const auto density_scalar_z = cuda::alpha_beta_to_scalar_z( task.vrho_pos[tid_x], task.vrho_neg[tid_x]); - const auto x_scalar_z = cuda::alpha_beta_to_scalar_z(dden_x_grad_a[tid_x], - dden_x_grad_b[tid_x]); - const auto y_scalar_z = cuda::alpha_beta_to_scalar_z(dden_y_grad_a[tid_x], - dden_y_grad_b[tid_x]); - const auto z_scalar_z = cuda::alpha_beta_to_scalar_z(dden_z_grad_a[tid_x], - dden_z_grad_b[tid_x]); - double density_potential = density_scalar_z.scalar; - double x_fact = x_scalar_z.scalar; - double y_fact = y_scalar_z.scalar; - double z_fact = z_scalar_z.scalar; - - if constexpr (den_selector == DEN_Z) { + if constexpr (den_selector == DEN_Z) density_potential = density_scalar_z.spin_z; - x_fact = x_scalar_z.spin_z; - y_fact = y_scalar_z.spin_z; - z_fact = z_scalar_z.spin_z; + + double gradient_contribution = 0.0; + for (const auto direction : {Direction::X, Direction::Y, Direction::Z}) { + const auto potential = cuda::alpha_beta_to_scalar_z( + cuda::gradient_potential(task, SpinChannel::Alpha, direction)[tid_x], + cuda::gradient_potential(task, SpinChannel::Beta, direction)[tid_x]); + double factor = potential.scalar; + if constexpr (den_selector == DEN_Z) factor = potential.spin_z; + gradient_contribution += + factor * cuda::basis_derivative(task, direction)[ibfoff]; } - auto val = x_fact * dbasis_x_eval_device[ibfoff] + - y_fact * dbasis_y_eval_device[ibfoff] + - z_fact * dbasis_z_eval_device[ibfoff] + + auto val = gradient_contribution + 0.5 * density_potential * basis_eval_device[ibfoff]; if constexpr (need_lapl) { diff --git a/SkalaXC/src/device/cuda/kernels/skala_exc_grad.cu b/SkalaXC/src/device/cuda/kernels/skala_exc_grad.cu index 3f682670..d668cdca 100644 --- a/SkalaXC/src/device/cuda/kernels/skala_exc_grad.cu +++ b/SkalaXC/src/device/cuda/kernels/skala_exc_grad.cu @@ -25,6 +25,7 @@ #include "device_specific/cuda_util.hpp" #include "spin_channels.cuh" #include +#include namespace SkalaXC { @@ -43,6 +44,9 @@ using GauXC::XCDeviceTask; */ __global__ void transform_skala_vxc_for_grad_kernel( uint32_t ntasks, XCDeviceTask* __restrict__ tasks_device) { + using cuda::Direction; + using cuda::PauliChannel; + using cuda::SpinChannel; const int batch_idx = blockIdx.z; if (batch_idx >= ntasks) return; @@ -54,22 +58,15 @@ __global__ void transform_skala_vxc_for_grad_kernel( if (tid >= npts) return; // Read per-direction SkalaXC derivatives (alpha/beta) - const double dx_a = task.gamma_pp[tid]; - const double dx_b = task.vgamma_pp[tid]; - const double dy_a = task.gamma_pm[tid]; - const double dy_b = task.vgamma_pm[tid]; - const double dz_a = task.gamma_mm[tid]; - const double dz_b = task.vgamma_mm[tid]; - - const auto dx_scalar_z = cuda::alpha_beta_to_scalar_z(dx_a, dx_b); - const auto dy_scalar_z = cuda::alpha_beta_to_scalar_z(dy_a, dy_b); - const auto dz_scalar_z = cuda::alpha_beta_to_scalar_z(dz_a, dz_b); - task.dden_sx[tid] = dx_scalar_z.scalar; - task.dden_sy[tid] = dy_scalar_z.scalar; - task.dden_sz[tid] = dz_scalar_z.scalar; - task.dden_zx[tid] = dx_scalar_z.spin_z; - task.dden_zy[tid] = dy_scalar_z.spin_z; - task.dden_zz[tid] = dz_scalar_z.spin_z; + for (const auto direction : {Direction::X, Direction::Y, Direction::Z}) { + const auto potential = cuda::alpha_beta_to_scalar_z( + cuda::gradient_potential(task, SpinChannel::Alpha, direction)[tid], + cuda::gradient_potential(task, SpinChannel::Beta, direction)[tid]); + cuda::density_gradient(task, PauliChannel::Scalar, direction)[tid] = + potential.scalar; + cuda::density_gradient(task, PauliChannel::SpinZ, direction)[tid] = + potential.spin_z; + } // Set vgamma coefficients so the standard kernel reproduces the SkalaXC // formula diff --git a/SkalaXC/src/device/cuda/kernels/spin_channels.cuh b/SkalaXC/src/device/cuda/kernels/spin_channels.cuh index 872179c4..fe613b85 100644 --- a/SkalaXC/src/device/cuda/kernels/spin_channels.cuh +++ b/SkalaXC/src/device/cuda/kernels/spin_channels.cuh @@ -1,7 +1,90 @@ #pragma once +#include +#include +#include + +#include "xc_integrator/xc_data/device/xc_device_task.hpp" + +#include + namespace SkalaXC::cuda { +enum class SpinChannel { Alpha, Beta }; +enum class PauliChannel { Scalar, SpinZ }; +enum class Direction { X, Y, Z }; + +/** + * @brief Select a model-gradient potential buffer before its transform. + * @param task GauXC task during model-potential unpacking or before conversion + * to GauXC gradient inputs, which overwrites the beta buffers with + * coefficients. + * @param channel Alpha or beta model channel. + * @param direction Cartesian derivative direction. + * @return Non-owning pointer, read-only for a const task; null for invalid + * selectors. + */ +template +__host__ __device__ __forceinline__ auto gradient_potential(Task& task, + SpinChannel channel, + Direction direction) + -> std::conditional_t, const double*, double*> { + static_assert(std::is_same_v, GauXC::XCDeviceTask>); + if (channel != SpinChannel::Alpha && channel != SpinChannel::Beta) + return nullptr; + switch (direction) { + case Direction::X: + return channel == SpinChannel::Alpha ? task.gamma_pp : task.vgamma_pp; + case Direction::Y: + return channel == SpinChannel::Alpha ? task.gamma_pm : task.vgamma_pm; + case Direction::Z: + return channel == SpinChannel::Alpha ? task.gamma_mm : task.vgamma_mm; + } + return nullptr; +} + +/** @brief Read a basis derivative buffer; null for an invalid direction. */ +__host__ __device__ __forceinline__ const double* basis_derivative( + const GauXC::XCDeviceTask& task, Direction direction) { + switch (direction) { + case Direction::X: + return task.dbfx; + case Direction::Y: + return task.dbfy; + case Direction::Z: + return task.dbfz; + } + return nullptr; +} + +/** + * @brief Access GauXC scalar/spin-z density-gradient scratch buffers. + * @param task Task holding density gradients during feature packing, or + * transformed gradient potentials after conversion to GauXC gradient inputs. + * @param channel Scalar or spin-z channel. + * @param direction Cartesian direction. + * @return Non-owning pointer, read-only for a const task; null for invalid + * selectors. + */ +template +__host__ __device__ __forceinline__ auto density_gradient(Task& task, + PauliChannel channel, + Direction direction) + -> std::conditional_t, const double*, double*> { + static_assert(std::is_same_v, GauXC::XCDeviceTask>); + if (channel != PauliChannel::Scalar && channel != PauliChannel::SpinZ) + return nullptr; + switch (direction) { + case Direction::X: + return channel == PauliChannel::Scalar ? task.dden_sx : task.dden_zx; + case Direction::Y: + return channel == PauliChannel::Scalar ? task.dden_sy : task.dden_zy; + case Direction::Z: + return channel == PauliChannel::Scalar ? task.dden_sz : task.dden_zz; + } + return nullptr; +} + struct AlphaBetaChannels { double alpha; double beta; diff --git a/SkalaXC/src/host/derivative_component_map.hpp b/SkalaXC/src/host/derivative_component_map.hpp new file mode 100644 index 00000000..d9e4f05c --- /dev/null +++ b/SkalaXC/src/host/derivative_component_map.hpp @@ -0,0 +1,119 @@ +#pragma once + +#include "component_matrix_map.hpp" +#include "spin_gradient.hpp" + +#include +#include +#include + +namespace SkalaXC { + +namespace detail { + +inline Eigen::Index first_derivative_component(Direction direction) { + if (direction < X || direction > Z) + throw std::out_of_range("Derivative direction out of range"); + return direction + 1; +} + +inline Eigen::Index hessian_component(Direction first, Direction second) { + first_derivative_component(first); + first_derivative_component(second); + constexpr std::array, 3> components{ + {{{4, 5, 6}}, {{5, 7, 8}}, {{6, 8, 9}}}}; + return components[first][second]; +} + +} // namespace detail + +/** @brief Borrow GauXC basis values, gradients, and symmetric Hessian blocks. + */ +template +class BasisComponentView { + public: + /** @brief Borrow an existing map with 1, 4, or 10 basis components. */ + explicit BasisComponentView(Map& components) : components_(components) { + const auto count = components.components(); + if (count != 1 && count != 4 && count != 10) + throw std::invalid_argument("Invalid basis component count"); + } + + /** @return Non-owning basis-value matrix. */ + auto value() { return components_.component(0); } + /** @return Read-only basis-value matrix. */ + auto value() const { return std::as_const(components_).component(0); } + + /** @return Non-owning derivative matrix for the requested direction. */ + auto first_derivative(Direction direction) { + return components_.component(detail::first_derivative_component(direction)); + } + /** @return Read-only derivative matrix for the requested direction. */ + auto first_derivative(Direction direction) const { + return std::as_const(components_) + .component(detail::first_derivative_component(direction)); + } + + /** @return Non-owning Hessian matrix, symmetric in its direction arguments. + */ + auto hessian(Direction first, Direction second) { + return components_.component(detail::hessian_component(first, second)); + } + /** @return Read-only Hessian matrix. */ + auto hessian(Direction first, Direction second) const { + return std::as_const(components_) + .component(detail::hessian_component(first, second)); + } + + private: + Map& components_; +}; + +/** @brief Borrow scalar/spin-z matrices with optional Cartesian derivatives. */ +template +class PauliComponentView { + public: + /** @brief Borrow an existing map with 1 or 4 components per channel. */ + explicit PauliComponentView(Map& components) : components_(components) { + if (components.components() != 2 && components.components() != 8) + throw std::invalid_argument("Invalid Pauli component count"); + } + + /** @return Non-owning value matrix for the requested Pauli channel. */ + auto value(PauliChannel channel) { + return components_.component(channel_offset(channel)); + } + /** @return Read-only value matrix for the requested Pauli channel. */ + auto value(PauliChannel channel) const { + return std::as_const(components_).component(channel_offset(channel)); + } + + /** @return Non-owning derivative matrix for one channel and direction. */ + auto first_derivative(PauliChannel channel, Direction direction) { + return components_.component(derivative_component(channel, direction)); + } + /** @return Read-only derivative matrix for one channel and direction. */ + auto first_derivative(PauliChannel channel, Direction direction) const { + return std::as_const(components_) + .component(derivative_component(channel, direction)); + } + + private: + Eigen::Index channel_offset(PauliChannel channel) const { + if (channel < Scalar || channel > SpinZ) + throw std::out_of_range("Pauli channel out of range"); + return channel * (components_.components() / spin_dimension); + } + + Eigen::Index derivative_component(PauliChannel channel, + Direction direction) const { + if (components_.components() != 8) + throw std::out_of_range("Pauli derivative components are absent"); + return channel_offset(channel) + + detail::first_derivative_component(direction); + } + + Map& components_; +}; + +} // namespace SkalaXC \ No newline at end of file diff --git a/SkalaXC/src/host/model_grid_exchange.cxx b/SkalaXC/src/host/model_grid_exchange.cxx index 89b69899..91106ce1 100644 --- a/SkalaXC/src/host/model_grid_exchange.cxx +++ b/SkalaXC/src/host/model_grid_exchange.cxx @@ -62,16 +62,9 @@ FeatureDict ModelGridExchange::prepare_local_features( if (has_density_gradient) { if (features.density_gradient.points() != block_point_count) SKALAXC_EXCEPTION("Invalid task density-gradient dimensions"); - for (Eigen::Index point = 0; point < block_point_count; ++point) - for (Eigen::Index direction = 0; direction < direction_dimension; - ++direction) - for (Eigen::Index spin = 0; spin < spin_dimension; ++spin) - density_gradient(static_cast(direction), - block_offset + point, - static_cast(spin)) = - features.density_gradient(static_cast(direction), - point, - static_cast(spin)); + copy_points( + features.density_gradient, + density_gradient.point_slice(block_offset, block_point_count)); } } @@ -198,15 +191,8 @@ void ModelGridExchange::distribute_local_potentials( density_potential.middleRows(block_offset, block_point_count); if (has_density_gradient) { potentials.density_gradient.resize(block_point_count); - for (Eigen::Index point = 0; point < block_point_count; ++point) - for (Eigen::Index direction = 0; direction < direction_dimension; - ++direction) - for (Eigen::Index spin = 0; spin < spin_dimension; ++spin) - potentials.density_gradient(static_cast(direction), - point, static_cast(spin)) = - density_gradient(static_cast(direction), - block_offset + point, - static_cast(spin)); + copy_points(density_gradient.point_slice(block_offset, block_point_count), + potentials.density_gradient); } if (has_kinetic) potentials.kinetic = diff --git a/SkalaXC/src/host/skala_host_driver.cxx b/SkalaXC/src/host/skala_host_driver.cxx index 04d809ea..0af1122a 100644 --- a/SkalaXC/src/host/skala_host_driver.cxx +++ b/SkalaXC/src/host/skala_host_driver.cxx @@ -11,6 +11,7 @@ #include "skala_host_driver.hpp" #include "collective_error.hpp" #include "component_matrix_map.hpp" +#include "derivative_component_map.hpp" #include "exceptions.hpp" #include "model_grid_exchange.hpp" #include "mpi_wrapper.hpp" @@ -50,137 +51,149 @@ class GauXCTaskAdapter { void eval_collocation(ComponentMatrixMap& basis_components, bool needs_gradient) const { + BasisComponentView basis_values(basis_components); if (needs_gradient) { - driver_.eval_collocation_gradient(npts_, nshells_, nbe_, - task_.points.data()->data(), basis_, - task_.bfn_screening.shell_list.data(), - basis_components.component_data(0), - basis_components.component_data(1), - basis_components.component_data(2), - basis_components.component_data(3)); + driver_.eval_collocation_gradient( + npts_, nshells_, nbe_, task_.points.data()->data(), basis_, + task_.bfn_screening.shell_list.data(), basis_values.value().data(), + basis_values.first_derivative(X).data(), + basis_values.first_derivative(Y).data(), + basis_values.first_derivative(Z).data()); } else { - driver_.eval_collocation(npts_, nshells_, nbe_, - task_.points.data()->data(), basis_, - task_.bfn_screening.shell_list.data(), - basis_components.component_data(0)); + driver_.eval_collocation( + npts_, nshells_, nbe_, task_.points.data()->data(), basis_, + task_.bfn_screening.shell_list.data(), basis_values.value().data()); } } void eval_collocation_hessian(ComponentMatrixMap& basis_components) const { + BasisComponentView basis_values(basis_components); driver_.eval_collocation_hessian( npts_, nshells_, nbe_, task_.points.data()->data(), basis_, - task_.bfn_screening.shell_list.data(), - basis_components.component_data(0), basis_components.component_data(1), - basis_components.component_data(2), basis_components.component_data(3), - basis_components.component_data(4), basis_components.component_data(5), - basis_components.component_data(6), basis_components.component_data(7), - basis_components.component_data(8), basis_components.component_data(9)); + task_.bfn_screening.shell_list.data(), basis_values.value().data(), + basis_values.first_derivative(X).data(), + basis_values.first_derivative(Y).data(), + basis_values.first_derivative(Z).data(), + basis_values.hessian(X, X).data(), basis_values.hessian(X, Y).data(), + basis_values.hessian(X, Z).data(), basis_values.hessian(Y, Y).data(), + basis_values.hessian(Y, Z).data(), basis_values.hessian(Z, Z).data()); } void eval_xmat(std::size_t point_components, std::size_t nbf, const GauXC::LocalHostWorkDriver::submat_map_t& submat_map, ConstColMajorMatrixMap density, const ComponentMatrixMap& basis_components, - ComponentMatrixMap& x_components, Eigen::Index x_component, + ComponentMatrixMap& x_components, PauliChannel channel, std::vector& scratch) const { - driver_.eval_xmat( - point_components * npts_, nbf, nbe_, submat_map, 1.0, density.data(), - density.outerStride(), basis_components.component_data(0), nbe_, - x_components.component_data(x_component), nbe_, scratch.data()); + const BasisComponentView basis_values(basis_components); + PauliComponentView xmat(x_components); + driver_.eval_xmat(point_components * npts_, nbf, nbe_, submat_map, 1.0, + density.data(), density.outerStride(), + basis_values.value().data(), nbe_, + xmat.value(channel).data(), nbe_, scratch.data()); } void eval_lda_model_features_uks(const ComponentMatrixMap& basis_components, const ComponentMatrixMap& x_components, - Eigen::Index spin_component, AlphaBetaMatrix& alpha_beta_density) const { - driver_.eval_uvvar_lda_uks(npts_, nbe_, basis_components.component_data(0), - x_components.component_data(0), nbe_, - x_components.component_data(spin_component), - nbe_, alpha_beta_density.data()); + const BasisComponentView basis_values(basis_components); + const PauliComponentView xmat(x_components); + driver_.eval_uvvar_lda_uks( + npts_, nbe_, basis_values.value().data(), xmat.value(Scalar).data(), + nbe_, xmat.value(SpinZ).data(), nbe_, alpha_beta_density.data()); } void eval_gga_model_features_uks(const ComponentMatrixMap& basis_components, const ComponentMatrixMap& x_components, - Eigen::Index spin_component, AlphaBetaMatrix& alpha_beta_density, SpinGradient& alpha_beta_density_gradient, std::vector& gamma, ScalarZGradient& scalar_z_scratch) const { + const BasisComponentView basis_values(basis_components); + const PauliComponentView xmat(x_components); scalar_z_scratch.resize(npts_); driver_.eval_uvvar_gga_uks( - npts_, nbe_, basis_components.component_data(0), - basis_components.component_data(1), basis_components.component_data(2), - basis_components.component_data(3), x_components.component_data(0), - nbe_, x_components.component_data(spin_component), nbe_, - alpha_beta_density.data(), scalar_z_scratch.direction_data(X), - scalar_z_scratch.direction_data(Y), scalar_z_scratch.direction_data(Z), - gamma.data()); + npts_, nbe_, basis_values.value().data(), + basis_values.first_derivative(X).data(), + basis_values.first_derivative(Y).data(), + basis_values.first_derivative(Z).data(), xmat.value(Scalar).data(), + nbe_, xmat.value(SpinZ).data(), nbe_, alpha_beta_density.data(), + scalar_z_scratch.direction_data(X), scalar_z_scratch.direction_data(Y), + scalar_z_scratch.direction_data(Z), gamma.data()); convert_scalar_z_to_alpha_beta(scalar_z_scratch, alpha_beta_density_gradient); } void eval_mgga_model_features_uks(const ComponentMatrixMap& basis_components, const ComponentMatrixMap& x_components, - Eigen::Index spin_component, AlphaBetaMatrix& alpha_beta_density, SpinGradient& alpha_beta_density_gradient, std::vector& gamma, AlphaBetaMatrix& alpha_beta_kinetic, std::vector& laplacian, ScalarZGradient& scalar_z_scratch) const { + const BasisComponentView basis_values(basis_components); + const PauliComponentView xmat(x_components); scalar_z_scratch.resize(npts_); driver_.eval_uvvar_mgga_uks( - npts_, nbe_, basis_components.component_data(0), - basis_components.component_data(1), basis_components.component_data(2), - basis_components.component_data(3), nullptr, - x_components.component_data(0), nbe_, - x_components.component_data(spin_component), nbe_, - x_components.component_data(1), x_components.component_data(2), - x_components.component_data(3), nbe_, - x_components.component_data(spin_component + 1), - x_components.component_data(spin_component + 2), - x_components.component_data(spin_component + 3), nbe_, - alpha_beta_density.data(), scalar_z_scratch.direction_data(X), - scalar_z_scratch.direction_data(Y), scalar_z_scratch.direction_data(Z), - gamma.data(), alpha_beta_kinetic.data(), laplacian.data()); + npts_, nbe_, basis_values.value().data(), + basis_values.first_derivative(X).data(), + basis_values.first_derivative(Y).data(), + basis_values.first_derivative(Z).data(), nullptr, + xmat.value(Scalar).data(), nbe_, xmat.value(SpinZ).data(), nbe_, + xmat.first_derivative(Scalar, X).data(), + xmat.first_derivative(Scalar, Y).data(), + xmat.first_derivative(Scalar, Z).data(), nbe_, + xmat.first_derivative(SpinZ, X).data(), + xmat.first_derivative(SpinZ, Y).data(), + xmat.first_derivative(SpinZ, Z).data(), nbe_, alpha_beta_density.data(), + scalar_z_scratch.direction_data(X), scalar_z_scratch.direction_data(Y), + scalar_z_scratch.direction_data(Z), gamma.data(), + alpha_beta_kinetic.data(), laplacian.data()); convert_scalar_z_to_alpha_beta(scalar_z_scratch, alpha_beta_density_gradient); } void eval_zmat_lda_vxc_uks(const AlphaBetaMatrix& density_potential, const ComponentMatrixMap& basis_components, - ComponentMatrixMap& zmat_components, - Eigen::Index spin_component) const { + ComponentMatrixMap& zmat_components) const { + const BasisComponentView basis_values(basis_components); + PauliComponentView zmat(zmat_components); driver_.eval_zmat_lda_vxc_uks( - npts_, nbe_, density_potential.data(), - basis_components.component_data(0), zmat_components.component_data(0), - nbe_, zmat_components.component_data(spin_component), nbe_); + npts_, nbe_, density_potential.data(), basis_values.value().data(), + zmat.value(Scalar).data(), nbe_, zmat.value(SpinZ).data(), nbe_); } void eval_mmat_mgga_vxc_uks(const AlphaBetaMatrix& kinetic_potential, const ComponentMatrixMap& basis_components, - ComponentMatrixMap& zmat_components, - Eigen::Index spin_component) const { + ComponentMatrixMap& zmat_components) const { + const BasisComponentView basis_values(basis_components); + PauliComponentView zmat(zmat_components); driver_.eval_mmat_mgga_vxc_uks( npts_, nbe_, kinetic_potential.data(), nullptr, - basis_components.component_data(1), basis_components.component_data(2), - basis_components.component_data(3), zmat_components.component_data(1), - zmat_components.component_data(2), zmat_components.component_data(3), - nbe_, zmat_components.component_data(spin_component + 1), - zmat_components.component_data(spin_component + 2), - zmat_components.component_data(spin_component + 3), nbe_); + basis_values.first_derivative(X).data(), + basis_values.first_derivative(Y).data(), + basis_values.first_derivative(Z).data(), + zmat.first_derivative(Scalar, X).data(), + zmat.first_derivative(Scalar, Y).data(), + zmat.first_derivative(Scalar, Z).data(), nbe_, + zmat.first_derivative(SpinZ, X).data(), + zmat.first_derivative(SpinZ, Y).data(), + zmat.first_derivative(SpinZ, Z).data(), nbe_); } void inc_vxc(std::size_t point_components, std::size_t nbf, const ComponentMatrixMap& basis_components, const GauXC::LocalHostWorkDriver::submat_map_t& submat_map, - const ComponentMatrixMap& zmat_components, - Eigen::Index zmat_component, ColMajorMatrixMap potential, + const ComponentMatrixMap& zmat_components, PauliChannel channel, + ColMajorMatrixMap potential, std::vector& scratch) const { + const BasisComponentView basis_values(basis_components); + const PauliComponentView zmat(zmat_components); driver_.inc_vxc(point_components * npts_, nbf, nbe_, - basis_components.component_data(0), submat_map, - zmat_components.component_data(zmat_component), nbe_, - potential.data(), potential.outerStride(), scratch.data()); + basis_values.value().data(), submat_map, + zmat.value(channel).data(), nbe_, potential.data(), + potential.outerStride(), scratch.data()); } void eval_weight_1st_deriv_contracted( @@ -210,10 +223,10 @@ class GauXCTaskAdapter { void validate_zmat_inputs(const AlphaBetaMatrix& density_potential, const SpinGradient& gradient_potential, const ComponentMatrixMap& basis_components, - const ComponentMatrixMap& zmat_components, - Eigen::Index spin_component) { - if (basis_components.components() < 4 || spin_component < 0 || - spin_component >= zmat_components.components() || + const ComponentMatrixMap& zmat_components) { + if (basis_components.components() < 4 || + (zmat_components.components() != 2 && + zmat_components.components() != 8) || zmat_components.rows() != basis_components.rows() || zmat_components.points() != basis_components.points()) SKALAXC_EXCEPTION("Invalid Z-matrix dimensions"); @@ -228,15 +241,16 @@ void validate_zmat_inputs(const AlphaBetaMatrix& density_potential, void eval_zmat_gga_vxc_uks(const AlphaBetaMatrix& density_potential, const SpinGradient& gradient_potential, const ComponentMatrixMap& basis_components, - ComponentMatrixMap& zmat_components, - Eigen::Index spin_component) { + ComponentMatrixMap& zmat_components) { validate_zmat_inputs(density_potential, gradient_potential, basis_components, - zmat_components, spin_component); + zmat_components); + const BasisComponentView basis_values(basis_components); + PauliComponentView zmat(zmat_components); const auto density_scalar_z = alpha_beta_to_scalar_z(density_potential); - const auto basis_value = basis_components.component(0); - auto zmat_scalar = zmat_components.component(0); - auto zmat_spin = zmat_components.component(spin_component); + const auto basis_value = basis_values.value(); + auto zmat_scalar = zmat.value(Scalar); + auto zmat_spin = zmat.value(SpinZ); zmat_scalar.array() = basis_value.array().rowwise() * (0.5 * density_scalar_z.col(PauliChannel::Scalar)).transpose().array(); @@ -244,12 +258,10 @@ void eval_zmat_gga_vxc_uks(const AlphaBetaMatrix& density_potential, basis_value.array().rowwise() * (0.5 * density_scalar_z.col(PauliChannel::SpinZ)).transpose().array(); - for (Eigen::Index direction = 0; direction < direction_dimension; - ++direction) { - const auto potential = - gradient_potential.direction(static_cast(direction)); + for (const auto direction : {X, Y, Z}) { + const auto potential = gradient_potential.direction(direction); const auto gradient_scalar_z = alpha_beta_to_scalar_z(potential); - const auto basis_derivative = basis_components.component(direction + 1); + const auto basis_derivative = basis_values.first_derivative(direction); zmat_scalar.array() += basis_derivative.array().rowwise() * gradient_scalar_z.col(PauliChannel::Scalar).transpose().array(); @@ -599,8 +611,6 @@ void SkalaHostDriver::exc_grad_local_work_( const int32_t nbf = basis.nbf(); const auto& tasks = lb_.get_tasks(); const size_t ntasks = tasks.size(); - constexpr std::array, 3> hessian_components{ - {{{4, 5, 6}}, {{5, 7, 8}}, {{6, 8, 9}}}}; #ifdef _OPENMP #pragma omp parallel @@ -631,7 +641,8 @@ void SkalaHostDriver::exc_grad_local_work_( const Eigen::Index zmat_component_count = (is_gga || is_mgga) ? 8 : 2; ComponentMatrixMap zmat_components(host_data.zmat.data(), zmat_component_count, nbe, npts); - const Eigen::Index spin_zmat_component = (is_gga || is_mgga) ? 4 : 1; + const BasisComponentView basis_values(basis_components); + const PauliComponentView xmat(zmat_components); std::vector> submat_map; std::tie(submat_map, std::ignore) = GauXC::gen_compressed_submat_map( basis_map, task.bfn_screening.shell_list, nbf, nbf); @@ -643,11 +654,11 @@ void SkalaHostDriver::exc_grad_local_work_( const int xmat_len = (is_gga || is_mgga) ? 4 : 1; task_work.eval_xmat(xmat_len, nbf, submat_map, scalar_density, - basis_components, zmat_components, 0, + basis_components, zmat_components, Scalar, host_data.nbe_scr); task_work.eval_xmat(xmat_len, nbf, submat_map, spin_density, - basis_components, zmat_components, - spin_zmat_component, host_data.nbe_scr); + basis_components, zmat_components, SpinZ, + host_data.nbe_scr); // GauXC's contracted partition derivative expects w_i * f_i. The model // boundary cotangent is f_i = dE/dw_i. @@ -687,8 +698,8 @@ void SkalaHostDriver::exc_grad_local_work_( .sum(); }; - const auto xN_component = zmat_components.component(0); - const auto xZ_component = zmat_components.component(spin_zmat_component); + const auto xN_component = xmat.value(Scalar); + const auto xZ_component = xmat.value(SpinZ); Eigen::Index basis_offset = 0; for (int32_t ish = 0; ish < nshells; ++ish) { const int sh_idx = task.bfn_screening.shell_list[ish]; @@ -702,10 +713,10 @@ void SkalaHostDriver::exc_grad_local_work_( const auto xN = xN_component.middleRows(basis_offset, shell_size); const auto xZ = xZ_component.middleRows(basis_offset, shell_size); Eigen::Vector3d shell_gradient = Eigen::Vector3d::Zero(); - for (Eigen::Index force = 0; force < direction_dimension; ++force) { + for (const auto force : {X, Y, Z}) { const auto basis_derivative = - basis_components.component(force + 1).middleRows(basis_offset, - shell_size); + basis_values.first_derivative(force).middleRows(basis_offset, + shell_size); shell_gradient(force) = contract(xN, basis_derivative, density_scalar_z.col(PauliChannel::Scalar)) + @@ -713,17 +724,15 @@ void SkalaHostDriver::exc_grad_local_work_( density_scalar_z.col(PauliChannel::SpinZ)); if (is_gga || is_mgga) { - for (Eigen::Index response = 0; response < direction_dimension; - ++response) { + for (const auto response : {X, Y, Z}) { const auto basis_hessian = - basis_components - .component(hessian_components[force][response]) + basis_values.hessian(force, response) .middleRows(basis_offset, shell_size); const auto xN_derivative = - zmat_components.component(response + 1) + xmat.first_derivative(Scalar, response) .middleRows(basis_offset, shell_size); const auto xZ_derivative = - zmat_components.component(response + 5) + xmat.first_derivative(SpinZ, response) .middleRows(basis_offset, shell_size); shell_gradient(force) += contract(basis_hessian, xN, gradient_scalar.col(response)) + @@ -819,25 +828,23 @@ void SkalaHostDriver::pre_skala_local_work_( task_work.eval_collocation(basis_components, needs_gradient); task_work.eval_xmat(mgga_component_count, nbf, submat_map, scalar_density, - basis_components, zmat_components, 0, + basis_components, zmat_components, Scalar, host_data.nbe_scr); task_work.eval_xmat(mgga_component_count, nbf, submat_map, spin_density, - basis_components, zmat_components, - mgga_component_count, host_data.nbe_scr); + basis_components, zmat_components, SpinZ, + host_data.nbe_scr); if (is_mgga) { task_work.eval_mgga_model_features_uks( - basis_components, zmat_components, mgga_component_count, - features.density, features.density_gradient, host_data.gamma, - features.kinetic, host_data.lapl, scalar_z_gradient); + basis_components, zmat_components, features.density, + features.density_gradient, host_data.gamma, features.kinetic, + host_data.lapl, scalar_z_gradient); } else if (is_gga) { task_work.eval_gga_model_features_uks( - basis_components, zmat_components, mgga_component_count, - features.density, features.density_gradient, host_data.gamma, - scalar_z_gradient); + basis_components, zmat_components, features.density, + features.density_gradient, host_data.gamma, scalar_z_gradient); } else { task_work.eval_lda_model_features_uks(basis_components, zmat_components, - mgga_component_count, features.density); } @@ -902,22 +909,20 @@ void SkalaHostDriver::post_skala_local_work_( if (needs_gradient) { eval_zmat_gga_vxc_uks(potentials.density, potentials.density_gradient, - basis_components, zmat_components, - mgga_component_count); + basis_components, zmat_components); if (is_mgga) task_work.eval_mmat_mgga_vxc_uks(potentials.kinetic, basis_components, - zmat_components, - mgga_component_count); + zmat_components); } else { task_work.eval_zmat_lda_vxc_uks(potentials.density, basis_components, - zmat_components, mgga_component_count); + zmat_components); } task_work.inc_vxc(mgga_component_count, nbf, basis_components, submat_map, - zmat_components, 0, scalar_potential, + zmat_components, Scalar, scalar_potential, host_data.nbe_scr); task_work.inc_vxc(mgga_component_count, nbf, basis_components, submat_map, - zmat_components, mgga_component_count, spin_potential, + zmat_components, SpinZ, spin_potential, host_data.nbe_scr); } } // omp parallel diff --git a/SkalaXC/src/host/spin_gradient.hpp b/SkalaXC/src/host/spin_gradient.hpp index 57301fe8..04f9ff22 100644 --- a/SkalaXC/src/host/spin_gradient.hpp +++ b/SkalaXC/src/host/spin_gradient.hpp @@ -5,6 +5,7 @@ #include #include +#include #include #include @@ -39,6 +40,11 @@ class ChannelGradient final { using DirectionMap = Eigen::Map; /** @brief Read-only one-direction view. */ using ConstDirectionMap = Eigen::Map; + /** @brief Mutable direction-by-interleaved-channel point block. */ + using PointSlice = Eigen::Block; + /** @brief Read-only point block. */ + using ConstPointSlice = + Eigen::Block; static_assert(DirectionMatrix::ColsAtCompileTime == spin_dimension); @@ -60,6 +66,30 @@ class ChannelGradient final { return values_.cols() / spin_dimension; } + /** + * @brief Borrow a point range without changing its direction stride. + * @param offset First point in the owner. + * @param count Number of points, possibly zero. + * @return Mutable view valid until the owner invalidates its storage. + */ + PointSlice point_slice(Eigen::Index offset, Eigen::Index count) & { + validate_point_slice(offset, count); + return values_.middleCols(offset * spin_dimension, count * spin_dimension); + } + + /** + * @brief Borrow a point range read-only. + * @param offset First point in the owner. + * @param count Number of points, possibly zero. + * @return Read-only view valid until the owner invalidates its storage. + */ + ConstPointSlice point_slice(Eigen::Index offset, Eigen::Index count) const& { + validate_point_slice(offset, count); + return values_.middleCols(offset * spin_dimension, count * spin_dimension); + } + PointSlice point_slice(Eigen::Index, Eigen::Index) && = delete; + ConstPointSlice point_slice(Eigen::Index, Eigen::Index) const&& = delete; + /** * @brief Access one value. * @param direction Cartesian direction. @@ -143,6 +173,12 @@ class ChannelGradient final { } private: + void validate_point_slice(Eigen::Index offset, Eigen::Index count) const { + if (offset < 0 || count < 0 || offset > points() || + count > points() - offset) + throw std::out_of_range("ChannelGradient point slice out of range"); + } + Eigen::Index column(Eigen::Index point, Channel channel) const { if (point < 0 || point >= points()) throw std::out_of_range("ChannelGradient point index out of range"); @@ -160,6 +196,49 @@ using ScalarZGradient = ChannelGradient; /** @brief Pointwise Cartesian density gradients for alpha and beta spin. */ using SpinGradient = ChannelGradient; +/** + * @brief Copy equal-sized, nonoverlapping point blocks without allocation. + * @param source Point block from point_slice; channel semantics must match. + * @param destination Writable point block; its owner is never resized. + * @throws std::invalid_argument If extents differ or nonempty ranges overlap. + */ +template +void copy_points( + const Eigen::Block& source, + SpinGradient::PointSlice destination) { + static_assert( + std::is_same_v, SpinGradient::Storage>); + if (source.cols() != destination.cols() || + source.cols() % spin_dimension != 0) + throw std::invalid_argument("Gradient point block dimensions mismatch"); + if (source.cols() == 0) return; + + const bool same_storage = + source.nestedExpression().data() == destination.nestedExpression().data(); + const auto source_start = source.startCol(); + const auto destination_start = destination.startCol(); + const bool overlap = same_storage && + source_start < destination_start + destination.cols() && + destination_start < source_start + source.cols(); + if (overlap) throw std::invalid_argument("Gradient point blocks overlap"); + destination = source; +} + +/** @brief Copy all source points into a selected destination range. */ +template +void copy_points(const ChannelGradient& source, + SpinGradient::PointSlice destination) { + copy_points(source.point_slice(0, source.points()), destination); +} + +/** @brief Copy a selected source range into a pre-sized destination. */ +template +void copy_points( + const Eigen::Block& source, + ChannelGradient& destination) { + copy_points(source, destination.point_slice(0, destination.points())); +} + /** * @brief Convert a double tensor shaped `[spin, direction, points]`. * @param tensor Source tensor. diff --git a/SkalaXC/tests/skala_device_test.cxx b/SkalaXC/tests/skala_device_test.cxx index 611177ef..f5fcdf17 100644 --- a/SkalaXC/tests/skala_device_test.cxx +++ b/SkalaXC/tests/skala_device_test.cxx @@ -1,7 +1,9 @@ #include #include +#include #include +#include "device/cuda/kernels/spin_channels.cuh" #include "test_utils.hpp" #include @@ -16,6 +18,7 @@ #include #include #include +#include #include #ifdef SKALAXC_HAS_MPI @@ -27,6 +30,27 @@ namespace { using Matrix = Eigen::MatrixXd; using Result = std::tuple; +void require_gradient_potential_buffer(GauXC::XCDeviceTask& task, + SkalaXC::cuda::SpinChannel channel, + SkalaXC::cuda::Direction direction, + double* expected) { + auto* writable = SkalaXC::cuda::gradient_potential(task, channel, direction); + const auto& const_task = task; + const auto* readable = + SkalaXC::cuda::gradient_potential(const_task, channel, direction); + STATIC_REQUIRE(std::is_same_v); + STATIC_REQUIRE(std::is_same_v); + REQUIRE(writable == expected); + REQUIRE(readable == expected); + for (std::size_t point = 0; point < task.npts; ++point) + REQUIRE(readable[point] == expected[point]); + writable[1] = -expected[1]; + REQUIRE(readable[1] == expected[1]); + REQUIRE(expected[1] < 0.0); +} + std::string cuda_skala_model() { return std::string(SKALAXC_MODEL_PATH) + "/skala-1.1-cuda.fun"; } @@ -88,6 +112,83 @@ std::vector evaluate_gradient( } // namespace +TEST_CASE("Skala CUDA gradient-potential accessors select semantic buffers", + "[skala][cuda][device-potential-accessors]") { + using SkalaXC::cuda::Direction; + using SkalaXC::cuda::SpinChannel; + std::array, 6> buffers{}; + for (std::size_t component = 0; component < buffers.size(); ++component) + for (std::size_t point = 0; point < buffers[component].size(); ++point) + buffers[component][point] = 100.0 * (component + 1) + point; + + GauXC::XCDeviceTask task; + task.npts = 3; + task.gamma_pp = buffers[0].data(); + task.gamma_pm = buffers[1].data(); + task.gamma_mm = buffers[2].data(); + task.vgamma_pp = buffers[3].data(); + task.vgamma_pm = buffers[4].data(); + task.vgamma_mm = buffers[5].data(); + + for (const auto channel : {SpinChannel::Alpha, SpinChannel::Beta}) + for (const auto direction : {Direction::X, Direction::Y, Direction::Z}) { + const auto component = static_cast(channel) * 3 + + static_cast(direction); + require_gradient_potential_buffer(task, channel, direction, + buffers[component].data()); + } + REQUIRE(SkalaXC::cuda::gradient_potential(task, static_cast(2), + Direction::X) == nullptr); + REQUIRE(SkalaXC::cuda::gradient_potential( + task, SpinChannel::Alpha, static_cast(3)) == nullptr); +} + +TEST_CASE("Skala CUDA directional accessors select basis and density buffers", + "[skala][cuda][device-potential-accessors]") { + using SkalaXC::cuda::Direction; + using SkalaXC::cuda::PauliChannel; + std::array, 9> buffers{}; + GauXC::XCDeviceTask task; + task.dbfx = buffers[0].data(); + task.dbfy = buffers[1].data(); + task.dbfz = buffers[2].data(); + task.dden_sx = buffers[3].data(); + task.dden_sy = buffers[4].data(); + task.dden_sz = buffers[5].data(); + task.dden_zx = buffers[6].data(); + task.dden_zy = buffers[7].data(); + task.dden_zz = buffers[8].data(); + const auto& const_task = task; + + for (const auto direction : {Direction::X, Direction::Y, Direction::Z}) { + REQUIRE(SkalaXC::cuda::basis_derivative(task, direction) == + buffers[static_cast(direction)].data()); + for (const auto channel : {PauliChannel::Scalar, PauliChannel::SpinZ}) { + const auto component = 3 + static_cast(channel) * 3 + + static_cast(direction); + auto* writable = + SkalaXC::cuda::density_gradient(task, channel, direction); + const auto* readable = + SkalaXC::cuda::density_gradient(const_task, channel, direction); + STATIC_REQUIRE(std::is_same_v); + STATIC_REQUIRE(std::is_same_v); + REQUIRE(writable == buffers[component].data()); + REQUIRE(readable == buffers[component].data()); + writable[1] = static_cast(component); + REQUIRE(buffers[component][1] == static_cast(component)); + } + } + REQUIRE(SkalaXC::cuda::basis_derivative(task, static_cast(3)) == + nullptr); + REQUIRE(SkalaXC::cuda::density_gradient(task, static_cast(2), + Direction::X) == nullptr); + REQUIRE(SkalaXC::cuda::density_gradient(task, PauliChannel::Scalar, + static_cast(3)) == + nullptr); +} + TEST_CASE("Skala CUDA reproduces host EXC and VXC", "[skala][cuda][device-reference-integration]") { const std::string fixture = std::string(SKALAXC_TEST_REF_DATA_PATH) + @@ -95,6 +196,9 @@ TEST_CASE("Skala CUDA reproduces host EXC and VXC", const auto system = SkalaXC::test::load_molecular_system(fixture); const auto density = SkalaXC::test::load_uks_density(fixture, "/DENSITY_SCALAR", "/DENSITY_Z"); + const double spin_fraction = GENERATE(0.0, 0.2); + const Matrix spin_density = density.spin + spin_fraction * density.scalar; + INFO("spin fraction=" << spin_fraction); SkalaXC::RuntimeEnvironment host_runtime{SKALAXC_MPI_CODE(MPI_COMM_WORLD)}; SkalaXC::DeviceRuntimeSettings device_settings; @@ -105,10 +209,10 @@ TEST_CASE("Skala CUDA reproduces host EXC and VXC", for (const std::string model : {"LDA", "PBE", "TPSS"}) { const Result host = evaluate(host_runtime, SkalaXC::ExecutionSpace::Host, system.molecule, - system.basis, model, density.scalar, density.spin, false); + system.basis, model, density.scalar, spin_density, false); const Result device = evaluate( device_runtime, SkalaXC::ExecutionSpace::Device, system.molecule, - system.basis, model, density.scalar, density.spin, true); + system.basis, model, density.scalar, spin_density, true); const double exc_error = std::abs(std::get<0>(device) - std::get<0>(host)) / std::max(1.0, std::abs(std::get<0>(host))); @@ -126,6 +230,7 @@ TEST_CASE("Skala CUDA reproduces host EXC and VXC", CHECK(exc_error <= 1e-10); CHECK(scalar_error <= 1e-7); CHECK(spin_error <= 1e-10); + if (spin_fraction != 0.0) REQUIRE(std::get<2>(host).norm() > 1e-6); } } @@ -134,7 +239,9 @@ TEST_CASE("Skala CUDA reproduces host semilocal nuclear gradients", const auto system = SkalaXC::test::make_rotated_h2_sto3g_system(); Matrix scalar_density(2, 2); scalar_density << 0.5, 0.5, 0.5, 0.5; - const Matrix spin_density = Matrix::Zero(2, 2); + const double spin_fraction = GENERATE(0.0, 0.2); + const Matrix spin_density = spin_fraction * scalar_density; + INFO("spin fraction=" << spin_fraction); SkalaXC::RuntimeEnvironment host_runtime{SKALAXC_MPI_CODE(MPI_COMM_WORLD)}; SkalaXC::RuntimeEnvironment device_runtime{ diff --git a/SkalaXC/tests/spin_gradient_unit_test.cxx b/SkalaXC/tests/spin_gradient_unit_test.cxx index dbd6bf61..49e3dc76 100644 --- a/SkalaXC/tests/spin_gradient_unit_test.cxx +++ b/SkalaXC/tests/spin_gradient_unit_test.cxx @@ -1,13 +1,17 @@ #include #include "component_matrix_map.hpp" +#include "derivative_component_map.hpp" #include "spin_gradient.hpp" #include #include #include +#include #include +#include +#include #include namespace { @@ -77,6 +81,117 @@ TEST_CASE("SpinGradient reuses storage for an unchanged point count", CHECK_THROWS_AS(gradient.resize(-1), std::invalid_argument); } +TEST_CASE("SpinGradient copies point views with independent parent strides", + "[eigen][spin-gradient][point-view]") { + const auto source = make_gradient(5); + auto destination = make_gradient(8); + const auto original = destination; + auto* storage = destination.direction_data(SkalaXC::X); + + const auto source_view = source.point_slice(1, 3); + auto destination_view = destination.point_slice(4, 3); + REQUIRE(source_view.rows() == 3); + REQUIRE(source_view.cols() == 6); + REQUIRE(destination_view.cols() == 6); + SkalaXC::copy_points(source_view, destination_view); + + REQUIRE(destination.direction_data(SkalaXC::X) == storage); + for (const auto direction : {SkalaXC::X, SkalaXC::Y, SkalaXC::Z}) { + REQUIRE(source_view.row(direction).data() == + source.direction_data(direction) + 2); + REQUIRE(destination_view.row(direction).data() == + destination.direction_data(direction) + 8); + for (Eigen::Index point = 0; point < destination.points(); ++point) + for (const auto spin : {SkalaXC::Alpha, SkalaXC::Beta}) { + const auto expected = point >= 4 && point < 7 + ? source(direction, point - 3, spin) + : original(direction, point, spin); + REQUIRE(destination(direction, point, spin) == expected); + } + } + + SkalaXC::SpinGradient extracted(3); + SkalaXC::copy_points(destination_view, extracted); + REQUIRE(extracted.point_slice(0, 3) == source_view); + SkalaXC::copy_points(extracted, destination.point_slice(0, 3)); + REQUIRE(destination.point_slice(0, 3) == source_view); +} + +TEST_CASE("SpinGradient point blocks preserve mutability and constness", + "[eigen][spin-gradient][point-view]") { + using Gradient = SkalaXC::SpinGradient; + STATIC_REQUIRE( + std::is_same_v().point_slice(0, 0)), + Gradient::PointSlice>); + STATIC_REQUIRE(std::is_same_v< + decltype(std::declval().point_slice(0, 0)), + Gradient::ConstPointSlice>); + STATIC_REQUIRE( + !std::is_assignable_v< + decltype(std::declval()(0, 0)), double>); + + auto gradient = make_gradient(5); + auto view = gradient.point_slice(2, 2); + view.row(SkalaXC::Y).setConstant(-7.0); + REQUIRE(gradient(SkalaXC::Y, 2, SkalaXC::Alpha) == -7.0); + REQUIRE(gradient(SkalaXC::Y, 3, SkalaXC::Beta) == -7.0); + REQUIRE(gradient(SkalaXC::X, 2, SkalaXC::Alpha) == + value(SkalaXC::X, 2, SkalaXC::Alpha)); + REQUIRE(gradient(SkalaXC::Y, 4, SkalaXC::Beta) == + value(SkalaXC::Y, 4, SkalaXC::Beta)); +} + +TEST_CASE( + "SpinGradient rejects overlapping point copies without modifying values", + "[eigen][spin-gradient][point-view]") { + for (const auto offsets : {std::array{0, 1, 4}, + std::array{1, 0, 4}, + std::array{1, 1, 3}}) { + auto gradient = make_gradient(5); + const auto original = gradient; + const auto source_offset = offsets[0]; + const auto destination_offset = offsets[1]; + const auto count = offsets[2]; + REQUIRE_THROWS_AS( + SkalaXC::copy_points(gradient.point_slice(source_offset, count), + gradient.point_slice(destination_offset, count)), + std::invalid_argument); + REQUIRE(gradient.point_slice(0, 5) == original.point_slice(0, 5)); + } +} + +TEST_CASE("SpinGradient copies disjoint slices within the same owner", + "[eigen][spin-gradient][point-view]") { + auto gradient = make_gradient(5); + const auto original = gradient; + SkalaXC::copy_points(gradient.point_slice(0, 2), gradient.point_slice(2, 2)); + REQUIRE(gradient.point_slice(2, 2) == original.point_slice(0, 2)); + REQUIRE(gradient.point_slice(0, 2) == original.point_slice(0, 2)); + REQUIRE(gradient.point_slice(4, 1) == original.point_slice(4, 1)); +} + +TEST_CASE("SpinGradient validates point ranges and accepts empty copies", + "[eigen][spin-gradient][point-view]") { + auto gradient = make_gradient(5); + const auto& const_gradient = gradient; + SkalaXC::SpinGradient empty; + REQUIRE_NOTHROW(SkalaXC::copy_points(empty, gradient.point_slice(5, 0))); + REQUIRE_NOTHROW( + SkalaXC::copy_points(const_gradient.point_slice(2, 0), empty)); + REQUIRE_NOTHROW( + SkalaXC::copy_points(empty.point_slice(0, 0), empty.point_slice(0, 0))); + REQUIRE_THROWS_AS(gradient.point_slice(-1, 1), std::out_of_range); + REQUIRE_THROWS_AS(gradient.point_slice(0, -1), std::out_of_range); + REQUIRE_THROWS_AS(gradient.point_slice(6, 0), std::out_of_range); + REQUIRE_THROWS_AS(gradient.point_slice(4, 2), std::out_of_range); + REQUIRE_THROWS_AS( + const_gradient.point_slice(1, std::numeric_limits::max()), + std::out_of_range); + REQUIRE_THROWS_AS(SkalaXC::copy_points(gradient.point_slice(0, 2), + gradient.point_slice(2, 3)), + std::invalid_argument); +} + TEST_CASE("Scalar-z gradients convert once to alpha-beta gradients", "[eigen][spin-gradient][representation]") { SkalaXC::ScalarZGradient scalar_z(1); @@ -163,6 +278,96 @@ TEST_CASE("SpinGradient permutes whole point records", std::invalid_argument); } +TEST_CASE("Basis derivative accessors preserve GauXC component ordering", + "[eigen][component-map][derivative-components]") { + std::vector storage(10 * 2 * 4, 0.0); + SkalaXC::ComponentMatrixMap components(storage.data(), 10, 2, 4); + SkalaXC::BasisComponentView basis(components); + const SkalaXC::ComponentMatrixMap& read_only = components; + const SkalaXC::BasisComponentView const_basis(read_only); + STATIC_REQUIRE( + !std::is_assignable_v); + REQUIRE(basis.value().data() == components.component_data(0)); + constexpr std::array, 3> expected_hessian{ + {{{4, 5, 6}}, {{5, 7, 8}}, {{6, 8, 9}}}}; + for (const auto direction : {SkalaXC::X, SkalaXC::Y, SkalaXC::Z}) { + REQUIRE(basis.first_derivative(direction).data() == + components.component_data(direction + 1)); + for (const auto response : {SkalaXC::X, SkalaXC::Y, SkalaXC::Z}) { + REQUIRE(const_basis.hessian(direction, response).data() == + components.component_data(expected_hessian[direction][response])); + REQUIRE(basis.hessian(direction, response).rows() == 2); + REQUIRE(basis.hessian(direction, response).cols() == 4); + } + } + basis.hessian(SkalaXC::Y, SkalaXC::X).setConstant(7.0); + REQUIRE(components.component(5).isConstant(7.0)); + REQUIRE(const_basis.hessian(SkalaXC::X, SkalaXC::Y).isConstant(7.0)); + REQUIRE_THROWS_AS(basis.first_derivative(static_cast(3)), + std::out_of_range); + REQUIRE_THROWS_AS( + basis.hessian(SkalaXC::X, static_cast(3)), + std::out_of_range); + + for (const Eigen::Index count : {1, 4}) { + SkalaXC::ComponentMatrixMap limited(storage.data(), count, 2, 4); + SkalaXC::BasisComponentView limited_basis(limited); + REQUIRE(limited_basis.value().data() == storage.data()); + REQUIRE_THROWS_AS(limited_basis.hessian(SkalaXC::X, SkalaXC::X), + std::out_of_range); + if (count == 1) + REQUIRE_THROWS_AS(limited_basis.first_derivative(SkalaXC::X), + std::out_of_range); + else + REQUIRE(limited_basis.first_derivative(SkalaXC::Z).data() == + limited.component_data(3)); + } + SkalaXC::ComponentMatrixMap invalid(storage.data(), 5, 2, 4); + REQUIRE_THROWS_AS(SkalaXC::BasisComponentView(invalid), + std::invalid_argument); +} + +TEST_CASE("Pauli derivative accessors preserve both channel layouts", + "[eigen][component-map][derivative-components]") { + for (const Eigen::Index per_channel : {1, 4}) { + std::vector storage(2 * per_channel * 3 * 5, 0.0); + SkalaXC::ComponentMatrixMap components(storage.data(), 2 * per_channel, 3, + 5); + SkalaXC::PauliComponentView channels(components); + const SkalaXC::ComponentMatrixMap& read_only = components; + const SkalaXC::PauliComponentView const_channels(read_only); + STATIC_REQUIRE( + !std::is_assignable_v< + decltype(const_channels.value(SkalaXC::Scalar)(0, 0)), double>); + for (const auto channel : {SkalaXC::Scalar, SkalaXC::SpinZ}) { + REQUIRE(channels.value(channel).data() == + components.component_data(channel * per_channel)); + for (const auto direction : {SkalaXC::X, SkalaXC::Y, SkalaXC::Z}) { + if (per_channel == 1) { + REQUIRE_THROWS_AS(channels.first_derivative(channel, direction), + std::out_of_range); + } else { + REQUIRE( + const_channels.first_derivative(channel, direction).data() == + components.component_data(channel * per_channel + direction + 1)); + channels.first_derivative(channel, direction).setConstant(9.0); + REQUIRE(components.component(channel * per_channel + direction + 1) + .isConstant(9.0)); + } + } + } + REQUIRE_THROWS_AS(channels.value(static_cast(2)), + std::out_of_range); + REQUIRE_THROWS_AS(channels.first_derivative( + SkalaXC::Scalar, static_cast(3)), + std::out_of_range); + } + std::vector storage(6, 0.0); + SkalaXC::ComponentMatrixMap invalid(storage.data(), 6, 1, 1); + REQUIRE_THROWS_AS(SkalaXC::PauliComponentView(invalid), + std::invalid_argument); +} + TEST_CASE("ComponentMatrixMap flattens component matrices without copying", "[eigen][component-map]") { constexpr Eigen::Index components = 3; From e09d70f6d0c07ad223f77bc171ae30337e87a7e7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 12 Sep 2026 19:06:56 +0000 Subject: [PATCH 33/33] Document SkalaXC helper parameters Co-authored-by: JensWehner <12139113+JensWehner@users.noreply.github.com> --- SkalaXC/src/host/derivative_component_map.hpp | 53 +++++++++++++++---- SkalaXC/src/host/spin_gradient.hpp | 12 ++++- 2 files changed, 53 insertions(+), 12 deletions(-) diff --git a/SkalaXC/src/host/derivative_component_map.hpp b/SkalaXC/src/host/derivative_component_map.hpp index d9e4f05c..2349e7b7 100644 --- a/SkalaXC/src/host/derivative_component_map.hpp +++ b/SkalaXC/src/host/derivative_component_map.hpp @@ -32,7 +32,10 @@ inline Eigen::Index hessian_component(Direction first, Direction second) { template class BasisComponentView { public: - /** @brief Borrow an existing map with 1, 4, or 10 basis components. */ + /** + * @brief Borrow an existing map with 1, 4, or 10 basis components. + * @param components Component map to borrow. + */ explicit BasisComponentView(Map& components) : components_(components) { const auto count = components.components(); if (count != 1 && count != 4 && count != 10) @@ -44,22 +47,35 @@ class BasisComponentView { /** @return Read-only basis-value matrix. */ auto value() const { return std::as_const(components_).component(0); } - /** @return Non-owning derivative matrix for the requested direction. */ + /** + * @param direction Requested Cartesian direction. + * @return Non-owning derivative matrix. + */ auto first_derivative(Direction direction) { return components_.component(detail::first_derivative_component(direction)); } - /** @return Read-only derivative matrix for the requested direction. */ + /** + * @param direction Requested Cartesian direction. + * @return Read-only derivative matrix. + */ auto first_derivative(Direction direction) const { return std::as_const(components_) .component(detail::first_derivative_component(direction)); } - /** @return Non-owning Hessian matrix, symmetric in its direction arguments. + /** + * @param first First Cartesian direction. + * @param second Second Cartesian direction. + * @return Non-owning Hessian matrix, symmetric in its direction arguments. */ auto hessian(Direction first, Direction second) { return components_.component(detail::hessian_component(first, second)); } - /** @return Read-only Hessian matrix. */ + /** + * @param first First Cartesian direction. + * @param second Second Cartesian direction. + * @return Read-only Hessian matrix. + */ auto hessian(Direction first, Direction second) const { return std::as_const(components_) .component(detail::hessian_component(first, second)); @@ -73,26 +89,43 @@ class BasisComponentView { template class PauliComponentView { public: - /** @brief Borrow an existing map with 1 or 4 components per channel. */ + /** + * @brief Borrow an existing map with 1 or 4 components per channel. + * @param components Component map to borrow. + */ explicit PauliComponentView(Map& components) : components_(components) { if (components.components() != 2 && components.components() != 8) throw std::invalid_argument("Invalid Pauli component count"); } - /** @return Non-owning value matrix for the requested Pauli channel. */ + /** + * @param channel Requested Pauli channel. + * @return Non-owning value matrix. + */ auto value(PauliChannel channel) { return components_.component(channel_offset(channel)); } - /** @return Read-only value matrix for the requested Pauli channel. */ + /** + * @param channel Requested Pauli channel. + * @return Read-only value matrix. + */ auto value(PauliChannel channel) const { return std::as_const(components_).component(channel_offset(channel)); } - /** @return Non-owning derivative matrix for one channel and direction. */ + /** + * @param channel Requested Pauli channel. + * @param direction Requested Cartesian direction. + * @return Non-owning derivative matrix. + */ auto first_derivative(PauliChannel channel, Direction direction) { return components_.component(derivative_component(channel, direction)); } - /** @return Read-only derivative matrix for one channel and direction. */ + /** + * @param channel Requested Pauli channel. + * @param direction Requested Cartesian direction. + * @return Read-only derivative matrix. + */ auto first_derivative(PauliChannel channel, Direction direction) const { return std::as_const(components_) .component(derivative_component(channel, direction)); diff --git a/SkalaXC/src/host/spin_gradient.hpp b/SkalaXC/src/host/spin_gradient.hpp index 04f9ff22..67f969bb 100644 --- a/SkalaXC/src/host/spin_gradient.hpp +++ b/SkalaXC/src/host/spin_gradient.hpp @@ -224,14 +224,22 @@ void copy_points( destination = source; } -/** @brief Copy all source points into a selected destination range. */ +/** + * @brief Copy all source points into a selected destination range. + * @param source Source gradient. + * @param destination Writable destination point block. + */ template void copy_points(const ChannelGradient& source, SpinGradient::PointSlice destination) { copy_points(source.point_slice(0, source.points()), destination); } -/** @brief Copy a selected source range into a pre-sized destination. */ +/** + * @brief Copy a selected source range into a pre-sized destination. + * @param source Source point block. + * @param destination Pre-sized destination gradient. + */ template void copy_points( const Eigen::Block& source,