From c56d10c05d282534520291d709f927a9cc2cdbb3 Mon Sep 17 00:00:00 2001 From: jenswehner Date: Mon, 24 Aug 2026 11:49:13 +0200 Subject: [PATCH 1/9] restructured --- .gitattributes | 2 +- .github/workflows/docs.yml | 2 +- .github/workflows/examples.yml | 6 +- .github/workflows/model-benchmark.yml | 13 +- .github/workflows/model-examples.yml | 14 +- .github/workflows/pypi.yml | 3 +- .github/workflows/test.yml | 46 +- .gitignore | 7 +- .pre-commit-config.yaml | 50 +- AGENTS.md | 48 +- CONTRIBUTING.md | 28 +- README.md | 16 +- docs/benchmark/conftest.py | 19 + .../benchmark}/reference/README.md | 0 .../benchmark}/reference/environments.json | 0 .../benchmark}/reference/fits.json | 0 .../benchmark}/reference/measurements.json | 0 .../benchmark}/reference/prose.yaml | 0 .../benchmark/src/skala_benchmark}/README.md | 2 +- .../src/skala_benchmark}/__init__.py | 0 .../src/skala_benchmark}/__main__.py | 12 +- .../src/skala_benchmark}/collect_results.py | 8 +- .../benchmark/src/skala_benchmark}/dataset.py | 10 +- .../src/skala_benchmark}/dataset_sources.csv | 0 .../benchmark/src/skala_benchmark}/fetch.py | 8 +- .../benchmark/src/skala_benchmark}/fitting.py | 4 +- .../benchmark/src/skala_benchmark}/metrics.py | 4 +- .../benchmark/src/skala_benchmark}/models.py | 0 .../src/skala_benchmark}/node_info.py | 2 +- .../src/skala_benchmark}/orchestrator.py | 14 +- .../src/skala_benchmark}/protocol.py | 0 .../src/skala_benchmark}/report/__init__.py | 0 .../src/skala_benchmark}/report/_normalize.py | 0 .../report/assets/report-base.css | 0 .../skala_benchmark}/report/assets/report.css | 0 .../skala_benchmark}/report/assets/report.js | 0 .../report/assets/vendor/d3.min.js | 0 .../report/assets/vendor/katex.min.js | 0 .../src/skala_benchmark}/report/data.py | 6 +- .../src/skala_benchmark}/report/generate.py | 0 .../src/skala_benchmark}/report/prose.py | 0 .../report/templates/index.html | 0 .../benchmark/src/skala_benchmark}/runner.py | 11 +- .../src/skala_benchmark}/schema/__init__.py | 0 .../skala_benchmark}/schema/environment.py | 0 .../skala_benchmark}/schema/measurements.py | 4 +- .../benchmark/src/skala_benchmark}/timing.py | 5 +- .../benchmark/tests}/test_cli.py | 19 +- .../benchmark/tests}/test_dataset.py | 9 +- .../benchmark/tests}/test_docs.py | 2 +- .../benchmark/tests}/test_metrics.py | 3 +- .../benchmark/tests}/test_orchestrator.py | 13 +- .../benchmark/tests}/test_report.py | 7 +- .../benchmark/tests}/test_runner.py | 7 +- .../benchmark/tests}/test_workflow.py | 8 +- docs/{ => site}/_ext/benchmark_report.py | 6 +- docs/{ => site}/_static/bib/data.bib | 0 docs/{ => site}/_static/img/density.png | Bin docs/{ => site}/ase.ipynb | 1 - docs/{ => site}/benchmarks.rst | 36 +- docs/{ => site}/conf.py | 3 +- docs/{ => site}/ftorch.rst | 39 +- docs/{ => site}/index.rst | 2 +- docs/{ => site}/installation.rst | 15 +- docs/{ => site}/model-card/index.rst | 0 docs/{ => site}/model-card/skala-1.0.rst | 2 +- docs/{ => site}/model-card/skala-1.1.rst | 2 +- docs/{ => site}/pyscf/gpu4pyscf.rst | 0 docs/{ => site}/pyscf/scf_settings.ipynb | 1 - docs/{ => site}/pyscf/singlepoint.ipynb | 1 - .../gauxc/README.md => gauxc/UPSTREAM.md | 0 gauxc/conftest.py | 19 + {docs/gauxc => gauxc/docs}/api/basis.rst | 0 {docs/gauxc => gauxc/docs}/api/cmake.rst | 7 +- {docs/gauxc => gauxc/docs}/api/exceptions.rst | 0 {docs/gauxc => gauxc/docs}/api/index.rst | 0 .../docs}/api/load_balancer.rst | 0 {docs/gauxc => gauxc/docs}/api/macros.rst | 0 .../docs}/api/molecular_weights.rst | 0 {docs/gauxc => gauxc/docs}/api/molecule.rst | 0 {docs/gauxc => gauxc/docs}/api/molgrid.rst | 0 .../docs}/api/runtime_environment.rst | 0 .../docs}/api/xc_integrator.rst | 0 {docs/gauxc => gauxc/docs}/c-library.rst | 68 +- gauxc/docs/conf.py | 29 + {docs/gauxc => gauxc/docs}/cpp-library.rst | 52 +- .../gauxc => gauxc/docs}/fortran-library.rst | 68 +- {docs/_static/bib => gauxc/docs}/gauxc.bib | 0 {docs/gauxc => gauxc/docs}/index.rst | 0 {docs/gauxc => gauxc/docs}/installation.rst | 0 .../gauxc => gauxc/docs}/scripts/export-h5.py | 3 +- {docs/gauxc => gauxc/docs}/standalone.rst | 0 .../examples}/c/gauxc_integration/.gitignore | 0 .../c/gauxc_integration/CMakeLists.txt | 0 .../examples}/c/gauxc_integration/app/main.c | 0 .../cmake/skala-argtable3.cmake | 0 .../cmake/skala-dep-versions.cmake | 0 .../gauxc_integration/cmake/skala-gauxc.cmake | 0 .../gauxc_integration/cmake/skala-hdf5.cmake | 0 .../cpp/gauxc_integration/.gitignore | 0 .../cpp/gauxc_integration/CMakeLists.txt | 0 .../cpp/gauxc_integration/app/main.cxx | 0 .../gauxc_integration/cmake/skala-cli11.cmake | 0 .../cmake/skala-dep-versions.cmake | 0 .../cmake/skala-eigen3.cmake | 0 .../gauxc_integration/cmake/skala-gauxc.cmake | 0 .../gauxc_integration/cmake/skala-hdf5.cmake | 0 .../cmake/skala-sdftd3.cmake | 0 .../fortran/gauxc_integration/.gitignore | 0 .../fortran/gauxc_integration/CMakeLists.txt | 0 .../fortran/gauxc_integration/app/main.F90 | 0 .../cmake/skala-dep-versions.cmake | 0 .../gauxc_integration/cmake/skala-flap.cmake | 0 .../gauxc_integration/cmake/skala-gauxc.cmake | 0 .../gauxc_integration/cmake/skala-hdf5.cmake | 0 gauxc/src/skala_gauxc/__init__.py | 5 + .../gauxc => gauxc/src/skala_gauxc}/export.py | 13 +- {tests => gauxc/tests}/test_gauxc_export.py | 17 +- model/conftest.py | 15 + .../examples}/cpp/cpp_integration/.gitignore | 0 .../cpp/cpp_integration/CMakeLists.txt | 0 .../examples}/cpp/cpp_integration/README.md | 2 +- .../cpp/cpp_integration/download_model.py | 1 - .../examples}/cpp/cpp_integration/main.cpp | 0 .../cpp/cpp_integration/prepare_inputs.py | 3 +- .../fortran/ftorch_integration/.gitignore | 0 .../fortran/ftorch_integration/CMakeLists.txt | 0 .../fortran/ftorch_integration/app/main.f90 | 0 .../cmake/skala-dep-versions.cmake | 0 .../cmake/skala-ftorch.cmake | 0 .../ftorch_integration/src/skala_ftorch.cxx | 0 .../ftorch_integration/src/skala_ftorch.f90 | 0 model/src/skala_model/__init__.py | 7 + .../src/skala_model}/layers.py | 0 .../src/skala_model}/model.py | 43 +- .../src/skala_model}/utils/__init__.py | 0 .../src/skala_model}/utils/cg.py | 0 .../src/skala_model}/utils/irreps.py | 7 +- .../src/skala_model}/utils/pad_ragged.py | 0 .../utils/symmetric_contraction.py | 6 +- {tests => model/tests}/test_model.py | 5 +- .../tests}/test_traced_model_comparison.py | 3 +- {tests => model/tests}/test_utils.py | 11 +- pixi.lock | 921 ++---------------- pixi.toml | 314 +----- pyproject.toml | 57 +- skala/LICENSE.txt | 21 + skala/README.md | 191 ++++ conftest.py => skala/conftest.py | 5 +- skala/pixi.toml | 33 + skala/pyproject.toml | 46 + {src => skala/src}/skala/__init__.py | 0 {src => skala/src}/skala/ase/__init__.py | 0 {src => skala/src}/skala/ase/calculator.py | 0 {src => skala/src}/skala/dispersion.py | 0 {src => skala/src}/skala/features.py | 0 .../src}/skala/functional/__init__.py | 2 - .../src}/skala/functional/_hashes.py | 0 {src => skala/src}/skala/functional/base.py | 0 .../src}/skala/functional/density.py | 4 +- {src => skala/src}/skala/functional/load.py | 8 +- .../src}/skala/functional/traditional.py | 12 +- .../src}/skala/gpu4pyscf/__init__.py | 0 {src => skala/src}/skala/gpu4pyscf/dft.py | 0 .../src}/skala/gpu4pyscf/gradients.py | 21 +- {src => skala/src}/skala/gpu4pyscf/grids.py | 4 +- {src => skala/src}/skala/py.typed | 0 {src => skala/src}/skala/pyscf/__init__.py | 12 +- .../src}/skala/pyscf/ao_evaluation.py | 12 +- {src => skala/src}/skala/pyscf/backend.py | 0 {src => skala/src}/skala/pyscf/dft.py | 8 +- {src => skala/src}/skala/pyscf/evaluation.py | 0 .../src}/skala/pyscf/feature_math.py | 0 {src => skala/src}/skala/pyscf/features.py | 0 {src => skala/src}/skala/pyscf/gradients.py | 20 +- {src => skala/src}/skala/pyscf/grids.py | 4 +- .../src}/skala/pyscf/memory_estimators.py | 0 .../src}/skala/pyscf/model_chunking.py | 0 {src => skala/src}/skala/pyscf/numint.py | 0 {src => skala/src}/skala/pyscf/retry.py | 0 .../src}/skala/pyscf/spatial_grid_layout.py | 4 +- {src => skala/src}/skala/pyscf/utils.py | 0 .../src}/skala/pyscf/xc_integrator.py | 4 +- {src => skala/src}/skala/typing.py | 0 {src => skala/src}/skala/utils/__init__.py | 0 .../src}/skala/utils/torch_allocator.py | 0 {tests => skala/tests}/__init__.py | 0 {tests => skala/tests}/ridders.py | 0 {tests => skala/tests}/test_ao_screening.py | 14 +- .../tests}/test_ao_screening_benchmark.py | 7 +- {tests => skala/tests}/test_ase.py | 1 - {tests => skala/tests}/test_backend.py | 1 - {tests => skala/tests}/test_build_release.py | 4 +- {tests => skala/tests}/test_download_model.py | 6 +- .../tests}/test_enhancement_factor.py | 1 - {tests => skala/tests}/test_evaluation.py | 1 - .../tests}/test_gpu4pyscf_ao_screening.py | 0 .../tests}/test_gpu4pyscf_classes.py | 18 +- .../tests}/test_gpu4pyscf_gradients.py | 8 +- {tests => skala/tests}/test_hash_pinning.py | 3 +- .../tests}/test_memory_estimators.py | 1 - {tests => skala/tests}/test_model_chunking.py | 1 - {tests => skala/tests}/test_pyscf_classes.py | 17 +- .../tests}/test_pyscf_gradients.py | 7 +- {tests => skala/tests}/test_scf_retry.py | 1 - {tests => skala/tests}/test_traditional.py | 13 +- {tests => skala/tests}/test_xc_integrator.py | 2 +- {tests => skala/tests}/utils.py | 5 +- src/skala/gauxc/__init__.py | 0 tools/build_release.py | 11 +- tools/check_release_artifacts.py | 121 +++ 211 files changed, 1237 insertions(+), 1613 deletions(-) create mode 100644 docs/benchmark/conftest.py rename {benchmarks => docs/benchmark}/reference/README.md (100%) rename {benchmarks => docs/benchmark}/reference/environments.json (100%) rename {benchmarks => docs/benchmark}/reference/fits.json (100%) rename {benchmarks => docs/benchmark}/reference/measurements.json (100%) rename {benchmarks => docs/benchmark}/reference/prose.yaml (100%) rename {src/skala/benchmark => docs/benchmark/src/skala_benchmark}/README.md (64%) rename {src/skala/benchmark => docs/benchmark/src/skala_benchmark}/__init__.py (100%) rename {src/skala/benchmark => docs/benchmark/src/skala_benchmark}/__main__.py (94%) rename {src/skala/benchmark => docs/benchmark/src/skala_benchmark}/collect_results.py (96%) rename {src/skala/benchmark => docs/benchmark/src/skala_benchmark}/dataset.py (94%) rename {src/skala/benchmark => docs/benchmark/src/skala_benchmark}/dataset_sources.csv (100%) rename {src/skala/benchmark => docs/benchmark/src/skala_benchmark}/fetch.py (97%) rename {src/skala/benchmark => docs/benchmark/src/skala_benchmark}/fitting.py (99%) rename {src/skala/benchmark => docs/benchmark/src/skala_benchmark}/metrics.py (99%) rename {src/skala/benchmark => docs/benchmark/src/skala_benchmark}/models.py (100%) rename {src/skala/benchmark => docs/benchmark/src/skala_benchmark}/node_info.py (99%) rename {src/skala/benchmark => docs/benchmark/src/skala_benchmark}/orchestrator.py (97%) rename {src/skala/benchmark => docs/benchmark/src/skala_benchmark}/protocol.py (100%) rename {src/skala/benchmark => docs/benchmark/src/skala_benchmark}/report/__init__.py (100%) rename {src/skala/benchmark => docs/benchmark/src/skala_benchmark}/report/_normalize.py (100%) rename {src/skala/benchmark => docs/benchmark/src/skala_benchmark}/report/assets/report-base.css (100%) rename {src/skala/benchmark => docs/benchmark/src/skala_benchmark}/report/assets/report.css (100%) rename {src/skala/benchmark => docs/benchmark/src/skala_benchmark}/report/assets/report.js (100%) rename {src/skala/benchmark => docs/benchmark/src/skala_benchmark}/report/assets/vendor/d3.min.js (100%) rename {src/skala/benchmark => docs/benchmark/src/skala_benchmark}/report/assets/vendor/katex.min.js (100%) rename {src/skala/benchmark => docs/benchmark/src/skala_benchmark}/report/data.py (99%) rename {src/skala/benchmark => docs/benchmark/src/skala_benchmark}/report/generate.py (100%) rename {src/skala/benchmark => docs/benchmark/src/skala_benchmark}/report/prose.py (100%) rename {src/skala/benchmark => docs/benchmark/src/skala_benchmark}/report/templates/index.html (100%) rename {src/skala/benchmark => docs/benchmark/src/skala_benchmark}/runner.py (98%) rename {src/skala/benchmark => docs/benchmark/src/skala_benchmark}/schema/__init__.py (100%) rename {src/skala/benchmark => docs/benchmark/src/skala_benchmark}/schema/environment.py (100%) rename {src/skala/benchmark => docs/benchmark/src/skala_benchmark}/schema/measurements.py (98%) rename {src/skala/benchmark => docs/benchmark/src/skala_benchmark}/timing.py (99%) rename {tests/benchmark => docs/benchmark/tests}/test_cli.py (81%) rename {tests/benchmark => docs/benchmark/tests}/test_dataset.py (94%) rename {tests/benchmark => docs/benchmark/tests}/test_docs.py (97%) rename {tests/benchmark => docs/benchmark/tests}/test_metrics.py (97%) rename {tests/benchmark => docs/benchmark/tests}/test_orchestrator.py (93%) rename {tests/benchmark => docs/benchmark/tests}/test_report.py (94%) rename {tests/benchmark => docs/benchmark/tests}/test_runner.py (88%) rename {tests/benchmark => docs/benchmark/tests}/test_workflow.py (93%) rename docs/{ => site}/_ext/benchmark_report.py (85%) rename docs/{ => site}/_static/bib/data.bib (100%) rename docs/{ => site}/_static/img/density.png (100%) rename docs/{ => site}/ase.ipynb (99%) rename docs/{ => site}/benchmarks.rst (89%) rename docs/{ => site}/conf.py (97%) rename docs/{ => site}/ftorch.rst (87%) rename docs/{ => site}/index.rst (96%) rename docs/{ => site}/installation.rst (90%) rename docs/{ => site}/model-card/index.rst (100%) rename docs/{ => site}/model-card/skala-1.0.rst (99%) rename docs/{ => site}/model-card/skala-1.1.rst (99%) rename docs/{ => site}/pyscf/gpu4pyscf.rst (100%) rename docs/{ => site}/pyscf/scf_settings.ipynb (99%) rename docs/{ => site}/pyscf/singlepoint.ipynb (99%) rename third_party/gauxc/README.md => gauxc/UPSTREAM.md (100%) create mode 100644 gauxc/conftest.py rename {docs/gauxc => gauxc/docs}/api/basis.rst (100%) rename {docs/gauxc => gauxc/docs}/api/cmake.rst (95%) rename {docs/gauxc => gauxc/docs}/api/exceptions.rst (100%) rename {docs/gauxc => gauxc/docs}/api/index.rst (100%) rename {docs/gauxc => gauxc/docs}/api/load_balancer.rst (100%) rename {docs/gauxc => gauxc/docs}/api/macros.rst (100%) rename {docs/gauxc => gauxc/docs}/api/molecular_weights.rst (100%) rename {docs/gauxc => gauxc/docs}/api/molecule.rst (100%) rename {docs/gauxc => gauxc/docs}/api/molgrid.rst (100%) rename {docs/gauxc => gauxc/docs}/api/runtime_environment.rst (100%) rename {docs/gauxc => gauxc/docs}/api/xc_integrator.rst (100%) rename {docs/gauxc => gauxc/docs}/c-library.rst (88%) create mode 100644 gauxc/docs/conf.py rename {docs/gauxc => gauxc/docs}/cpp-library.rst (90%) rename {docs/gauxc => gauxc/docs}/fortran-library.rst (87%) rename {docs/_static/bib => gauxc/docs}/gauxc.bib (100%) rename {docs/gauxc => gauxc/docs}/index.rst (100%) rename {docs/gauxc => gauxc/docs}/installation.rst (100%) rename {docs/gauxc => gauxc/docs}/scripts/export-h5.py (85%) rename {docs/gauxc => gauxc/docs}/standalone.rst (100%) rename {examples => gauxc/examples}/c/gauxc_integration/.gitignore (100%) rename {examples => gauxc/examples}/c/gauxc_integration/CMakeLists.txt (100%) rename {examples => gauxc/examples}/c/gauxc_integration/app/main.c (100%) rename {examples => gauxc/examples}/c/gauxc_integration/cmake/skala-argtable3.cmake (100%) rename {examples => gauxc/examples}/c/gauxc_integration/cmake/skala-dep-versions.cmake (100%) rename {examples => gauxc/examples}/c/gauxc_integration/cmake/skala-gauxc.cmake (100%) rename {examples => gauxc/examples}/c/gauxc_integration/cmake/skala-hdf5.cmake (100%) rename {examples => gauxc/examples}/cpp/gauxc_integration/.gitignore (100%) rename {examples => gauxc/examples}/cpp/gauxc_integration/CMakeLists.txt (100%) rename {examples => gauxc/examples}/cpp/gauxc_integration/app/main.cxx (100%) rename {examples => gauxc/examples}/cpp/gauxc_integration/cmake/skala-cli11.cmake (100%) rename {examples => gauxc/examples}/cpp/gauxc_integration/cmake/skala-dep-versions.cmake (100%) rename {examples => gauxc/examples}/cpp/gauxc_integration/cmake/skala-eigen3.cmake (100%) rename {examples => gauxc/examples}/cpp/gauxc_integration/cmake/skala-gauxc.cmake (100%) rename {examples => gauxc/examples}/cpp/gauxc_integration/cmake/skala-hdf5.cmake (100%) rename {examples => gauxc/examples}/cpp/gauxc_integration/cmake/skala-sdftd3.cmake (100%) rename {examples => gauxc/examples}/fortran/gauxc_integration/.gitignore (100%) rename {examples => gauxc/examples}/fortran/gauxc_integration/CMakeLists.txt (100%) rename {examples => gauxc/examples}/fortran/gauxc_integration/app/main.F90 (100%) rename {examples => gauxc/examples}/fortran/gauxc_integration/cmake/skala-dep-versions.cmake (100%) rename {examples => gauxc/examples}/fortran/gauxc_integration/cmake/skala-flap.cmake (100%) rename {examples => gauxc/examples}/fortran/gauxc_integration/cmake/skala-gauxc.cmake (100%) rename {examples => gauxc/examples}/fortran/gauxc_integration/cmake/skala-hdf5.cmake (100%) create mode 100644 gauxc/src/skala_gauxc/__init__.py rename {src/skala/gauxc => gauxc/src/skala_gauxc}/export.py (91%) rename {tests => gauxc/tests}/test_gauxc_export.py (85%) create mode 100644 model/conftest.py rename {examples => model/examples}/cpp/cpp_integration/.gitignore (100%) rename {examples => model/examples}/cpp/cpp_integration/CMakeLists.txt (100%) rename {examples => model/examples}/cpp/cpp_integration/README.md (93%) rename {examples => model/examples}/cpp/cpp_integration/download_model.py (99%) rename {examples => model/examples}/cpp/cpp_integration/main.cpp (100%) rename {examples => model/examples}/cpp/cpp_integration/prepare_inputs.py (96%) rename {examples => model/examples}/fortran/ftorch_integration/.gitignore (100%) rename {examples => model/examples}/fortran/ftorch_integration/CMakeLists.txt (100%) rename {examples => model/examples}/fortran/ftorch_integration/app/main.f90 (100%) rename {examples => model/examples}/fortran/ftorch_integration/cmake/skala-dep-versions.cmake (100%) rename {examples => model/examples}/fortran/ftorch_integration/cmake/skala-ftorch.cmake (100%) rename {examples => model/examples}/fortran/ftorch_integration/src/skala_ftorch.cxx (100%) rename {examples => model/examples}/fortran/ftorch_integration/src/skala_ftorch.f90 (100%) create mode 100644 model/src/skala_model/__init__.py rename {src/skala/functional => model/src/skala_model}/layers.py (100%) rename {src/skala/functional => model/src/skala_model}/model.py (96%) rename {src/skala/functional => model/src/skala_model}/utils/__init__.py (100%) rename {src/skala/functional => model/src/skala_model}/utils/cg.py (100%) rename {src/skala/functional => model/src/skala_model}/utils/irreps.py (97%) rename {src/skala/functional => model/src/skala_model}/utils/pad_ragged.py (100%) rename {src/skala/functional => model/src/skala_model}/utils/symmetric_contraction.py (97%) rename {tests => model/tests}/test_model.py (99%) rename {tests => model/tests}/test_traced_model_comparison.py (99%) rename {tests => model/tests}/test_utils.py (95%) create mode 100644 skala/LICENSE.txt create mode 100644 skala/README.md rename conftest.py => skala/conftest.py (94%) create mode 100644 skala/pixi.toml create mode 100644 skala/pyproject.toml rename {src => skala/src}/skala/__init__.py (100%) rename {src => skala/src}/skala/ase/__init__.py (100%) rename {src => skala/src}/skala/ase/calculator.py (100%) rename {src => skala/src}/skala/dispersion.py (100%) rename {src => skala/src}/skala/features.py (100%) rename {src => skala/src}/skala/functional/__init__.py (98%) rename {src => skala/src}/skala/functional/_hashes.py (100%) rename {src => skala/src}/skala/functional/base.py (100%) rename {src => skala/src}/skala/functional/density.py (98%) rename {src => skala/src}/skala/functional/load.py (96%) rename {src => skala/src}/skala/functional/traditional.py (98%) rename {src => skala/src}/skala/gpu4pyscf/__init__.py (100%) rename {src => skala/src}/skala/gpu4pyscf/dft.py (100%) rename {src => skala/src}/skala/gpu4pyscf/gradients.py (96%) rename {src => skala/src}/skala/gpu4pyscf/grids.py (96%) rename {src => skala/src}/skala/py.typed (100%) rename {src => skala/src}/skala/pyscf/__init__.py (97%) rename {src => skala/src}/skala/pyscf/ao_evaluation.py (98%) rename {src => skala/src}/skala/pyscf/backend.py (100%) rename {src => skala/src}/skala/pyscf/dft.py (97%) rename {src => skala/src}/skala/pyscf/evaluation.py (100%) rename {src => skala/src}/skala/pyscf/feature_math.py (100%) rename {src => skala/src}/skala/pyscf/features.py (100%) rename {src => skala/src}/skala/pyscf/gradients.py (95%) rename {src => skala/src}/skala/pyscf/grids.py (95%) rename {src => skala/src}/skala/pyscf/memory_estimators.py (100%) rename {src => skala/src}/skala/pyscf/model_chunking.py (100%) rename {src => skala/src}/skala/pyscf/numint.py (100%) rename {src => skala/src}/skala/pyscf/retry.py (100%) rename {src => skala/src}/skala/pyscf/spatial_grid_layout.py (97%) rename {src => skala/src}/skala/pyscf/utils.py (100%) rename {src => skala/src}/skala/pyscf/xc_integrator.py (99%) rename {src => skala/src}/skala/typing.py (100%) rename {src => skala/src}/skala/utils/__init__.py (100%) rename {src => skala/src}/skala/utils/torch_allocator.py (100%) rename {tests => skala/tests}/__init__.py (100%) rename {tests => skala/tests}/ridders.py (100%) rename {tests => skala/tests}/test_ao_screening.py (99%) rename {tests => skala/tests}/test_ao_screening_benchmark.py (99%) rename {tests => skala/tests}/test_ase.py (99%) rename {tests => skala/tests}/test_backend.py (99%) rename {tests => skala/tests}/test_build_release.py (96%) rename {tests => skala/tests}/test_download_model.py (98%) rename {tests => skala/tests}/test_enhancement_factor.py (99%) rename {tests => skala/tests}/test_evaluation.py (99%) rename {tests => skala/tests}/test_gpu4pyscf_ao_screening.py (100%) rename {tests => skala/tests}/test_gpu4pyscf_classes.py (92%) rename {tests => skala/tests}/test_gpu4pyscf_gradients.py (99%) rename {tests => skala/tests}/test_hash_pinning.py (96%) rename {tests => skala/tests}/test_memory_estimators.py (99%) rename {tests => skala/tests}/test_model_chunking.py (99%) rename {tests => skala/tests}/test_pyscf_classes.py (93%) rename {tests => skala/tests}/test_pyscf_gradients.py (99%) rename {tests => skala/tests}/test_scf_retry.py (99%) rename {tests => skala/tests}/test_traditional.py (94%) rename {tests => skala/tests}/test_xc_integrator.py (100%) rename {tests => skala/tests}/utils.py (97%) delete mode 100644 src/skala/gauxc/__init__.py create mode 100644 tools/check_release_artifacts.py diff --git a/.gitattributes b/.gitattributes index 75cf0571..20fabbec 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1 @@ -benchmarks/reference/measurements.json filter=lfs diff=lfs merge=lfs -text +docs/benchmark/reference/measurements.json filter=lfs diff=lfs merge=lfs -text diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index d24ebcf7..9ce4eb4d 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -51,7 +51,7 @@ jobs: - name: Upload Pages artifact uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3 with: - path: docs/_build/html + path: docs/site/_build/html deploy: needs: build diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml index 2e7fee2c..da7f84ea 100644 --- a/.github/workflows/examples.yml +++ b/.github/workflows/examples.yml @@ -5,9 +5,7 @@ on: branches: [main] paths: &gauxc-paths - '.github/workflows/examples.yml' - - 'examples/c/gauxc_integration/**' - - 'examples/cpp/gauxc_integration/**' - - 'examples/fortran/gauxc_integration/**' + - 'gauxc/**' - 'pixi.lock' - 'pixi.toml' pull_request: @@ -141,7 +139,7 @@ jobs: GAUXC_ENABLE_MPI: ${{ matrix.toolchain == 'mpi' && 'ON' || 'OFF' }} GAUXC_ENABLE_OPENMP: ${{ matrix.toolchain == 'openmp' && 'ON' || 'OFF' }} run: | - cmake -B ../build_example -S examples/${{ matrix.example }}/gauxc_integration -G Ninja \ + 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 \ diff --git a/.github/workflows/model-benchmark.yml b/.github/workflows/model-benchmark.yml index c0772704..322b2781 100644 --- a/.github/workflows/model-benchmark.yml +++ b/.github/workflows/model-benchmark.yml @@ -9,11 +9,10 @@ on: - 'pixi.lock' - 'pixi.toml' - 'pyproject.toml' - - 'src/skala/__init__.py' - - 'src/skala/features.py' - - 'src/skala/functional/**' - - 'tests/test_traced_model_comparison.py' - - 'tools/verify_gpu.py' + - 'model/**' + - 'skala/src/skala/__init__.py' + - 'skala/src/skala/features.py' + - 'skala/src/skala/functional/**' pull_request: branches: [main] paths: *model-benchmark-paths @@ -49,7 +48,7 @@ jobs: - name: Run CPU model benchmarks run: >- pytest -v -m model_benchmark -k cpu - tests/test_traced_model_comparison.py + model/tests/test_traced_model_comparison.py gpu: name: GPU model benchmark @@ -80,4 +79,4 @@ jobs: - name: Run GPU model benchmarks run: >- pytest -v -m model_benchmark -k cuda - tests/test_traced_model_comparison.py + model/tests/test_traced_model_comparison.py diff --git a/.github/workflows/model-examples.yml b/.github/workflows/model-examples.yml index 91876e18..e0e513a1 100644 --- a/.github/workflows/model-examples.yml +++ b/.github/workflows/model-examples.yml @@ -5,12 +5,11 @@ on: branches: [main] paths: &model-example-paths - '.github/workflows/model-examples.yml' - - 'examples/cpp/cpp_integration/**' - - 'examples/fortran/ftorch_integration/**' + - 'model/examples/**' + - 'model/src/**' - 'pixi.lock' - 'pixi.toml' - - 'pyproject.toml' - - 'src/skala/**' + - 'skala/src/skala/**' pull_request: branches: [main] paths: *model-example-paths @@ -67,7 +66,8 @@ jobs: - name: Generate features run: >- - python examples/cpp/cpp_integration/prepare_inputs.py --output-dir features + python model/examples/cpp/cpp_integration/prepare_inputs.py + --output-dir features - name: Upload features uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 @@ -98,7 +98,7 @@ jobs: - name: Configure and build project run: | - cmake -B build_example -S examples/cpp/cpp_integration -G Ninja + cmake -B build_example -S model/examples/cpp/cpp_integration -G Ninja cmake --build build_example - name: Download features @@ -141,7 +141,7 @@ jobs: - name: Configure, build, and install project run: | - cmake -B build_example -S examples/fortran/ftorch_integration -G Ninja \ + cmake -B build_example -S model/examples/fortran/ftorch_integration -G Ninja \ -DCMAKE_INSTALL_PREFIX="$CONDA_PREFIX" cmake --build build_example cmake --install build_example diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml index 1ea89c14..8c4e2161 100644 --- a/.github/workflows/pypi.yml +++ b/.github/workflows/pypi.yml @@ -61,13 +61,14 @@ jobs: cache: false - name: Build conda artifact - run: pixi publish --path . --target-dir dist-conda + run: pixi publish --path skala --target-dir dist-conda - name: Store conda artifact uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: skala-conda-pkg path: dist-conda/*.conda + if-no-files-found: error publish-to-pypi: name: Publish to PyPI diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d97969cd..8d819e6f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -6,14 +6,13 @@ on: paths: &test-paths - '.github/workflows/test.yml' - '.pre-commit-config.yaml' - - 'benchmarks/reference/**' - - 'conftest.py' - - 'docs/_ext/**' + - 'docs/benchmark/**' + - 'gauxc/**/*.py' + - 'model/**/*.py' - 'pixi.lock' - 'pixi.toml' - 'pyproject.toml' - - 'src/skala/**' - - 'tests/**' + - 'skala/**' - '**/*.py' - '**/*.pyi' - '**/*.ipynb' @@ -90,12 +89,41 @@ jobs: run: >- pytest -v --doctest-modules --cov=skala --cov-report=xml --cov-report=term-missing --cov-report=html --durations=50 - --durations-min=1.0 src/skala/ tests/ + --durations-min=1.0 skala/src/skala/ skala/tests/ - name: Print CPU diagnostics on failure if: ${{ failure() }} uses: ./.github/actions/cpu-diagnostics + component-test: + name: Model, GauXC, and benchmark unit tests + runs-on: ubuntu-latest + needs: + - lint + env: + OMP_NUM_THREADS: 4 + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + with: + lfs: true + + - 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.75.0 + environments: lint + activate-environment: true + locked: true + cache: false + + - name: Run component unit tests + run: >- + pytest -v model/tests/test_model.py model/tests/test_utils.py + gauxc/tests/ docs/benchmark/tests/ + gpu-test: runs-on: microsoft-skala-gpu-pool needs: @@ -132,13 +160,13 @@ jobs: - name: Run GPU tests run: >- - pytest -v -m 'gpu and not profiling and not model_benchmark' tests/ + pytest -v -m 'gpu and not profiling and not model_benchmark' skala/tests/ env: CUDA_LAUNCH_BLOCKING: 1 - name: Run GPU doctests - run: pytest -v --doctest-modules src/skala/gpu4pyscf/ + run: pytest -v --doctest-modules skala/src/skala/gpu4pyscf/ profiling: name: "Profiling (Python=3.12 & PySCF=2.14 & PyTorch=2.13)" @@ -163,4 +191,4 @@ jobs: cache: false - name: Run profiling tests - run: pytest -v -m profiling tests/ + run: pytest -v -m profiling skala/tests/ diff --git a/.gitignore b/.gitignore index fa6cfbdd..de97f211 100644 --- a/.gitignore +++ b/.gitignore @@ -332,9 +332,13 @@ paket-files/ __pycache__/ *.pyc *.egg-info/ +.pytest_cache/ +.benchmarks/ +htmlcov/ .pixi/ jupyter_execute/ /build/ +**/_build/ /build_example/ /dist/ /dist-conda/ @@ -412,8 +416,5 @@ FodyWeavers.xsd # JetBrains Rider *.sln.iml -# Sphinx documentation build output -docs/_build/ - # Checkpoint files *.fun diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1ea85258..69ef6f21 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -18,10 +18,54 @@ repos: - repo: local hooks: - - id: mypy - name: mypy + - id: mypy-skala + name: mypy (Skala runtime) entry: mypy language: system - args: [--config-file, pyproject.toml, --num-workers, "4", .] + args: + - --config-file + - pyproject.toml + - --num-workers + - "4" + - skala + pass_filenames: false + always_run: true + + - id: mypy-model + name: mypy (model) + entry: mypy + language: system + args: + - --config-file + - pyproject.toml + - --num-workers + - "4" + - model + pass_filenames: false + always_run: true + + - id: mypy-gauxc + name: mypy (GauXC) + entry: mypy + language: system + args: + - --config-file + - pyproject.toml + - --num-workers + - "4" + - gauxc + pass_filenames: false + always_run: true + + - id: mypy-docs + name: mypy (documentation) + entry: mypy + language: system + args: + - --config-file + - pyproject.toml + - --num-workers + - "4" + - docs pass_filenames: false always_run: true diff --git a/AGENTS.md b/AGENTS.md index 23424cdf..b2df0bc3 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -11,11 +11,10 @@ Skala is a neural network-based exchange-correlation (XC) functional for density | Path | Description | |------|-------------| -| `src/skala/` | Core Python package (model, PySCF/ASE integrations, utilities) | -| `tests/` | Pytest test suite | -| `docs/` | Sphinx documentation (RST + Jupyter notebooks via myst-nb) | -| `examples/` | Usage examples (Python scripts and C++ integrations) | -| `third_party/gauxc/` | Vendored GauXC library with Skala support | +| `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 | +| `docs/` | Main Sphinx site and benchmark/report tooling | | `.github/workflows/` | CI workflows (test, docs) | ## Development environment @@ -38,7 +37,7 @@ Skala is a neural network-based exchange-correlation (XC) functional for density named untyped dependencies in `pyproject.toml`; do not use global `--ignore-missing-imports`. - Line length: 100 characters (Black-compatible). - Imports sorted via Ruff's isort rules. -- Exclude `third_party/` and `tests/` from mypy; exclude `third_party/` from Ruff. +- Generated build, coverage, and documentation output is excluded from static analysis. When editing code: - Run `ruff format ` and `ruff check --fix ` before committing. @@ -50,12 +49,11 @@ When editing code: - Framework: pytest with pytest-cov. - Run tests: ```bash - pixi run -e default pytest -v --doctest-modules \ + 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 src/skala/ tests/ + --durations=50 --durations-min=1.0 skala/src/skala/ skala/tests/ ``` -- The generic `pytest` task sets `OMP_NUM_THREADS=4` and forwards all additional arguments. -- Keep test files in `tests/` with `test_` prefix. +- Keep tests beside their owning component with a `test_` prefix. - Use fixtures for expensive setup (molecule construction, model loading). - Prefer fast unit tests; integration tests that run DFT should be marked or placed separately. @@ -64,9 +62,11 @@ When editing code: - Engine: Sphinx with myst-nb (executes notebooks during build). - Build locally: ```bash - pixi run -e docs sphinx-build -b html docs docs/_build/html + pixi run -e docs sphinx-build -b html docs/site docs/site/_build/html + pixi run -e docs sphinx-build -b html gauxc/docs docs/site/_build/html/gauxc + touch docs/site/_build/html/.nojekyll ``` -- Notebooks in `docs/` should be executable with a 5-minute timeout. +- Notebooks in `docs/site/` should be executable with a 5-minute timeout. - Use reStructuredText for standalone pages; Jupyter notebooks for tutorials. ## Pull request guidelines @@ -80,24 +80,26 @@ When editing code: ## Architecture notes -- **Functional implementation** (`src/skala/functional/`): Defines the Skala model layers, density - features, and enhancement-factor network. The pre-trained weights are loaded via Hugging Face Hub. -- **PySCF integration** (`src/skala/pyscf/`): Custom `numint` module and `SkalaKS` class hook the +- **Runtime functional API** (`skala/src/skala/functional/`): Loads traced checkpoints and defines + traditional functionals and the runtime interface. +- **Model definition** (`model/src/skala_model/`): Defines trainable layers and the + enhancement-factor network; it is not part of release artifacts. +- **PySCF integration** (`skala/src/skala/pyscf/`): Custom `numint` module and `SkalaKS` class hook the model into PySCF's DFT machinery. -- **ASE calculator** (`src/skala/ase/`): Provides an ASE-compatible calculator for energy/force +- **ASE calculator** (`skala/src/skala/ase/`): Provides an ASE-compatible calculator for energy/force evaluations and geometry optimizations. -- **GauXC add-on** (`third_party/gauxc/`): C++ library enabling Skala in compiled DFT codes; uses - LibTorch for inference. +- **GauXC integration** (`gauxc/`): Exporter and C/C++/Fortran examples for external GauXC builds. -## Common tasks +## Common commands | Task | Command | |------|---------| -| Format code | `pixi run -e default ruff format src/ tests/` | +| Format code | `pixi run -e default ruff format skala/ model/ gauxc/ docs/benchmark/` | | Lint code | `pixi run -e default pre-commit run --all-files` | -| Run tests | `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 src/skala/ tests/` | -| Build docs | `pixi run -e docs sphinx-build -b html docs docs/_build/html` | -| Type check | `pixi run -e default mypy src/skala` | +| 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/ docs/benchmark/tests/` | +| Build docs | `pixi run -e docs sphinx-build -b html docs/site docs/site/_build/html && pixi run -e docs sphinx-build -b html gauxc/docs docs/site/_build/html/gauxc && touch docs/site/_build/html/.nojekyll` | +| Type check | `pixi run -e default mypy skala/src model/src gauxc/src docs/benchmark/src` | ## Contact diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 439358e8..efbd6052 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -26,23 +26,27 @@ pixi run -e default pre-commit install Run the standard checks in their Pixi environments: ```bash -pixi run -e default pytest -v --doctest-modules \ +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 src/skala/ tests/ + --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/ docs/benchmark/tests/ pixi run -e default pre-commit run --all-files -pixi run -e docs sphinx-build -b html docs docs/_build/html +pixi run -e docs sphinx-build -b html docs/site docs/site/_build/html +pixi run -e docs sphinx-build -b html gauxc/docs docs/site/_build/html/gauxc +touch docs/site/_build/html/.nojekyll ``` -The generic `pytest` task sets `OMP_NUM_THREADS=4` and forwards all additional arguments. +Set `OMP_NUM_THREADS=4` when running tests locally to match CI. 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 `pyproject.toml`. +synchronized with changes to `pixi.toml` or any component `pyproject.toml`. ## Model development -The torch model in the `src/skala/functional` folder serves as a representation of what our +The torch model in `model/src/skala_model` serves as a representation of what our model does. The real model is inside the respective `.fun` files on [hugging face](https://huggingface.co/microsoft/skala-1.1), which contains a fully traced model. So the model folder is not production code, but more an explanation in code, which we will try to keep in line with our traced models. @@ -62,23 +66,23 @@ outside this synthetic benchmark. The tests use 200,000 deterministic grid point neither molecular setup nor golden output data. Run the CPU cases with four threads: ```bash -MKL_NUM_THREADS=4 pixi run -e default \ - pytest -v -m model_benchmark -k cpu tests/test_traced_model_comparison.py +OMP_NUM_THREADS=4 MKL_NUM_THREADS=4 pixi run -e default \ + pytest -v -m model_benchmark -k cpu model/tests/test_traced_model_comparison.py ``` On a CUDA-capable runner, execute both CPU and GPU cases by omitting the CPU filter: ```bash -MKL_NUM_THREADS=4 pixi run -e gpu-cuda12-torch213 \ - pytest -v -m model_benchmark -k cuda tests/test_traced_model_comparison.py +OMP_NUM_THREADS=4 MKL_NUM_THREADS=4 pixi run -e gpu-cuda12-torch213 \ + pytest -v -m model_benchmark -k cuda model/tests/test_traced_model_comparison.py ``` The same comparison can be run as a standalone report. It prints maximum accuracy differences, local and published runtime medians, and isolated peak allocations for forward and backward work: ```bash -pixi run -e default python tests/test_traced_model_comparison.py --device cpu -pixi run -e gpu-cuda12-torch213 python tests/test_traced_model_comparison.py --device cuda +pixi run -e default python model/tests/test_traced_model_comparison.py --device cpu +pixi run -e gpu-cuda12-torch213 python model/tests/test_traced_model_comparison.py --device cuda ``` Despite that feel free to open issues and PRs proposing model improvements, we are very diff --git a/README.md b/README.md index f096aaab..e30369c3 100644 --- a/README.md +++ b/README.md @@ -15,16 +15,24 @@ Learn more about Skala in our [ArXiv paper](https://arxiv.org/abs/2506.14665). ## What's in here -This repository contains two main components: +This repository contains four components: -1. The Python package `skala`, distributed [on PyPI](https://pypi.org/project/skala/) and on conda-forge. It contains a PyTorch implementation of the Skala model and its bindings to the quantum-chemistry packages [PySCF](https://pyscf.org/), [GPU4PySCF](https://pyscf.org/user/gpu.html), and [ASE](https://ase-lib.org/). -2. Examples of using Skala from compiled code through LibTorch and GauXC: - - [Skala in C++ with libtorch](examples/cpp/cpp_integration) +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. +4. [`docs/`](docs) contains the main Sphinx site and benchmark runner/report tooling. + +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. diff --git a/docs/benchmark/conftest.py b/docs/benchmark/conftest.py new file mode 100644 index 00000000..c7b5f4c9 --- /dev/null +++ b/docs/benchmark/conftest.py @@ -0,0 +1,19 @@ +# SPDX-License-Identifier: MIT + +"""Fixtures for the benchmark and report tests.""" + +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/benchmarks/reference/README.md b/docs/benchmark/reference/README.md similarity index 100% rename from benchmarks/reference/README.md rename to docs/benchmark/reference/README.md diff --git a/benchmarks/reference/environments.json b/docs/benchmark/reference/environments.json similarity index 100% rename from benchmarks/reference/environments.json rename to docs/benchmark/reference/environments.json diff --git a/benchmarks/reference/fits.json b/docs/benchmark/reference/fits.json similarity index 100% rename from benchmarks/reference/fits.json rename to docs/benchmark/reference/fits.json diff --git a/benchmarks/reference/measurements.json b/docs/benchmark/reference/measurements.json similarity index 100% rename from benchmarks/reference/measurements.json rename to docs/benchmark/reference/measurements.json diff --git a/benchmarks/reference/prose.yaml b/docs/benchmark/reference/prose.yaml similarity index 100% rename from benchmarks/reference/prose.yaml rename to docs/benchmark/reference/prose.yaml diff --git a/src/skala/benchmark/README.md b/docs/benchmark/src/skala_benchmark/README.md similarity index 64% rename from src/skala/benchmark/README.md rename to docs/benchmark/src/skala_benchmark/README.md index 4664a635..4d2bb8b8 100644 --- a/src/skala/benchmark/README.md +++ b/docs/benchmark/src/skala_benchmark/README.md @@ -1,4 +1,4 @@ # Benchmark documentation User instructions for running, collecting, and comparing benchmark timings live in -[`docs/benchmarks.rst`](../../../docs/benchmarks.rst). +[`docs/site/benchmarks.rst`](../../../site/benchmarks.rst). diff --git a/src/skala/benchmark/__init__.py b/docs/benchmark/src/skala_benchmark/__init__.py similarity index 100% rename from src/skala/benchmark/__init__.py rename to docs/benchmark/src/skala_benchmark/__init__.py diff --git a/src/skala/benchmark/__main__.py b/docs/benchmark/src/skala_benchmark/__main__.py similarity index 94% rename from src/skala/benchmark/__main__.py rename to docs/benchmark/src/skala_benchmark/__main__.py index d91a8368..17d3ff91 100644 --- a/src/skala/benchmark/__main__.py +++ b/docs/benchmark/src/skala_benchmark/__main__.py @@ -9,14 +9,14 @@ from collections.abc import Sequence from pathlib import Path -from skala.benchmark.orchestrator import SweepRequest, parse_duration, run_sweep -from skala.benchmark.protocol import DEFAULT_PROTOCOL, Device +from skala_benchmark.orchestrator import SweepRequest, parse_duration, run_sweep +from skala_benchmark.protocol import DEFAULT_PROTOCOL, Device def main(argv: Sequence[str] | None = None) -> None: """Run one stage of the benchmark workflow.""" parser = argparse.ArgumentParser( - prog="python -m skala.benchmark", + prog="python -m skala_benchmark", description="Run, collect, and report the Skala DFT benchmark.", ) subparsers = parser.add_subparsers(dest="command", required=True) @@ -133,16 +133,16 @@ def main(argv: Sequence[str] | None = None) -> None: ) ) elif args.command == "fetch-dataset": - from skala.benchmark.fetch import main as fetch_main + from skala_benchmark.fetch import main as fetch_main raise SystemExit(fetch_main(args.dataset_dir)) elif args.command == "collect": - from skala.benchmark.collect_results import collect_results + from skala_benchmark.collect_results import collect_results output_dir = args.output_dir or str(Path(args.input_dir) / "collected") collect_results(args.input_dir, output_dir) else: - from skala.benchmark.report.generate import generate + from skala_benchmark.report.generate import generate generate(args.output_dir, args.collected_dirs, prose_path=args.prose) diff --git a/src/skala/benchmark/collect_results.py b/docs/benchmark/src/skala_benchmark/collect_results.py similarity index 96% rename from src/skala/benchmark/collect_results.py rename to docs/benchmark/src/skala_benchmark/collect_results.py index 8c3d9a58..4f315247 100644 --- a/src/skala/benchmark/collect_results.py +++ b/docs/benchmark/src/skala_benchmark/collect_results.py @@ -9,10 +9,10 @@ from pathlib import Path from typing import Any -from skala.benchmark import metrics -from skala.benchmark.fitting import fit_piecewise_loglog -from skala.benchmark.schema.environment import Environment -from skala.benchmark.schema.measurements import read_dataset +from skala_benchmark import metrics +from skala_benchmark.fitting import fit_piecewise_loglog +from skala_benchmark.schema.environment import Environment +from skala_benchmark.schema.measurements import read_dataset MIN_FIT_POINTS = 4 diff --git a/src/skala/benchmark/dataset.py b/docs/benchmark/src/skala_benchmark/dataset.py similarity index 94% rename from src/skala/benchmark/dataset.py rename to docs/benchmark/src/skala_benchmark/dataset.py index d75af75b..45cd880d 100644 --- a/src/skala/benchmark/dataset.py +++ b/docs/benchmark/src/skala_benchmark/dataset.py @@ -4,7 +4,7 @@ The structures themselves are not part of this repository. They belong to the datasets they were taken from and are downloaded from those sources by -:mod:`skala.benchmark.fetch`; what is kept here is a manifest naming each +:mod:`skala_benchmark.fetch`; what is kept here is a manifest naming each molecule, the file it comes from, and enough metadata to verify the download. """ @@ -17,7 +17,7 @@ from importlib.resources import files from pathlib import Path -from skala.benchmark.models import Molecule +from skala_benchmark.models import Molecule #: Manifest of the benchmark set. Metadata only; it holds no coordinates. MANIFEST_FILE = "dataset_sources.csv" @@ -70,7 +70,7 @@ def default_dataset_dir() -> Path: def read_manifest() -> list[ManifestEntry]: """Return the packaged manifest of benchmark molecules.""" - resource = files("skala.benchmark") / MANIFEST_FILE + resource = files("skala_benchmark") / MANIFEST_FILE with resource.open("r", encoding="utf-8") as stream: return [ ManifestEntry( @@ -113,7 +113,7 @@ def load_benchmark_molecules( """ path = dataset_path(dataset_dir) if not path.exists(): - command = "python -m skala.benchmark fetch-dataset" + command = "python -m skala_benchmark fetch-dataset" if dataset_dir is not None: command += f" --dataset-dir {path.parent}" raise FileNotFoundError( @@ -126,7 +126,7 @@ def load_benchmark_molecules( if {str(record["hash"]) for record in records} != expected: raise ValueError( f"the dataset in {path.parent} does not match this version of the " - "benchmark; re-run 'python -m skala.benchmark fetch-dataset'" + "benchmark; re-run 'python -m skala_benchmark fetch-dataset'" ) return [ BenchmarkMolecule( diff --git a/src/skala/benchmark/dataset_sources.csv b/docs/benchmark/src/skala_benchmark/dataset_sources.csv similarity index 100% rename from src/skala/benchmark/dataset_sources.csv rename to docs/benchmark/src/skala_benchmark/dataset_sources.csv diff --git a/src/skala/benchmark/fetch.py b/docs/benchmark/src/skala_benchmark/fetch.py similarity index 97% rename from src/skala/benchmark/fetch.py rename to docs/benchmark/src/skala_benchmark/fetch.py index 7a6057eb..47360609 100644 --- a/src/skala/benchmark/fetch.py +++ b/docs/benchmark/src/skala_benchmark/fetch.py @@ -5,9 +5,9 @@ The set combines five published datasets. Their structures are not redistributed here; they are downloaded from the upstream repositories, each pinned to a commit, and assembled into the file the benchmark reads. See -``docs/benchmarks.rst`` for the datasets and the citations they require. +``docs/site/benchmarks.rst`` for the datasets and the citations they require. -Every structure is checked against :mod:`skala.benchmark.dataset`'s manifest -- +Every structure is checked against :mod:`skala_benchmark.dataset`'s manifest -- atom count, element formula, charge and multiplicity -- so a source that has changed upstream is reported rather than silently used. """ @@ -22,7 +22,7 @@ import numpy as np -from skala.benchmark.dataset import ( +from skala_benchmark.dataset import ( DATASET_FILE, ManifestEntry, default_dataset_dir, @@ -180,7 +180,7 @@ def fetch_dataset(dataset_dir: str | Path | None = None) -> Path: Args: dataset_dir: Directory to write the dataset to. Defaults to - :func:`skala.benchmark.dataset.default_dataset_dir`. + :func:`skala_benchmark.dataset.default_dataset_dir`. Returns: The path of the written dataset file. diff --git a/src/skala/benchmark/fitting.py b/docs/benchmark/src/skala_benchmark/fitting.py similarity index 99% rename from src/skala/benchmark/fitting.py rename to docs/benchmark/src/skala_benchmark/fitting.py index 36922000..c1ecd7c2 100644 --- a/src/skala/benchmark/fitting.py +++ b/docs/benchmark/src/skala_benchmark/fitting.py @@ -74,7 +74,9 @@ def predict(self, x: float) -> float: The prediction in original y units, or NaN for an empty fit. """ prediction = self.predict_loglog(x) - return 10.0**prediction + result = 10.0**prediction + assert isinstance(result, float) + return result def fit_piecewise_loglog( diff --git a/src/skala/benchmark/metrics.py b/docs/benchmark/src/skala_benchmark/metrics.py similarity index 99% rename from src/skala/benchmark/metrics.py rename to docs/benchmark/src/skala_benchmark/metrics.py index 1d2aa71c..fc61a215 100644 --- a/src/skala/benchmark/metrics.py +++ b/docs/benchmark/src/skala_benchmark/metrics.py @@ -5,7 +5,7 @@ The registries in this module are the single source of truth for report labels, units, axes, source columns, and fit combinations. -Every quantity is measured directly (see :mod:`skala.benchmark.timing`); nothing +Every quantity is measured directly (see :mod:`skala_benchmark.timing`); nothing is inferred from sampling. Four layers nest inside one SCF iteration:: xc_eval in numint in veff in cycle @@ -51,7 +51,7 @@ Row = Mapping[str, Any] #: Cycles from this index on are treated as steady state. Mirrors -#: :data:`skala.benchmark.timing.STEADY_STATE_FROM_CYCLE`. +#: :data:`skala_benchmark.timing.STEADY_STATE_FROM_CYCLE`. STEADY_STATE_FROM_CYCLE = 1 diff --git a/src/skala/benchmark/models.py b/docs/benchmark/src/skala_benchmark/models.py similarity index 100% rename from src/skala/benchmark/models.py rename to docs/benchmark/src/skala_benchmark/models.py diff --git a/src/skala/benchmark/node_info.py b/docs/benchmark/src/skala_benchmark/node_info.py similarity index 99% rename from src/skala/benchmark/node_info.py rename to docs/benchmark/src/skala_benchmark/node_info.py index def0c5b7..e3150d77 100644 --- a/src/skala/benchmark/node_info.py +++ b/docs/benchmark/src/skala_benchmark/node_info.py @@ -15,7 +15,7 @@ from datetime import UTC, datetime from importlib import metadata -from skala.benchmark.schema.environment import Environment +from skala_benchmark.schema.environment import Environment #: Threading-related environment variables worth recording verbatim. _THREAD_ENV_VARS = ( diff --git a/src/skala/benchmark/orchestrator.py b/docs/benchmark/src/skala_benchmark/orchestrator.py similarity index 97% rename from src/skala/benchmark/orchestrator.py rename to docs/benchmark/src/skala_benchmark/orchestrator.py index 9be34ceb..bd885a2e 100644 --- a/src/skala/benchmark/orchestrator.py +++ b/docs/benchmark/src/skala_benchmark/orchestrator.py @@ -25,16 +25,16 @@ import pyarrow.parquet as pq -from skala.benchmark.dataset import BenchmarkMolecule, load_benchmark_molecules -from skala.benchmark.node_info import collect_environment -from skala.benchmark.protocol import ( +from skala_benchmark.dataset import BenchmarkMolecule, load_benchmark_molecules +from skala_benchmark.node_info import collect_environment +from skala_benchmark.protocol import ( DEFAULT_PROTOCOL, BenchmarkProtocol, Device, FunctionalSpec, ) -from skala.benchmark.runner import RunConfig, count_atomic_orbitals, validate_device -from skala.benchmark.schema.measurements import Row, make_row, write_shard +from skala_benchmark.runner import RunConfig, count_atomic_orbitals, validate_device +from skala_benchmark.schema.measurements import Row, make_row, write_shard #: One point in the sweep: a (basis, functional, molecule) triple. Task = tuple[str, FunctionalSpec, BenchmarkMolecule] @@ -89,7 +89,7 @@ class CheckpointState: def main(argv: list[str]) -> None: - from skala.benchmark.__main__ import main as benchmark_main + from skala_benchmark.__main__ import main as benchmark_main benchmark_main(["run", *argv]) @@ -393,7 +393,7 @@ def _execute(ctx: SweepContext, config: RunConfig) -> dict[str, object]: started = time.perf_counter() command = [ - ctx.python, "-m", "skala.benchmark.runner", + ctx.python, "-m", "skala_benchmark.runner", "--config", str(cfg_path), "--result", str(result_path), "--launched-at", repr(started), ] # fmt: skip diff --git a/src/skala/benchmark/protocol.py b/docs/benchmark/src/skala_benchmark/protocol.py similarity index 100% rename from src/skala/benchmark/protocol.py rename to docs/benchmark/src/skala_benchmark/protocol.py diff --git a/src/skala/benchmark/report/__init__.py b/docs/benchmark/src/skala_benchmark/report/__init__.py similarity index 100% rename from src/skala/benchmark/report/__init__.py rename to docs/benchmark/src/skala_benchmark/report/__init__.py diff --git a/src/skala/benchmark/report/_normalize.py b/docs/benchmark/src/skala_benchmark/report/_normalize.py similarity index 100% rename from src/skala/benchmark/report/_normalize.py rename to docs/benchmark/src/skala_benchmark/report/_normalize.py diff --git a/src/skala/benchmark/report/assets/report-base.css b/docs/benchmark/src/skala_benchmark/report/assets/report-base.css similarity index 100% rename from src/skala/benchmark/report/assets/report-base.css rename to docs/benchmark/src/skala_benchmark/report/assets/report-base.css diff --git a/src/skala/benchmark/report/assets/report.css b/docs/benchmark/src/skala_benchmark/report/assets/report.css similarity index 100% rename from src/skala/benchmark/report/assets/report.css rename to docs/benchmark/src/skala_benchmark/report/assets/report.css diff --git a/src/skala/benchmark/report/assets/report.js b/docs/benchmark/src/skala_benchmark/report/assets/report.js similarity index 100% rename from src/skala/benchmark/report/assets/report.js rename to docs/benchmark/src/skala_benchmark/report/assets/report.js diff --git a/src/skala/benchmark/report/assets/vendor/d3.min.js b/docs/benchmark/src/skala_benchmark/report/assets/vendor/d3.min.js similarity index 100% rename from src/skala/benchmark/report/assets/vendor/d3.min.js rename to docs/benchmark/src/skala_benchmark/report/assets/vendor/d3.min.js diff --git a/src/skala/benchmark/report/assets/vendor/katex.min.js b/docs/benchmark/src/skala_benchmark/report/assets/vendor/katex.min.js similarity index 100% rename from src/skala/benchmark/report/assets/vendor/katex.min.js rename to docs/benchmark/src/skala_benchmark/report/assets/vendor/katex.min.js diff --git a/src/skala/benchmark/report/data.py b/docs/benchmark/src/skala_benchmark/report/data.py similarity index 99% rename from src/skala/benchmark/report/data.py rename to docs/benchmark/src/skala_benchmark/report/data.py index 297cb581..d75826c0 100644 --- a/src/skala/benchmark/report/data.py +++ b/docs/benchmark/src/skala_benchmark/report/data.py @@ -10,7 +10,7 @@ import numpy as np import pandas as pd -from skala.benchmark import fitting, metrics +from skala_benchmark import fitting, metrics from ._normalize import coerce_int, string_list @@ -463,7 +463,7 @@ def composition_records( Args: measurements: Concatenated collected measurement table. series: Which composition to build, see - :data:`skala.benchmark.metrics.COMPOSITION_SERIES`. + :data:`skala_benchmark.metrics.COMPOSITION_SERIES`. Returns: Records with ``env_id``, ``basis``, ``functional``, ``x`` (#AOs), and @@ -516,7 +516,7 @@ def composition_smooth( Groups the per-point fractions from :func:`composition_records` by environment, basis, and functional, then fits a cross-validated smoothing spline to the cumulative band boundaries (see - :func:`skala.benchmark.fitting.smooth_stacked_fractions`). The result feeds + :func:`skala_benchmark.fitting.smooth_stacked_fractions`). The result feeds the report's stacked-area charts so the bands read as smooth curves rather than piecewise segments. diff --git a/src/skala/benchmark/report/generate.py b/docs/benchmark/src/skala_benchmark/report/generate.py similarity index 100% rename from src/skala/benchmark/report/generate.py rename to docs/benchmark/src/skala_benchmark/report/generate.py diff --git a/src/skala/benchmark/report/prose.py b/docs/benchmark/src/skala_benchmark/report/prose.py similarity index 100% rename from src/skala/benchmark/report/prose.py rename to docs/benchmark/src/skala_benchmark/report/prose.py diff --git a/src/skala/benchmark/report/templates/index.html b/docs/benchmark/src/skala_benchmark/report/templates/index.html similarity index 100% rename from src/skala/benchmark/report/templates/index.html rename to docs/benchmark/src/skala_benchmark/report/templates/index.html diff --git a/src/skala/benchmark/runner.py b/docs/benchmark/src/skala_benchmark/runner.py similarity index 98% rename from src/skala/benchmark/runner.py rename to docs/benchmark/src/skala_benchmark/runner.py index 2ec00730..a5366fdd 100644 --- a/src/skala/benchmark/runner.py +++ b/docs/benchmark/src/skala_benchmark/runner.py @@ -16,9 +16,9 @@ from pathlib import Path from typing import TYPE_CHECKING -from skala.benchmark.models import Molecule -from skala.benchmark.protocol import Device, FunctionalKind, FunctionalSpec -from skala.benchmark.timing import instrument +from skala_benchmark.models import Molecule +from skala_benchmark.protocol import Device, FunctionalKind, FunctionalSpec +from skala_benchmark.timing import instrument #: When this module finished loading, on the same clock the orchestrator uses. #: ``time.perf_counter`` is ``CLOCK_MONOTONIC`` on Linux, which counts from boot @@ -40,7 +40,6 @@ import torch from pyscf import gto from pyscf.scf.hf import SCF - from skala.functional.base import ExcFunctionalBase @@ -136,7 +135,7 @@ class RunResult: kernel_time_ms: float # mf.kernel() call only setup_ms: float # kernel entry until the first numerical-integration call finalize_ms: float # after the last cycle: pyscf's post-loop convergence check - #: One entry per SCF iteration; see :class:`skala.benchmark.timing. + #: One entry per SCF iteration; see :class:`skala_benchmark.timing. #: CycleTiming`. Cycle 0 carries the one-time warmup cost. cycles: list[dict[str, float | int]] @@ -554,7 +553,7 @@ def validate_device(device: Device) -> None: def _timeline_device(device: Device) -> str: """Return the timeline selector for ``device``, without importing torch. - :func:`skala.benchmark.timing.make_timeline` only needs to know whether the + :func:`skala_benchmark.timing.make_timeline` only needs to know whether the work runs on CUDA. Passing a string keeps torch out of the measured region: a classical functional on CPU never imports it otherwise, and importing it between the kernel timestamps would put seconds of module loading inside the diff --git a/src/skala/benchmark/schema/__init__.py b/docs/benchmark/src/skala_benchmark/schema/__init__.py similarity index 100% rename from src/skala/benchmark/schema/__init__.py rename to docs/benchmark/src/skala_benchmark/schema/__init__.py diff --git a/src/skala/benchmark/schema/environment.py b/docs/benchmark/src/skala_benchmark/schema/environment.py similarity index 100% rename from src/skala/benchmark/schema/environment.py rename to docs/benchmark/src/skala_benchmark/schema/environment.py diff --git a/src/skala/benchmark/schema/measurements.py b/docs/benchmark/src/skala_benchmark/schema/measurements.py similarity index 98% rename from src/skala/benchmark/schema/measurements.py rename to docs/benchmark/src/skala_benchmark/schema/measurements.py index d056da2b..53eefac9 100644 --- a/src/skala/benchmark/schema/measurements.py +++ b/docs/benchmark/src/skala_benchmark/schema/measurements.py @@ -3,7 +3,7 @@ """Partitioned parquet schema for benchmark *results*. Each row is one measurement of a single DFT computation. -Rows link to an :class:`~skala.benchmark.schema.environment.Environment` +Rows link to an :class:`~skala_benchmark.schema.environment.Environment` via ``env_id``. Shards are written Hive-partitioned by ``shard_index`` so a full run merges by scanning the directory as a dataset. """ @@ -17,7 +17,7 @@ import pyarrow.dataset as ds import pyarrow.parquet as pq -#: One SCF iteration, timed directly (see :mod:`skala.benchmark.timing`). The +#: One SCF iteration, timed directly (see :mod:`skala_benchmark.timing`). The #: layers nest: ``xc_eval_ms <= numint_ms <= veff_ms <= wall_ms``, and for a #: neural functional ``xc_eval_ms == forward_ms + backward_ms``. CYCLE_STRUCT = pa.struct( diff --git a/src/skala/benchmark/timing.py b/docs/benchmark/src/skala_benchmark/timing.py similarity index 99% rename from src/skala/benchmark/timing.py rename to docs/benchmark/src/skala_benchmark/timing.py index 8d5e9e0c..9a2d86f0 100644 --- a/src/skala/benchmark/timing.py +++ b/docs/benchmark/src/skala_benchmark/timing.py @@ -34,12 +34,11 @@ if TYPE_CHECKING: import torch from pyscf.scf.hf import SCF - from skala.functional.base import ExcFunctionalBase #: Cycles from this index on are treated as steady state. Cycle 0 is excluded so #: that anything specific to a first iteration cannot distort a scaling fit; -#: :func:`skala.benchmark.metrics.warmup_ratio` reports how much that matters. +#: :func:`skala_benchmark.metrics.warmup_ratio` reports how much that matters. STEADY_STATE_FROM_CYCLE = 1 @@ -139,7 +138,7 @@ def __init__(self) -> None: def mark(self) -> Mark: event = self._torch.cuda.Event(enable_timing=True) # type: ignore[no-untyped-call] - event.record() # type: ignore[no-untyped-call] + event.record() return event def resolve(self) -> None: diff --git a/tests/benchmark/test_cli.py b/docs/benchmark/tests/test_cli.py similarity index 81% rename from tests/benchmark/test_cli.py rename to docs/benchmark/tests/test_cli.py index 5bb4f922..3d52d74c 100644 --- a/tests/benchmark/test_cli.py +++ b/docs/benchmark/tests/test_cli.py @@ -6,10 +6,9 @@ from pathlib import Path import pytest - -from skala.benchmark.__main__ import main -from skala.benchmark.orchestrator import SweepRequest -from skala.benchmark.protocol import Device +from skala_benchmark.__main__ import main +from skala_benchmark.orchestrator import SweepRequest +from skala_benchmark.protocol import Device def test_run_routes_a_typed_request( @@ -17,7 +16,7 @@ def test_run_routes_a_typed_request( ) -> None: requests: list[SweepRequest] = [] monkeypatch.setattr( - "skala.benchmark.__main__.run_sweep", lambda request: requests.append(request) + "skala_benchmark.__main__.run_sweep", lambda request: requests.append(request) ) main( @@ -47,7 +46,7 @@ def test_collect_routes_to_the_default_output( ) -> None: calls: list[tuple[str, str]] = [] monkeypatch.setattr( - "skala.benchmark.collect_results.collect_results", + "skala_benchmark.collect_results.collect_results", lambda input_dir, output_dir: calls.append((input_dir, output_dir)), ) @@ -61,13 +60,13 @@ def test_report_routes_dry_and_interpreted_reports( ) -> None: calls: list[tuple[str, list[str], str | None]] = [] monkeypatch.setattr( - importlib.import_module("skala.benchmark.report.generate"), + importlib.import_module("skala_benchmark.report.generate"), "generate", lambda output, inputs, prose_path=None: calls.append( (output, inputs, prose_path) ), ) - reference = "benchmarks/reference" + reference = "docs/benchmark/reference" local = str(tmp_path / "benchmark-output" / "collected") main(["report", str(tmp_path / "local-report"), reference, local]) @@ -77,7 +76,7 @@ def test_report_routes_dry_and_interpreted_reports( str(tmp_path / "official-report"), reference, "--prose", - "benchmarks/reference/prose.yaml", + "docs/benchmark/reference/prose.yaml", ] ) @@ -90,6 +89,6 @@ def test_report_routes_dry_and_interpreted_reports( ( str(tmp_path / "official-report"), [reference], - "benchmarks/reference/prose.yaml", + "docs/benchmark/reference/prose.yaml", ), ] diff --git a/tests/benchmark/test_dataset.py b/docs/benchmark/tests/test_dataset.py similarity index 94% rename from tests/benchmark/test_dataset.py rename to docs/benchmark/tests/test_dataset.py index a83adc65..6ef1a99d 100644 --- a/tests/benchmark/test_dataset.py +++ b/docs/benchmark/tests/test_dataset.py @@ -9,15 +9,14 @@ from pathlib import Path import pytest - -from skala.benchmark.dataset import ( +from skala_benchmark.dataset import ( DATASET_DIR_ENV, dataset_path, default_dataset_dir, load_benchmark_molecules, read_manifest, ) -from skala.benchmark.fetch import CONFORMER_SI_SHA256, SOURCES, atomic_numbers +from skala_benchmark.fetch import CONFORMER_SI_SHA256, SOURCES, atomic_numbers def test_manifest_is_packaged_and_complete() -> None: @@ -36,9 +35,9 @@ def test_manifest_holds_no_coordinates() -> None: """The structures belong to their source datasets and are not redistributed.""" from importlib.resources import files - from skala.benchmark.dataset import MANIFEST_FILE + from skala_benchmark.dataset import MANIFEST_FILE - text = (files("skala.benchmark") / MANIFEST_FILE).read_text(encoding="utf-8") + text = (files("skala_benchmark") / MANIFEST_FILE).read_text(encoding="utf-8") columns = text.splitlines()[0].split(",") assert columns == [ "source", diff --git a/tests/benchmark/test_docs.py b/docs/benchmark/tests/test_docs.py similarity index 97% rename from tests/benchmark/test_docs.py rename to docs/benchmark/tests/test_docs.py index 8f768769..63fc2bbb 100644 --- a/tests/benchmark/test_docs.py +++ b/docs/benchmark/tests/test_docs.py @@ -11,7 +11,7 @@ def _load_extension() -> Any: - path = Path(__file__).parents[2] / "docs" / "_ext" / "benchmark_report.py" + path = Path(__file__).parents[2] / "site" / "_ext" / "benchmark_report.py" spec = importlib.util.spec_from_file_location("benchmark_report_test", path) assert spec is not None and spec.loader is not None module = importlib.util.module_from_spec(spec) diff --git a/tests/benchmark/test_metrics.py b/docs/benchmark/tests/test_metrics.py similarity index 97% rename from tests/benchmark/test_metrics.py rename to docs/benchmark/tests/test_metrics.py index 6f8620e2..60f4ff9a 100644 --- a/tests/benchmark/test_metrics.py +++ b/docs/benchmark/tests/test_metrics.py @@ -3,8 +3,7 @@ from __future__ import annotations import pytest - -from skala.benchmark.metrics import ( +from skala_benchmark.metrics import ( composition_times, metric_value, warmup_ratio, diff --git a/tests/benchmark/test_orchestrator.py b/docs/benchmark/tests/test_orchestrator.py similarity index 93% rename from tests/benchmark/test_orchestrator.py rename to docs/benchmark/tests/test_orchestrator.py index c7cb0c17..2cfe8c1d 100644 --- a/tests/benchmark/test_orchestrator.py +++ b/docs/benchmark/tests/test_orchestrator.py @@ -6,24 +6,23 @@ from pathlib import Path import pytest - -from skala.benchmark import node_info -from skala.benchmark.dataset import BenchmarkMolecule -from skala.benchmark.models import Molecule -from skala.benchmark.orchestrator import ( +from skala_benchmark import node_info +from skala_benchmark.dataset import BenchmarkMolecule +from skala_benchmark.models import Molecule +from skala_benchmark.orchestrator import ( SweepRequest, _load_checkpoint_state, _sweep_fingerprint, build_tasks, select_for_shard, ) -from skala.benchmark.protocol import ( +from skala_benchmark.protocol import ( BenchmarkProtocol, Device, FunctionalKind, FunctionalSpec, ) -from skala.benchmark.schema.measurements import make_row, write_shard +from skala_benchmark.schema.measurements import make_row, write_shard def _molecule(name: str, electrons: int) -> BenchmarkMolecule: diff --git a/tests/benchmark/test_report.py b/docs/benchmark/tests/test_report.py similarity index 94% rename from tests/benchmark/test_report.py rename to docs/benchmark/tests/test_report.py index 97bacccd..79095d51 100644 --- a/tests/benchmark/test_report.py +++ b/docs/benchmark/tests/test_report.py @@ -7,11 +7,10 @@ from pathlib import Path import pytest +from skala_benchmark.report import generate +from skala_benchmark.report.prose import load_prose -from skala.benchmark.report import generate -from skala.benchmark.report.prose import load_prose - -_REFERENCE_DIR = Path(__file__).parents[2] / "benchmarks" / "reference" +_REFERENCE_DIR = Path(__file__).parents[1] / "reference" _EXPECTED_FILES = { "data.json", "d3.min.js", diff --git a/tests/benchmark/test_runner.py b/docs/benchmark/tests/test_runner.py similarity index 88% rename from tests/benchmark/test_runner.py rename to docs/benchmark/tests/test_runner.py index c158af19..a41d6cf9 100644 --- a/tests/benchmark/test_runner.py +++ b/docs/benchmark/tests/test_runner.py @@ -7,10 +7,9 @@ import math import pytest - -from skala.benchmark.models import Molecule -from skala.benchmark.protocol import Device, FunctionalKind, FunctionalSpec -from skala.benchmark.runner import RunConfig, RunResult, run_worker +from skala_benchmark.models import Molecule +from skala_benchmark.protocol import Device, FunctionalKind, FunctionalSpec +from skala_benchmark.runner import RunConfig, RunResult, run_worker def test_real_worker_produces_an_accounted_serializable_measurement() -> None: diff --git a/tests/benchmark/test_workflow.py b/docs/benchmark/tests/test_workflow.py similarity index 93% rename from tests/benchmark/test_workflow.py rename to docs/benchmark/tests/test_workflow.py index 6e028e1e..41b55d63 100644 --- a/tests/benchmark/test_workflow.py +++ b/docs/benchmark/tests/test_workflow.py @@ -6,10 +6,10 @@ import json from pathlib import Path -from skala.benchmark.collect_results import MIN_FIT_POINTS, collect_results -from skala.benchmark.report import generate -from skala.benchmark.schema.environment import Environment -from skala.benchmark.schema.measurements import make_row, write_shard +from skala_benchmark.collect_results import MIN_FIT_POINTS, collect_results +from skala_benchmark.report import generate +from skala_benchmark.schema.environment import Environment +from skala_benchmark.schema.measurements import make_row, write_shard def test_raw_data_collects_and_reports_reproducibly(tmp_path: Path) -> None: diff --git a/docs/_ext/benchmark_report.py b/docs/site/_ext/benchmark_report.py similarity index 85% rename from docs/_ext/benchmark_report.py rename to docs/site/_ext/benchmark_report.py index b4393ef3..39c0aee7 100644 --- a/docs/_ext/benchmark_report.py +++ b/docs/site/_ext/benchmark_report.py @@ -8,10 +8,10 @@ from pathlib import Path from typing import Any -from skala.benchmark.report import generate +from skala_benchmark.report import generate -_REPOSITORY_ROOT = Path(__file__).resolve().parents[2] -_REFERENCE_DIR = _REPOSITORY_ROOT / "benchmarks" / "reference" +_DOCS_ROOT = Path(__file__).resolve().parents[2] +_REFERENCE_DIR = _DOCS_ROOT / "benchmark" / "reference" _SOURCE_FILES = ( "environments.json", "measurements.json", diff --git a/docs/_static/bib/data.bib b/docs/site/_static/bib/data.bib similarity index 100% rename from docs/_static/bib/data.bib rename to docs/site/_static/bib/data.bib diff --git a/docs/_static/img/density.png b/docs/site/_static/img/density.png similarity index 100% rename from docs/_static/img/density.png rename to docs/site/_static/img/density.png diff --git a/docs/ase.ipynb b/docs/site/ase.ipynb similarity index 99% rename from docs/ase.ipynb rename to docs/site/ase.ipynb index 26555d8a..d857b919 100644 --- a/docs/ase.ipynb +++ b/docs/site/ase.ipynb @@ -21,7 +21,6 @@ "from ase.build import molecule\n", "from ase.optimize import LBFGSLineSearch as Opt\n", "from ase.units import Hartree\n", - "\n", "from skala.ase import Skala" ] }, diff --git a/docs/benchmarks.rst b/docs/site/benchmarks.rst similarity index 89% rename from docs/benchmarks.rst rename to docs/site/benchmarks.rst index 2bc035c7..b70b1bb9 100644 --- a/docs/benchmarks.rst +++ b/docs/site/benchmarks.rst @@ -25,7 +25,7 @@ The molecule set The 58 molecules span two to nearly two thousand atoms and are taken from five published datasets. Their structures are the property of the authors of those datasets and are not -redistributed here: ``python -m skala.benchmark fetch-dataset`` downloads them from the original +redistributed here: ``python -m skala_benchmark fetch-dataset`` downloads them from the original sources, each pinned to a commit so that a rebuild is reproducible. The one source that a commit cannot pin, the conformer-benchmark supporting information, is checked against a digest instead. @@ -81,7 +81,7 @@ Compare a local implementation or machine ----------------------------------------- Use the same benchmark protocol on your own hardware or software stack, then compare your timings -against our fixed reference measurements in ``benchmarks/reference``. This is the expected workflow +against our fixed reference measurements in ``docs/benchmark/reference``. This is the expected workflow for users who want to validate an implementation, check a new machine, or confirm that a local build matches our published performance envelope. @@ -93,16 +93,16 @@ because worker subprocesses inherit them: .. code-block:: bash git lfs pull - pixi install --locked -e default - pixi run -e default python -m skala.benchmark fetch-dataset + pixi install --locked -e default + pixi run -e default python -m skala_benchmark fetch-dataset export OMP_NUM_THREADS=16 - pixi run -e default python -m skala.benchmark run benchmark-output \ - --env-id local-cpu \ - --env-label 'Local 16-core CPU' \ - --device cpu \ - --max-orbitals 250 \ - --time-limit 4h + pixi run -e default python -m skala_benchmark run benchmark-output \ + --env-id local-cpu \ + --env-label 'Local 16-core CPU' \ + --device cpu \ + --max-orbitals 250 \ + --time-limit 4h Choose the physical core count appropriate for the machine. GPU runs require a compatible CUDA, CuPy, and GPU4PySCF installation; requesting ``--device gpu`` fails instead of silently falling @@ -112,11 +112,11 @@ For a quick smoke test, use a separate output directory and restrict both molecu .. code-block:: bash - pixi run -e default python -m skala.benchmark run benchmark-smoke \ - --env-id cpu-smoke \ - --device cpu \ - --max-atoms 3 \ - --basis def2-svp + pixi run -e default python -m skala_benchmark run benchmark-smoke \ + --env-id cpu-smoke \ + --device cpu \ + --max-atoms 3 \ + --basis def2-svp Filters are part of the sweep identity, so do not use a restricted run to resume a full sweep. @@ -136,11 +136,11 @@ location and point every shard at it, so the compute nodes need no network acces .. code-block:: bash - python -m skala.benchmark collect benchmark-output + python -m skala_benchmark collect benchmark-output # Create a report with both our reference timings and your local timings. - python -m skala.benchmark report local-report \ - benchmarks/reference \ + python -m skala_benchmark report local-report \ + docs/benchmark/reference \ benchmark-output/collected The collected JSON is written to ``benchmark-output/collected`` by default. The local report uses diff --git a/docs/conf.py b/docs/site/conf.py similarity index 97% rename from docs/conf.py rename to docs/site/conf.py index 3e050886..f589d9b6 100644 --- a/docs/conf.py +++ b/docs/site/conf.py @@ -32,7 +32,6 @@ nb_merge_streams = True # Merge multiple outputs from the same cell into one box bibtex_bibfiles = [ - "_static/bib/gauxc.bib", "_static/bib/data.bib", ] @@ -43,7 +42,7 @@ html_theme_options = { "repository_url": "https://github.com/microsoft/skala", "repository_branch": "main", - "path_to_docs": "docs", + "path_to_docs": "docs/site", "use_repository_button": True, } master_doc = "index" diff --git a/docs/ftorch.rst b/docs/site/ftorch.rst similarity index 87% rename from docs/ftorch.rst rename to docs/site/ftorch.rst index 33202627..0819b9f5 100644 --- a/docs/ftorch.rst +++ b/docs/site/ftorch.rst @@ -21,7 +21,7 @@ Configure, build, and install the example with: .. code-block:: bash pixi run -e ftorch bash -c \ - 'cmake -B build_example -S examples/fortran/ftorch_integration -G Ninja \ + 'cmake -B build_example -S model/examples/fortran/ftorch_integration -G Ninja \ -DCMAKE_INSTALL_PREFIX="$CONDA_PREFIX"' pixi run -e ftorch cmake --build build_example pixi run -e ftorch cmake --install build_example @@ -55,19 +55,19 @@ We will use the following directory structure and files: For the main ``CMakeLists.txt`` file, we will set up the project and include the necessary CMake modules for Skala and FTorch: -.. literalinclude:: ../examples/fortran/ftorch_integration/CMakeLists.txt +.. literalinclude:: ../../model/examples/fortran/ftorch_integration/CMakeLists.txt :language: cmake :caption: CMakeLists.txt To ensure that we have the correct versions of our dependencies, we will include a CMake module that specifies the versions of Skala and FTorch: -.. literalinclude:: ../examples/fortran/ftorch_integration/cmake/skala-dep-versions.cmake +.. literalinclude:: ../../model/examples/fortran/ftorch_integration/cmake/skala-dep-versions.cmake :language: cmake :caption: cmake/skala-dep-versions.cmake Next, we will include the CMake modules for Skala and FTorch, which will handle finding the libraries and setting up the necessary include directories and link targets: -.. literalinclude:: ../examples/fortran/ftorch_integration/cmake/skala-ftorch.cmake +.. literalinclude:: ../../model/examples/fortran/ftorch_integration/cmake/skala-ftorch.cmake :language: cmake :caption: cmake/skala-ftorch.cmake @@ -83,11 +83,11 @@ However, we will not go into the details of these files here, as they are primar The files ``skala_ftorch.cxx`` and ``skala_ftorch.f90`` contain the C++ and Fortran code, respectively, that define the bindings between Skala and FTorch. These files include functions for loading Skala models, preparing input features, and computing exchange-correlation energies and potentials. - .. literalinclude:: ../examples/fortran/ftorch_integration/src/skala_ftorch.cxx + .. literalinclude:: ../../model/examples/fortran/ftorch_integration/src/skala_ftorch.cxx :language: c++ :caption: src/skala_ftorch.cxx - .. literalinclude:: ../examples/fortran/ftorch_integration/src/skala_ftorch.f90 + .. literalinclude:: ../../model/examples/fortran/ftorch_integration/src/skala_ftorch.f90 :language: fortran :caption: src/skala_ftorch.f90 @@ -98,35 +98,35 @@ Fortran application Finally, we have the Fortran application itself, which demonstrates how to use the Skala bindings to compute exchange-correlation energies and potentials. We start the main program with the necessary module imports and variable declarations: -.. literalinclude:: ../examples/fortran/ftorch_integration/app/main.f90 +.. literalinclude:: ../../model/examples/fortran/ftorch_integration/app/main.f90 :language: fortran :caption: app/main.f90 :lines: 1-18 First, we obtain the command line arguments for the model path and feature directory, and check that they are provided: -.. literalinclude:: ../examples/fortran/ftorch_integration/app/main.f90 +.. literalinclude:: ../../model/examples/fortran/ftorch_integration/app/main.f90 :language: fortran :caption: app/main.f90 :lines: 20-30 We define a small contained helper procedure to read the command line arguments: -.. literalinclude:: ../examples/fortran/ftorch_integration/app/main.f90 +.. literalinclude:: ../../model/examples/fortran/ftorch_integration/app/main.f90 :language: fortran :caption: app/main.f90 :lines: 227-248 The main types provided by the Skala bindings are the ``skala_model`` type, which extends the ``torch_model`` provided by FTorch and has a custom ``skala_model_load`` procedure for loading the Skala model and its meta data. -.. literalinclude:: ../examples/fortran/ftorch_integration/app/main.f90 +.. literalinclude:: ../../model/examples/fortran/ftorch_integration/app/main.f90 :language: fortran :caption: app/main.f90 :lines: 32-34 The input to the Skala model is passed via a dictionary of tensors, which we prepare by loading the necessary features from disk and converting them to the appropriate format. -.. literalinclude:: ../examples/fortran/ftorch_integration/app/main.f90 +.. literalinclude:: ../../model/examples/fortran/ftorch_integration/app/main.f90 :language: fortran :caption: app/main.f90 :lines: 36-70 @@ -135,7 +135,7 @@ The input to the Skala model is passed via a dictionary of tensors, which we pre To export the features from Python, you can use the provided ``prepare_inputs.py`` script. - .. literalinclude:: ../examples/cpp/cpp_integration/prepare_inputs.py + .. literalinclude:: ../../model/examples/cpp/cpp_integration/prepare_inputs.py :language: python :caption: prepare_inputs.py @@ -145,7 +145,7 @@ The input to the Skala model is passed via a dictionary of tensors, which we pre To place the features in the correct format for Skala, we add them to the input dictionary with the appropriate keys. -.. literalinclude:: ../examples/fortran/ftorch_integration/app/main.f90 +.. literalinclude:: ../../model/examples/fortran/ftorch_integration/app/main.f90 :language: fortran :caption: app/main.f90 :lines: 72-92 @@ -165,14 +165,14 @@ To place the features in the correct format for Skala, we add them to the input With this we can now compute the exchange-correlation energy and potential by calling the Skala model with the prepared inputs. -.. literalinclude:: ../examples/fortran/ftorch_integration/app/main.f90 +.. literalinclude:: ../../model/examples/fortran/ftorch_integration/app/main.f90 :language: fortran :caption: app/main.f90 :lines: 94-96 To get the exchange-correlation energy, we need to weight the exc values by the grid weights and sum over the grid points, which we can do using the provided tensor operations. -.. literalinclude:: ../examples/fortran/ftorch_integration/app/main.f90 +.. literalinclude:: ../../model/examples/fortran/ftorch_integration/app/main.f90 :language: fortran :caption: app/main.f90 :lines: 98-105 @@ -197,7 +197,8 @@ To evaluate Skala, we download the model checkpoint from HuggingFace using the ` .. note:: - To create the features directory run the ``prepare_inputs.py`` script from the ``examples/cpp/cpp_integration/`` directory. + To create the features directory run the ``prepare_inputs.py`` script from the + ``model/examples/cpp/cpp_integration/`` directory. This will generate the necessary input features for the H2 molecule with the def2-QZVP basis set. .. code-block:: bash @@ -239,21 +240,21 @@ The output for the H2 molecule with the def2-QZVP basis set should look like thi The ``get_exc_vxc`` procedure computes the exchange-correlation energy and potential, which we can then access from the returned dictionary. The potential terms are stored under the same keys as the input features and can be extracted as tensors. -.. literalinclude:: ../examples/fortran/ftorch_integration/app/main.f90 +.. literalinclude:: ../../model/examples/fortran/ftorch_integration/app/main.f90 :language: fortran :caption: app/main.f90 :lines: 107-119 We can use those tensors for further processing in our application, for example to compute the norm of the potential -.. literalinclude:: ../examples/fortran/ftorch_integration/app/main.f90 +.. literalinclude:: ../../model/examples/fortran/ftorch_integration/app/main.f90 :language: fortran :caption: app/main.f90 :lines: 121-155 Or by converting them to Fortran arrays and using the built-in array operations. -.. literalinclude:: ../examples/fortran/ftorch_integration/app/main.f90 +.. literalinclude:: ../../model/examples/fortran/ftorch_integration/app/main.f90 :language: fortran :caption: app/main.f90 :lines: 162-225 diff --git a/docs/index.rst b/docs/site/index.rst similarity index 96% rename from docs/index.rst rename to docs/site/index.rst index 2ea1c158..f84223e9 100644 --- a/docs/index.rst +++ b/docs/site/index.rst @@ -25,7 +25,7 @@ The model is trained on a large dataset of highly accurate total atomization ene SCF settings ASE Fortran (FTorch) - GauXC + GauXC Performance & scaling .. toctree:: diff --git a/docs/installation.rst b/docs/site/installation.rst similarity index 90% rename from docs/installation.rst rename to docs/site/installation.rst index b4b9c871..1bcd56e6 100644 --- a/docs/installation.rst +++ b/docs/site/installation.rst @@ -57,13 +57,12 @@ always use the selected environment: .. code-block:: bash pixi run -e default python your_script.py - pixi run -e default pytest -v --doctest-modules \ + 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 src/skala/ tests/ + --durations=50 --durations-min=1.0 skala/src/skala/ skala/tests/ pixi run -e default pre-commit run --all-files -The generic ``pytest`` task sets ``OMP_NUM_THREADS=4`` and forwards all -additional arguments. +Set ``OMP_NUM_THREADS=4`` when running tests locally to match CI. The locked compatibility environments are: @@ -109,8 +108,8 @@ For example, install and test the primary CUDA environment with: pixi install --locked -e gpu-cuda12-torch213 pixi run -e gpu-cuda12-torch213 python tools/verify_gpu.py - pixi run -e gpu-cuda12-torch213 \ - pytest -v -m 'gpu and not profiling and not model_benchmark' tests/ + OMP_NUM_THREADS=4 pixi run -e gpu-cuda12-torch213 \ + pytest -v -m 'gpu and not profiling and not model_benchmark' skala/tests/ The CUDA platforms are encoded in the lockfile, so container builds do not need a CUDA override when no GPU is attached. Runtime GPU checks still require a @@ -126,9 +125,9 @@ To test your installation, you can run the tests: .. code-block:: bash - pixi run -e default pytest -v --doctest-modules \ + 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 src/skala/ tests/ + --durations=50 --durations-min=1.0 skala/src/skala/ skala/tests/ Model checkpoints diff --git a/docs/model-card/index.rst b/docs/site/model-card/index.rst similarity index 100% rename from docs/model-card/index.rst rename to docs/site/model-card/index.rst diff --git a/docs/model-card/skala-1.0.rst b/docs/site/model-card/skala-1.0.rst similarity index 99% rename from docs/model-card/skala-1.0.rst rename to docs/site/model-card/skala-1.0.rst index d71b6357..b6c3593e 100644 --- a/docs/model-card/skala-1.0.rst +++ b/docs/site/model-card/skala-1.0.rst @@ -163,7 +163,7 @@ License .. dropdown:: MIT License - .. literalinclude:: ../../LICENSE.txt + .. literalinclude:: ../../../LICENSE.txt :lines: 3- Citation diff --git a/docs/model-card/skala-1.1.rst b/docs/site/model-card/skala-1.1.rst similarity index 99% rename from docs/model-card/skala-1.1.rst rename to docs/site/model-card/skala-1.1.rst index 814b27d1..6085f56a 100644 --- a/docs/model-card/skala-1.1.rst +++ b/docs/site/model-card/skala-1.1.rst @@ -196,7 +196,7 @@ License .. dropdown:: MIT License - .. literalinclude:: ../../LICENSE.txt + .. literalinclude:: ../../../LICENSE.txt :lines: 3- Citation diff --git a/docs/pyscf/gpu4pyscf.rst b/docs/site/pyscf/gpu4pyscf.rst similarity index 100% rename from docs/pyscf/gpu4pyscf.rst rename to docs/site/pyscf/gpu4pyscf.rst diff --git a/docs/pyscf/scf_settings.ipynb b/docs/site/pyscf/scf_settings.ipynb similarity index 99% rename from docs/pyscf/scf_settings.ipynb rename to docs/site/pyscf/scf_settings.ipynb index 04aa3ffc..bbfd8a2a 100644 --- a/docs/pyscf/scf_settings.ipynb +++ b/docs/site/pyscf/scf_settings.ipynb @@ -17,7 +17,6 @@ "outputs": [], "source": [ "from pyscf import gto\n", - "\n", "from skala.pyscf import SkalaKS" ] }, diff --git a/docs/pyscf/singlepoint.ipynb b/docs/site/pyscf/singlepoint.ipynb similarity index 99% rename from docs/pyscf/singlepoint.ipynb rename to docs/site/pyscf/singlepoint.ipynb index 8d9aaf3c..b0e40e17 100644 --- a/docs/pyscf/singlepoint.ipynb +++ b/docs/site/pyscf/singlepoint.ipynb @@ -19,7 +19,6 @@ "outputs": [], "source": [ "from pyscf import gto\n", - "\n", "from skala.pyscf import SkalaKS" ] }, diff --git a/third_party/gauxc/README.md b/gauxc/UPSTREAM.md similarity index 100% rename from third_party/gauxc/README.md rename to gauxc/UPSTREAM.md diff --git a/gauxc/conftest.py b/gauxc/conftest.py new file mode 100644 index 00000000..5ce23035 --- /dev/null +++ b/gauxc/conftest.py @@ -0,0 +1,19 @@ +# 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/docs/gauxc/api/basis.rst b/gauxc/docs/api/basis.rst similarity index 100% rename from docs/gauxc/api/basis.rst rename to gauxc/docs/api/basis.rst diff --git a/docs/gauxc/api/cmake.rst b/gauxc/docs/api/cmake.rst similarity index 95% rename from docs/gauxc/api/cmake.rst rename to gauxc/docs/api/cmake.rst index bd3c57c0..41b4284a 100644 --- a/docs/gauxc/api/cmake.rst +++ b/gauxc/docs/api/cmake.rst @@ -136,7 +136,8 @@ 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. -Pixi tasks set it to the selected environment, also exposed as ``${CONDA_PREFIX}``. +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 @@ -162,13 +163,13 @@ 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 +.. 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 +.. literalinclude:: ../../examples/cpp/gauxc_integration/cmake/skala-dep-versions.cmake :language: cmake :caption: cmake/skala-dep-versions.cmake :lines: 1-2 diff --git a/docs/gauxc/api/exceptions.rst b/gauxc/docs/api/exceptions.rst similarity index 100% rename from docs/gauxc/api/exceptions.rst rename to gauxc/docs/api/exceptions.rst diff --git a/docs/gauxc/api/index.rst b/gauxc/docs/api/index.rst similarity index 100% rename from docs/gauxc/api/index.rst rename to gauxc/docs/api/index.rst diff --git a/docs/gauxc/api/load_balancer.rst b/gauxc/docs/api/load_balancer.rst similarity index 100% rename from docs/gauxc/api/load_balancer.rst rename to gauxc/docs/api/load_balancer.rst diff --git a/docs/gauxc/api/macros.rst b/gauxc/docs/api/macros.rst similarity index 100% rename from docs/gauxc/api/macros.rst rename to gauxc/docs/api/macros.rst diff --git a/docs/gauxc/api/molecular_weights.rst b/gauxc/docs/api/molecular_weights.rst similarity index 100% rename from docs/gauxc/api/molecular_weights.rst rename to gauxc/docs/api/molecular_weights.rst diff --git a/docs/gauxc/api/molecule.rst b/gauxc/docs/api/molecule.rst similarity index 100% rename from docs/gauxc/api/molecule.rst rename to gauxc/docs/api/molecule.rst diff --git a/docs/gauxc/api/molgrid.rst b/gauxc/docs/api/molgrid.rst similarity index 100% rename from docs/gauxc/api/molgrid.rst rename to gauxc/docs/api/molgrid.rst diff --git a/docs/gauxc/api/runtime_environment.rst b/gauxc/docs/api/runtime_environment.rst similarity index 100% rename from docs/gauxc/api/runtime_environment.rst rename to gauxc/docs/api/runtime_environment.rst diff --git a/docs/gauxc/api/xc_integrator.rst b/gauxc/docs/api/xc_integrator.rst similarity index 100% rename from docs/gauxc/api/xc_integrator.rst rename to gauxc/docs/api/xc_integrator.rst diff --git a/docs/gauxc/c-library.rst b/gauxc/docs/c-library.rst similarity index 88% rename from docs/gauxc/c-library.rst rename to gauxc/docs/c-library.rst index 70198380..906260cb 100644 --- a/docs/gauxc/c-library.rst +++ b/gauxc/docs/c-library.rst @@ -31,13 +31,13 @@ The directory structure for the project will be 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 +.. 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 +.. literalinclude:: ../examples/c/gauxc_integration/cmake/skala-dep-versions.cmake :language: cmake :caption: cmake/skala-dep-versions.cmake @@ -47,19 +47,19 @@ For this we can rely in most cases to discover the GauXC config file, however we 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 +.. 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 +.. 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 +.. literalinclude:: ../examples/c/gauxc_integration/cmake/skala-hdf5.cmake :language: cmake :caption: cmake/skala-hdf5.cmake @@ -71,7 +71,7 @@ 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 +.. literalinclude:: ../examples/c/gauxc_integration/app/main.c :language: c :lines: 1-25 :caption: app/main.c (header includes) @@ -107,14 +107,14 @@ For each of the GauXC components we will be using, we include the respective hea 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 +.. 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 +.. literalinclude:: ../examples/c/gauxc_integration/app/main.c :language: c :lines: 408-410,412 :caption: app/main.c (MPI finalize) @@ -149,7 +149,7 @@ Our main parameters for the input will therefore be 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 +.. literalinclude:: ../examples/c/gauxc_integration/app/main.c :language: c :lines: 191-216 :caption: app/main.c (command line arguments) @@ -160,7 +160,7 @@ We define the command line arguments for the input HDF5 file, model type, and ot With this we can parse the command line and handle potential errors. -.. literalinclude:: ../../examples/c/gauxc_integration/app/main.c +.. literalinclude:: ../examples/c/gauxc_integration/app/main.c :language: c :lines: 218-238 :caption: app/main.c (parse command line arguments) @@ -168,21 +168,21 @@ With this we can parse the command line and handle potential errors. 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 +.. 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 +.. 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 +.. literalinclude:: ../examples/c/gauxc_integration/app/main.c :language: c :lines: 250-251 :caption: app/main.c (free Argtable3 structures) @@ -190,7 +190,7 @@ At this point we can already free the Argtable3 structures as we do not need the 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 +.. literalinclude:: ../examples/c/gauxc_integration/app/main.c :language: c :lines: 388-394 :caption: app/main.c (free input strings) @@ -247,7 +247,7 @@ With this we are able to change our configuration conveniently from the command 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 +.. literalinclude:: ../examples/c/gauxc_integration/app/main.c :language: c :lines: 253-267 :caption: app/main.c (GauXC status and runtime environment) @@ -262,28 +262,28 @@ The ``world_size`` and ``world_rank`` variables describe our MPI environment and 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 +.. 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 +.. 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 +.. 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 +.. literalinclude:: ../examples/c/gauxc_integration/app/main.c :language: c :caption: app/main.c (return exit code) :lines: 408-412 @@ -313,7 +313,7 @@ For reading the molecule we will use GauXC's built-in functionality to read from 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 +.. literalinclude:: ../examples/c/gauxc_integration/app/main.c :language: c :caption: app/main.c (read molecule) :lines: 279-285 @@ -352,7 +352,7 @@ For the basis set we will use the same approach as for the molecule and use GauX 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 +.. literalinclude:: ../examples/c/gauxc_integration/app/main.c :language: c :caption: app/main.c (read basisset) :lines: 287-293 @@ -364,7 +364,7 @@ To setup the integration grid, which is the part of the input to GauXC for compu 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 +.. literalinclude:: ../examples/c/gauxc_integration/app/main.c :language: c :caption: app/main.c (enumerator conversion functions) :lines: 39-85 @@ -372,7 +372,7 @@ In GauXC these are defined as enumerators and we add a number of helper function 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 +.. literalinclude:: ../examples/c/gauxc_integration/app/main.c :language: c :caption: app/main.c (grid setup) :lines: 295-310 @@ -384,7 +384,7 @@ To distribute the work of evaluating the exchange-correlation functional on the 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 +.. literalinclude:: ../examples/c/gauxc_integration/app/main.c :language: c :caption: app/main.c (execuation space enumerator) :lines: 27-37 @@ -392,7 +392,7 @@ Again we have a helper function to convert the input string to the respective en 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 +.. literalinclude:: ../examples/c/gauxc_integration/app/main.c :language: c :caption: app/main.c (load balancer setup) :lines: 312-337 @@ -400,7 +400,7 @@ We can now create the load balancer based on our input parameters. 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 +.. literalinclude:: ../examples/c/gauxc_integration/app/main.c :language: c :caption: app/main.c (integrator setup) :lines: 339-346 @@ -412,21 +412,21 @@ 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 +.. 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 +.. 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 +.. literalinclude:: ../examples/c/gauxc_integration/app/main.c :language: c :caption: app/main.c (free density matrices) :lines: 396-397 @@ -436,7 +436,7 @@ Exchange-correlation evaluation With all inputs provided we can now perform the exchange-correlation evaluation. -.. literalinclude:: ../../examples/c/gauxc_integration/app/main.c +.. literalinclude:: ../examples/c/gauxc_integration/app/main.c :language: c :caption: app/main.c (exchange-correlation evaluation) :lines: 361-367 @@ -444,21 +444,21 @@ With all inputs provided we can now perform the exchange-correlation evaluation. 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 +.. 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 +.. 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 +.. literalinclude:: ../examples/c/gauxc_integration/app/main.c :language: c :caption: app/main.c (free exchange-correlation potentials) :lines: 398-399 @@ -531,7 +531,7 @@ Full source code .. dropdown:: Full source code of the main driver - .. literalinclude:: ../../examples/c/gauxc_integration/app/main.c + .. literalinclude:: ../examples/c/gauxc_integration/app/main.c :language: c :caption: app/main.c diff --git a/gauxc/docs/conf.py b/gauxc/docs/conf.py new file mode 100644 index 00000000..dcfcf1d5 --- /dev/null +++ b/gauxc/docs/conf.py @@ -0,0 +1,29 @@ +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/docs/gauxc/cpp-library.rst b/gauxc/docs/cpp-library.rst similarity index 90% rename from docs/gauxc/cpp-library.rst rename to gauxc/docs/cpp-library.rst index 9fd9765b..6edcdbe1 100644 --- a/docs/gauxc/cpp-library.rst +++ b/gauxc/docs/cpp-library.rst @@ -38,13 +38,13 @@ The directory structure for the project will be 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 +.. 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 +.. literalinclude:: ../examples/cpp/gauxc_integration/cmake/skala-dep-versions.cmake :language: cmake :caption: cmake/skala-dep-versions.cmake @@ -54,7 +54,7 @@ For this we can rely in most cases to discover the GauXC config file, however we 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 +.. literalinclude:: ../examples/cpp/gauxc_integration/cmake/skala-gauxc.cmake :language: cmake :caption: cmake/skala-gauxc.cmake @@ -63,14 +63,14 @@ 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 +.. 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 +.. literalinclude:: ../examples/cpp/gauxc_integration/cmake/skala-cli11.cmake :language: cmake :caption: cmake/skala-cli11.cmake @@ -82,7 +82,7 @@ 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 +.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx :language: c++ :caption: app/main.cxx (headers) :lines: 1-20 @@ -107,7 +107,7 @@ In this tutorial we will be using 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 +.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx :language: c++ :caption: app/main.cxx (initialization) :lines: 118-133 @@ -122,14 +122,14 @@ 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 +.. 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 +.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx :language: c++ :caption: app/main.cxx (finalization) :lines: 244-248 @@ -182,14 +182,14 @@ For this we are defining a new function to handle different cases, like having a 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 +.. 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 +.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx :language: c++ :caption: app/main.cxx (runtime setup) :lines: 153-156 @@ -199,7 +199,7 @@ The ``world_size`` and ``world_rank`` variables describe our MPI environment and 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 +.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx :language: c++ :caption: app/main.cxx (inputs) :lines: 158-167 @@ -229,14 +229,14 @@ For reading the molecule we will use GauXC's built-in functionality to read from 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 +.. 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 +.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx :language: c++ :caption: app/main.cxx (molecule) :lines: 169-170 @@ -274,14 +274,14 @@ With GauXC's :cpp:func:`void GauXC::read_hdf5_record(BasisSet&,string,string)` f 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 +.. 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 +.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx :language: c++ :caption: app/main.cxx (basis) :lines: 172-173 @@ -293,7 +293,7 @@ To setup the integration grid, which is the part of the input to GauXC for compu 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 +.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx :language: c++ :caption: app/main.cxx (grid setting) :lines: 64-98 @@ -301,7 +301,7 @@ In GauXC these are defined as enumerators and we add a number of helper function 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 +.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx :language: c++ :caption: app/main.cxx (grid) :lines: 175-181 @@ -313,7 +313,7 @@ To distribute the work of evaluating the exchange-correlation functional on the 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 +.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx :language: c++ :caption: app/main.cxx (load balancer) :lines: 183-205 @@ -321,7 +321,7 @@ Note that the load balancer will provide access to the molecule, basis and grid 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 +.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx :language: c++ :caption: app/main.cxx (integrator) :lines: 207-214 @@ -332,14 +332,14 @@ 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 +.. 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 +.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx :language: c++ :caption: app/main.cxx (density matrix) :lines: 216-218 @@ -349,7 +349,7 @@ Exchange-correlation evaluation With all inputs provided we can now perform the exchange-correlation evaluation. -.. literalinclude:: ../../examples/cpp/gauxc_integration/app/main.cxx +.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx :language: c++ :caption: app/main.cxx (exchange-correlation) :lines: 225-228 @@ -358,14 +358,14 @@ With all inputs provided we can now perform the exchange-correlation evaluation. 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 + .. 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 +.. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx :language: c++ :caption: app/main.cxx (output) :lines: 236-243 @@ -438,7 +438,7 @@ Full source code .. dropdown:: Full source code of the main driver - .. literalinclude:: ../../examples/cpp/gauxc_integration/app/main.cxx + .. literalinclude:: ../examples/cpp/gauxc_integration/app/main.cxx :language: c++ :caption: app/main.cxx diff --git a/docs/gauxc/fortran-library.rst b/gauxc/docs/fortran-library.rst similarity index 87% rename from docs/gauxc/fortran-library.rst rename to gauxc/docs/fortran-library.rst index 043ebf65..6ff47ac9 100644 --- a/docs/gauxc/fortran-library.rst +++ b/gauxc/docs/fortran-library.rst @@ -57,13 +57,13 @@ The directory structure for the project will be First, we create the main ``CMakeLists.txt`` to define our project, include dependencies, and declare the executable. -.. literalinclude:: ../../examples/fortran/gauxc_integration/CMakeLists.txt +.. 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 +.. literalinclude:: ../examples/fortran/gauxc_integration/cmake/skala-dep-versions.cmake :language: cmake :caption: cmake/skala-dep-versions.cmake @@ -74,19 +74,19 @@ The options defined in the main CMake file are passed through to GauXC to ensure 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 +.. 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 +.. 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 +.. literalinclude:: ../examples/fortran/gauxc_integration/cmake/skala-hdf5.cmake :language: cmake :caption: cmake/skala-hdf5.cmake @@ -101,7 +101,7 @@ 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 +.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 :language: fortran :caption: app/main.F90 :lines: 1-28 @@ -137,14 +137,14 @@ Each GauXC component has a corresponding Fortran module: Next, we declare variables for the GauXC-specific types: -.. literalinclude:: ../../examples/fortran/gauxc_integration/app/main.F90 +.. 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 +.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 :language: fortran :caption: app/main.F90 :lines: 45-53 @@ -152,14 +152,14 @@ We also declare variables for input parameters and intermediate values: 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 +.. 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 +.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 :language: fortran :caption: app/main.F90 :lines: 262-264 @@ -191,7 +191,7 @@ We use the ``command_line_interface`` type from the FLAP library to define the C 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 +.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 :language: fortran :caption: app/main.F90 :lines: 59-64 @@ -200,7 +200,7 @@ 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 +.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 :language: fortran :caption: app/main.F90 :lines: 66-92,132-140 @@ -214,7 +214,7 @@ After defining the CLI, we parse it within the ``input`` block and retrieve the 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 +.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 :language: fortran :caption: app/main.F90 :lines: 94-131 @@ -284,14 +284,14 @@ 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 +.. 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 +.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 :language: fortran :caption: app/main.F90 :lines: 245-250 @@ -299,7 +299,7 @@ At the end of the block, we check the status and clean up the runtime environmen 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 +.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 :language: fortran :caption: app/main.F90 :lines: 159-168 @@ -333,14 +333,14 @@ Add this immediately after the runtime configuration printout in the ``main`` bl 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 +.. 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 +.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 :language: fortran :caption: app/main.F90 (free molecule) :lines: 252 @@ -378,14 +378,14 @@ Place this directly after the molecule-loading code in the ``main`` block. 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 +.. 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 +.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 :language: fortran :caption: app/main.F90 (free basisset) :lines: 253 @@ -402,7 +402,7 @@ Three parameters control grid construction: GauXC uses enumerators for these settings. We define helper functions to convert CLI strings: -.. literalinclude:: ../../examples/fortran/gauxc_integration/app/main.F90 +.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 :language: fortran :caption: app/main.F90 (enumerator conversion functions) :lines: 266,279-322 @@ -413,14 +413,14 @@ 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 +.. 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 +.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 :language: fortran :caption: app/main.F90 (free grid) :lines: 254 @@ -431,7 +431,7 @@ 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 +.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 :language: fortran :caption: app/main.F90 (execution space enumerator) :lines: 266-277 @@ -441,7 +441,7 @@ 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 +.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 :language: fortran :caption: app/main.F90 (load balancer setup) :lines: 191-207 @@ -449,7 +449,7 @@ Add this in the ``main`` block right after the grid has been constructed. 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 +.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 :language: fortran :force: :caption: app/main.F90 (integrator setup) @@ -457,7 +457,7 @@ The functional and load balancer are passed directly to the integrator construct We free the integrator and associated objects at program end: -.. literalinclude:: ../../examples/fortran/gauxc_integration/app/main.F90 +.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 :language: fortran :caption: app/main.F90 (free integrator) :lines: 255-260 @@ -471,14 +471,14 @@ This subroutine opens the HDF5 file, reads a 2D dataset into an allocatable arra 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 +.. 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 +.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 :language: fortran :caption: app/main.F90 (read density matrix) :lines: 214-218 @@ -488,7 +488,7 @@ Exchange-correlation evaluation With all inputs ready, we perform the XC evaluation: -.. literalinclude:: ../../examples/fortran/gauxc_integration/app/main.F90 +.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 :language: fortran :caption: app/main.F90 (exchange-correlation evaluation) :lines: 225-229 @@ -497,21 +497,21 @@ With all inputs ready, we perform the XC evaluation: To measure evaluation time, define a helper function: - .. literalinclude:: ../../examples/fortran/gauxc_integration/app/main.F90 + .. 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 + .. 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 +.. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 :language: fortran :caption: app/main.F90 (exchange-correlation output) :lines: 237-243 @@ -585,7 +585,7 @@ Full source code .. dropdown:: Full source code of the main driver - .. literalinclude:: ../../examples/fortran/gauxc_integration/app/main.F90 + .. literalinclude:: ../examples/fortran/gauxc_integration/app/main.F90 :language: fortran :force: :caption: app/main.F90 diff --git a/docs/_static/bib/gauxc.bib b/gauxc/docs/gauxc.bib similarity index 100% rename from docs/_static/bib/gauxc.bib rename to gauxc/docs/gauxc.bib diff --git a/docs/gauxc/index.rst b/gauxc/docs/index.rst similarity index 100% rename from docs/gauxc/index.rst rename to gauxc/docs/index.rst diff --git a/docs/gauxc/installation.rst b/gauxc/docs/installation.rst similarity index 100% rename from docs/gauxc/installation.rst rename to gauxc/docs/installation.rst diff --git a/docs/gauxc/scripts/export-h5.py b/gauxc/docs/scripts/export-h5.py similarity index 85% rename from docs/gauxc/scripts/export-h5.py rename to gauxc/docs/scripts/export-h5.py index 73d8c5af..75a00433 100644 --- a/docs/gauxc/scripts/export-h5.py +++ b/gauxc/docs/scripts/export-h5.py @@ -1,7 +1,6 @@ from pyscf import gto - -from skala.gauxc.export import write_gauxc_h5_from_pyscf from skala.pyscf import SkalaRKS +from skala_gauxc import write_gauxc_h5_from_pyscf mol = gto.M(atom="He 0 0 0", basis="def2-svp", unit="Bohr", spin=0) ks = SkalaRKS(mol, xc="pbe") diff --git a/docs/gauxc/standalone.rst b/gauxc/docs/standalone.rst similarity index 100% rename from docs/gauxc/standalone.rst rename to gauxc/docs/standalone.rst diff --git a/examples/c/gauxc_integration/.gitignore b/gauxc/examples/c/gauxc_integration/.gitignore similarity index 100% rename from examples/c/gauxc_integration/.gitignore rename to gauxc/examples/c/gauxc_integration/.gitignore diff --git a/examples/c/gauxc_integration/CMakeLists.txt b/gauxc/examples/c/gauxc_integration/CMakeLists.txt similarity index 100% rename from examples/c/gauxc_integration/CMakeLists.txt rename to gauxc/examples/c/gauxc_integration/CMakeLists.txt diff --git a/examples/c/gauxc_integration/app/main.c b/gauxc/examples/c/gauxc_integration/app/main.c similarity index 100% rename from examples/c/gauxc_integration/app/main.c rename to gauxc/examples/c/gauxc_integration/app/main.c diff --git a/examples/c/gauxc_integration/cmake/skala-argtable3.cmake b/gauxc/examples/c/gauxc_integration/cmake/skala-argtable3.cmake similarity index 100% rename from examples/c/gauxc_integration/cmake/skala-argtable3.cmake rename to gauxc/examples/c/gauxc_integration/cmake/skala-argtable3.cmake diff --git a/examples/c/gauxc_integration/cmake/skala-dep-versions.cmake b/gauxc/examples/c/gauxc_integration/cmake/skala-dep-versions.cmake similarity index 100% rename from examples/c/gauxc_integration/cmake/skala-dep-versions.cmake rename to gauxc/examples/c/gauxc_integration/cmake/skala-dep-versions.cmake diff --git a/examples/c/gauxc_integration/cmake/skala-gauxc.cmake b/gauxc/examples/c/gauxc_integration/cmake/skala-gauxc.cmake similarity index 100% rename from examples/c/gauxc_integration/cmake/skala-gauxc.cmake rename to gauxc/examples/c/gauxc_integration/cmake/skala-gauxc.cmake diff --git a/examples/c/gauxc_integration/cmake/skala-hdf5.cmake b/gauxc/examples/c/gauxc_integration/cmake/skala-hdf5.cmake similarity index 100% rename from examples/c/gauxc_integration/cmake/skala-hdf5.cmake rename to gauxc/examples/c/gauxc_integration/cmake/skala-hdf5.cmake diff --git a/examples/cpp/gauxc_integration/.gitignore b/gauxc/examples/cpp/gauxc_integration/.gitignore similarity index 100% rename from examples/cpp/gauxc_integration/.gitignore rename to gauxc/examples/cpp/gauxc_integration/.gitignore diff --git a/examples/cpp/gauxc_integration/CMakeLists.txt b/gauxc/examples/cpp/gauxc_integration/CMakeLists.txt similarity index 100% rename from examples/cpp/gauxc_integration/CMakeLists.txt rename to gauxc/examples/cpp/gauxc_integration/CMakeLists.txt diff --git a/examples/cpp/gauxc_integration/app/main.cxx b/gauxc/examples/cpp/gauxc_integration/app/main.cxx similarity index 100% rename from examples/cpp/gauxc_integration/app/main.cxx rename to gauxc/examples/cpp/gauxc_integration/app/main.cxx diff --git a/examples/cpp/gauxc_integration/cmake/skala-cli11.cmake b/gauxc/examples/cpp/gauxc_integration/cmake/skala-cli11.cmake similarity index 100% rename from examples/cpp/gauxc_integration/cmake/skala-cli11.cmake rename to gauxc/examples/cpp/gauxc_integration/cmake/skala-cli11.cmake diff --git a/examples/cpp/gauxc_integration/cmake/skala-dep-versions.cmake b/gauxc/examples/cpp/gauxc_integration/cmake/skala-dep-versions.cmake similarity index 100% rename from examples/cpp/gauxc_integration/cmake/skala-dep-versions.cmake rename to gauxc/examples/cpp/gauxc_integration/cmake/skala-dep-versions.cmake diff --git a/examples/cpp/gauxc_integration/cmake/skala-eigen3.cmake b/gauxc/examples/cpp/gauxc_integration/cmake/skala-eigen3.cmake similarity index 100% rename from examples/cpp/gauxc_integration/cmake/skala-eigen3.cmake rename to gauxc/examples/cpp/gauxc_integration/cmake/skala-eigen3.cmake diff --git a/examples/cpp/gauxc_integration/cmake/skala-gauxc.cmake b/gauxc/examples/cpp/gauxc_integration/cmake/skala-gauxc.cmake similarity index 100% rename from examples/cpp/gauxc_integration/cmake/skala-gauxc.cmake rename to gauxc/examples/cpp/gauxc_integration/cmake/skala-gauxc.cmake diff --git a/examples/cpp/gauxc_integration/cmake/skala-hdf5.cmake b/gauxc/examples/cpp/gauxc_integration/cmake/skala-hdf5.cmake similarity index 100% rename from examples/cpp/gauxc_integration/cmake/skala-hdf5.cmake rename to gauxc/examples/cpp/gauxc_integration/cmake/skala-hdf5.cmake diff --git a/examples/cpp/gauxc_integration/cmake/skala-sdftd3.cmake b/gauxc/examples/cpp/gauxc_integration/cmake/skala-sdftd3.cmake similarity index 100% rename from examples/cpp/gauxc_integration/cmake/skala-sdftd3.cmake rename to gauxc/examples/cpp/gauxc_integration/cmake/skala-sdftd3.cmake diff --git a/examples/fortran/gauxc_integration/.gitignore b/gauxc/examples/fortran/gauxc_integration/.gitignore similarity index 100% rename from examples/fortran/gauxc_integration/.gitignore rename to gauxc/examples/fortran/gauxc_integration/.gitignore diff --git a/examples/fortran/gauxc_integration/CMakeLists.txt b/gauxc/examples/fortran/gauxc_integration/CMakeLists.txt similarity index 100% rename from examples/fortran/gauxc_integration/CMakeLists.txt rename to gauxc/examples/fortran/gauxc_integration/CMakeLists.txt diff --git a/examples/fortran/gauxc_integration/app/main.F90 b/gauxc/examples/fortran/gauxc_integration/app/main.F90 similarity index 100% rename from examples/fortran/gauxc_integration/app/main.F90 rename to gauxc/examples/fortran/gauxc_integration/app/main.F90 diff --git a/examples/fortran/gauxc_integration/cmake/skala-dep-versions.cmake b/gauxc/examples/fortran/gauxc_integration/cmake/skala-dep-versions.cmake similarity index 100% rename from examples/fortran/gauxc_integration/cmake/skala-dep-versions.cmake rename to gauxc/examples/fortran/gauxc_integration/cmake/skala-dep-versions.cmake diff --git a/examples/fortran/gauxc_integration/cmake/skala-flap.cmake b/gauxc/examples/fortran/gauxc_integration/cmake/skala-flap.cmake similarity index 100% rename from examples/fortran/gauxc_integration/cmake/skala-flap.cmake rename to gauxc/examples/fortran/gauxc_integration/cmake/skala-flap.cmake diff --git a/examples/fortran/gauxc_integration/cmake/skala-gauxc.cmake b/gauxc/examples/fortran/gauxc_integration/cmake/skala-gauxc.cmake similarity index 100% rename from examples/fortran/gauxc_integration/cmake/skala-gauxc.cmake rename to gauxc/examples/fortran/gauxc_integration/cmake/skala-gauxc.cmake diff --git a/examples/fortran/gauxc_integration/cmake/skala-hdf5.cmake b/gauxc/examples/fortran/gauxc_integration/cmake/skala-hdf5.cmake similarity index 100% rename from examples/fortran/gauxc_integration/cmake/skala-hdf5.cmake rename to gauxc/examples/fortran/gauxc_integration/cmake/skala-hdf5.cmake diff --git a/gauxc/src/skala_gauxc/__init__.py b/gauxc/src/skala_gauxc/__init__.py new file mode 100644 index 00000000..7a475364 --- /dev/null +++ b/gauxc/src/skala_gauxc/__init__.py @@ -0,0 +1,5 @@ +"""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/src/skala/gauxc/export.py b/gauxc/src/skala_gauxc/export.py similarity index 91% rename from src/skala/gauxc/export.py rename to gauxc/src/skala_gauxc/export.py index cce923ad..261fc8c9 100644 --- a/src/skala/gauxc/export.py +++ b/gauxc/src/skala_gauxc/export.py @@ -1,3 +1,5 @@ +from typing import Any + import h5py import numpy as np from pyscf import gto @@ -128,14 +130,17 @@ def norm( alpha = np.asarray(alpha) two_alpha = 2 * alpha two_alpha_to_am32 = two_alpha ** (l + 1) * np.sqrt(two_alpha) - normalization_factor = np.sqrt( + 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 = np.asarray(coeff) * normalization_factor - normalization_factor = 1.0 / np.sqrt(np.einsum("i,j,ij->", coeff, coeff, aa)) - return (coeff * normalization_factor).tolist() + 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( diff --git a/tests/test_gauxc_export.py b/gauxc/tests/test_gauxc_export.py similarity index 85% rename from tests/test_gauxc_export.py rename to gauxc/tests/test_gauxc_export.py index e19e53d7..f4cbe6c3 100644 --- a/tests/test_gauxc_export.py +++ b/gauxc/tests/test_gauxc_export.py @@ -1,16 +1,16 @@ from tempfile import NamedTemporaryFile +from typing import cast import h5py import numpy as np import pytest from pyscf import dft, gto - -from skala.gauxc.export import write_gauxc_h5_from_pyscf +from skala_gauxc import write_gauxc_h5_from_pyscf @pytest.fixture(params=["He", "Li"]) def mol_name(request: pytest.FixtureRequest) -> str: - return request.param + return cast(str, request.param) @pytest.fixture @@ -20,7 +20,7 @@ def basis() -> str: @pytest.fixture(params=["cart", "sph"]) def cartesian(request: pytest.FixtureRequest) -> bool: - return request.param == "cart" + return cast(str, request.param) == "cart" @pytest.fixture @@ -47,12 +47,16 @@ def ks(mol: gto.Mole) -> dft.rks.RKS: @pytest.fixture def dm(ks: dft.rks.RKS) -> np.ndarray: - return ks.make_rdm1() + result = ks.make_rdm1() + assert isinstance(result, np.ndarray) + return result @pytest.fixture def exc(ks: dft.rks.RKS) -> float: - return ks.scf_summary["exc"] + result = ks.scf_summary["exc"] + assert isinstance(result, float) + return result @pytest.fixture @@ -61,6 +65,7 @@ def vxc(ks: dft.rks.RKS, dm: np.ndarray) -> np.ndarray: _, _, 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 diff --git a/model/conftest.py b/model/conftest.py new file mode 100644 index 00000000..7b930632 --- /dev/null +++ b/model/conftest.py @@ -0,0 +1,15 @@ +# SPDX-License-Identifier: MIT + +"""Fixtures for tests of the trainable model definition.""" + +import functools +from collections.abc import Callable + +import pytest +from skala.functional import ExcFunctionalBase, load_functional + + +@pytest.fixture(scope="session") +def load_functional_cached() -> Callable[..., ExcFunctionalBase | str]: + """Load each functional from the Hub at most once per test session.""" + return functools.lru_cache(maxsize=None)(load_functional) diff --git a/examples/cpp/cpp_integration/.gitignore b/model/examples/cpp/cpp_integration/.gitignore similarity index 100% rename from examples/cpp/cpp_integration/.gitignore rename to model/examples/cpp/cpp_integration/.gitignore diff --git a/examples/cpp/cpp_integration/CMakeLists.txt b/model/examples/cpp/cpp_integration/CMakeLists.txt similarity index 100% rename from examples/cpp/cpp_integration/CMakeLists.txt rename to model/examples/cpp/cpp_integration/CMakeLists.txt diff --git a/examples/cpp/cpp_integration/README.md b/model/examples/cpp/cpp_integration/README.md similarity index 93% rename from examples/cpp/cpp_integration/README.md rename to model/examples/cpp/cpp_integration/README.md index a3116ee4..ec00d8f5 100644 --- a/examples/cpp/cpp_integration/README.md +++ b/model/examples/cpp/cpp_integration/README.md @@ -15,7 +15,7 @@ pixi install --locked -e cpp-integration Configure and build the example with CMake and Ninja in the Pixi environment: ```bash -pixi run -e cpp-integration cmake -B build_example -S examples/cpp/cpp_integration -G Ninja +pixi run -e cpp-integration cmake -B build_example -S model/examples/cpp/cpp_integration -G Ninja pixi run -e cpp-integration cmake --build build_example ``` diff --git a/examples/cpp/cpp_integration/download_model.py b/model/examples/cpp/cpp_integration/download_model.py similarity index 99% rename from examples/cpp/cpp_integration/download_model.py rename to model/examples/cpp/cpp_integration/download_model.py index 5665ab4b..0ea78d86 100755 --- a/examples/cpp/cpp_integration/download_model.py +++ b/model/examples/cpp/cpp_integration/download_model.py @@ -10,7 +10,6 @@ import shutil from huggingface_hub import hf_hub_download - from skala.functional._hashes import KNOWN_HASHES from skala.functional.load import TracedFunctional diff --git a/examples/cpp/cpp_integration/main.cpp b/model/examples/cpp/cpp_integration/main.cpp similarity index 100% rename from examples/cpp/cpp_integration/main.cpp rename to model/examples/cpp/cpp_integration/main.cpp diff --git a/examples/cpp/cpp_integration/prepare_inputs.py b/model/examples/cpp/cpp_integration/prepare_inputs.py similarity index 96% rename from examples/cpp/cpp_integration/prepare_inputs.py rename to model/examples/cpp/cpp_integration/prepare_inputs.py index d3c103fe..5508cd7a 100755 --- a/examples/cpp/cpp_integration/prepare_inputs.py +++ b/model/examples/cpp/cpp_integration/prepare_inputs.py @@ -6,10 +6,9 @@ import torch from pyscf import dft, gto from pyscf.dft import gen_grid - -from skala.functional.model import SkalaFunctional from skala.functional.traditional import LDA from skala.pyscf.features import generate_features +from skala_model import SkalaFunctional def main() -> None: diff --git a/examples/fortran/ftorch_integration/.gitignore b/model/examples/fortran/ftorch_integration/.gitignore similarity index 100% rename from examples/fortran/ftorch_integration/.gitignore rename to model/examples/fortran/ftorch_integration/.gitignore diff --git a/examples/fortran/ftorch_integration/CMakeLists.txt b/model/examples/fortran/ftorch_integration/CMakeLists.txt similarity index 100% rename from examples/fortran/ftorch_integration/CMakeLists.txt rename to model/examples/fortran/ftorch_integration/CMakeLists.txt diff --git a/examples/fortran/ftorch_integration/app/main.f90 b/model/examples/fortran/ftorch_integration/app/main.f90 similarity index 100% rename from examples/fortran/ftorch_integration/app/main.f90 rename to model/examples/fortran/ftorch_integration/app/main.f90 diff --git a/examples/fortran/ftorch_integration/cmake/skala-dep-versions.cmake b/model/examples/fortran/ftorch_integration/cmake/skala-dep-versions.cmake similarity index 100% rename from examples/fortran/ftorch_integration/cmake/skala-dep-versions.cmake rename to model/examples/fortran/ftorch_integration/cmake/skala-dep-versions.cmake diff --git a/examples/fortran/ftorch_integration/cmake/skala-ftorch.cmake b/model/examples/fortran/ftorch_integration/cmake/skala-ftorch.cmake similarity index 100% rename from examples/fortran/ftorch_integration/cmake/skala-ftorch.cmake rename to model/examples/fortran/ftorch_integration/cmake/skala-ftorch.cmake diff --git a/examples/fortran/ftorch_integration/src/skala_ftorch.cxx b/model/examples/fortran/ftorch_integration/src/skala_ftorch.cxx similarity index 100% rename from examples/fortran/ftorch_integration/src/skala_ftorch.cxx rename to model/examples/fortran/ftorch_integration/src/skala_ftorch.cxx diff --git a/examples/fortran/ftorch_integration/src/skala_ftorch.f90 b/model/examples/fortran/ftorch_integration/src/skala_ftorch.f90 similarity index 100% rename from examples/fortran/ftorch_integration/src/skala_ftorch.f90 rename to model/examples/fortran/ftorch_integration/src/skala_ftorch.f90 diff --git a/model/src/skala_model/__init__.py b/model/src/skala_model/__init__.py new file mode 100644 index 00000000..ef6f2d02 --- /dev/null +++ b/model/src/skala_model/__init__.py @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: MIT + +"""Trainable Skala model definition.""" + +from skala_model.model import SkalaFunctional + +__all__ = ["SkalaFunctional"] diff --git a/src/skala/functional/layers.py b/model/src/skala_model/layers.py similarity index 100% rename from src/skala/functional/layers.py rename to model/src/skala_model/layers.py diff --git a/src/skala/functional/model.py b/model/src/skala_model/model.py similarity index 96% rename from src/skala/functional/model.py rename to model/src/skala_model/model.py index d3c45092..0d7fc238 100644 --- a/src/skala/functional/model.py +++ b/model/src/skala_model/model.py @@ -9,19 +9,19 @@ """ import math -from typing import Any, ClassVar, cast +from typing import Any, ClassVar import torch from e3nn import o3 from opt_einsum_fx import jitable, optimize_einsums_full -from torch import fx, nn - from skala.features import Feature, FeatureMap from skala.functional.base import ExcFunctionalBase, enhancement_density_inner_product -from skala.functional.layers import ScaledSigmoid -from skala.functional.utils.irreps import Irreps -from skala.functional.utils.pad_ragged import pad_ragged, unpad_ragged -from skala.functional.utils.symmetric_contraction import SymmetricContraction +from torch import fx, nn + +from skala_model.layers import ScaledSigmoid +from skala_model.utils.irreps import Irreps +from skala_model.utils.pad_ragged import pad_ragged, unpad_ragged +from skala_model.utils.symmetric_contraction import SymmetricContraction ANGSTROM_TO_BOHR = 1.88973 @@ -212,7 +212,7 @@ def load_state_dict( # type: ignore # needs mutable dict state_dict: dict[str, Any], strict: bool = True, assign: bool = False, - ) -> dict[str, torch.Tensor]: + ) -> torch.nn.modules.module._IncompatibleKeys: """Load state_dict with backward compatibility for older checkpoints.""" if strict: current_sd = self.state_dict() @@ -230,7 +230,9 @@ def load_state_dict( # type: ignore # needs mutable dict key.startswith(p) for p in self._RECONSTRUCTABLE_BUFFER_PREFIXES ): del state_dict[key] - return super().load_state_dict(state_dict, strict=strict, assign=assign) + result = super().load_state_dict(state_dict, strict=strict, assign=assign) + assert isinstance(result, torch.nn.modules.module._IncompatibleKeys) + return result def _init_weights(self) -> None: for layer in self.input_model: @@ -245,7 +247,9 @@ def _init_weights(self) -> None: @property def dtype(self) -> torch.dtype: - return cast(nn.Linear, self.input_model[0]).weight.dtype + input_layer = self.input_model[0] + assert isinstance(input_layer, nn.Linear) + return input_layer.weight.dtype def pack_features(self, mol_feats: FeatureMap) -> FeatureMap: """Pack flat features into dense (grid_per_atom, atoms, …) layout. @@ -502,7 +506,9 @@ def forward( # Non-linear transform with skip connection features = torch.cat([features, h_fine * exp_m1_rho_total], dim=-1) - return self.concat_layer(features) + result = self.concat_layer(features) + assert isinstance(result, torch.Tensor) + return result @property def dtype(self) -> torch.dtype: @@ -610,7 +616,7 @@ def _load_from_state_dict( missing_keys, unexpected_keys, error_msgs, - ) # type: ignore[no-untyped-call] + ) def _setup_batched_tp(self) -> None: """Detect batched mode and pre-compute gather indices. @@ -864,10 +870,17 @@ def num_elements(ins: tuple[int, int]) -> int: @property def weight_list(self) -> list[torch.Tensor]: - return [getattr(self, f"weight_{i_in}_{i_out}") for i_in, i_out in self.instr] + result = [] + for i_in, i_out in self.instr: + weight = getattr(self, f"weight_{i_in}_{i_out}") + assert isinstance(weight, torch.Tensor) + result.append(weight) + return result def forward(self, x: torch.Tensor) -> torch.Tensor: - return self._o3_linear(x, *self.weight_list) + result = self._o3_linear(x, *self.weight_list) + assert isinstance(result, torch.Tensor) + return result def o3_identity_init(linear: O3Linear, out_dim_multiplier: int = 1) -> None: @@ -932,6 +945,6 @@ def _o3_linear_codegen( concatenated = out[0] graph.output(concatenated.node, torch.Tensor) - graph.lint() # type: ignore[no-untyped-call] + graph.lint() return fx.GraphModule(torch.nn.Module(), graph) diff --git a/src/skala/functional/utils/__init__.py b/model/src/skala_model/utils/__init__.py similarity index 100% rename from src/skala/functional/utils/__init__.py rename to model/src/skala_model/utils/__init__.py diff --git a/src/skala/functional/utils/cg.py b/model/src/skala_model/utils/cg.py similarity index 100% rename from src/skala/functional/utils/cg.py rename to model/src/skala_model/utils/cg.py diff --git a/src/skala/functional/utils/irreps.py b/model/src/skala_model/utils/irreps.py similarity index 97% rename from src/skala/functional/utils/irreps.py rename to model/src/skala_model/utils/irreps.py index 22dca47f..c28cb3f3 100644 --- a/src/skala/functional/utils/irreps.py +++ b/model/src/skala_model/utils/irreps.py @@ -19,7 +19,7 @@ and their direct sums for use in equivariant neural network architectures. Example: - >>> from skala.functional.utils.irreps import Irrep, Irreps + >>> from skala_model.utils.irreps import Irrep, Irreps >>> Irrep("1o") 1o >>> Irreps("16x0e + 8x1o + 4x2e") @@ -84,7 +84,10 @@ def __eq__(self, other: object) -> bool: if isinstance(other, Irrep): return self._l == other._l and self._p == other._p if isinstance(other, tuple) and len(other) == 2: - return self._l == other[0] and self._p == other[1] + other_l, other_p = other + assert isinstance(other_l, int) + assert isinstance(other_p, int) + return self._l == other_l and self._p == other_p return False def __hash__(self) -> int: diff --git a/src/skala/functional/utils/pad_ragged.py b/model/src/skala_model/utils/pad_ragged.py similarity index 100% rename from src/skala/functional/utils/pad_ragged.py rename to model/src/skala_model/utils/pad_ragged.py diff --git a/src/skala/functional/utils/symmetric_contraction.py b/model/src/skala_model/utils/symmetric_contraction.py similarity index 97% rename from src/skala/functional/utils/symmetric_contraction.py rename to model/src/skala_model/utils/symmetric_contraction.py index 7dbf2cfd..1c6297e9 100644 --- a/src/skala/functional/utils/symmetric_contraction.py +++ b/model/src/skala_model/utils/symmetric_contraction.py @@ -8,7 +8,7 @@ import torch.fx from e3nn import o3 -from skala.functional.utils.cg import u_matrix_real +from skala_model.utils.cg import u_matrix_real ALPHABET = ["w", "x", "v", "n", "z", "r", "t", "y", "u", "o", "p", "s"] @@ -205,7 +205,9 @@ def forward( c_tensor = c_tensor + out out = contract_features(c_tensor, x) - return out.view(out.shape[0], -1) + result = out.view(out.shape[0], -1) + assert isinstance(result, torch.Tensor) + return result def pack(x: torch.Tensor, irreps: o3.Irreps) -> torch.Tensor: diff --git a/tests/test_model.py b/model/tests/test_model.py similarity index 99% rename from tests/test_model.py rename to model/tests/test_model.py index a785f430..d8f1f4b2 100644 --- a/tests/test_model.py +++ b/model/tests/test_model.py @@ -14,10 +14,9 @@ import pytest import torch - from skala.features import Feature, FeatureMap from skala.functional import ExcFunctionalBase -from skala.functional.model import ( +from skala_model.model import ( ANGSTROM_TO_BOHR, ExpRadialScaleModel, NonLocalModel, @@ -27,7 +26,7 @@ TensorProduct, _prepare_features_raw, ) -from skala.functional.utils.irreps import Irreps +from skala_model.utils.irreps import Irreps @pytest.fixture(autouse=True) diff --git a/tests/test_traced_model_comparison.py b/model/tests/test_traced_model_comparison.py similarity index 99% rename from tests/test_traced_model_comparison.py rename to model/tests/test_traced_model_comparison.py index 8dac81da..73d912ab 100644 --- a/tests/test_traced_model_comparison.py +++ b/model/tests/test_traced_model_comparison.py @@ -20,14 +20,13 @@ import pytest import torch from pytest_benchmark.fixture import BenchmarkFixture - from skala.features import Feature, FeatureMap from skala.functional import ( FunctionalArtifact, TracedFunctional, resolve_functional_artifact, ) -from skala.functional.model import SkalaFunctional +from skala_model import SkalaFunctional # Trace the first irregular layout and check the graph against every other # shape. The layouts range from small two-atom chunks to larger twelve-atom diff --git a/tests/test_utils.py b/model/tests/test_utils.py similarity index 95% rename from tests/test_utils.py rename to model/tests/test_utils.py index b846cd9f..66a65834 100644 --- a/tests/test_utils.py +++ b/model/tests/test_utils.py @@ -6,9 +6,8 @@ import pytest import torch - -from skala.functional.utils.irreps import Irrep, Irreps, MulIr -from skala.functional.utils.pad_ragged import pad_ragged, unpad_ragged +from skala_model.utils.irreps import Irrep, Irreps, MulIr +from skala_model.utils.pad_ragged import pad_ragged, unpad_ragged class TestPadRagged: @@ -160,8 +159,7 @@ def _isolated_rng(self) -> Iterator[None]: def test_output_shape(self) -> None: from e3nn import o3 as e3nn_o3 - - from skala.functional.utils.symmetric_contraction import SymmetricContraction + from skala_model.utils.symmetric_contraction import SymmetricContraction torch.manual_seed(42) irreps_in = e3nn_o3.Irreps("3x0e+3x1e") @@ -174,8 +172,7 @@ def test_output_shape(self) -> None: def test_output_deterministic(self) -> None: from e3nn import o3 as e3nn_o3 - - from skala.functional.utils.symmetric_contraction import SymmetricContraction + from skala_model.utils.symmetric_contraction import SymmetricContraction torch.manual_seed(42) irreps_in = e3nn_o3.Irreps("3x0e+3x1e") diff --git a/pixi.lock b/pixi.lock index 9835228e..f1edd318 100644 --- a/pixi.lock +++ b/pixi.lock @@ -95,15 +95,6 @@ environments: 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/brotli-1.2.0-h505cf86_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_3.conda @@ -127,8 +118,6 @@ environments: - 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/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 @@ -138,7 +127,6 @@ environments: - 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-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 @@ -209,7 +197,6 @@ environments: - 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 @@ -229,8 +216,6 @@ environments: - 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/click-8.4.2-pyhc90fa1f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_1.conda @@ -280,20 +265,12 @@ environments: - 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_source: skala[a2158a4d] @ . + - 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 p1: - 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/brotli-1.2.0-h505cf86_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-h9908984_3.conda @@ -317,8 +294,6 @@ environments: - 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/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 @@ -328,7 +303,6 @@ environments: - 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-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 @@ -399,7 +373,6 @@ environments: - 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 @@ -419,8 +392,6 @@ environments: - 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/click-8.4.2-pyhc90fa1f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_1.conda @@ -470,9 +441,10 @@ environments: - 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_source: skala[a2158a4d] @ . + - 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/ @@ -736,7 +708,7 @@ environments: - 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 - - conda_source: skala[a2158a4d] @ . + - 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 @@ -984,7 +956,7 @@ environments: - 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_source: skala[4f0049e0] @ . + - 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 @@ -1226,7 +1198,7 @@ environments: - 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 - - conda_source: skala[ba0d9f24] @ . + - 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 @@ -1280,8 +1252,6 @@ environments: - 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/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 @@ -1291,7 +1261,6 @@ environments: - 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/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 @@ -1416,8 +1385,6 @@ environments: - 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/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/charset-normalizer-3.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda @@ -1426,7 +1393,6 @@ environments: - 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/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/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.32.3-pyhd8ed1ab_0.conda @@ -1473,9 +1439,6 @@ environments: - 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/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/parso-0.8.7-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda @@ -1528,9 +1491,10 @@ environments: - 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 - - conda_source: skala[a2158a4d] @ . + - 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/ @@ -2923,8 +2887,6 @@ environments: - 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/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 @@ -2934,7 +2896,6 @@ environments: - 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/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 @@ -3064,8 +3025,6 @@ environments: - 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/click-8.4.2-pyhc90fa1f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda @@ -3129,13 +3088,14 @@ environments: - 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_source: skala[a2158a4d] @ . + - 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: @@ -3192,8 +3152,6 @@ environments: - 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/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 @@ -3203,7 +3161,6 @@ environments: - 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/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 @@ -3333,8 +3290,6 @@ environments: - 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/click-8.4.2-pyhc90fa1f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda @@ -3398,13 +3353,14 @@ environments: - 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_source: skala[a2158a4d] @ . + - 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: @@ -3461,8 +3417,6 @@ environments: - 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/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 @@ -3472,7 +3426,6 @@ environments: - 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/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 @@ -3602,8 +3555,6 @@ environments: - 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/click-8.4.2-pyhc90fa1f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda @@ -3667,13 +3618,14 @@ environments: - 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_source: skala[a2158a4d] @ . + - 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: @@ -3938,7 +3890,7 @@ environments: - 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 - - conda_source: skala[a2158a4d] @ . + - 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 @@ -3990,28 +3942,9 @@ environments: 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-py311h724c32c_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.15.4-py311hc6a3e95_1.conda @@ -4020,39 +3953,22 @@ environments: - 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/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-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/h5py-3.16.0-nompi_py311h89df61e_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-py311h724c32c_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/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 @@ -4062,33 +3978,21 @@ environments: - 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/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 @@ -4098,38 +4002,28 @@ environments: - 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-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/nlohmann_json-3.12.0-h54a6638_2.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/orc-2.3.1-h443056b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.5-py311h8032f78_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-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/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-py311h38be061_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-25.0.0-py311h66caee6_0_cpu.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/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.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/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-py311h49ec1c0_0.conda @@ -4141,21 +4035,17 @@ environments: - 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/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/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 @@ -4175,14 +4065,9 @@ environments: - 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 @@ -4208,8 +4093,9 @@ environments: - 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_source: skala[a2158a4d] @ . + - 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: @@ -4256,8 +4142,6 @@ environments: - 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 @@ -4267,7 +4151,6 @@ environments: - 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 @@ -4389,14 +4272,11 @@ environments: - 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/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/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 @@ -4423,9 +4303,6 @@ environments: - 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/platformdirs-4.11.3-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda @@ -4455,9 +4332,10 @@ environments: - 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_source: skala[a2158a4d] @ . + - 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 @@ -4495,8 +4373,6 @@ environments: - 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 @@ -4506,7 +4382,6 @@ environments: - 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 @@ -4616,14 +4491,11 @@ environments: - 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/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/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 @@ -4649,9 +4521,6 @@ environments: - 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/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 @@ -4677,22 +4546,20 @@ environments: - 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_source: skala[4f0049e0] @ . + - 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/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/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/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 @@ -4718,9 +4585,6 @@ environments: - 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/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 @@ -4785,8 +4649,6 @@ environments: - 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 @@ -4795,7 +4657,6 @@ environments: - 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 @@ -4895,8 +4756,9 @@ environments: - 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 - - conda_source: skala[ba0d9f24] @ . + - 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/ @@ -4942,8 +4804,6 @@ environments: - 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 @@ -4953,7 +4813,6 @@ environments: - 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 @@ -5075,14 +4934,11 @@ environments: - 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/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/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 @@ -5109,9 +4965,6 @@ environments: - 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/platformdirs-4.11.3-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda @@ -5141,9 +4994,10 @@ environments: - 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_source: skala[a2158a4d] @ . + - 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 @@ -5181,8 +5035,6 @@ environments: - 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 @@ -5192,7 +5044,6 @@ environments: - 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 @@ -5302,14 +5153,11 @@ environments: - 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/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/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 @@ -5335,9 +5183,6 @@ environments: - 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/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 @@ -5363,22 +5208,20 @@ environments: - 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_source: skala[4f0049e0] @ . + - 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/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/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/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 @@ -5404,9 +5247,6 @@ environments: - 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/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 @@ -5471,8 +5311,6 @@ environments: - 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 @@ -5481,7 +5319,6 @@ environments: - 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 @@ -5581,8 +5418,9 @@ environments: - 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 - - conda_source: skala[ba0d9f24] @ . + - 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/ @@ -5591,28 +5429,9 @@ environments: 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-py313hc8edb43_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.15.4-py313h55b89ea_1.conda @@ -5621,39 +5440,22 @@ environments: - 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/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-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/h5py-3.16.0-nompi_py313hf402d47_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-py313hc8edb43_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/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 @@ -5663,9 +5465,6 @@ environments: - 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 @@ -5673,23 +5472,14 @@ environments: - 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/libnghttp2-1.68.1-h74cf4be_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/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 @@ -5698,38 +5488,28 @@ environments: - 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-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/nlohmann_json-3.12.0-h54a6638_2.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/orc-2.3.1-h443056b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.5-py313hbfd7664_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-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/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-py313h78bf25f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-25.0.0-py313h98bfbea_0_cpu.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/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-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/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/xorg-libice-1.1.2-h280c20c_0.conda @@ -5740,21 +5520,17 @@ environments: - 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/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/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 @@ -5774,14 +5550,9 @@ environments: - 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 @@ -5807,9 +5578,10 @@ environments: - 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_source: skala[a2158a4d] @ . + - 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 @@ -7649,42 +7421,6 @@ packages: - libgcc >=14 size: 28158 timestamp: 1787166213180 -- conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py311h89df61e_104.conda - sha256: 5dda0a441c3a6df961c9c36092db84bfde17fb0d0f723ef8fdc3f7cdfac0c0fb - md5: df9a4867e159d6b873171a9d66dd2a23 - depends: - - __glibc >=2.17,<3.0.a0 - - cached-property - - hdf5 >=1.14.6,<1.14.7.0a0 - - libgcc >=15 - - numpy >=1.23,<3 - - python >=3.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/h5py?source=compressed-mapping - run_exports: {} - size: 1371667 - timestamp: 1787108752025 -- 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/h5py-3.16.0-nompi_py312hfaa9938_104.conda sha256: 64e1d13bc0ec29fa416aeefac77283eea349f3ed2acfcfc513f0cacd30fbcf6d md5: 9ca94eb30bd0938240f32b6e6398b862 @@ -7703,24 +7439,6 @@ packages: run_exports: {} size: 1353159 timestamp: 1787108753979 -- conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py313hf402d47_104.conda - sha256: 5226f928041e2389cedc6c66acc69400d59cc1b3bd8969f51d986b480fd3a468 - md5: 083166f29525f7755c99b992ca9e91e0 - 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.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/h5py?source=hash-mapping - run_exports: {} - size: 1347671 - timestamp: 1787108767322 - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_110.conda sha256: ac57ce3abbda2a82d6192bc36fbd7fe96e867d84c999ef81a3da034dfd01a995 md5: 9c6e11a83468e1d5decae516077a73fb @@ -10497,72 +10215,14 @@ packages: - 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-py311h8032f78_1.conda - sha256: a6023e417a9c4c517bba4e43a28a3c9b621677aaf59017e70c6a856cc22a4202 - md5: fb92751a76609c3e96ba31d1b18f6142 - 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.11.* *_cp311 - 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: 15238790 - timestamp: 1785276229113 + 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 @@ -10621,64 +10281,6 @@ packages: run_exports: {} size: 14936796 timestamp: 1785276227779 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.5-py313hbfd7664_1.conda - sha256: 3fc0e22d9c4338b2becb6a2cce230a57f94730dfb6d3be395089084411c458e3 - md5: a78866632a871f274cd2015bccdd2ca0 - depends: - - python - - numpy >=1.26.0 - - python-dateutil >=2.8.2 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - numpy >=1.23,<3 - - python_abi 3.13.* *_cp313 - 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: 15049335 - timestamp: 1785276231848 - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-h8b3dc9c_1.conda sha256: 9ebb10a4eb3be51ae67d85c679f5a7a50cb040ed25c783e6331a225ea09991d4 md5: 06f6113cf1ff4a54b65f87ead132a5f1 @@ -10843,23 +10445,6 @@ packages: run_exports: {} size: 9115 timestamp: 1786067714761 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-25.0.0-py311h38be061_0.conda - sha256: 8ddc6e100fa786a9da5905ceb7cf4c685117e482881f1d84a25598b7d94cc2f6 - md5: 0d88b3b64a5ce17e5fd9c972d95c6a5e - 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.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: {} - size: 26056 - timestamp: 1784258321643 - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-25.0.0-py312h7900ff3_0.conda sha256: 9b6c4aed5da2a3b8f649e1b73596e0867a5506bed9c3aa45dbaedfb674822191 md5: 6f1918b7565c3cc5ed047a97ea510e55 @@ -10877,45 +10462,6 @@ packages: run_exports: {} size: 26079 timestamp: 1784258397971 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-25.0.0-py313h78bf25f_0.conda - sha256: 283926f580a9efd06e438d19f402d37e189cababbc18b86920a66f6441d84b24 - md5: 9cda71e83d2aa135af38edb6b0293d95 - 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.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - license: Apache-2.0 - license_family: APACHE - purls: [] - run_exports: {} - size: 26039 - timestamp: 1784258353242 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-25.0.0-py311h66caee6_0_cpu.conda - sha256: 902247e1d1f74de9af4420f044c404a8acdbd98809688123d76926e94878db9a - md5: 239354664a203fc93d1eca5d19e91d94 - 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.11,<3.12.0a0 - - python_abi 3.11.* *_cp311 - 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: 5481877 - timestamp: 1784258310247 - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-25.0.0-py312h2054cf2_0_cpu.conda sha256: 8b54b732de45d85198e8e9ce5d5b5642c847f4379f917c64a4de48643a3305ee md5: aff56abfcef5a031603250b7dc23e9d5 @@ -10938,28 +10484,6 @@ packages: run_exports: {} size: 5395858 timestamp: 1784258391353 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-25.0.0-py313h98bfbea_0_cpu.conda - sha256: 2acc9a98e83a07deeebe295cc3314a9e19261af32415cfaf2dbaaac71bcb1bbd - md5: e44951ecdce8a268052edcac0c8efcc2 - 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.13,<3.14.0a0 - - python_abi 3.13.* *_cp313 - 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: 5442780 - timestamp: 1784258403853 - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.15-h8ab3286_2_cpython.conda build_number: 2 sha256: b3c9919295379d106bbfb05c159f51354aec45aa9378205d566f57cc18359557 @@ -11991,19 +11515,6 @@ packages: run_exports: {} size: 410641 timestamp: 1770909099497 -- conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.12.5-hec9e821_1.conda - sha256: 19e200bf2b34ea9fd3f88e8f20603541c58b741f9ac0f0f71804859fc2b5f97e - md5: d1d3d016ae5371aafd0967dba5151afe - depends: - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=15 - - libgcc >=15 - constrains: - - __glibc >=2.17 - license: Apache-2.0 OR MIT - run_exports: {} - size: 17769047 - timestamp: 1787146933655 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-h280c20c_0.conda sha256: 49b532d1df875c6749d9078b56a76f3f5db49a5abe0ca620b593ed474ef0ebf1 md5: 85c9442aec283b4e464fa9ecc484a2f3 @@ -12181,21 +11692,6 @@ packages: - 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-7_kmp_llvm.conda build_number: 7 sha256: 3a5dfcf315e59dff4130e033b0f9de8c38fa5f65009d2d82452a3f57f5fcb39f @@ -13407,16 +12903,6 @@ packages: - libglib >=2.88.3,<3.0a0 size: 4945329 timestamp: 1786457675064 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.1.0-h8acb6b2_2.conda - sha256: c47d48956ab7b399744ae363509dc644ac614b0ad9c000beaeeea8b1c6e258e3 - md5: 8d427a4d1a086922e2e1cd536b9c63cf - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - run_exports: - strong: - - _openmp_mutex >=4.5 - size: 617395 - timestamp: 1787164364894 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgoogle-cloud-3.8.0-h2efc11c_0.conda sha256: 28999fda2990fecd2b7b86da99fa997c2f4bcbe89576e362b8bab4559687ac69 md5: a20e63a2f4a5639b3cbfcc33ef4d9555 @@ -13562,16 +13048,6 @@ packages: - liblzma >=5.8.3,<6.0a0 size: 125578 timestamp: 1786348561649 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_2.conda - sha256: 5d6621a2229777824386164b40c67ff804fe98dd4165354cf73ee73e282a2adf - md5: eaaaec4776cd8a7b987c4b1782220141 - depends: - - libgcc >=14 - license: BSD-2-Clause - license_family: BSD - run_exports: {} - size: 113885 - timestamp: 1786650485380 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.68.1-ha4b982d_1.conda sha256: 0c28d734512fa2c66a232b2f3968eae7124dbd6ad42c594c752f1d08dfb86195 md5: ff4b2b7c169c438bf648fb14f369c3b9 @@ -14543,36 +14019,6 @@ packages: - python size: 13798396 timestamp: 1786443483173 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.13.15-hfc9013d_101_cp313.conda - build_number: 101 - sha256: e9bfbf0a71037b637e62800bffa69f3d485285bdba60afff02db907a1118dada - md5: d5e68eac5e0c5dd3cc13daa2233dfcbc - 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 - - 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 - run_exports: - weak: - - python_abi 3.13.* *_cp313 - noarch: - - python - size: 35577508 - timestamp: 1786368204307 - python_site_packages_path: lib/python3.13/site-packages - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-librt-0.15.0-py312hd41f8a7_0.conda sha256: 52f674203b53fc5b2502b40f5b3e1d3000f297cccbed180f08bf49dc0601099c md5: ea26dd52e5783b5e6c06f7674968ef4d @@ -14870,18 +14316,6 @@ packages: run_exports: {} size: 409407 timestamp: 1770909146204 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.12.5-h9b5564c_1.conda - sha256: 8905a0fc7350d0198bc6b72b7d3245db9d258e3ee38acf994237bf0993ef73e7 - md5: 1d23354045384cdd39eabc0252094a3e - depends: - - libstdcxx >=15 - - libgcc >=15 - constrains: - - __glibc >=2.17 - license: Apache-2.0 OR MIT - run_exports: {} - size: 17683943 - timestamp: 1787146849818 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libice-1.1.2-h80f16a2_0.conda sha256: e56bb636aefe3503a53520a0b7f3737f3a26fe0accf0befffc24d1c0ddd27008 md5: 0566e37830f85911b141524635939941 @@ -15526,17 +14960,6 @@ packages: run_exports: {} size: 391463 timestamp: 1777474663095 -- conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.6-pyhcf101f3_0.conda - sha256: bb826ff403b8195467e7cd5f504bc14767b424dac27bb225508ca2c1852554b2 - md5: 86b177231eecb011fe00e2117dbc3348 - depends: - - python >=3.10 - - python - license: MIT - license_family: MIT - run_exports: {} - size: 13160 - timestamp: 1776172429816 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda sha256: ee6cf346d017d954255bbcbdb424cddea4d14e4ed7e9813e429db1d795d01144 md5: 8e662bd460bda79b1ea39194e3c4c9ab @@ -15686,24 +15109,6 @@ packages: run_exports: {} size: 100789 timestamp: 1785796355216 -- conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.32.0-pyhcf101f3_0.conda - sha256: 8a66f14a879572644b2fbd6d1357af7892961997a14c25cb17bd082d8360a67a - md5: 5d151f6743d58dfe2555ab8201a1b09d - depends: - - packaging >=24.2 - - pathspec >=0.10.1 - - pluggy >=1.0.0 - - python >=3.10 - - tomlkit >=0.11.1 - - tomli >=1.2.2 - - trove-classifiers - - editables >=0.3 - - python - license: MIT - license_family: MIT - run_exports: {} - size: 62794 - timestamp: 1786711084570 - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda sha256: fdcea5d7cb314485d3907192ef024c704311548c5b0cbeb390cd1951051e29d2 md5: b395909221b9bd1df066e5930e18855b @@ -17348,17 +16753,6 @@ packages: run_exports: {} size: 21561 timestamp: 1774492402955 -- conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.15.1-pyhcf101f3_0.conda - sha256: 5cf833b4d199688b7652fb322ecc134de9555e9444d9249750de9a153421ad0a - md5: e4942e2de7436ff28be7f5645cf3c8d6 - depends: - - python >=3.10 - - python - license: MIT - license_family: MIT - run_exports: {} - size: 49054 - timestamp: 1784287707171 - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.70.0-pyh8f84b5b_0.conda sha256: a4d9e9da15b13f1ab047e7db412e2ed564bc615832e80213cf129b973c3abf4a md5: 00953c3b729e03b0ae21f49fdf3441bb @@ -17388,17 +16782,6 @@ packages: run_exports: {} size: 116935 timestamp: 1785761789772 -- conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2026.6.1.19-pyhcf101f3_0.conda - sha256: 74dabeb087f26116a262a7580a78622f2bf109798a7e154d4d9b48234ed72b11 - md5: f23d5a5855f09bcb5026938486a9750d - depends: - - python >=3.10 - - python - license: Apache-2.0 - license_family: APACHE - run_exports: {} - size: 24210 - timestamp: 1780385194431 - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda sha256: b141933ece3518f6d7b75dfb59451e2f26b405a44c18e2518a83e9a02e09315c md5: c680b5747e8c4c8f23dca0bb7042a8fc @@ -18891,16 +18274,6 @@ packages: - liblzma >=5.8.3,<6.0a0 size: 91720 timestamp: 1786348695846 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_2.conda - sha256: 04cc136c5a956a73aa14e0a160b5822b0b29714e67b299fa1b1fd16dbcba5366 - md5: ff33a4dbd93abc8a798cc4e0e7c8136d - depends: - - __osx >=11.0 - license: BSD-2-Clause - license_family: BSD - run_exports: {} - size: 73289 - timestamp: 1786651074391 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h435687b_1.conda sha256: 445440d8cccccb6585f71d1eb7c949d64a2af2ced5481d924621424ff3b6a398 md5: ac9902dcbe0417f50cf95ab2bde062fa @@ -19819,34 +19192,6 @@ packages: - python size: 13473493 timestamp: 1786444752563 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.15-hf1cfe1e_101_cp313.conda - build_number: 101 - sha256: 5d581f5236760dfd35b516cc4268b06d6d05cd6f96720083ec0c8a9300218270 - md5: d63c64caf641d0767f776336134a88a5 - 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 - - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.53.4,<4.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 - run_exports: - weak: - - python_abi 3.13.* *_cp313 - noarch: - - python - size: 17119404 - timestamp: 1786367447230 - python_site_packages_path: lib/python3.13/site-packages - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-librt-0.15.0-py312hb3ab3e3_0.conda sha256: a5c239da4d61c2ac48bd19a78e942bdc641ce45e81d44fca14e38c0e004103bf md5: e25e6dd89dc14c6d1dc82238e77aca41 @@ -20166,18 +19511,6 @@ packages: run_exports: {} size: 415828 timestamp: 1770909782683 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/uv-0.12.5-h58858c0_1.conda - sha256: 11c928ad5c250c211cc779283953ff2643a65950144289c2cea40803602e3cd9 - md5: 1cae7e9e61d7a167597600f3a8959692 - depends: - - __osx >=11.0 - - libcxx >=21 - constrains: - - __osx >=11.0 - license: Apache-2.0 OR MIT - run_exports: {} - size: 15004145 - timestamp: 1787146947528 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-h84a0fba_2.conda sha256: 5c5ea38ceec008e4ff40111fc166b04086fca310b0aa9e5bd46f65e6b0dcb71d md5: 31d71ce1b056f69b6ec67ee0712bdf97 @@ -20259,138 +19592,17 @@ packages: - zstd >=1.5.7,<1.6.0a0 size: 433687 timestamp: 1786599629846 -- conda_source: skala[4f0049e0] @ . - variants: - target_platform: noarch - depends: - - ase - - e3nn - - h5py - - huggingface_hub - - numpy - - opt_einsum_fx - - python >=3.11,<3.14 - - python * - - pytorch >=2.12,<2.14 - host_packages: - - 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/bzip2-1.0.8-h4777abc_10.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/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.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/libgcc-16.1.0-h205dda4_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.1.0-h8acb6b2_2.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/libmpdec-4.0.0-he30d5cf_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/libstdcxx-16.1.0-hef695bb_2.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/libzlib-1.3.2-hdc9db2a_3.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/openssl-3.6.3-h546c87b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.13.15-hfc9013d_101_cp313.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/tk-8.6.13-noxft_hf03c496_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.12.5-h9b5564c_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/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.6-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.32.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/pathspec-1.1.1-pyhd8ed1ab_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/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.15.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2026.6.1.19-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda -- conda_source: skala[a2158a4d] @ . - variants: - target_platform: noarch - depends: - - ase - - e3nn - - h5py - - huggingface_hub - - numpy - - opt_einsum_fx - - python >=3.11,<3.14 - - python * - - pytorch >=2.12,<2.14 - host_packages: - - 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/libmpdec-4.0.0-hb03c661_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/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/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.13.15-hb101c97_101_cp313.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/uv-0.12.5-hec9e821_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/editables-0.6-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.32.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/pathspec-1.1.1-pyhd8ed1ab_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/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.15.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2026.6.1.19-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda -- conda_source: skala[ba0d9f24] @ . - variants: - target_platform: noarch - depends: +- pypi: ./skala + name: skala + requires_dist: - ase - - e3nn - - h5py - - huggingface_hub + - huggingface-hub - numpy - - opt_einsum_fx - - python >=3.11,<3.14 - - python * - - pytorch >=2.12,<2.14 - host_packages: - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.6-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.32.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/pathspec-1.1.1-pyhd8ed1ab_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/python_abi-3.13-8_cp313.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.15.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2026.6.1.19-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/bzip2-1.0.8-h4e30115_10.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/libcxx-22.1.8-h55c6f16_0.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/liblzma-5.8.3-h8088a28_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_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/libzlib-1.3.2-h8088a28_3.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/openssl-3.6.3-hd24854e_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.13.15-hf1cfe1e_101_cp313.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/tk-8.6.13-hbeba79b_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/uv-0.12.5-h58858c0_1.conda + - 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 @@ -20456,6 +19668,13 @@ packages: - 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 @@ -20558,6 +19777,13 @@ packages: - 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 @@ -20599,6 +19825,27 @@ packages: - 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 diff --git a/pixi.toml b/pixi.toml index f1df6b25..e0b8d31c 100644 --- a/pixi.toml +++ b/pixi.toml @@ -18,11 +18,20 @@ conda-forge = { mapping-mode = "overlay", mapping = { dftd3-python = "dftd3", py [feature.python-runtime.dependencies] ase = "*" -e3nn = "*" -h5py = "*" numpy = "<2.5" + +[feature.python-runtime.pypi-dependencies] +skala = { path = "skala", editable = true } + +[feature.model-definition.dependencies] +e3nn = "*" opt_einsum_fx = "*" -skala = { path = "." } + +[feature.gauxc-python.dependencies] +h5py = "*" + +[feature.component-sources.activation.env] +PYTHONPATH = "$PIXI_PROJECT_ROOT/model/src:$PIXI_PROJECT_ROOT/gauxc/src:$PIXI_PROJECT_ROOT/docs/benchmark/src" [feature.model-assets.dependencies] huggingface_hub = "*" @@ -100,9 +109,6 @@ pytest-cov = "*" pytest-randomly = "*" pytest-timeout = "*" -[feature.test.tasks] -pytest = { cmd = "pytest", env = { OMP_NUM_THREADS = "4" } } - [feature.lint.dependencies] mypy = ">=2" pre-commit = "*" @@ -193,279 +199,23 @@ libcublas-dev = ">=12,<13" libcusparse-dev = ">=12,<13" libmagma-devel = ">=2.10,<2.11" -[environments.default] -features = [ - "python-runtime", - "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"] - -[environments.lint] -features = [ - "python-runtime", - "model-assets", - "python-312", - "pyscf-214", - "dispersion", - "torch-213-cpu", - "test", - "lint", - "profiling", - "benchmark", -] -no-default-feature = true -platforms = ["linux-64"] - -[environments.test-py311-pyscf214-torch213] -features = [ - "python-runtime", - "model-assets", - "python-311", - "pyscf-214", - "dispersion", - "torch-213-cpu", - "test", - "benchmark", -] -no-default-feature = true -platforms = ["linux-64"] - -[environments.test-py312-pyscf214-torch212] -features = [ - "python-runtime", - "model-assets", - "python-312", - "pyscf-214", - "dispersion", - "torch-212-cpu", - "test", - "profiling", - "benchmark", -] -no-default-feature = true -platforms = ["linux-64", "linux-aarch64", "osx-arm64"] - -[environments.test-py312-pyscf214-torch213] -features = [ - "python-runtime", - "model-assets", - "python-312", - "pyscf-214", - "dispersion", - "torch-213-cpu", - "test", - "profiling", - "benchmark", -] -no-default-feature = true -platforms = ["linux-64", "linux-aarch64", "osx-arm64"] - -[environments.test-py313-pyscf214-torch213] -features = [ - "python-runtime", - "model-assets", - "python-313", - "pyscf-214", - "dispersion", - "torch-213-cpu", - "test", - "benchmark", -] -no-default-feature = true -platforms = ["linux-64"] - -[environments.gpu-cuda12-torch212] -features = [ - "python-runtime", - "model-assets", - "python-312", - "pyscf-214", - "dispersion", - "torch-212-gpu", - "cuda-12", - "test", - "benchmark", -] -no-default-feature = true -platforms = ["linux-64-cuda12"] - -[environments.gpu-cuda12-torch213] -features = [ - "python-runtime", - "model-assets", - "python-312", - "pyscf-214", - "dispersion", - "torch-213-gpu", - "cuda-12", - "test", - "benchmark", -] -no-default-feature = true -platforms = ["linux-64-cuda12"] - -[environments.gpu-cuda13-torch213] -features = [ - "python-runtime", - "model-assets", - "python-312", - "pyscf-214", - "dispersion", - "torch-213-gpu", - "cuda-13", - "test", - "benchmark", -] -no-default-feature = true -platforms = ["linux-64-cuda13"] - -[environments.docs] -features = [ - "python-runtime", - "model-assets", - "python-312", - "pyscf-214", - "dispersion", - "torch-213-cpu", - "benchmark", - "docs", -] -no-default-feature = true -platforms = ["linux-64"] - -[environments.assets] -features = ["python-312", "model-assets"] -no-default-feature = true -platforms = ["linux-64"] - -[environments.release] -features = ["python-312", "release"] -no-default-feature = true -platforms = ["linux-64"] - -[environments.cpp-integration] -features = [ - "python-runtime", - "model-assets", - "python-312", - "pyscf-214", - "dispersion", - "torch-213-cpu", - "native-toolchain", -] -no-default-feature = true -platforms = ["linux-64"] - -[environments.gauxc-openmp] -features = [ - "python-312", - "torch-213-cpu", - "native-toolchain", - "gauxc-core", - "gauxc-cpu", - "hdf5-serial", -] -no-default-feature = true -platforms = ["linux-64"] - -[environments.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"] - -[environments.gauxc-mpi] -features = [ - "python-312", - "torch-213-cpu", - "native-toolchain", - "gauxc-core", - "gauxc-cpu", - "mpi", -] -no-default-feature = true -platforms = ["linux-64"] - -[environments.gauxc-mpi-fortran] -features = [ - "python-312", - "torch-213-cpu", - "native-toolchain", - "fortran", - "gauxc-core", - "gauxc-cpu", - "mpi", -] -no-default-feature = true -platforms = ["linux-64"] - -[environments.gauxc-cuda12] -features = [ - "python-312", - "torch-213-gpu", - "native-toolchain", - "gauxc-core", - "gauxc-cuda12", - "hdf5-serial", -] -no-default-feature = true -platforms = ["linux-64-cuda12"] - -[environments.ftorch] -features = [ - "python-312", - "model-assets", - "torch-213-cpu", - "native-toolchain", - "fortran", -] -no-default-feature = true -platforms = ["linux-64"] - -[package] -name = "skala" -version = "2026.9" -description = "Skala Exchange Correlation Functional" -license-file = "LICENSE.txt" -readme = "README.md" -repository = "https://github.com/microsoft/skala" -documentation = "https://microsoft.github.io/skala" -publish = false - -[package.build] -backend = { name = "pixi-build-python", version = "0.8.*", channels = ["https://prefix.dev/conda-forge"] } - -[package.build.config] -ignore-pypi-mapping = true - -[package.host-dependencies] -hatchling = "*" -python = ">=3.11,<3.14" - -# PySCF and dispersion packages intentionally remain PyPI-only environment -# dependencies because conda PySCF introduces an incompatible XCFun ABI. -[package.run-dependencies] -ase = "*" -e3nn = "*" -h5py = "*" -huggingface_hub = "*" -numpy = "*" -opt_einsum_fx = "*" -python = ">=3.11,<3.14" -pytorch = ">=2.12,<2.14" +[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"] } +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"] } +test-py313-pyscf214-torch213 = { features = ["python-runtime", "model-assets", "python-313", "pyscf-214", "dispersion", "torch-213-cpu", "test"], no-default-feature = true, platforms = ["linux-64"] } +gpu-cuda12-torch212 = { features = ["python-runtime", "model-definition", "component-sources", "model-assets", "python-312", "pyscf-214", "dispersion", "torch-212-gpu", "cuda-12", "test", "benchmark"], no-default-feature = true, platforms = ["linux-64-cuda12"] } +gpu-cuda12-torch213 = { features = ["python-runtime", "model-definition", "component-sources", "model-assets", "python-312", "pyscf-214", "dispersion", "torch-213-gpu", "cuda-12", "test", "benchmark"], no-default-feature = true, platforms = ["linux-64-cuda12"] } +gpu-cuda13-torch213 = { features = ["python-runtime", "model-definition", "component-sources", "model-assets", "python-312", "pyscf-214", "dispersion", "torch-213-gpu", "cuda-13", "test", "benchmark"], no-default-feature = true, platforms = ["linux-64-cuda13"] } +docs = { features = ["python-runtime", "component-sources", "model-assets", "python-312", "pyscf-214", "dispersion", "torch-213-cpu", "benchmark", "docs"], no-default-feature = true, platforms = ["linux-64"] } +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"] } diff --git a/pyproject.toml b/pyproject.toml index f04404be..ce7615a9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,51 +1,8 @@ -[build-system] -requires = ["hatchling"] -build-backend = "hatchling.build" - -[project] -name = "skala" -version = "2026.9" -description = "Skala Exchange Correlation Functional" -authors = [] -license-files = ["LICENSE.txt"] -readme = "README.md" -keywords = [] -classifiers = [ - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Operating System :: MacOS", - "Operating System :: POSIX :: Linux", - "Development Status :: 5 - Production/Stable", -] -requires-python = ">=3.11,<3.14" -dependencies = [ - "ase", - "e3nn", - "h5py", - "huggingface_hub", - "numpy", - "opt_einsum_fx", - "pyscf>=2.14,<2.15", - "pyscf-dispersion>=1.5; sys_platform == 'linux'", - "dftd3>=1.5,<2; sys_platform == 'darwin'", - "torch>=2.12,<2.14" -] - -urls.repository = "https://github.com/microsoft/skala" -urls.documentation = "https://microsoft.github.io/skala" -urls.homepage = "https://aka.ms/dft" - -[tool.hatch.build.targets.wheel] -packages = ["src/skala"] - [tool.mypy] strict = true no_namespace_packages = true python_version = "3.11" -exclude = ["build/", "third_party/"] -disable_error_code = ["no-any-return", "unused-ignore"] +exclude = ["build/", "docs/site/_build/", "htmlcov/", "third_party/"] [[tool.mypy.overrides]] module = [ @@ -67,11 +24,15 @@ ignore_missing_imports = true [tool.ruff] target-version = "py311" -src = ["src"] -exclude = ["third_party"] +src = ["skala/", "model/", "gauxc/", "docs/"] +exclude = ["build", "docs/site/_build", "third_party"] [tool.ruff.lint] -extend-select = [ +select = [ + "E4", # pycodestyle import errors + "E7", # pycodestyle statement errors + "E9", # pycodestyle runtime errors + "F", # Pyflakes "B", # flake8-bugbear "D417", # undocumented-param in docstring "I", # isort @@ -91,6 +52,8 @@ line-length = 100 [tool.pytest.ini_options] timeout = 300 addopts = "-m 'not profiling and not benchmark and not model_benchmark'" +pythonpath = [".", "skala/src", "model/src", "gauxc/src", "docs/benchmark/src"] +testpaths = ["skala/tests", "model/tests", "gauxc/tests", "docs/benchmark/tests"] markers = [ "benchmark: performance measurements collected by pytest-benchmark", "gpu: requires a CUDA-capable GPU and GPU test dependencies", diff --git a/skala/LICENSE.txt b/skala/LICENSE.txt new file mode 100644 index 00000000..22aed37e --- /dev/null +++ b/skala/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) Microsoft Corporation. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/skala/README.md b/skala/README.md new file mode 100644 index 00000000..33820868 --- /dev/null +++ b/skala/README.md @@ -0,0 +1,191 @@ +# Skala: Accurate and scalable exchange-correlation with deep learning + +[![Documentation](https://img.shields.io/badge/docs-microsoft.github.io%2Fskala-blue?logo=read-the-docs&logoColor=white)](https://microsoft.github.io/skala) +[![Tests](https://img.shields.io/github/actions/workflow/status/microsoft/skala/test.yml?branch=main&logo=github&label=build)](https://github.com/microsoft/skala/actions/workflows/test.yml) +[![PyPI](https://img.shields.io/pypi/v/skala?logo=pypi&logoColor=white)](https://pypi.org/project/skala/) +[![Paper](https://img.shields.io/badge/arXiv-2506.14665-b31b1b?logo=arxiv&logoColor=white)](https://arxiv.org/abs/2506.14665) + +Skala is a neural network-based exchange-correlation functional for density functional theory (DFT), developed by Microsoft Research AI for Science. It uses deep learning to predict exchange-correlation energies from electron density features, surpasses state-of-the-art hybrid functionals in accuracy for main group thermochemistry, kinetics and non-covalent interactions, all at a computational cost similar to semi-local DFT. + +Trained on a large, diverse dataset — including coupled-cluster atomization energies and public benchmarks — Skala uses scalable message passing and local layers to learn both local and non-local effects. The model has about 385,000 parameters and matches the accuracy of leading hybrid functionals. + +The recommended neural functional is `skala-1.1`, which uses per-atom packed grids, multiple non-local layers, and symmetric contraction. The legacy `skala-1.0` traced model is still loadable via `load_functional("skala-1.0")`. + +Learn more about Skala in our [ArXiv paper](https://arxiv.org/abs/2506.14665). + +## What's in here + +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. + +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) + +### 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). + +## Getting started: PySCF (CPU) + +All information below relates to the Python package `skala`. +Skala supports Linux and macOS with Python 3.11 through 3.13, the latest +PySCF release (2.14), and the two latest PyTorch release lines (2.12 and 2.13). + +`pip install skala` works out of the box and pulls every dependency from PyPI. +If you don't already have PyTorch installed, install the CPU-only wheel first +to avoid pulling a large CUDA build: + +```bash +pip install torch --index-url https://download.pytorch.org/whl/cpu +pip install skala +``` + +For a reproducible source environment, use the default environment from the +committed Pixi lockfile. It uses Python 3.12, PySCF 2.14, and CPU-only PyTorch 2.13: + +```bash +pixi install --locked -e default +pixi run -e default python your_script.py +``` + +Run an SCF calculation with Skala for a hydrogen molecule: + +```python +from pyscf import gto +from skala.pyscf import SkalaKS + +mol = gto.M( + atom="""H 0 0 0; H 0 0 1.4""", + basis="def2-tzvp", +) +ks = SkalaKS(mol, xc="skala-1.1") +ks.kernel() +``` + +## Getting started: GPU4PySCF (GPU) + +The GPU install is more involved because `gpu4pyscf` ships CUDA-version-specific +wheels that must match your CUDA toolkit. GPU environments and helper packages +use the latest tested GPU4PySCF release, 1.8.1. + +To install all dependencies from PyPI, use the GPU specific package with the +matching CUDA version, e.g., for CUDA 12: + +```bash +pip install skala-cuda12x +``` + +The `skala-cuda13x` package is available for CUDA 13. + +For a reproducible source environment, choose one of the locked GPU environments: + +| Environment | CUDA | PyTorch | +|---|---:|---:| +| `gpu-cuda12-torch212` | 12 | 2.12 | +| `gpu-cuda12-torch213` | 12 | 2.13 | +| `gpu-cuda13-torch213` | 13 | 2.13 | + +For example: + +```bash +pixi install --locked -e gpu-cuda12-torch213 +pixi run -e gpu-cuda12-torch213 python your_script.py +``` + +The workspace records CUDA 12 and CUDA 13 as explicit platforms, so the lock can +be installed while building a container without an attached GPU. Check your +driver's maximum supported CUDA version with `nvidia-smi`. + +Run an SCF calculation with Skala for a hydrogen molecule on GPU: + +```python +from pyscf import gto +from skala.gpu4pyscf import SkalaKS + +mol = gto.M( + atom="""H 0 0 0; H 0 0 1.4""", + basis="def2-tzvp", +) +ks = SkalaKS(mol, xc="skala-1.1") +ks.kernel() +``` + +### Known issue: multiple visible GPUs + +Skala uses a single GPU, but importing `gpu4pyscf` allocates memory on **every** +visible CUDA device. This can conflict with PyTorch and with other processes +sharing those GPUs (e.g. in MPI-parallel workloads). + +Restrict CUDA to one device **before** launching Python: + +```bash +CUDA_VISIBLE_DEVICES=0 python my_script.py +``` + +For MPI-parallel runs, assign one GPU per local rank: + +```bash +mpirun -np 4 bash -c 'CUDA_VISIBLE_DEVICES=$OMPI_COMM_WORLD_LOCAL_RANK python my_script.py' +``` + +Tracked upstream at [pyscf/gpu4pyscf#435](https://github.com/pyscf/gpu4pyscf/issues/435). + +## Getting started: ASE calculator + +Skala also provides an [ASE](https://wiki.fysik.dtu.dk/ase/) calculator for energy, force, and geometry optimization workflows: + +```python +from ase.build import molecule +from ase.optimize import LBFGSLineSearch +from skala.ase import Skala + +atoms = molecule("H2O") +atoms.calc = Skala(xc="skala-1.1", basis="def2-tzvp") + +# Single-point energy (eV) +print(atoms.get_potential_energy()) + +# Geometry optimization +opt = LBFGSLineSearch(atoms) +opt.run(fmax=0.01) +``` + +## Documentation and examples + +See [microsoft.github.io/skala](https://microsoft.github.io/skala) for a more detailed installation guide and further examples of how to use the Skala functional with PySCF, GPU4PySCF and ASE. + +## Security: loading `.fun` files + +Skala model files (`.fun`) use TorchScript serialization, which can execute arbitrary code when loaded. **Never load `.fun` files from untrusted sources.** + +When loading the official Skala models via `load_functional("skala-1.1")` or `load_functional("skala-1.0")`, file integrity is automatically verified against pinned SHA-256 hashes before deserialization. If you load `.fun` files directly with `TracedFunctional.load()`, pass the `expected_hash` parameter to enable verification: + +```python +TracedFunctional.load("model.fun", expected_hash="") +``` + +## Project information + +See the following files for more information about contributing, reporting issues, and the code of conduct: + +- [`CONTRIBUTING.md`](CONTRIBUTING.md) +- [`LICENSE.txt`](LICENSE.txt) +- [`SECURITY.md`](SECURITY.md) + +## Trademarks + +This project may contain trademarks or logos for projects, products, or services. +Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). +Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. +Any use of third-party trademarks or logos are subject to those third-party's policies. diff --git a/conftest.py b/skala/conftest.py similarity index 94% rename from conftest.py rename to skala/conftest.py index fc23dd3f..1b9f5ef4 100644 --- a/conftest.py +++ b/skala/conftest.py @@ -9,7 +9,6 @@ import pytest import torch from pyscf.scf import hf - from skala.functional import ExcFunctionalBase, load_functional @@ -51,8 +50,8 @@ def pytest_ignore_collect(collection_path: Path, config: pytest.Config) -> bool return None return relative_path == Path( - "src/skala/utils/torch_allocator.py" - ) or relative_path.is_relative_to("src/skala/gpu4pyscf") + "skala/src/skala/utils/torch_allocator.py" + ) or relative_path.is_relative_to("skala/src/skala/gpu4pyscf") @pytest.hookimpl(wrapper=True) diff --git a/skala/pixi.toml b/skala/pixi.toml new file mode 100644 index 00000000..9a11184f --- /dev/null +++ b/skala/pixi.toml @@ -0,0 +1,33 @@ +[workspace] +channels = ["conda-forge"] +platforms = ["linux-64", "linux-aarch64", "osx-arm64"] +preview = ["pixi-build"] + +[package] +name = "skala" +version = "2026.9" +description = "Skala Exchange Correlation Functional" +license-file = "LICENSE.txt" +readme = "README.md" +repository = "https://github.com/microsoft/skala" +documentation = "https://microsoft.github.io/skala" +publish = false + +[package.build] +backend = { name = "pixi-build-python", version = "0.8.*", channels = ["https://prefix.dev/conda-forge"] } + +[package.build.config] +ignore-pypi-mapping = true + +[package.host-dependencies] +hatchling = "*" +python = ">=3.11,<3.14" + +# PySCF and dispersion packages intentionally remain PyPI-only environment +# dependencies because conda PySCF introduces an incompatible XCFun ABI. +[package.run-dependencies] +ase = "*" +huggingface_hub = "*" +numpy = "*" +python = ">=3.11,<3.14" +pytorch = ">=2.12,<2.14" \ No newline at end of file diff --git a/skala/pyproject.toml b/skala/pyproject.toml new file mode 100644 index 00000000..2e086993 --- /dev/null +++ b/skala/pyproject.toml @@ -0,0 +1,46 @@ +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[project] +name = "skala" +version = "2026.9" +description = "Skala Exchange Correlation Functional" +authors = [] +license-files = ["LICENSE.txt"] +readme = "README.md" +keywords = [] +classifiers = [ + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Operating System :: MacOS", + "Operating System :: POSIX :: Linux", + "Development Status :: 5 - Production/Stable", +] +requires-python = ">=3.11,<3.14" +dependencies = [ + "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" +] + +urls.repository = "https://github.com/microsoft/skala" +urls.documentation = "https://microsoft.github.io/skala" +urls.homepage = "https://aka.ms/dft" + +[tool.hatch.build.targets.wheel] +packages = ["src/skala"] + +[tool.hatch.build.targets.sdist] +include = [ + "/LICENSE.txt", + "/README.md", + "/pyproject.toml", + "/src/skala", +] diff --git a/src/skala/__init__.py b/skala/src/skala/__init__.py similarity index 100% rename from src/skala/__init__.py rename to skala/src/skala/__init__.py diff --git a/src/skala/ase/__init__.py b/skala/src/skala/ase/__init__.py similarity index 100% rename from src/skala/ase/__init__.py rename to skala/src/skala/ase/__init__.py diff --git a/src/skala/ase/calculator.py b/skala/src/skala/ase/calculator.py similarity index 100% rename from src/skala/ase/calculator.py rename to skala/src/skala/ase/calculator.py diff --git a/src/skala/dispersion.py b/skala/src/skala/dispersion.py similarity index 100% rename from src/skala/dispersion.py rename to skala/src/skala/dispersion.py diff --git a/src/skala/features.py b/skala/src/skala/features.py similarity index 100% rename from src/skala/features.py rename to skala/src/skala/features.py diff --git a/src/skala/functional/__init__.py b/skala/src/skala/functional/__init__.py similarity index 98% rename from src/skala/functional/__init__.py rename to skala/src/skala/functional/__init__.py index 2a1cf5bd..75223b32 100644 --- a/src/skala/functional/__init__.py +++ b/skala/src/skala/functional/__init__.py @@ -19,7 +19,6 @@ from skala.functional._hashes import KNOWN_HASHES from skala.functional.base import ExcFunctionalBase from skala.functional.load import TracedFunctional -from skala.functional.model import SkalaFunctional from skala.functional.traditional import ( LDA, PBE, @@ -41,7 +40,6 @@ "TPSS", "ExcFunctionalBase", "FunctionalArtifact", - "SkalaFunctional", "TracedFunctional", "load_functional", "resolve_functional_artifact", diff --git a/src/skala/functional/_hashes.py b/skala/src/skala/functional/_hashes.py similarity index 100% rename from src/skala/functional/_hashes.py rename to skala/src/skala/functional/_hashes.py diff --git a/src/skala/functional/base.py b/skala/src/skala/functional/base.py similarity index 100% rename from src/skala/functional/base.py rename to skala/src/skala/functional/base.py diff --git a/src/skala/functional/density.py b/skala/src/skala/functional/density.py similarity index 98% rename from src/skala/functional/density.py rename to skala/src/skala/functional/density.py index f25ad1cd..1ea724cd 100644 --- a/src/skala/functional/density.py +++ b/skala/src/skala/functional/density.py @@ -185,7 +185,9 @@ def grad_norm(grad: Tensor) -> Tensor: Gradient norm |∇ρ|. """ # expecting [(2,)3,G)] - return grad.norm(dim=-2) + result = grad.norm(dim=-2) + assert isinstance(result, Tensor) + return result def z(rho: Tensor, grad: Tensor, kin: Tensor) -> Tensor: diff --git a/src/skala/functional/load.py b/skala/src/skala/functional/load.py similarity index 96% rename from src/skala/functional/load.py rename to skala/src/skala/functional/load.py index ec081e6e..29a57f56 100644 --- a/src/skala/functional/load.py +++ b/skala/src/skala/functional/load.py @@ -58,10 +58,14 @@ def get_d3_settings(self) -> str | None: return self.expected_d3_settings def get_exc_density(self, mol: FeatureMap) -> torch.Tensor: - return self._traced_model.get_exc_density(mol) + result = self._traced_model.get_exc_density(mol) + assert isinstance(result, torch.Tensor) + return result def get_exc(self, mol: FeatureMap) -> torch.Tensor: - return self._traced_model.get_exc(mol) + result = self._traced_model.get_exc(mol) + assert isinstance(result, torch.Tensor) + return result @property def original_name(self) -> str: diff --git a/src/skala/functional/traditional.py b/skala/src/skala/functional/traditional.py similarity index 98% rename from src/skala/functional/traditional.py rename to skala/src/skala/functional/traditional.py index 0097752f..5955d656 100644 --- a/src/skala/functional/traditional.py +++ b/skala/src/skala/functional/traditional.py @@ -97,12 +97,14 @@ class LDA(SpinScaledXCFunctional): ] def exchange(self, mol_features: FeatureMap) -> Tensor: - return ( + result = ( -3 / 4 * (3 / math.pi) ** (1 / 3) * mol_features[Feature.DENSITY].abs() ** (4 / 3) ) + assert isinstance(result, Tensor) + return result def correlation_density(self, mol_features: FeatureMap) -> Tensor: return mol_features[Feature.DENSITY].new_zeros((1,)) @@ -122,12 +124,14 @@ class SPW92(SpinScaledXCFunctional): ] def exchange(self, mol_features: FeatureMap) -> Tensor: - return ( + result = ( -3 / 4 * (3 / math.pi) ** (1 / 3) * mol_features[Feature.DENSITY].abs() ** (4 / 3) ) + assert isinstance(result, Tensor) + return result def correlation_density(self, mol_features: FeatureMap) -> Tensor: def Gamma( @@ -279,7 +283,9 @@ def correlation_density(self, mol_features: FeatureMap) -> Tensor: * torch.max(eps_c_pbe, self.pbe.correlation_density(mols[spin])) for spin in range(2) ) - return eps_c_revpkzb * (1 + self.d * eps_c_revpkzb * z**3) + result = eps_c_revpkzb * (1 + self.d * eps_c_revpkzb * z**3) + assert isinstance(result, Tensor) + return result class _SCANLikeFunctional(SpinScaledXCFunctional): diff --git a/src/skala/gpu4pyscf/__init__.py b/skala/src/skala/gpu4pyscf/__init__.py similarity index 100% rename from src/skala/gpu4pyscf/__init__.py rename to skala/src/skala/gpu4pyscf/__init__.py diff --git a/src/skala/gpu4pyscf/dft.py b/skala/src/skala/gpu4pyscf/dft.py similarity index 100% rename from src/skala/gpu4pyscf/dft.py rename to skala/src/skala/gpu4pyscf/dft.py diff --git a/src/skala/gpu4pyscf/gradients.py b/skala/src/skala/gpu4pyscf/gradients.py similarity index 96% rename from src/skala/gpu4pyscf/gradients.py rename to skala/src/skala/gpu4pyscf/gradients.py index 8c9fc4c4..ccc17e29 100644 --- a/src/skala/gpu4pyscf/gradients.py +++ b/skala/src/skala/gpu4pyscf/gradients.py @@ -312,9 +312,11 @@ def energy_ee( veff_grad = ( 2 * nuc_grad_from_veff(mol, veff, from_dlpack(dm)).detach().cpu().numpy() ) - return veff_grad + self.jk_energy_per_atom( + result = veff_grad + self.jk_energy_per_atom( dm, k_factor=0.0, verbose=self.verbose ) + assert isinstance(result, np.ndarray) + return result def grad_elec( self, @@ -344,12 +346,15 @@ def grad_elec( raise RuntimeError("Nuclear gradient contribution was not computed") grad = super().grad_elec(mo_energy, mo_coeff, mo_occ, atmlst) - return grad + veff_nuc_grad.detach().cpu().numpy() + result = grad + veff_nuc_grad.detach().cpu().numpy() + assert isinstance(result, np.ndarray) + return result def grad_nuc( self, mol: gto.Mole | None = None, atmlst: list[int] | None = None ) -> np.ndarray: nuc_g = super().grad_nuc(mol, atmlst) + assert isinstance(nuc_g, np.ndarray) if self.with_dftd3 is None: return nuc_g disp_g = self.with_dftd3.get_gradient() @@ -413,7 +418,11 @@ def energy_ee( veff_grad = ( 2 * nuc_grad_from_veff(mol, veff, from_dlpack(dm)).detach().cpu().numpy() ) - return veff_grad + self.jk_energy_per_atom(dm, k_factor=0, verbose=self.verbose) + result = veff_grad + self.jk_energy_per_atom( + dm, k_factor=0, verbose=self.verbose + ) + assert isinstance(result, np.ndarray) + return result def grad_elec( self, @@ -443,13 +452,15 @@ def grad_elec( raise RuntimeError("Nuclear gradient contribution was not computed") grad = super().grad_elec(mo_energy, mo_coeff, mo_occ, atmlst) - - return grad + veff_nuc_grad.detach().cpu().numpy() + result = grad + veff_nuc_grad.detach().cpu().numpy() + assert isinstance(result, np.ndarray) + return result def grad_nuc( self, mol: gto.Mole | None = None, atmlst: list[int] | None = None ) -> np.ndarray: nuc_g = super().grad_nuc(mol, atmlst) + assert isinstance(nuc_g, np.ndarray) if self.with_dftd3 is None: return nuc_g disp_g = self.with_dftd3.get_gradient() diff --git a/src/skala/gpu4pyscf/grids.py b/skala/src/skala/gpu4pyscf/grids.py similarity index 96% rename from src/skala/gpu4pyscf/grids.py rename to skala/src/skala/gpu4pyscf/grids.py index ed1166ed..b91a7a00 100644 --- a/src/skala/gpu4pyscf/grids.py +++ b/skala/src/skala/gpu4pyscf/grids.py @@ -63,13 +63,15 @@ def build( ) -> "SkalaGrids": if sort_grids or sort_grids_of_each_atom: LOG.debug("sorted grids not supported, forcing unsorted grids") - return super().build( + result = super().build( mol, with_non0tab, sort_grids=False, sort_grids_of_each_atom=False, **kwargs, ) + assert isinstance(result, SkalaGrids) + return result def prepare_spatial_grid_layout( self, diff --git a/src/skala/py.typed b/skala/src/skala/py.typed similarity index 100% rename from src/skala/py.typed rename to skala/src/skala/py.typed diff --git a/src/skala/pyscf/__init__.py b/skala/src/skala/pyscf/__init__.py similarity index 97% rename from src/skala/pyscf/__init__.py rename to skala/src/skala/pyscf/__init__.py index 20bdf649..236de2ff 100644 --- a/src/skala/pyscf/__init__.py +++ b/skala/src/skala/pyscf/__init__.py @@ -85,7 +85,7 @@ def SkalaKS( f"DFT-D3 dispersion correction is not supported for native PySCF functionals (xc={xc!r}). " "Pass with_dftd3=False or use pyscf.dft.RKS/UKS directly." ) - return _create_native_pyscf_ks( + result = _create_native_pyscf_ks( mol, xc, with_density_fit=with_density_fit, @@ -94,6 +94,16 @@ def SkalaKS( ks_config=ks_config, soscf_config=soscf_config, ) + assert isinstance( + result, + ( + dft.SkalaRKS, + dft.SkalaUKS, + pyscf_dft.rks.RKS, + pyscf_dft.uks.UKS, + ), + ) + return result if mol.spin == 0: return SkalaRKS( mol, diff --git a/src/skala/pyscf/ao_evaluation.py b/skala/src/skala/pyscf/ao_evaluation.py similarity index 98% rename from src/skala/pyscf/ao_evaluation.py rename to skala/src/skala/pyscf/ao_evaluation.py index b80ec612..19952524 100644 --- a/src/skala/pyscf/ao_evaluation.py +++ b/skala/src/skala/pyscf/ao_evaluation.py @@ -104,10 +104,14 @@ def _evaluate_feature_block( if active_dm_submatrix is None: raise ValueError("Feature evaluation requires a density matrix.") if compile_feature_function: - return torch.compile(feature_function.forward)( + result = torch.compile(feature_function.forward)( active_dm_submatrix, block.ao_values ) - return feature_function(active_dm_submatrix, block.ao_values) + assert isinstance(result, Tensor) + return result + result = feature_function(active_dm_submatrix, block.ao_values) + assert isinstance(result, Tensor) + return result class _CPUAOBlockLoop: @@ -566,7 +570,9 @@ def _resolve_ao_block_size( block_size = int(max_memory * 1e6 / ((comp + 1) * nao * 8 * backend_block_size)) block_size = max(4, min(block_size, 1200)) * backend_block_size - return block_size - block_size % dft.gen_grid.BLKSIZE + result = block_size - block_size % dft.gen_grid.BLKSIZE + assert isinstance(result, int) + return result def auto_chunk( diff --git a/src/skala/pyscf/backend.py b/skala/src/skala/pyscf/backend.py similarity index 100% rename from src/skala/pyscf/backend.py rename to skala/src/skala/pyscf/backend.py diff --git a/src/skala/pyscf/dft.py b/skala/src/skala/pyscf/dft.py similarity index 97% rename from src/skala/pyscf/dft.py rename to skala/src/skala/pyscf/dft.py index 7673d637..9e7d7ea0 100644 --- a/src/skala/pyscf/dft.py +++ b/skala/src/skala/pyscf/dft.py @@ -110,7 +110,9 @@ def initialize_grids( "SkalaRKS requires skala.pyscf.grids.SkalaGrids, got " f"{type(self.grids).__module__}.{type(self.grids).__name__}" ) - return super().initialize_grids(mol or self.mol, dm) + result = super().initialize_grids(mol or self.mol, dm) + assert isinstance(result, SkalaRKS) + return result def energy_nuc(self) -> float: enuc = float(super().energy_nuc()) @@ -202,7 +204,9 @@ def initialize_grids( "SkalaUKS requires skala.pyscf.grids.SkalaGrids, got " f"{type(self.grids).__module__}.{type(self.grids).__name__}" ) - return super().initialize_grids(mol or self.mol, dm) + result = super().initialize_grids(mol or self.mol, dm) + assert isinstance(result, SkalaUKS) + return result def energy_nuc(self) -> float: enuc = float(super().energy_nuc()) diff --git a/src/skala/pyscf/evaluation.py b/skala/src/skala/pyscf/evaluation.py similarity index 100% rename from src/skala/pyscf/evaluation.py rename to skala/src/skala/pyscf/evaluation.py diff --git a/src/skala/pyscf/feature_math.py b/skala/src/skala/pyscf/feature_math.py similarity index 100% rename from src/skala/pyscf/feature_math.py rename to skala/src/skala/pyscf/feature_math.py diff --git a/src/skala/pyscf/features.py b/skala/src/skala/pyscf/features.py similarity index 100% rename from src/skala/pyscf/features.py rename to skala/src/skala/pyscf/features.py diff --git a/src/skala/pyscf/gradients.py b/skala/src/skala/pyscf/gradients.py similarity index 95% rename from src/skala/pyscf/gradients.py rename to skala/src/skala/pyscf/gradients.py index 59b6090a..091cc071 100644 --- a/src/skala/pyscf/gradients.py +++ b/skala/src/skala/pyscf/gradients.py @@ -274,7 +274,9 @@ def get_veff( nuc_grad_feats=self.nuc_grad_feats, ) self.veff_nuc_grad_.detach_() - return veff.detach_().numpy() + self.get_j(mol, dm) + result = veff.detach_().numpy() + self.get_j(mol, dm) + assert isinstance(result, np.ndarray) + return result def grad_elec( self, @@ -291,13 +293,15 @@ def grad_elec( mo_coeff = self.base.mo_coeff grad = super().grad_elec(mo_energy, mo_coeff, mo_occ, atmlst) - - return grad + (self.veff_nuc_grad_).numpy() + result = grad + (self.veff_nuc_grad_).numpy() + assert isinstance(result, np.ndarray) + return result def grad_nuc( self, mol: gto.Mole | None = None, atmlst: list[int] | None = None ) -> np.ndarray: nuc_g = super().grad_nuc(mol, atmlst) + assert isinstance(nuc_g, np.ndarray) if self.with_dftd3 is None: return nuc_g disp_g = self.with_dftd3.get_gradient() @@ -352,7 +356,9 @@ def get_veff( rdm1=torch.from_numpy(dm), nuc_grad_feats=self.nuc_grad_feats, ) - return veff.detach_().numpy() + self.get_j(mol, dm).sum(0) + result = veff.detach_().numpy() + self.get_j(mol, dm).sum(0) + assert isinstance(result, np.ndarray) + return result def grad_elec( self, @@ -369,13 +375,15 @@ def grad_elec( mo_coeff = self.base.mo_coeff grad = super().grad_elec(mo_energy, mo_coeff, mo_occ, atmlst) - - return grad + (self.veff_nuc_grad_).numpy() + result = grad + (self.veff_nuc_grad_).numpy() + assert isinstance(result, np.ndarray) + return result def grad_nuc( self, mol: gto.Mole | None = None, atmlst: list[int] | None = None ) -> np.ndarray: nuc_g = super().grad_nuc(mol, atmlst) + assert isinstance(nuc_g, np.ndarray) if self.with_dftd3 is None: return nuc_g disp_g = self.with_dftd3.get_gradient() diff --git a/src/skala/pyscf/grids.py b/skala/src/skala/pyscf/grids.py similarity index 95% rename from src/skala/pyscf/grids.py rename to skala/src/skala/pyscf/grids.py index 73a9c5d7..c93e5c77 100644 --- a/src/skala/pyscf/grids.py +++ b/skala/src/skala/pyscf/grids.py @@ -62,7 +62,9 @@ def build( ) -> "SkalaGrids": if sort_grids: LOG.debug("sorted grids not supported, forcing unsorted grids") - return super().build(mol, with_non0tab, sort_grids=False, **kwargs) + result = super().build(mol, with_non0tab, sort_grids=False, **kwargs) + assert isinstance(result, SkalaGrids) + return result def prepare_spatial_grid_layout( self, diff --git a/src/skala/pyscf/memory_estimators.py b/skala/src/skala/pyscf/memory_estimators.py similarity index 100% rename from src/skala/pyscf/memory_estimators.py rename to skala/src/skala/pyscf/memory_estimators.py diff --git a/src/skala/pyscf/model_chunking.py b/skala/src/skala/pyscf/model_chunking.py similarity index 100% rename from src/skala/pyscf/model_chunking.py rename to skala/src/skala/pyscf/model_chunking.py diff --git a/src/skala/pyscf/numint.py b/skala/src/skala/pyscf/numint.py similarity index 100% rename from src/skala/pyscf/numint.py rename to skala/src/skala/pyscf/numint.py diff --git a/src/skala/pyscf/retry.py b/skala/src/skala/pyscf/retry.py similarity index 100% rename from src/skala/pyscf/retry.py rename to skala/src/skala/pyscf/retry.py diff --git a/src/skala/pyscf/spatial_grid_layout.py b/skala/src/skala/pyscf/spatial_grid_layout.py similarity index 97% rename from src/skala/pyscf/spatial_grid_layout.py rename to skala/src/skala/pyscf/spatial_grid_layout.py index 326bb80b..69cfb057 100644 --- a/src/skala/pyscf/spatial_grid_layout.py +++ b/skala/src/skala/pyscf/spatial_grid_layout.py @@ -83,7 +83,9 @@ def split_projections(indices: np.ndarray[D1, I64]) -> np.ndarray: largest_component = int(np.argmax(np.abs(principal_direction))) if principal_direction[largest_component] < 0: principal_direction = -principal_direction - return centered_coords @ principal_direction + result = centered_coords @ principal_direction + assert isinstance(result, np.ndarray) + return result def partition(indices: np.ndarray[D1, I64]) -> list[np.ndarray[D1, I64]]: if indices.size <= block_size: diff --git a/src/skala/pyscf/utils.py b/skala/src/skala/pyscf/utils.py similarity index 100% rename from src/skala/pyscf/utils.py rename to skala/src/skala/pyscf/utils.py diff --git a/src/skala/pyscf/xc_integrator.py b/skala/src/skala/pyscf/xc_integrator.py similarity index 99% rename from src/skala/pyscf/xc_integrator.py rename to skala/src/skala/pyscf/xc_integrator.py index 4f5da467..75bee4c8 100644 --- a/src/skala/pyscf/xc_integrator.py +++ b/skala/src/skala/pyscf/xc_integrator.py @@ -30,7 +30,9 @@ def _should_screen_aos(mol: gto.Mole) -> bool: """Return whether PySCF's sparse-contraction crossover is exceeded.""" # we use a smaller threshold because for MetaGGAs the AO evaluation is more expensive - return 2 * mol.nao_nr() > pyscf_numint.SWITCH_SIZE + result = (2 * mol.nao_nr()) > pyscf_numint.SWITCH_SIZE + assert isinstance(result, bool) + return result def _assert_skala_grid(grids: Grid, device: torch.device) -> TypeGuard["_SkalaGrid"]: diff --git a/src/skala/typing.py b/skala/src/skala/typing.py similarity index 100% rename from src/skala/typing.py rename to skala/src/skala/typing.py diff --git a/src/skala/utils/__init__.py b/skala/src/skala/utils/__init__.py similarity index 100% rename from src/skala/utils/__init__.py rename to skala/src/skala/utils/__init__.py diff --git a/src/skala/utils/torch_allocator.py b/skala/src/skala/utils/torch_allocator.py similarity index 100% rename from src/skala/utils/torch_allocator.py rename to skala/src/skala/utils/torch_allocator.py diff --git a/tests/__init__.py b/skala/tests/__init__.py similarity index 100% rename from tests/__init__.py rename to skala/tests/__init__.py diff --git a/tests/ridders.py b/skala/tests/ridders.py similarity index 100% rename from tests/ridders.py rename to skala/tests/ridders.py diff --git a/tests/test_ao_screening.py b/skala/tests/test_ao_screening.py similarity index 99% rename from tests/test_ao_screening.py rename to skala/tests/test_ao_screening.py index d3b0387a..ee2068d5 100644 --- a/tests/test_ao_screening.py +++ b/skala/tests/test_ao_screening.py @@ -6,7 +6,6 @@ import pytest import torch from pyscf import dft, gto - from skala.features import Feature, FeatureMap from skala.functional.base import ExcFunctionalBase from skala.pyscf import ao_evaluation as ao_evaluation_module @@ -34,6 +33,7 @@ ) from skala.pyscf.xc_integrator import XCIntegrator from skala.typing import F64 + from tests.utils import QuadraticFunctional, force_ao_screening _NumPyNumInt: TypeAlias = SkalaNumInt[np.ndarray[Any, F64]] @@ -97,11 +97,13 @@ def test_mgga_supported_features_are_linear_in_density_matrix( )[1] def first_jvp(value: torch.Tensor) -> torch.Tensor: - return torch.func.jvp( + result = torch.func.jvp( lambda inner: feature_function(inner, ao), (value,), (tangent,), )[1] + assert isinstance(result, torch.Tensor) + return result second_jvp = torch.func.jvp( first_jvp, @@ -703,7 +705,9 @@ def evaluate(value: torch.Tensor) -> torch.Tensor: torch.testing.assert_close(feature_tangent, evaluate(tangent)) def first_jvp(value: torch.Tensor) -> torch.Tensor: - return torch.func.jvp(evaluate, (value,), (tangent,))[1] + result = torch.func.jvp(evaluate, (value,), (tangent,))[1] + assert isinstance(result, torch.Tensor) + return result second_jvp = torch.func.jvp(first_jvp, (dm,), (torch.ones_like(dm),))[1] torch.testing.assert_close(second_jvp, torch.zeros_like(features)) @@ -1158,7 +1162,9 @@ def counting_apply(*args: object) -> torch.Tensor: backward_calls += 1 else: forward_calls += 1 - return original_apply(*args) # type: ignore[no-untyped-call] + result = original_apply(*args) # type: ignore[no-untyped-call] + assert isinstance(result, torch.Tensor) + return result monkeypatch.setattr( ao_evaluation_module._BlockwiseAOFeatureOperator, diff --git a/tests/test_ao_screening_benchmark.py b/skala/tests/test_ao_screening_benchmark.py similarity index 99% rename from tests/test_ao_screening_benchmark.py rename to skala/tests/test_ao_screening_benchmark.py index c631b109..c571aff2 100644 --- a/tests/test_ao_screening_benchmark.py +++ b/skala/tests/test_ao_screening_benchmark.py @@ -20,13 +20,13 @@ import torch from pyscf import dft, gto, lib from pytest_benchmark.fixture import BenchmarkFixture -from torch.utils.dlpack import from_dlpack - from skala.functional import load_functional from skala.functional.base import ExcFunctionalBase from skala.pyscf.grids import SkalaGrids from skala.pyscf.numint import SkalaNumInt -from tests.utils import force_ao_screening, require_gpu +from torch.utils.dlpack import from_dlpack + +from .utils import force_ao_screening, require_gpu THREAD_COUNT = 4 MAX_MEMORY_MB = 2000 @@ -152,7 +152,6 @@ def _make_benchmark_case( synchronize: Callable[[], None] = lambda: None # noqa: E731 elif backend == "cuda": import cupy - from skala.gpu4pyscf import SkalaKS ks = SkalaKS(mol, xc=functional, with_dftd3=False) diff --git a/tests/test_ase.py b/skala/tests/test_ase.py similarity index 99% rename from tests/test_ase.py rename to skala/tests/test_ase.py index 53a568f0..acfeae0d 100644 --- a/tests/test_ase.py +++ b/skala/tests/test_ase.py @@ -5,7 +5,6 @@ from ase.build import molecule from ase.calculators import calculator - from skala.ase import Skala diff --git a/tests/test_backend.py b/skala/tests/test_backend.py similarity index 99% rename from tests/test_backend.py rename to skala/tests/test_backend.py index e3f35180..7f48e631 100644 --- a/tests/test_backend.py +++ b/skala/tests/test_backend.py @@ -2,7 +2,6 @@ import numpy as np import pytest - from skala.pyscf.backend import from_numpy_or_cupy diff --git a/tests/test_build_release.py b/skala/tests/test_build_release.py similarity index 96% rename from tests/test_build_release.py rename to skala/tests/test_build_release.py index b0e4e38b..6a886b22 100644 --- a/tests/test_build_release.py +++ b/skala/tests/test_build_release.py @@ -7,7 +7,7 @@ import pytest from tools import build_release -REPOSITORY = Path(__file__).resolve().parents[1] +REPOSITORY = Path(__file__).resolve().parents[2] @pytest.mark.parametrize( @@ -30,7 +30,7 @@ def test_render_compatibility_pyproject( assert module == module_name assert project["name"] == package - assert project["version"] == build_release.project_version(REPOSITORY) + assert project["version"] == build_release.project_version(REPOSITORY / "skala") assert project["dependencies"] == [ f"skala=={project['version']}", *dependencies, diff --git a/tests/test_download_model.py b/skala/tests/test_download_model.py similarity index 98% rename from tests/test_download_model.py rename to skala/tests/test_download_model.py index 029a056c..aaf8f288 100644 --- a/tests/test_download_model.py +++ b/skala/tests/test_download_model.py @@ -17,15 +17,15 @@ from typing import cast import pytest -import torch - import skala.functional as functional_module +import torch from skala.functional import FunctionalArtifact, resolve_functional_artifact from skala.functional._hashes import KNOWN_HASHES from skala.functional.load import TracedFunctional _SCRIPT_PATH = ( - Path(__file__).resolve().parents[1] + Path(__file__).resolve().parents[2] + / "model" / "examples" / "cpp" / "cpp_integration" diff --git a/tests/test_enhancement_factor.py b/skala/tests/test_enhancement_factor.py similarity index 99% rename from tests/test_enhancement_factor.py rename to skala/tests/test_enhancement_factor.py index 90e329c1..a808a8b6 100644 --- a/tests/test_enhancement_factor.py +++ b/skala/tests/test_enhancement_factor.py @@ -1,7 +1,6 @@ # SPDX-License-Identifier: MIT import torch - from skala.functional.base import spin_symmetrized_enhancement_factor diff --git a/tests/test_evaluation.py b/skala/tests/test_evaluation.py similarity index 99% rename from tests/test_evaluation.py rename to skala/tests/test_evaluation.py index 93d0fe53..6ec89daf 100644 --- a/tests/test_evaluation.py +++ b/skala/tests/test_evaluation.py @@ -1,7 +1,6 @@ from dataclasses import FrozenInstanceError import pytest - from skala.features import Feature from skala.pyscf.evaluation import EvaluationPolicy, FeatureSpec diff --git a/tests/test_gpu4pyscf_ao_screening.py b/skala/tests/test_gpu4pyscf_ao_screening.py similarity index 100% rename from tests/test_gpu4pyscf_ao_screening.py rename to skala/tests/test_gpu4pyscf_ao_screening.py diff --git a/tests/test_gpu4pyscf_classes.py b/skala/tests/test_gpu4pyscf_classes.py similarity index 92% rename from tests/test_gpu4pyscf_classes.py rename to skala/tests/test_gpu4pyscf_classes.py index 7363ce64..c9d5cd28 100644 --- a/tests/test_gpu4pyscf_classes.py +++ b/skala/tests/test_gpu4pyscf_classes.py @@ -1,4 +1,5 @@ from collections.abc import Callable +from typing import cast import numpy as np import pytest @@ -24,33 +25,36 @@ def skala_xc( load_functional_cached: Callable[..., ExcFunctionalBase | str], ) -> ExcFunctionalBase: """Load the Skala functional under test on GPU.""" - func = load_functional_cached(request.param, device=torch.device("cuda:0")) + func = load_functional_cached( + cast(str, request.param), device=torch.device("cuda:0") + ) assert isinstance(func, ExcFunctionalBase) return func @pytest.fixture(params=["H", "H2"]) def mol(request: pytest.FixtureRequest) -> gto.Mole: - if request.param == "H": + molecule = cast(str, request.param) + if molecule == "H": return gto.M(atom="H", basis="sto-3g", spin=1) - if request.param == "H2": + if molecule == "H2": return gto.M(atom="H 0 0 0; H 0 0 0.74", basis="sto-3g") - raise ValueError(f"Unknown molecule: {request.param}") + raise ValueError(f"Unknown molecule: {molecule}") @pytest.fixture(params=["dfj", "no df"]) def with_density_fit(request: pytest.FixtureRequest) -> bool: - return request.param == "dfj" + return cast(str, request.param) == "dfj" @pytest.fixture(params=["soscf", "scf"]) def with_newton(request: pytest.FixtureRequest) -> bool: - return request.param == "soscf" + return cast(str, request.param) == "soscf" @pytest.fixture(params=["d3", "no d3"]) def with_dftd3(request: pytest.FixtureRequest) -> bool: - return request.param == "d3" + return cast(str, request.param) == "d3" def test_skala_class( diff --git a/tests/test_gpu4pyscf_gradients.py b/skala/tests/test_gpu4pyscf_gradients.py similarity index 99% rename from tests/test_gpu4pyscf_gradients.py rename to skala/tests/test_gpu4pyscf_gradients.py index 7951f611..7df96ac3 100644 --- a/tests/test_gpu4pyscf_gradients.py +++ b/skala/tests/test_gpu4pyscf_gradients.py @@ -1,5 +1,5 @@ from collections.abc import Callable -from typing import Any +from typing import Any, cast import pytest import torch @@ -14,7 +14,6 @@ from gpu4pyscf import dft, scf # noqa: E402 from pyscf import gto # noqa: E402 - from skala.features import Feature, FeatureMap # noqa: E402 from skala.functional.base import ExcFunctionalBase # noqa: E402 from skala.gpu4pyscf import SkalaKS # noqa: E402 @@ -28,6 +27,7 @@ from skala.pyscf.features import generate_features # noqa: E402 from skala.pyscf.gradients import SkalaRKSGradient as CpuSkalaRKSGradient # noqa: E402 from skala.utils import torch_allocator # noqa: E402 + from tests.ridders import num_grad_ridders # noqa: E402 H2_SKALA_1_1_GRAD_REF = torch.tensor( @@ -115,7 +115,7 @@ def fail_if_called(mem_ptr: int) -> None: @pytest.fixture(params=["HF", "H2O", "H2O+"]) def mol_name(request: pytest.FixtureRequest) -> str: - return request.param + return cast(str, request.param) def get_mol(molname: str) -> gto.Mole: @@ -453,7 +453,7 @@ def run_scf( ] ) def xc_name(request: pytest.FixtureRequest) -> str: - return request.param + return cast(str, request.param) def mol_min_bas(molname: str) -> gto.Mole: diff --git a/tests/test_hash_pinning.py b/skala/tests/test_hash_pinning.py similarity index 96% rename from tests/test_hash_pinning.py rename to skala/tests/test_hash_pinning.py index c91bd31d..19f7ad4e 100644 --- a/tests/test_hash_pinning.py +++ b/skala/tests/test_hash_pinning.py @@ -10,7 +10,6 @@ import pytest import torch - from skala.functional.load import TracedFunctional @@ -34,7 +33,7 @@ def get_exc(self, data: dict[str, torch.Tensor]) -> torch.Tensor: "protocol_version": json.dumps(2).encode(), } buf = io.BytesIO() - torch.jit.save(scripted, buf, _extra_files=extra_files) # type: ignore[no-untyped-call] + torch.jit.save(scripted, buf, _extra_files=extra_files) return buf.getvalue() diff --git a/tests/test_memory_estimators.py b/skala/tests/test_memory_estimators.py similarity index 99% rename from tests/test_memory_estimators.py rename to skala/tests/test_memory_estimators.py index e0a92655..d7088f32 100644 --- a/tests/test_memory_estimators.py +++ b/skala/tests/test_memory_estimators.py @@ -1,6 +1,5 @@ import pytest import torch - from skala.pyscf.memory_estimators import ( estimate_global_raw_feature_buffer_memory, estimate_global_screened_buffer_memory, diff --git a/tests/test_model_chunking.py b/skala/tests/test_model_chunking.py similarity index 99% rename from tests/test_model_chunking.py rename to skala/tests/test_model_chunking.py index 8b2b39c7..0fdf05e3 100644 --- a/tests/test_model_chunking.py +++ b/skala/tests/test_model_chunking.py @@ -5,7 +5,6 @@ import pytest import torch from pyscf import gto - from skala.features import Feature, FeatureMap from skala.pyscf import model_chunking from skala.pyscf.backend import Grid diff --git a/tests/test_pyscf_classes.py b/skala/tests/test_pyscf_classes.py similarity index 93% rename from tests/test_pyscf_classes.py rename to skala/tests/test_pyscf_classes.py index ee2335b8..c1a9fc79 100644 --- a/tests/test_pyscf_classes.py +++ b/skala/tests/test_pyscf_classes.py @@ -1,9 +1,9 @@ from collections.abc import Callable +from typing import cast import numpy as np import pytest from pyscf import dft, gto - from skala.functional.base import ExcFunctionalBase from skala.pyscf import SkalaKS from skala.pyscf.dft import SkalaRKS, SkalaUKS @@ -17,33 +17,34 @@ def skala_xc( load_functional_cached: Callable[..., ExcFunctionalBase | str], ) -> ExcFunctionalBase: """Load the Skala functional under test.""" - func = load_functional_cached(request.param) + func = load_functional_cached(cast(str, request.param)) assert isinstance(func, ExcFunctionalBase) return func @pytest.fixture(params=["H", "H2"]) def mol(request: pytest.FixtureRequest) -> gto.Mole: - if request.param == "H": + molecule = cast(str, request.param) + if molecule == "H": return gto.M(atom="H", basis="sto-3g", spin=1) - if request.param == "H2": + if molecule == "H2": return gto.M(atom="H 0 0 0; H 0 0 0.74", basis="sto-3g") - raise ValueError(f"Unknown molecule: {request.param}") + raise ValueError(f"Unknown molecule: {molecule}") @pytest.fixture(params=["dfj", "no df"]) def with_density_fit(request: pytest.FixtureRequest) -> bool: - return request.param == "dfj" + return cast(str, request.param) == "dfj" @pytest.fixture(params=["soscf", "scf"]) def with_newton(request: pytest.FixtureRequest) -> bool: - return request.param == "soscf" + return cast(str, request.param) == "soscf" @pytest.fixture(params=["d3", "no d3"]) def with_dftd3(request: pytest.FixtureRequest) -> bool: - return request.param == "d3" + return cast(str, request.param) == "d3" def test_skala_class( diff --git a/tests/test_pyscf_gradients.py b/skala/tests/test_pyscf_gradients.py similarity index 99% rename from tests/test_pyscf_gradients.py rename to skala/tests/test_pyscf_gradients.py index bd916275..706cf650 100644 --- a/tests/test_pyscf_gradients.py +++ b/skala/tests/test_pyscf_gradients.py @@ -1,9 +1,9 @@ from collections.abc import Callable +from typing import cast import pytest import torch from pyscf import dft, gto, scf - from skala.features import Feature, FeatureMap from skala.functional.base import ExcFunctionalBase from skala.pyscf import SkalaKS @@ -13,13 +13,14 @@ SkalaUKSGradient, veff_and_expl_nuc_grad, ) + from tests.ridders import num_grad_ridders from tests.utils import FULL_GRAD_REF @pytest.fixture(params=["HF", "H2O", "H2O+"]) def mol_name(request: pytest.FixtureRequest) -> str: - return request.param + return cast(str, request.param) def get_mol(molname: str) -> gto.Mole: @@ -366,7 +367,7 @@ def run_scf( @pytest.fixture(params=["pbe", "skala-1.0", "skala-1.1"]) def xc_name(request: pytest.FixtureRequest) -> str: - return request.param + return cast(str, request.param) def mol_min_bas(mol_name: str) -> gto.Mole: diff --git a/tests/test_scf_retry.py b/skala/tests/test_scf_retry.py similarity index 99% rename from tests/test_scf_retry.py rename to skala/tests/test_scf_retry.py index 55035ed0..1ff2d64f 100644 --- a/tests/test_scf_retry.py +++ b/skala/tests/test_scf_retry.py @@ -3,7 +3,6 @@ import pytest from pyscf import dft, gto from pyscf.soscf.newton_ah import _CIAH_SOSCF - from skala.pyscf.retry import retry_scf SCF_CONFIG = { diff --git a/tests/test_traditional.py b/skala/tests/test_traditional.py similarity index 94% rename from tests/test_traditional.py rename to skala/tests/test_traditional.py index 55d678dc..d16068fa 100644 --- a/tests/test_traditional.py +++ b/skala/tests/test_traditional.py @@ -1,30 +1,31 @@ # SPDX-License-Identifier: MIT from collections.abc import Callable +from typing import cast import pytest from pyscf import dft, gto from pytest import approx -from torch import nn - from skala.functional import ExcFunctionalBase from skala.pyscf import SkalaKS +from torch import nn @pytest.fixture(params=["HF", "Ar", "H"]) def mol(request: pytest.FixtureRequest) -> gto.Mole: - if request.param == "HF": + molecule = cast(str, request.param) + if molecule == "HF": return gto.M(atom="H 0 0 0; F 0 0 1.1", basis="cc-pvdz") - elif request.param == "Ar": + elif molecule == "Ar": return gto.M(atom="Ar 0 0 0", basis="def2-svp") - elif request.param == "H": + elif molecule == "H": return gto.M(atom="H 0 0 0", basis="cc-pvdz", spin=1) raise AssertionError() @pytest.fixture(params=["lda", "spw92", "pbe", "tpss", "scan", "rscan", "r2scan"]) def xc(request: pytest.FixtureRequest) -> str: - return request.param + return cast(str, request.param) @pytest.fixture diff --git a/tests/test_xc_integrator.py b/skala/tests/test_xc_integrator.py similarity index 100% rename from tests/test_xc_integrator.py rename to skala/tests/test_xc_integrator.py index 5a1e8a71..6a0c4733 100644 --- a/tests/test_xc_integrator.py +++ b/skala/tests/test_xc_integrator.py @@ -1,11 +1,11 @@ import pytest import torch from pyscf import dft, gto - from skala.features import Feature, FeatureMap from skala.pyscf import xc_integrator as xc_integrator_module from skala.pyscf.grids import SkalaGrids from skala.pyscf.xc_integrator import XCIntegrator, XCResult + from tests.utils import QuadraticFunctional, force_ao_screening diff --git a/tests/utils.py b/skala/tests/utils.py similarity index 97% rename from tests/utils.py rename to skala/tests/utils.py index b7ba6de2..f20931cd 100644 --- a/tests/utils.py +++ b/skala/tests/utils.py @@ -7,7 +7,6 @@ import pytest import torch - from skala.features import Feature, FeatureMap from skala.functional.base import ExcFunctionalBase from skala.pyscf import xc_integrator as xc_integrator_module @@ -21,7 +20,9 @@ def require_gpu() -> ModuleType: """ if not torch.cuda.is_available(): pytest.skip("CUDA is not available.", allow_module_level=True) - return pytest.importorskip("cupy", reason="CuPy is not available.") + result = pytest.importorskip("cupy", reason="CuPy is not available.") + assert isinstance(result, ModuleType) + return result class QuadraticFunctional(ExcFunctionalBase): diff --git a/src/skala/gauxc/__init__.py b/src/skala/gauxc/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tools/build_release.py b/tools/build_release.py index b371de63..4e7a33bf 100644 --- a/tools/build_release.py +++ b/tools/build_release.py @@ -36,7 +36,7 @@ def render_template(template: Path, replacements: dict[str, str]) -> str: def render_compatibility_pyproject(repository: Path, package: str) -> tuple[str, str]: """Render project metadata and return its import package name.""" - version = project_version(repository) + version = project_version(repository / "skala") if package == "microsoft-skala": template = ( repository / ".github" / "workflows" / "pypi" / "microsoft-skala.toml" @@ -56,14 +56,15 @@ def render_compatibility_pyproject(repository: Path, package: str) -> tuple[str, def prepare_source(repository: Path, staging: Path, package: str) -> None: """Create an isolated source tree for one distribution package.""" - shutil.copy2(repository / "README.md", staging / "README.md") - shutil.copy2(repository / "LICENSE.txt", staging / "LICENSE.txt") + runtime = repository / "skala" + shutil.copy2(runtime / "README.md", staging / "README.md") + shutil.copy2(runtime / "LICENSE.txt", staging / "LICENSE.txt") source_root = staging / "src" source_root.mkdir() if package == "skala": - shutil.copy2(repository / "pyproject.toml", staging / "pyproject.toml") - shutil.copytree(repository / "src" / "skala", source_root / "skala") + shutil.copy2(runtime / "pyproject.toml", staging / "pyproject.toml") + shutil.copytree(runtime / "src" / "skala", source_root / "skala") return module_name, rendered = render_compatibility_pyproject(repository, package) diff --git a/tools/check_release_artifacts.py b/tools/check_release_artifacts.py new file mode 100644 index 00000000..84516dc4 --- /dev/null +++ b/tools/check_release_artifacts.py @@ -0,0 +1,121 @@ +from __future__ import annotations + +import argparse +import tarfile +import zipfile +from collections.abc import Iterable +from pathlib import Path, PurePosixPath + +PACKAGES = ("skala", "microsoft-skala", "skala-cuda12x", "skala-cuda13x") + +FORBIDDEN_PARTS = {"tests", "model", "gauxc", "docs", "examples", "benchmark"} +FORBIDDEN_RUNTIME_PATHS = { + PurePosixPath("skala/functional/layers.py"), + PurePosixPath("skala/functional/model.py"), +} +REQUIRED_RUNTIME_PATHS = { + PurePosixPath("skala/__init__.py"), + PurePosixPath("skala/ase/__init__.py"), + PurePosixPath("skala/functional/load.py"), + PurePosixPath("skala/gpu4pyscf/__init__.py"), + PurePosixPath("skala/py.typed"), + PurePosixPath("skala/pyscf/__init__.py"), +} + + +def archive_paths(artifact: Path) -> set[PurePosixPath]: + """Return normalized member paths from one wheel or source archive.""" + if artifact.suffix == ".whl": + with zipfile.ZipFile(artifact) as archive: + return { + PurePosixPath(name) + for name in archive.namelist() + if not name.endswith("/") + } + + if artifact.name.endswith(".tar.gz"): + with tarfile.open(artifact, "r:gz") as archive: + members = { + PurePosixPath(member.name) + for member in archive.getmembers() + if member.isfile() + } + return { + PurePosixPath(*member.parts[1:]) + for member in members + if len(member.parts) > 1 + } + + raise ValueError(f"Unsupported release artifact: {artifact}") + + +def assert_no_forbidden_paths(paths: Iterable[PurePosixPath], artifact: Path) -> None: + """Reject component source that is not part of the runtime release.""" + forbidden = { + path + for path in paths + if FORBIDDEN_PARTS.intersection(path.parts) or path in FORBIDDEN_RUNTIME_PATHS + } + if forbidden: + members = "\n".join(f" - {path}" for path in sorted(forbidden)) + raise ValueError(f"Forbidden members in {artifact}:\n{members}") + + +def validate_artifact(artifact: Path, package: str) -> None: + """Validate one built artifact for the selected distribution.""" + paths = archive_paths(artifact) + assert_no_forbidden_paths(paths, artifact) + + if package == "skala": + source_prefix = ( + PurePosixPath("src") if artifact.name.endswith(".tar.gz") else None + ) + required = { + source_prefix / path if source_prefix is not None else path + for path in REQUIRED_RUNTIME_PATHS + } + else: + module = "microsoft_skala" if package == "microsoft-skala" else "skala_cuda" + prefix = ( + PurePosixPath("src") + if artifact.name.endswith(".tar.gz") + else PurePosixPath() + ) + required = {prefix / module / "__init__.py", prefix / module / "py.typed"} + + missing = required - paths + if missing: + members = "\n".join(f" - {path}" for path in sorted(missing)) + raise ValueError(f"Required members missing from {artifact}:\n{members}") + + +def matching_artifacts(directory: Path, package: str) -> list[Path]: + """Find the wheel and sdist produced for one distribution.""" + normalized = package.replace("-", "_") + artifacts = sorted( + path + for path in directory.iterdir() + if path.name.startswith((package, normalized)) + and (path.suffix == ".whl" or path.name.endswith(".tar.gz")) + ) + if not any(path.suffix == ".whl" for path in artifacts): + raise ValueError(f"No wheel found for {package} in {directory}") + if not any(path.name.endswith(".tar.gz") for path in artifacts): + raise ValueError(f"No sdist found for {package} in {directory}") + return artifacts + + +def main() -> None: + """Validate release artifacts from the command line.""" + parser = argparse.ArgumentParser() + parser.add_argument("package", choices=PACKAGES) + parser.add_argument("--dist-dir", type=Path, default=Path("dist")) + args = parser.parse_args() + + for artifact in matching_artifacts(args.dist_dir.resolve(), args.package): + validate_artifact(artifact, args.package) + print(f"validated {artifact}") + + +if __name__ == "__main__": + main() From 616e1976fd242a9a3dbeccd4393c20d0be7b5aed Mon Sep 17 00:00:00 2001 From: jenswehner Date: Wed, 26 Aug 2026 15:46:29 +0200 Subject: [PATCH 2/9] use smaller runners, make dispersion handling easier, add more documentation --- .github/workflows/model-benchmark.yml | 2 +- .github/workflows/test.yml | 13 +++-- skala/README.md | 7 --- skala/src/skala/dispersion.py | 78 +++++++++++++++++---------- skala/tests/test_build_release.py | 36 ++++++++++++- tools/check_release_artifacts.py | 9 +++- 6 files changed, 100 insertions(+), 45 deletions(-) diff --git a/.github/workflows/model-benchmark.yml b/.github/workflows/model-benchmark.yml index 322b2781..ccc881ed 100644 --- a/.github/workflows/model-benchmark.yml +++ b/.github/workflows/model-benchmark.yml @@ -52,7 +52,7 @@ jobs: gpu: name: GPU model benchmark - runs-on: microsoft-skala-gpu-pool + runs-on: microsoft-skala-small-gpu-pool env: OMP_NUM_THREADS: 4 MKL_NUM_THREADS: 4 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8d819e6f..7a39858d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -125,7 +125,7 @@ jobs: gauxc/tests/ docs/benchmark/tests/ gpu-test: - runs-on: microsoft-skala-gpu-pool + runs-on: ${{ matrix.runner }} needs: - lint env: @@ -133,10 +133,13 @@ jobs: strategy: fail-fast: false matrix: - environment: - - gpu-cuda12-torch212 - - gpu-cuda12-torch213 - - gpu-cuda13-torch213 + include: + - environment: gpu-cuda12-torch212 + runner: microsoft-skala-small-gpu-pool + - environment: gpu-cuda12-torch213 + runner: microsoft-skala-small-gpu-pool + - environment: gpu-cuda13-torch213 + runner: microsoft-skala-gpu-pool name: "${{ matrix.environment }}" steps: - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 diff --git a/skala/README.md b/skala/README.md index 33820868..377bfa23 100644 --- a/skala/README.md +++ b/skala/README.md @@ -29,13 +29,6 @@ Repository resources include: - [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) -### 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). - ## Getting started: PySCF (CPU) All information below relates to the Python package `skala`. diff --git a/skala/src/skala/dispersion.py b/skala/src/skala/dispersion.py index f556b7f1..c1cb387e 100644 --- a/skala/src/skala/dispersion.py +++ b/skala/src/skala/dispersion.py @@ -1,42 +1,64 @@ """Cross-platform DFT-D3 backend compatibility.""" -import sys -from importlib import import_module -from typing import Any +from __future__ import annotations + +from typing import Self import numpy as np from pyscf import gto -_USE_PYSCF_DISPERSION = sys.platform == "linux" -_backend_module = import_module( - "pyscf.dispersion.dftd3" if _USE_PYSCF_DISPERSION else "dftd3.pyscf" -) - +try: + from pyscf.dispersion.dftd3 import ( # type: ignore[import-not-found, unused-ignore] + DFTD3Dispersion as _PySCFDFTD3Dispersion, + ) -class DFTD3Dispersion: - """Normalize the DFT-D3 APIs available on supported platforms.""" + class DFTD3Dispersion: # pyright: ignore[reportRedeclaration] + """Normalize the PySCF DFT-D3 API.""" - def __init__(self, mol: gto.Mole, xc: str): - self._xc = xc - self._backend: Any = _backend_module.DFTD3Dispersion(mol, xc) + def __init__(self, mol: gto.Mole, xc: str): + self._xc = xc + self._backend = _PySCFDFTD3Dispersion(mol, xc) - def get_energy(self) -> float: - """Return the dispersion energy as a Python scalar.""" - if _USE_PYSCF_DISPERSION: + def get_energy(self) -> float: + """Return the dispersion energy as a Python scalar.""" energy = self._backend.get_dispersion()["energy"] - else: - energy = self._backend.kernel()[0] - return float(np.asarray(energy).item()) + return float(np.asarray(energy).item()) - def get_gradient(self) -> np.ndarray: - """Return the dispersion nuclear gradient.""" - if _USE_PYSCF_DISPERSION: + def get_gradient(self) -> np.ndarray: + """Return the dispersion nuclear gradient.""" gradient = self._backend.get_dispersion(grad=True)["gradient"] - else: + return np.asarray(gradient) + + def reset(self, mol: gto.Mole) -> Self: + """Reset the backend for a new molecular geometry.""" + self._backend = _PySCFDFTD3Dispersion(mol, self._xc) + return self +except ModuleNotFoundError as error: + if error.name not in {"pyscf.dispersion", "pyscf.dispersion.dftd3"}: + raise + + from dftd3.pyscf import ( # type: ignore[import-not-found, unused-ignore] + DFTD3Dispersion as _StandaloneDFTD3Dispersion, + ) + + class DFTD3Dispersion: # type: ignore[no-redef] + """Normalize the standalone DFT-D3 API.""" + + def __init__(self, mol: gto.Mole, xc: str): + self._xc = xc + self._backend = _StandaloneDFTD3Dispersion(mol, xc) + + def get_energy(self) -> float: + """Return the dispersion energy as a Python scalar.""" + energy = self._backend.kernel()[0] + return float(np.asarray(energy).item()) + + def get_gradient(self) -> np.ndarray: + """Return the dispersion nuclear gradient.""" gradient = self._backend.kernel()[1] - return np.asarray(gradient) + return np.asarray(gradient) - def reset(self, mol: gto.Mole) -> "DFTD3Dispersion": - """Reset the backend for a new molecular geometry.""" - self._backend = _backend_module.DFTD3Dispersion(mol, self._xc) - return self + def reset(self, mol: gto.Mole) -> Self: + """Reset the backend for a new molecular geometry.""" + self._backend = _StandaloneDFTD3Dispersion(mol, self._xc) + return self diff --git a/skala/tests/test_build_release.py b/skala/tests/test_build_release.py index 6a886b22..7dfb6f30 100644 --- a/skala/tests/test_build_release.py +++ b/skala/tests/test_build_release.py @@ -1,11 +1,11 @@ from __future__ import annotations import tomllib -from pathlib import Path +from pathlib import Path, PurePosixPath from typing import Any import pytest -from tools import build_release +from tools import build_release, check_release_artifacts REPOSITORY = Path(__file__).resolve().parents[2] @@ -58,3 +58,35 @@ def test_render_template_rejects_invalid_toml(tmp_path: Path) -> None: with pytest.raises(tomllib.TOMLDecodeError): build_release.render_template(template, {}) + + +@pytest.mark.parametrize("filename", ["layers.py", "model.py"]) +def test_sdist_rejects_trainable_runtime_sources(tmp_path: Path, filename: str) -> None: + artifact = tmp_path / "skala-1.0.0.tar.gz" + path = PurePosixPath("src/skala/functional") / filename + + with pytest.raises(ValueError) as exc_info: + check_release_artifacts.assert_no_forbidden_paths({path}, artifact) + + assert str(path) in str(exc_info.value) + + +def test_matching_skala_artifacts_excludes_compatibility_distributions( + tmp_path: Path, +) -> None: + runtime_artifacts = { + "skala-1.0.0-py3-none-any.whl", + "skala-1.0.0.tar.gz", + } + compatibility_artifacts = { + "skala_cuda12x-1.0.0-py3-none-any.whl", + "skala_cuda12x-1.0.0.tar.gz", + "skala_cuda13x-1.0.0-py3-none-any.whl", + "skala_cuda13x-1.0.0.tar.gz", + } + for filename in runtime_artifacts | compatibility_artifacts: + (tmp_path / filename).touch() + + artifacts = check_release_artifacts.matching_artifacts(tmp_path, "skala") + + assert {artifact.name for artifact in artifacts} == runtime_artifacts diff --git a/tools/check_release_artifacts.py b/tools/check_release_artifacts.py index 84516dc4..d5404a26 100644 --- a/tools/check_release_artifacts.py +++ b/tools/check_release_artifacts.py @@ -1,3 +1,5 @@ +"""Validate built release artifacts for expected and forbidden package contents.""" + from __future__ import annotations import argparse @@ -54,7 +56,9 @@ def assert_no_forbidden_paths(paths: Iterable[PurePosixPath], artifact: Path) -> forbidden = { path for path in paths - if FORBIDDEN_PARTS.intersection(path.parts) or path in FORBIDDEN_RUNTIME_PATHS + if FORBIDDEN_PARTS.intersection(path.parts) + or PurePosixPath(*path.parts[1:] if path.parts[:1] == ("src",) else path.parts) + in FORBIDDEN_RUNTIME_PATHS } if forbidden: members = "\n".join(f" - {path}" for path in sorted(forbidden)) @@ -92,10 +96,11 @@ def validate_artifact(artifact: Path, package: str) -> None: def matching_artifacts(directory: Path, package: str) -> list[Path]: """Find the wheel and sdist produced for one distribution.""" normalized = package.replace("-", "_") + prefixes = (f"{package}-", f"{normalized}-") artifacts = sorted( path for path in directory.iterdir() - if path.name.startswith((package, normalized)) + if path.name.startswith(prefixes) and (path.suffix == ".whl" or path.name.endswith(".tar.gz")) ) if not any(path.suffix == ".whl" for path in artifacts): From 281a56c29358240495aab4eea6514cb6c66e5f47 Mon Sep 17 00:00:00 2001 From: jenswehner Date: Wed, 26 Aug 2026 16:06:54 +0200 Subject: [PATCH 3/9] make model and benchmark python packages --- docs/benchmark/README.md | 8 ++++ docs/benchmark/pyproject.toml | 36 +++++++++++++++ docs/benchmark/src/skala_benchmark/README.md | 4 -- model/README.md | 9 ++++ model/pyproject.toml | 26 +++++++++++ pixi.lock | 46 ++++++++++++++++++++ pixi.toml | 8 +++- pyproject.toml | 2 +- 8 files changed, 133 insertions(+), 6 deletions(-) create mode 100644 docs/benchmark/README.md create mode 100644 docs/benchmark/pyproject.toml delete mode 100644 docs/benchmark/src/skala_benchmark/README.md create mode 100644 model/README.md create mode 100644 model/pyproject.toml diff --git a/docs/benchmark/README.md b/docs/benchmark/README.md new file mode 100644 index 00000000..369d32c1 --- /dev/null +++ b/docs/benchmark/README.md @@ -0,0 +1,8 @@ +# Skala benchmark + +This package runs Skala DFT benchmarks, collects their measurements, and generates offline reports. +The default Pixi environment installs it as an editable package and provides the `skala-benchmark` +command. + +See the [benchmark documentation](../site/benchmarks.rst) for dataset setup, benchmark execution, +result collection, and report generation. \ No newline at end of file diff --git a/docs/benchmark/pyproject.toml b/docs/benchmark/pyproject.toml new file mode 100644 index 00000000..ec6fa942 --- /dev/null +++ b/docs/benchmark/pyproject.toml @@ -0,0 +1,36 @@ +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[project] +name = "skala-benchmark" +version = "2026.9" +description = "Benchmark runner and report generator for Skala" +readme = "README.md" +requires-python = ">=3.11,<3.14" +dependencies = [ + "jinja2", + "markdown-it-py", + "markupsafe", + "numpy", + "pandas", + "pyarrow", + "pyscf>=2.14,<2.15", + "pyyaml", + "scipy", + "skala>=2026.9,<2027", + "torch>=2.12,<2.14", +] + +[project.scripts] +skala-benchmark = "skala_benchmark.__main__:main" + +[tool.hatch.build.targets.wheel] +packages = ["src/skala_benchmark"] + +[tool.hatch.build.targets.sdist] +include = [ + "/README.md", + "/pyproject.toml", + "/src/skala_benchmark", +] \ No newline at end of file diff --git a/docs/benchmark/src/skala_benchmark/README.md b/docs/benchmark/src/skala_benchmark/README.md deleted file mode 100644 index 4d2bb8b8..00000000 --- a/docs/benchmark/src/skala_benchmark/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# Benchmark documentation - -User instructions for running, collecting, and comparing benchmark timings live in -[`docs/site/benchmarks.rst`](../../../site/benchmarks.rst). diff --git a/model/README.md b/model/README.md new file mode 100644 index 00000000..485829b5 --- /dev/null +++ b/model/README.md @@ -0,0 +1,9 @@ +# Skala model + +This package contains the trainable model definition used to document and test the architecture +behind Skala's published traced model checkpoints. + +Before proposing model changes, read the +[model development guidance](../CONTRIBUTING.md#model-development). It explains how this source +relates to the published checkpoints and describes the additional compatibility and performance +testing expected for model contributions. \ No newline at end of file diff --git a/model/pyproject.toml b/model/pyproject.toml new file mode 100644 index 00000000..a57857b8 --- /dev/null +++ b/model/pyproject.toml @@ -0,0 +1,26 @@ +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[project] +name = "skala-model" +version = "2026.9" +description = "Trainable model definition for the Skala exchange-correlation functional" +readme = "README.md" +requires-python = ">=3.11,<3.14" +dependencies = [ + "e3nn", + "opt_einsum_fx", + "skala>=2026.9,<2027", + "torch>=2.12,<2.14", +] + +[tool.hatch.build.targets.wheel] +packages = ["src/skala_model"] + +[tool.hatch.build.targets.sdist] +include = [ + "/README.md", + "/pyproject.toml", + "/src/skala_model", +] \ No newline at end of file diff --git a/pixi.lock b/pixi.lock index f1edd318..8cbba822 100644 --- a/pixi.lock +++ b/pixi.lock @@ -265,6 +265,7 @@ environments: - 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 @@ -441,6 +442,7 @@ environments: - 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 @@ -708,6 +710,8 @@ environments: - 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: ./docs/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 @@ -956,6 +960,8 @@ environments: - 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: ./docs/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 @@ -1198,6 +1204,8 @@ environments: - 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: ./docs/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 @@ -1491,6 +1499,7 @@ environments: - 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: ./docs/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 @@ -3088,6 +3097,8 @@ environments: - 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: ./docs/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 @@ -3353,6 +3364,8 @@ environments: - 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: ./docs/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 @@ -3618,6 +3631,8 @@ environments: - 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: ./docs/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 @@ -3890,6 +3905,8 @@ environments: - 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: ./docs/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 @@ -4332,6 +4349,7 @@ environments: - 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: ./docs/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 @@ -4546,6 +4564,7 @@ environments: - 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: ./docs/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 @@ -4756,6 +4775,7 @@ environments: - 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: ./docs/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 @@ -4994,6 +5014,7 @@ environments: - 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: ./docs/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 @@ -5208,6 +5229,7 @@ environments: - 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: ./docs/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 @@ -5418,6 +5440,7 @@ environments: - 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: ./docs/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 @@ -19592,6 +19615,29 @@ packages: - zstd >=1.5.7,<1.6.0a0 size: 433687 timestamp: 1786599629846 +- pypi: ./docs/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: diff --git a/pixi.toml b/pixi.toml index e0b8d31c..1709f701 100644 --- a/pixi.toml +++ b/pixi.toml @@ -27,11 +27,14 @@ skala = { path = "skala", editable = true } e3nn = "*" 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/model/src:$PIXI_PROJECT_ROOT/gauxc/src:$PIXI_PROJECT_ROOT/docs/benchmark/src" +PYTHONPATH = "$PIXI_PROJECT_ROOT/gauxc/src" [feature.model-assets.dependencies] huggingface_hub = "*" @@ -131,6 +134,9 @@ pyarrow = "*" pyyaml = "*" scipy = "*" +[feature.benchmark.pypi-dependencies] +skala-benchmark = { path = "docs/benchmark", editable = true } + [feature.docs.dependencies] ipywidgets = "*" myst-nb = "*" diff --git a/pyproject.toml b/pyproject.toml index ce7615a9..8f8797ef 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -52,7 +52,7 @@ line-length = 100 [tool.pytest.ini_options] timeout = 300 addopts = "-m 'not profiling and not benchmark and not model_benchmark'" -pythonpath = [".", "skala/src", "model/src", "gauxc/src", "docs/benchmark/src"] +pythonpath = [".", "skala/src", "gauxc/src"] testpaths = ["skala/tests", "model/tests", "gauxc/tests", "docs/benchmark/tests"] markers = [ "benchmark: performance measurements collected by pytest-benchmark", From ea8f3ff304820dedce2959c7488fc08da505ff21 Mon Sep 17 00:00:00 2001 From: jenswehner Date: Wed, 26 Aug 2026 16:12:05 +0200 Subject: [PATCH 4/9] simplifiy mypy precommit --- .pre-commit-config.yaml | 40 ++-------------------------------------- pyproject.toml | 3 ++- 2 files changed, 4 insertions(+), 39 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 69ef6f21..68fdea89 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -18,8 +18,8 @@ repos: - repo: local hooks: - - id: mypy-skala - name: mypy (Skala runtime) + - id: mypy + name: mypy entry: mypy language: system args: @@ -28,44 +28,8 @@ repos: - --num-workers - "4" - skala - pass_filenames: false - always_run: true - - - id: mypy-model - name: mypy (model) - entry: mypy - language: system - args: - - --config-file - - pyproject.toml - - --num-workers - - "4" - model - pass_filenames: false - always_run: true - - - id: mypy-gauxc - name: mypy (GauXC) - entry: mypy - language: system - args: - - --config-file - - pyproject.toml - - --num-workers - - "4" - gauxc - pass_filenames: false - always_run: true - - - id: mypy-docs - name: mypy (documentation) - entry: mypy - language: system - args: - - --config-file - - pyproject.toml - - --num-workers - - "4" - docs pass_filenames: false always_run: true diff --git a/pyproject.toml b/pyproject.toml index 8f8797ef..590c4c0b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,7 @@ [tool.mypy] strict = true -no_namespace_packages = true +explicit_package_bases = true +mypy_path = ["skala/src", "model/src", "gauxc/src", "docs/benchmark/src", "skala", "."] python_version = "3.11" exclude = ["build/", "docs/site/_build/", "htmlcov/", "third_party/"] From 060a16903191d88aab335321abbd80ea64e87c97 Mon Sep 17 00:00:00 2001 From: jenswehner Date: Wed, 26 Aug 2026 16:25:37 +0200 Subject: [PATCH 5/9] move docs/benchmark to benchmark --- .gitattributes | 2 +- .github/workflows/test.yml | 4 +-- .pre-commit-config.yaml | 1 + AGENTS.md | 9 +++--- CONTRIBUTING.md | 2 +- README.md | 5 ++-- {docs/benchmark => benchmark}/README.md | 4 +-- {docs/benchmark => benchmark}/conftest.py | 0 {docs/benchmark => benchmark}/pyproject.toml | 0 .../reference/README.md | 0 .../reference/environments.json | 0 .../reference/fits.json | 0 .../reference/measurements.json | 0 .../reference/prose.yaml | 0 .../src/skala_benchmark/__init__.py | 0 .../src/skala_benchmark/__main__.py | 0 .../src/skala_benchmark/collect_results.py | 0 .../src/skala_benchmark/dataset.py | 0 .../src/skala_benchmark/dataset_sources.csv | 0 .../src/skala_benchmark/fetch.py | 0 .../src/skala_benchmark/fitting.py | 0 .../src/skala_benchmark/metrics.py | 0 .../src/skala_benchmark/models.py | 0 .../src/skala_benchmark/node_info.py | 0 .../src/skala_benchmark/orchestrator.py | 0 .../src/skala_benchmark/protocol.py | 0 .../src/skala_benchmark/report/__init__.py | 0 .../src/skala_benchmark/report/_normalize.py | 0 .../report/assets/report-base.css | 0 .../skala_benchmark/report/assets/report.css | 0 .../skala_benchmark/report/assets/report.js | 0 .../report/assets/vendor/d3.min.js | 0 .../report/assets/vendor/katex.min.js | 0 .../src/skala_benchmark/report/data.py | 0 .../src/skala_benchmark/report/generate.py | 0 .../src/skala_benchmark/report/prose.py | 0 .../report/templates/index.html | 0 .../src/skala_benchmark/runner.py | 0 .../src/skala_benchmark/schema/__init__.py | 0 .../src/skala_benchmark/schema/environment.py | 0 .../skala_benchmark/schema/measurements.py | 0 .../src/skala_benchmark/timing.py | 0 .../benchmark => benchmark}/tests/test_cli.py | 6 ++-- .../tests/test_dataset.py | 0 .../tests/test_docs.py | 2 +- .../tests/test_metrics.py | 0 .../tests/test_orchestrator.py | 0 .../tests/test_report.py | 0 .../tests/test_runner.py | 0 .../tests/test_workflow.py | 0 docs/site/_ext/benchmark_report.py | 4 +-- docs/site/benchmarks.rst | 4 +-- pixi.lock | 30 +++++++++---------- pixi.toml | 2 +- pyproject.toml | 6 ++-- 55 files changed, 42 insertions(+), 39 deletions(-) rename {docs/benchmark => benchmark}/README.md (61%) rename {docs/benchmark => benchmark}/conftest.py (100%) rename {docs/benchmark => benchmark}/pyproject.toml (100%) rename {docs/benchmark => benchmark}/reference/README.md (100%) rename {docs/benchmark => benchmark}/reference/environments.json (100%) rename {docs/benchmark => benchmark}/reference/fits.json (100%) rename {docs/benchmark => benchmark}/reference/measurements.json (100%) rename {docs/benchmark => benchmark}/reference/prose.yaml (100%) rename {docs/benchmark => benchmark}/src/skala_benchmark/__init__.py (100%) rename {docs/benchmark => benchmark}/src/skala_benchmark/__main__.py (100%) rename {docs/benchmark => benchmark}/src/skala_benchmark/collect_results.py (100%) rename {docs/benchmark => benchmark}/src/skala_benchmark/dataset.py (100%) rename {docs/benchmark => benchmark}/src/skala_benchmark/dataset_sources.csv (100%) rename {docs/benchmark => benchmark}/src/skala_benchmark/fetch.py (100%) rename {docs/benchmark => benchmark}/src/skala_benchmark/fitting.py (100%) rename {docs/benchmark => benchmark}/src/skala_benchmark/metrics.py (100%) rename {docs/benchmark => benchmark}/src/skala_benchmark/models.py (100%) rename {docs/benchmark => benchmark}/src/skala_benchmark/node_info.py (100%) rename {docs/benchmark => benchmark}/src/skala_benchmark/orchestrator.py (100%) rename {docs/benchmark => benchmark}/src/skala_benchmark/protocol.py (100%) rename {docs/benchmark => benchmark}/src/skala_benchmark/report/__init__.py (100%) rename {docs/benchmark => benchmark}/src/skala_benchmark/report/_normalize.py (100%) rename {docs/benchmark => benchmark}/src/skala_benchmark/report/assets/report-base.css (100%) rename {docs/benchmark => benchmark}/src/skala_benchmark/report/assets/report.css (100%) rename {docs/benchmark => benchmark}/src/skala_benchmark/report/assets/report.js (100%) rename {docs/benchmark => benchmark}/src/skala_benchmark/report/assets/vendor/d3.min.js (100%) rename {docs/benchmark => benchmark}/src/skala_benchmark/report/assets/vendor/katex.min.js (100%) rename {docs/benchmark => benchmark}/src/skala_benchmark/report/data.py (100%) rename {docs/benchmark => benchmark}/src/skala_benchmark/report/generate.py (100%) rename {docs/benchmark => benchmark}/src/skala_benchmark/report/prose.py (100%) rename {docs/benchmark => benchmark}/src/skala_benchmark/report/templates/index.html (100%) rename {docs/benchmark => benchmark}/src/skala_benchmark/runner.py (100%) rename {docs/benchmark => benchmark}/src/skala_benchmark/schema/__init__.py (100%) rename {docs/benchmark => benchmark}/src/skala_benchmark/schema/environment.py (100%) rename {docs/benchmark => benchmark}/src/skala_benchmark/schema/measurements.py (100%) rename {docs/benchmark => benchmark}/src/skala_benchmark/timing.py (100%) rename {docs/benchmark => benchmark}/tests/test_cli.py (94%) rename {docs/benchmark => benchmark}/tests/test_dataset.py (100%) rename {docs/benchmark => benchmark}/tests/test_docs.py (95%) rename {docs/benchmark => benchmark}/tests/test_metrics.py (100%) rename {docs/benchmark => benchmark}/tests/test_orchestrator.py (100%) rename {docs/benchmark => benchmark}/tests/test_report.py (100%) rename {docs/benchmark => benchmark}/tests/test_runner.py (100%) rename {docs/benchmark => benchmark}/tests/test_workflow.py (100%) diff --git a/.gitattributes b/.gitattributes index 20fabbec..b34f5ea1 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1 @@ -docs/benchmark/reference/measurements.json filter=lfs diff=lfs merge=lfs -text +benchmark/reference/measurements.json filter=lfs diff=lfs merge=lfs -text diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7a39858d..dcf0df3e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -6,7 +6,7 @@ on: paths: &test-paths - '.github/workflows/test.yml' - '.pre-commit-config.yaml' - - 'docs/benchmark/**' + - 'benchmark/**' - 'gauxc/**/*.py' - 'model/**/*.py' - 'pixi.lock' @@ -122,7 +122,7 @@ jobs: - name: Run component unit tests run: >- pytest -v model/tests/test_model.py model/tests/test_utils.py - gauxc/tests/ docs/benchmark/tests/ + gauxc/tests/ benchmark/tests/ gpu-test: runs-on: ${{ matrix.runner }} diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 68fdea89..711eab4e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -30,6 +30,7 @@ repos: - skala - model - gauxc + - benchmark - docs pass_filenames: false always_run: true diff --git a/AGENTS.md b/AGENTS.md index b2df0bc3..905fccef 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -14,7 +14,8 @@ Skala is a neural network-based exchange-correlation (XC) functional for density | `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 | -| `docs/` | Main Sphinx site and benchmark/report tooling | +| `benchmark/` | Benchmark runner, reference data, report tooling, and tests | +| `docs/` | Main Sphinx site | | `.github/workflows/` | CI workflows (test, docs) | ## Development environment @@ -94,12 +95,12 @@ When editing code: | Task | Command | |------|---------| -| Format code | `pixi run -e default ruff format skala/ model/ gauxc/ docs/benchmark/` | +| Format code | `pixi run -e default ruff format skala/ model/ gauxc/ benchmark/ docs/` | | 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/ docs/benchmark/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 docs/site docs/site/_build/html && pixi run -e docs sphinx-build -b html gauxc/docs docs/site/_build/html/gauxc && touch docs/site/_build/html/.nojekyll` | -| Type check | `pixi run -e default mypy skala/src model/src gauxc/src docs/benchmark/src` | +| Type check | `pixi run -e default mypy skala/src model/src gauxc/src benchmark/src` | ## Contact diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index efbd6052..982d167c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -30,7 +30,7 @@ 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/ docs/benchmark/tests/ + model/tests/test_utils.py gauxc/tests/ benchmark/tests/ pixi run -e default pre-commit run --all-files pixi run -e docs sphinx-build -b html docs/site docs/site/_build/html pixi run -e docs sphinx-build -b html gauxc/docs docs/site/_build/html/gauxc diff --git a/README.md b/README.md index e30369c3..1dca0d1c 100644 --- a/README.md +++ b/README.md @@ -15,12 +15,13 @@ Learn more about Skala in our [ArXiv paper](https://arxiv.org/abs/2506.14665). ## What's in here -This repository contains four components: +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. -4. [`docs/`](docs) contains the main Sphinx site and benchmark runner/report tooling. +4. [`benchmark/`](benchmark) contains the benchmark runner, reference data, report tooling, and tests. +5. [`docs/`](docs) contains the main Sphinx site. Compiled-code examples include: - [Skala in C++ with libtorch](model/examples/cpp/cpp_integration) diff --git a/docs/benchmark/README.md b/benchmark/README.md similarity index 61% rename from docs/benchmark/README.md rename to benchmark/README.md index 369d32c1..7a804abd 100644 --- a/docs/benchmark/README.md +++ b/benchmark/README.md @@ -4,5 +4,5 @@ This package runs Skala DFT benchmarks, collects their measurements, and generat The default Pixi environment installs it as an editable package and provides the `skala-benchmark` command. -See the [benchmark documentation](../site/benchmarks.rst) for dataset setup, benchmark execution, -result collection, and report generation. \ No newline at end of file +See the [benchmark documentation](../docs/site/benchmarks.rst) for dataset setup, benchmark +execution, result collection, and report generation. \ No newline at end of file diff --git a/docs/benchmark/conftest.py b/benchmark/conftest.py similarity index 100% rename from docs/benchmark/conftest.py rename to benchmark/conftest.py diff --git a/docs/benchmark/pyproject.toml b/benchmark/pyproject.toml similarity index 100% rename from docs/benchmark/pyproject.toml rename to benchmark/pyproject.toml diff --git a/docs/benchmark/reference/README.md b/benchmark/reference/README.md similarity index 100% rename from docs/benchmark/reference/README.md rename to benchmark/reference/README.md diff --git a/docs/benchmark/reference/environments.json b/benchmark/reference/environments.json similarity index 100% rename from docs/benchmark/reference/environments.json rename to benchmark/reference/environments.json diff --git a/docs/benchmark/reference/fits.json b/benchmark/reference/fits.json similarity index 100% rename from docs/benchmark/reference/fits.json rename to benchmark/reference/fits.json diff --git a/docs/benchmark/reference/measurements.json b/benchmark/reference/measurements.json similarity index 100% rename from docs/benchmark/reference/measurements.json rename to benchmark/reference/measurements.json diff --git a/docs/benchmark/reference/prose.yaml b/benchmark/reference/prose.yaml similarity index 100% rename from docs/benchmark/reference/prose.yaml rename to benchmark/reference/prose.yaml diff --git a/docs/benchmark/src/skala_benchmark/__init__.py b/benchmark/src/skala_benchmark/__init__.py similarity index 100% rename from docs/benchmark/src/skala_benchmark/__init__.py rename to benchmark/src/skala_benchmark/__init__.py diff --git a/docs/benchmark/src/skala_benchmark/__main__.py b/benchmark/src/skala_benchmark/__main__.py similarity index 100% rename from docs/benchmark/src/skala_benchmark/__main__.py rename to benchmark/src/skala_benchmark/__main__.py diff --git a/docs/benchmark/src/skala_benchmark/collect_results.py b/benchmark/src/skala_benchmark/collect_results.py similarity index 100% rename from docs/benchmark/src/skala_benchmark/collect_results.py rename to benchmark/src/skala_benchmark/collect_results.py diff --git a/docs/benchmark/src/skala_benchmark/dataset.py b/benchmark/src/skala_benchmark/dataset.py similarity index 100% rename from docs/benchmark/src/skala_benchmark/dataset.py rename to benchmark/src/skala_benchmark/dataset.py diff --git a/docs/benchmark/src/skala_benchmark/dataset_sources.csv b/benchmark/src/skala_benchmark/dataset_sources.csv similarity index 100% rename from docs/benchmark/src/skala_benchmark/dataset_sources.csv rename to benchmark/src/skala_benchmark/dataset_sources.csv diff --git a/docs/benchmark/src/skala_benchmark/fetch.py b/benchmark/src/skala_benchmark/fetch.py similarity index 100% rename from docs/benchmark/src/skala_benchmark/fetch.py rename to benchmark/src/skala_benchmark/fetch.py diff --git a/docs/benchmark/src/skala_benchmark/fitting.py b/benchmark/src/skala_benchmark/fitting.py similarity index 100% rename from docs/benchmark/src/skala_benchmark/fitting.py rename to benchmark/src/skala_benchmark/fitting.py diff --git a/docs/benchmark/src/skala_benchmark/metrics.py b/benchmark/src/skala_benchmark/metrics.py similarity index 100% rename from docs/benchmark/src/skala_benchmark/metrics.py rename to benchmark/src/skala_benchmark/metrics.py diff --git a/docs/benchmark/src/skala_benchmark/models.py b/benchmark/src/skala_benchmark/models.py similarity index 100% rename from docs/benchmark/src/skala_benchmark/models.py rename to benchmark/src/skala_benchmark/models.py diff --git a/docs/benchmark/src/skala_benchmark/node_info.py b/benchmark/src/skala_benchmark/node_info.py similarity index 100% rename from docs/benchmark/src/skala_benchmark/node_info.py rename to benchmark/src/skala_benchmark/node_info.py diff --git a/docs/benchmark/src/skala_benchmark/orchestrator.py b/benchmark/src/skala_benchmark/orchestrator.py similarity index 100% rename from docs/benchmark/src/skala_benchmark/orchestrator.py rename to benchmark/src/skala_benchmark/orchestrator.py diff --git a/docs/benchmark/src/skala_benchmark/protocol.py b/benchmark/src/skala_benchmark/protocol.py similarity index 100% rename from docs/benchmark/src/skala_benchmark/protocol.py rename to benchmark/src/skala_benchmark/protocol.py diff --git a/docs/benchmark/src/skala_benchmark/report/__init__.py b/benchmark/src/skala_benchmark/report/__init__.py similarity index 100% rename from docs/benchmark/src/skala_benchmark/report/__init__.py rename to benchmark/src/skala_benchmark/report/__init__.py diff --git a/docs/benchmark/src/skala_benchmark/report/_normalize.py b/benchmark/src/skala_benchmark/report/_normalize.py similarity index 100% rename from docs/benchmark/src/skala_benchmark/report/_normalize.py rename to benchmark/src/skala_benchmark/report/_normalize.py diff --git a/docs/benchmark/src/skala_benchmark/report/assets/report-base.css b/benchmark/src/skala_benchmark/report/assets/report-base.css similarity index 100% rename from docs/benchmark/src/skala_benchmark/report/assets/report-base.css rename to benchmark/src/skala_benchmark/report/assets/report-base.css diff --git a/docs/benchmark/src/skala_benchmark/report/assets/report.css b/benchmark/src/skala_benchmark/report/assets/report.css similarity index 100% rename from docs/benchmark/src/skala_benchmark/report/assets/report.css rename to benchmark/src/skala_benchmark/report/assets/report.css diff --git a/docs/benchmark/src/skala_benchmark/report/assets/report.js b/benchmark/src/skala_benchmark/report/assets/report.js similarity index 100% rename from docs/benchmark/src/skala_benchmark/report/assets/report.js rename to benchmark/src/skala_benchmark/report/assets/report.js diff --git a/docs/benchmark/src/skala_benchmark/report/assets/vendor/d3.min.js b/benchmark/src/skala_benchmark/report/assets/vendor/d3.min.js similarity index 100% rename from docs/benchmark/src/skala_benchmark/report/assets/vendor/d3.min.js rename to benchmark/src/skala_benchmark/report/assets/vendor/d3.min.js diff --git a/docs/benchmark/src/skala_benchmark/report/assets/vendor/katex.min.js b/benchmark/src/skala_benchmark/report/assets/vendor/katex.min.js similarity index 100% rename from docs/benchmark/src/skala_benchmark/report/assets/vendor/katex.min.js rename to benchmark/src/skala_benchmark/report/assets/vendor/katex.min.js diff --git a/docs/benchmark/src/skala_benchmark/report/data.py b/benchmark/src/skala_benchmark/report/data.py similarity index 100% rename from docs/benchmark/src/skala_benchmark/report/data.py rename to benchmark/src/skala_benchmark/report/data.py diff --git a/docs/benchmark/src/skala_benchmark/report/generate.py b/benchmark/src/skala_benchmark/report/generate.py similarity index 100% rename from docs/benchmark/src/skala_benchmark/report/generate.py rename to benchmark/src/skala_benchmark/report/generate.py diff --git a/docs/benchmark/src/skala_benchmark/report/prose.py b/benchmark/src/skala_benchmark/report/prose.py similarity index 100% rename from docs/benchmark/src/skala_benchmark/report/prose.py rename to benchmark/src/skala_benchmark/report/prose.py diff --git a/docs/benchmark/src/skala_benchmark/report/templates/index.html b/benchmark/src/skala_benchmark/report/templates/index.html similarity index 100% rename from docs/benchmark/src/skala_benchmark/report/templates/index.html rename to benchmark/src/skala_benchmark/report/templates/index.html diff --git a/docs/benchmark/src/skala_benchmark/runner.py b/benchmark/src/skala_benchmark/runner.py similarity index 100% rename from docs/benchmark/src/skala_benchmark/runner.py rename to benchmark/src/skala_benchmark/runner.py diff --git a/docs/benchmark/src/skala_benchmark/schema/__init__.py b/benchmark/src/skala_benchmark/schema/__init__.py similarity index 100% rename from docs/benchmark/src/skala_benchmark/schema/__init__.py rename to benchmark/src/skala_benchmark/schema/__init__.py diff --git a/docs/benchmark/src/skala_benchmark/schema/environment.py b/benchmark/src/skala_benchmark/schema/environment.py similarity index 100% rename from docs/benchmark/src/skala_benchmark/schema/environment.py rename to benchmark/src/skala_benchmark/schema/environment.py diff --git a/docs/benchmark/src/skala_benchmark/schema/measurements.py b/benchmark/src/skala_benchmark/schema/measurements.py similarity index 100% rename from docs/benchmark/src/skala_benchmark/schema/measurements.py rename to benchmark/src/skala_benchmark/schema/measurements.py diff --git a/docs/benchmark/src/skala_benchmark/timing.py b/benchmark/src/skala_benchmark/timing.py similarity index 100% rename from docs/benchmark/src/skala_benchmark/timing.py rename to benchmark/src/skala_benchmark/timing.py diff --git a/docs/benchmark/tests/test_cli.py b/benchmark/tests/test_cli.py similarity index 94% rename from docs/benchmark/tests/test_cli.py rename to benchmark/tests/test_cli.py index 3d52d74c..caf7a419 100644 --- a/docs/benchmark/tests/test_cli.py +++ b/benchmark/tests/test_cli.py @@ -66,7 +66,7 @@ def test_report_routes_dry_and_interpreted_reports( (output, inputs, prose_path) ), ) - reference = "docs/benchmark/reference" + reference = "benchmark/reference" local = str(tmp_path / "benchmark-output" / "collected") main(["report", str(tmp_path / "local-report"), reference, local]) @@ -76,7 +76,7 @@ def test_report_routes_dry_and_interpreted_reports( str(tmp_path / "official-report"), reference, "--prose", - "docs/benchmark/reference/prose.yaml", + "benchmark/reference/prose.yaml", ] ) @@ -89,6 +89,6 @@ def test_report_routes_dry_and_interpreted_reports( ( str(tmp_path / "official-report"), [reference], - "docs/benchmark/reference/prose.yaml", + "benchmark/reference/prose.yaml", ), ] diff --git a/docs/benchmark/tests/test_dataset.py b/benchmark/tests/test_dataset.py similarity index 100% rename from docs/benchmark/tests/test_dataset.py rename to benchmark/tests/test_dataset.py diff --git a/docs/benchmark/tests/test_docs.py b/benchmark/tests/test_docs.py similarity index 95% rename from docs/benchmark/tests/test_docs.py rename to benchmark/tests/test_docs.py index 63fc2bbb..621fec7b 100644 --- a/docs/benchmark/tests/test_docs.py +++ b/benchmark/tests/test_docs.py @@ -11,7 +11,7 @@ def _load_extension() -> Any: - path = Path(__file__).parents[2] / "site" / "_ext" / "benchmark_report.py" + path = Path(__file__).parents[2] / "docs" / "site" / "_ext" / "benchmark_report.py" spec = importlib.util.spec_from_file_location("benchmark_report_test", path) assert spec is not None and spec.loader is not None module = importlib.util.module_from_spec(spec) diff --git a/docs/benchmark/tests/test_metrics.py b/benchmark/tests/test_metrics.py similarity index 100% rename from docs/benchmark/tests/test_metrics.py rename to benchmark/tests/test_metrics.py diff --git a/docs/benchmark/tests/test_orchestrator.py b/benchmark/tests/test_orchestrator.py similarity index 100% rename from docs/benchmark/tests/test_orchestrator.py rename to benchmark/tests/test_orchestrator.py diff --git a/docs/benchmark/tests/test_report.py b/benchmark/tests/test_report.py similarity index 100% rename from docs/benchmark/tests/test_report.py rename to benchmark/tests/test_report.py diff --git a/docs/benchmark/tests/test_runner.py b/benchmark/tests/test_runner.py similarity index 100% rename from docs/benchmark/tests/test_runner.py rename to benchmark/tests/test_runner.py diff --git a/docs/benchmark/tests/test_workflow.py b/benchmark/tests/test_workflow.py similarity index 100% rename from docs/benchmark/tests/test_workflow.py rename to benchmark/tests/test_workflow.py diff --git a/docs/site/_ext/benchmark_report.py b/docs/site/_ext/benchmark_report.py index 39c0aee7..e75b5d43 100644 --- a/docs/site/_ext/benchmark_report.py +++ b/docs/site/_ext/benchmark_report.py @@ -10,8 +10,8 @@ from skala_benchmark.report import generate -_DOCS_ROOT = Path(__file__).resolve().parents[2] -_REFERENCE_DIR = _DOCS_ROOT / "benchmark" / "reference" +_REPOSITORY_ROOT = Path(__file__).resolve().parents[3] +_REFERENCE_DIR = _REPOSITORY_ROOT / "benchmark" / "reference" _SOURCE_FILES = ( "environments.json", "measurements.json", diff --git a/docs/site/benchmarks.rst b/docs/site/benchmarks.rst index b70b1bb9..cff98ff6 100644 --- a/docs/site/benchmarks.rst +++ b/docs/site/benchmarks.rst @@ -81,7 +81,7 @@ Compare a local implementation or machine ----------------------------------------- Use the same benchmark protocol on your own hardware or software stack, then compare your timings -against our fixed reference measurements in ``docs/benchmark/reference``. This is the expected workflow +against our fixed reference measurements in ``benchmark/reference``. This is the expected workflow for users who want to validate an implementation, check a new machine, or confirm that a local build matches our published performance envelope. @@ -140,7 +140,7 @@ location and point every shard at it, so the compute nodes need no network acces # Create a report with both our reference timings and your local timings. python -m skala_benchmark report local-report \ - docs/benchmark/reference \ + benchmark/reference \ benchmark-output/collected The collected JSON is written to ``benchmark-output/collected`` by default. The local report uses diff --git a/pixi.lock b/pixi.lock index 8cbba822..fe07a634 100644 --- a/pixi.lock +++ b/pixi.lock @@ -710,7 +710,7 @@ environments: - 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: ./docs/benchmark + - 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 @@ -960,7 +960,7 @@ environments: - 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: ./docs/benchmark + - 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 @@ -1204,7 +1204,7 @@ environments: - 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: ./docs/benchmark + - 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 @@ -1499,7 +1499,7 @@ environments: - 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: ./docs/benchmark + - 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 @@ -3097,7 +3097,7 @@ environments: - 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: ./docs/benchmark + - 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 @@ -3364,7 +3364,7 @@ environments: - 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: ./docs/benchmark + - 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 @@ -3631,7 +3631,7 @@ environments: - 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: ./docs/benchmark + - 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 @@ -3905,7 +3905,7 @@ environments: - 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: ./docs/benchmark + - 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 @@ -4349,7 +4349,7 @@ environments: - 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: ./docs/benchmark + - 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 @@ -4564,7 +4564,7 @@ environments: - 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: ./docs/benchmark + - 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 @@ -4775,7 +4775,7 @@ environments: - 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: ./docs/benchmark + - 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 @@ -5014,7 +5014,7 @@ environments: - 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: ./docs/benchmark + - 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 @@ -5229,7 +5229,7 @@ environments: - 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: ./docs/benchmark + - 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 @@ -5440,7 +5440,7 @@ environments: - 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: ./docs/benchmark + - 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 @@ -19615,7 +19615,7 @@ packages: - zstd >=1.5.7,<1.6.0a0 size: 433687 timestamp: 1786599629846 -- pypi: ./docs/benchmark +- pypi: ./benchmark name: skala-benchmark requires_dist: - jinja2 diff --git a/pixi.toml b/pixi.toml index 1709f701..fccbdf97 100644 --- a/pixi.toml +++ b/pixi.toml @@ -135,7 +135,7 @@ pyyaml = "*" scipy = "*" [feature.benchmark.pypi-dependencies] -skala-benchmark = { path = "docs/benchmark", editable = true } +skala-benchmark = { path = "benchmark", editable = true } [feature.docs.dependencies] ipywidgets = "*" diff --git a/pyproject.toml b/pyproject.toml index 590c4c0b..29ae7032 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", "docs/benchmark/src", "skala", "."] +mypy_path = ["skala/src", "model/src", "gauxc/src", "benchmark/src", "skala", "."] python_version = "3.11" exclude = ["build/", "docs/site/_build/", "htmlcov/", "third_party/"] @@ -25,7 +25,7 @@ ignore_missing_imports = true [tool.ruff] target-version = "py311" -src = ["skala/", "model/", "gauxc/", "docs/"] +src = ["skala/", "model/", "gauxc/", "benchmark/", "docs/"] exclude = ["build", "docs/site/_build", "third_party"] [tool.ruff.lint] @@ -54,7 +54,7 @@ line-length = 100 timeout = 300 addopts = "-m 'not profiling and not benchmark and not model_benchmark'" pythonpath = [".", "skala/src", "gauxc/src"] -testpaths = ["skala/tests", "model/tests", "gauxc/tests", "docs/benchmark/tests"] +testpaths = ["skala/tests", "model/tests", "gauxc/tests", "benchmark/tests"] markers = [ "benchmark: performance measurements collected by pytest-benchmark", "gpu: requires a CUDA-capable GPU and GPU test dependencies", From 944d29f91a2c4ff194b8553091656c74f66c51f8 Mon Sep 17 00:00:00 2001 From: jenswehner Date: Wed, 26 Aug 2026 16:38:11 +0200 Subject: [PATCH 6/9] align workflows with packages --- .github/workflows/benchmark-test.yml | 45 +++++++++++ .github/workflows/gauxc-test.yml | 41 ++++++++++ .github/workflows/lint.yml | 29 +++++++ .github/workflows/model-test.yml | 42 ++++++++++ .../workflows/{test.yml => skala-test.yml} | 77 ++----------------- README.md | 2 +- skala/README.md | 2 +- 7 files changed, 166 insertions(+), 72 deletions(-) create mode 100644 .github/workflows/benchmark-test.yml create mode 100644 .github/workflows/gauxc-test.yml create mode 100644 .github/workflows/lint.yml create mode 100644 .github/workflows/model-test.yml rename .github/workflows/{test.yml => skala-test.yml} (68%) diff --git a/.github/workflows/benchmark-test.yml b/.github/workflows/benchmark-test.yml new file mode 100644 index 00000000..e6eb8da1 --- /dev/null +++ b/.github/workflows/benchmark-test.yml @@ -0,0 +1,45 @@ +name: Benchmark tests + +on: + push: + branches: [main] + paths: &benchmark-test-paths + - '.github/workflows/benchmark-test.yml' + - 'benchmark/**' + - 'docs/site/_ext/benchmark_report.py' + - 'pixi.lock' + - 'pixi.toml' + - 'pyproject.toml' + - 'skala/src/**' + pull_request: + branches: [main] + paths: *benchmark-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: + lfs: true + + - 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.75.0 + environments: default + activate-environment: true + locked: true + cache: false + + - name: Run benchmark unit tests + run: pytest -v benchmark/tests/ \ No newline at end of file diff --git a/.github/workflows/gauxc-test.yml b/.github/workflows/gauxc-test.yml new file mode 100644 index 00000000..cde33362 --- /dev/null +++ b/.github/workflows/gauxc-test.yml @@ -0,0 +1,41 @@ +name: "GauXC tests" + +on: + push: + branches: [main] + paths: &gauxc-test-paths + - '.github/workflows/gauxc-test.yml' + - '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: prefix-dev/setup-pixi@f00437f565399d418b0acc85936d12c1fb668347 # v0.10.1 + with: + pixi-version: v0.75.0 + environments: default + activate-environment: true + locked: true + cache: false + + - name: Run GauXC unit tests + run: pytest -v gauxc/tests/ \ No newline at end of file diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 00000000..b97f764b --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,29 @@ +name: Lint + +on: + push: + branches: [main] + pull_request: + branches: [main] + workflow_dispatch: + +permissions: + contents: read + +jobs: + lint: + 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.75.0 + environments: lint + activate-environment: true + locked: true + cache: false + + - name: Run pre-commit hooks + run: pre-commit run --all-files diff --git a/.github/workflows/model-test.yml b/.github/workflows/model-test.yml new file mode 100644 index 00000000..a712118c --- /dev/null +++ b/.github/workflows/model-test.yml @@ -0,0 +1,42 @@ +name: Model tests + +on: + push: + branches: [main] + paths: &model-test-paths + - '.github/workflows/model-test.yml' + - 'model/**' + - 'pixi.lock' + - 'pixi.toml' + - 'pyproject.toml' + - 'skala/src/**' + pull_request: + branches: [main] + paths: *model-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: prefix-dev/setup-pixi@f00437f565399d418b0acc85936d12c1fb668347 # v0.10.1 + with: + pixi-version: v0.75.0 + environments: default + activate-environment: true + locked: true + cache: false + + - name: Run model unit tests + run: pytest -v model/tests/test_model.py model/tests/test_utils.py \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/skala-test.yml similarity index 68% rename from .github/workflows/test.yml rename to .github/workflows/skala-test.yml index dcf0df3e..c2ff1e72 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/skala-test.yml @@ -1,53 +1,26 @@ -name: Tests +name: Skala tests on: push: branches: [main] - paths: &test-paths - - '.github/workflows/test.yml' - - '.pre-commit-config.yaml' - - 'benchmark/**' - - 'gauxc/**/*.py' - - 'model/**/*.py' + paths: &skala-test-paths + - '.github/workflows/skala-test.yml' - 'pixi.lock' - 'pixi.toml' - 'pyproject.toml' - 'skala/**' - - '**/*.py' - - '**/*.pyi' - - '**/*.ipynb' + - 'tools/**' pull_request: branches: [main] - paths: *test-paths + paths: *skala-test-paths + workflow_dispatch: permissions: contents: read jobs: - lint: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 - - - 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.75.0 - environments: lint - activate-environment: true - locked: true - cache: false - - - name: Run pre-commit hooks - run: pre-commit run --all-files - test: runs-on: ${{ matrix.runner }} - needs: - - lint env: OMP_NUM_THREADS: 4 strategy: @@ -70,8 +43,6 @@ jobs: name: "${{ matrix.environment }} @ ${{ matrix.runner }}" steps: - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 - with: - lfs: true - name: Print CPU diagnostics uses: ./.github/actions/cpu-diagnostics @@ -95,39 +66,8 @@ jobs: if: ${{ failure() }} uses: ./.github/actions/cpu-diagnostics - component-test: - name: Model, GauXC, and benchmark unit tests - runs-on: ubuntu-latest - needs: - - lint - env: - OMP_NUM_THREADS: 4 - steps: - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 - with: - lfs: true - - - 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.75.0 - environments: lint - activate-environment: true - locked: true - cache: false - - - name: Run component unit tests - run: >- - pytest -v model/tests/test_model.py model/tests/test_utils.py - gauxc/tests/ benchmark/tests/ - gpu-test: runs-on: ${{ matrix.runner }} - needs: - - lint env: OMP_NUM_THREADS: 4 strategy: @@ -167,15 +107,12 @@ jobs: env: CUDA_LAUNCH_BLOCKING: 1 - - name: Run GPU doctests run: pytest -v --doctest-modules skala/src/skala/gpu4pyscf/ profiling: name: "Profiling (Python=3.12 & PySCF=2.14 & PyTorch=2.13)" runs-on: ubuntu-latest - needs: - - lint env: OMP_NUM_THREADS: 4 steps: @@ -194,4 +131,4 @@ jobs: cache: false - name: Run profiling tests - run: pytest -v -m profiling skala/tests/ + run: pytest -v -m profiling skala/tests/ \ No newline at end of file diff --git a/README.md b/README.md index 1dca0d1c..3790bc5e 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Skala: Accurate and scalable exchange-correlation with deep learning [![Documentation](https://img.shields.io/badge/docs-microsoft.github.io%2Fskala-blue?logo=read-the-docs&logoColor=white)](https://microsoft.github.io/skala) -[![Tests](https://img.shields.io/github/actions/workflow/status/microsoft/skala/test.yml?branch=main&logo=github&label=build)](https://github.com/microsoft/skala/actions/workflows/test.yml) +[![Tests](https://img.shields.io/github/actions/workflow/status/microsoft/skala/skala-test.yml?branch=main&logo=github&label=build)](https://github.com/microsoft/skala/actions/workflows/skala-test.yml) [![PyPI](https://img.shields.io/pypi/v/skala?logo=pypi&logoColor=white)](https://pypi.org/project/skala/) [![Paper](https://img.shields.io/badge/arXiv-2506.14665-b31b1b?logo=arxiv&logoColor=white)](https://arxiv.org/abs/2506.14665) diff --git a/skala/README.md b/skala/README.md index 377bfa23..c61d0324 100644 --- a/skala/README.md +++ b/skala/README.md @@ -1,7 +1,7 @@ # Skala: Accurate and scalable exchange-correlation with deep learning [![Documentation](https://img.shields.io/badge/docs-microsoft.github.io%2Fskala-blue?logo=read-the-docs&logoColor=white)](https://microsoft.github.io/skala) -[![Tests](https://img.shields.io/github/actions/workflow/status/microsoft/skala/test.yml?branch=main&logo=github&label=build)](https://github.com/microsoft/skala/actions/workflows/test.yml) +[![Tests](https://img.shields.io/github/actions/workflow/status/microsoft/skala/skala-test.yml?branch=main&logo=github&label=build)](https://github.com/microsoft/skala/actions/workflows/skala-test.yml) [![PyPI](https://img.shields.io/pypi/v/skala?logo=pypi&logoColor=white)](https://pypi.org/project/skala/) [![Paper](https://img.shields.io/badge/arXiv-2506.14665-b31b1b?logo=arxiv&logoColor=white)](https://arxiv.org/abs/2506.14665) From 5b46cc400b88962bcf2647c256c0ca231558d52f Mon Sep 17 00:00:00 2001 From: jenswehner Date: Wed, 26 Aug 2026 21:35:17 +0200 Subject: [PATCH 7/9] renamed docs/site to website --- .github/workflows/benchmark-test.yml | 2 +- .github/workflows/docs.yml | 8 ++--- .pre-commit-config.yaml | 2 +- AGENTS.md | 12 +++---- CONTRIBUTING.md | 6 ++-- README.md | 2 +- benchmark/README.md | 2 +- benchmark/src/skala_benchmark/fetch.py | 2 +- pyproject.toml | 6 ++-- tools/verify_gpu.py | 11 ++++++ {docs => website}/.gitignore | 0 .../site => website}/_ext/benchmark_report.py | 2 +- {docs/site => website}/_static/bib/data.bib | 0 .../site => website}/_static/img/density.png | Bin {docs/site => website}/ase.ipynb | 0 {docs/site => website}/benchmarks.rst | 0 {docs/site => website}/conf.py | 2 +- {docs/site => website}/ftorch.rst | 34 +++++++++--------- {docs/site => website}/index.rst | 0 {docs/site => website}/installation.rst | 0 {docs/site => website}/model-card/index.rst | 0 .../site => website}/model-card/skala-1.0.rst | 2 +- .../site => website}/model-card/skala-1.1.rst | 2 +- {docs/site => website}/pyscf/gpu4pyscf.rst | 0 .../site => website}/pyscf/scf_settings.ipynb | 5 +-- .../site => website}/pyscf/singlepoint.ipynb | 5 +-- 26 files changed, 59 insertions(+), 46 deletions(-) rename {docs => website}/.gitignore (100%) rename {docs/site => website}/_ext/benchmark_report.py (94%) rename {docs/site => website}/_static/bib/data.bib (100%) rename {docs/site => website}/_static/img/density.png (100%) rename {docs/site => website}/ase.ipynb (100%) rename {docs/site => website}/benchmarks.rst (100%) rename {docs/site => website}/conf.py (98%) rename {docs/site => website}/ftorch.rst (88%) rename {docs/site => website}/index.rst (100%) rename {docs/site => website}/installation.rst (100%) rename {docs/site => website}/model-card/index.rst (100%) rename {docs/site => website}/model-card/skala-1.0.rst (99%) rename {docs/site => website}/model-card/skala-1.1.rst (99%) rename {docs/site => website}/pyscf/gpu4pyscf.rst (100%) rename {docs/site => website}/pyscf/scf_settings.ipynb (97%) rename {docs/site => website}/pyscf/singlepoint.ipynb (98%) diff --git a/.github/workflows/benchmark-test.yml b/.github/workflows/benchmark-test.yml index e6eb8da1..9b96410c 100644 --- a/.github/workflows/benchmark-test.yml +++ b/.github/workflows/benchmark-test.yml @@ -6,7 +6,7 @@ on: paths: &benchmark-test-paths - '.github/workflows/benchmark-test.yml' - 'benchmark/**' - - 'docs/site/_ext/benchmark_report.py' + - 'website/_ext/benchmark_report.py' - 'pixi.lock' - 'pixi.toml' - 'pyproject.toml' diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 9ce4eb4d..1320f82c 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -40,18 +40,18 @@ jobs: - name: Build documentation run: | - sphinx-build -b html docs docs/_build/html - touch docs/_build/html/.nojekyll + sphinx-build -b html website website/_build/html + touch website/_build/html/.nojekyll - name: Check external links run: >- sphinx-build -D nb_execution_mode=off -b linkcheck - docs docs/_build/linkcheck + website website/_build/linkcheck - name: Upload Pages artifact uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3 with: - path: docs/site/_build/html + path: website/_build/html deploy: needs: build diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 711eab4e..fe60b51f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -31,6 +31,6 @@ repos: - model - gauxc - benchmark - - docs + - website pass_filenames: false always_run: true diff --git a/AGENTS.md b/AGENTS.md index 905fccef..97153314 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -15,7 +15,7 @@ Skala is a neural network-based exchange-correlation (XC) functional for density | `model/` | Trainable model definition, tests, and LibTorch/FTorch examples | | `gauxc/` | GauXC exporter, native examples, tests, and documentation | | `benchmark/` | Benchmark runner, reference data, report tooling, and tests | -| `docs/` | Main Sphinx site | +| `website/` | Main Sphinx site | | `.github/workflows/` | CI workflows (test, docs) | ## Development environment @@ -63,11 +63,11 @@ When editing code: - Engine: Sphinx with myst-nb (executes notebooks during build). - Build locally: ```bash - pixi run -e docs sphinx-build -b html docs/site docs/site/_build/html - pixi run -e docs sphinx-build -b html gauxc/docs docs/site/_build/html/gauxc - touch docs/site/_build/html/.nojekyll + 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 `docs/site/` should be executable with a 5-minute timeout. +- Notebooks in `website/` should be executable with a 5-minute timeout. - Use reStructuredText for standalone pages; Jupyter notebooks for tutorials. ## Pull request guidelines @@ -99,7 +99,7 @@ When editing code: | 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 docs/site docs/site/_build/html && pixi run -e docs sphinx-build -b html gauxc/docs docs/site/_build/html/gauxc && touch docs/site/_build/html/.nojekyll` | +| 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 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 982d167c..73664794 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -32,9 +32,9 @@ OMP_NUM_THREADS=4 pixi run -e default pytest -v --doctest-modules \ OMP_NUM_THREADS=4 pixi run -e default pytest -v model/tests/test_model.py \ model/tests/test_utils.py gauxc/tests/ benchmark/tests/ pixi run -e default pre-commit run --all-files -pixi run -e docs sphinx-build -b html docs/site docs/site/_build/html -pixi run -e docs sphinx-build -b html gauxc/docs docs/site/_build/html/gauxc -touch docs/site/_build/html/.nojekyll +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 ``` Set `OMP_NUM_THREADS=4` when running tests locally to match CI. diff --git a/README.md b/README.md index 3790bc5e..d454f2c0 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ This repository contains five components: 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. 4. [`benchmark/`](benchmark) contains the benchmark runner, reference data, report tooling, and tests. -5. [`docs/`](docs) contains the main Sphinx site. +5. [`website/`](website) contains the main Sphinx site. Compiled-code examples include: - [Skala in C++ with libtorch](model/examples/cpp/cpp_integration) diff --git a/benchmark/README.md b/benchmark/README.md index 7a804abd..39184061 100644 --- a/benchmark/README.md +++ b/benchmark/README.md @@ -4,5 +4,5 @@ This package runs Skala DFT benchmarks, collects their measurements, and generat The default Pixi environment installs it as an editable package and provides the `skala-benchmark` command. -See the [benchmark documentation](../docs/site/benchmarks.rst) for dataset setup, benchmark +See the [benchmark documentation](../website/benchmarks.rst) for dataset setup, benchmark execution, result collection, and report generation. \ No newline at end of file diff --git a/benchmark/src/skala_benchmark/fetch.py b/benchmark/src/skala_benchmark/fetch.py index 47360609..b9828f4b 100644 --- a/benchmark/src/skala_benchmark/fetch.py +++ b/benchmark/src/skala_benchmark/fetch.py @@ -5,7 +5,7 @@ The set combines five published datasets. Their structures are not redistributed here; they are downloaded from the upstream repositories, each pinned to a commit, and assembled into the file the benchmark reads. See -``docs/site/benchmarks.rst`` for the datasets and the citations they require. +``website/benchmarks.rst`` for the datasets and the citations they require. Every structure is checked against :mod:`skala_benchmark.dataset`'s manifest -- atom count, element formula, charge and multiplicity -- so a source that has diff --git a/pyproject.toml b/pyproject.toml index 29ae7032..4ca06e51 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ strict = true explicit_package_bases = true mypy_path = ["skala/src", "model/src", "gauxc/src", "benchmark/src", "skala", "."] python_version = "3.11" -exclude = ["build/", "docs/site/_build/", "htmlcov/", "third_party/"] +exclude = ["build/", "website/_build/", "htmlcov/", "third_party/"] [[tool.mypy.overrides]] module = [ @@ -25,8 +25,8 @@ ignore_missing_imports = true [tool.ruff] target-version = "py311" -src = ["skala/", "model/", "gauxc/", "benchmark/", "docs/"] -exclude = ["build", "docs/site/_build", "third_party"] +src = ["skala/", "model/", "gauxc/", "benchmark/", "website/"] +exclude = ["build", "website/_build", "third_party"] [tool.ruff.lint] select = [ diff --git a/tools/verify_gpu.py b/tools/verify_gpu.py index 705b3cac..183daf7b 100644 --- a/tools/verify_gpu.py +++ b/tools/verify_gpu.py @@ -22,6 +22,17 @@ def main() -> None: ) from error gpu4pyscf_version = version(distribution) + device = torch.cuda.current_device() + properties = torch.cuda.get_device_properties(device) + free_memory, total_memory = torch.cuda.mem_get_info(device) + print( + "gpu", + properties.name, + "capability", + f"{properties.major}.{properties.minor}", + "memory", + f"{free_memory / 1024**3:.2f}/{total_memory / 1024**3:.2f} GiB free", + ) print("torch", torch.__version__, "cuda", torch.version.cuda) print( "cupy", diff --git a/docs/.gitignore b/website/.gitignore similarity index 100% rename from docs/.gitignore rename to website/.gitignore diff --git a/docs/site/_ext/benchmark_report.py b/website/_ext/benchmark_report.py similarity index 94% rename from docs/site/_ext/benchmark_report.py rename to website/_ext/benchmark_report.py index e75b5d43..bdf79f96 100644 --- a/docs/site/_ext/benchmark_report.py +++ b/website/_ext/benchmark_report.py @@ -10,7 +10,7 @@ from skala_benchmark.report import generate -_REPOSITORY_ROOT = Path(__file__).resolve().parents[3] +_REPOSITORY_ROOT = Path(__file__).resolve().parents[2] _REFERENCE_DIR = _REPOSITORY_ROOT / "benchmark" / "reference" _SOURCE_FILES = ( "environments.json", diff --git a/docs/site/_static/bib/data.bib b/website/_static/bib/data.bib similarity index 100% rename from docs/site/_static/bib/data.bib rename to website/_static/bib/data.bib diff --git a/docs/site/_static/img/density.png b/website/_static/img/density.png similarity index 100% rename from docs/site/_static/img/density.png rename to website/_static/img/density.png diff --git a/docs/site/ase.ipynb b/website/ase.ipynb similarity index 100% rename from docs/site/ase.ipynb rename to website/ase.ipynb diff --git a/docs/site/benchmarks.rst b/website/benchmarks.rst similarity index 100% rename from docs/site/benchmarks.rst rename to website/benchmarks.rst diff --git a/docs/site/conf.py b/website/conf.py similarity index 98% rename from docs/site/conf.py rename to website/conf.py index f589d9b6..ed5b5d3a 100644 --- a/docs/site/conf.py +++ b/website/conf.py @@ -42,7 +42,7 @@ html_theme_options = { "repository_url": "https://github.com/microsoft/skala", "repository_branch": "main", - "path_to_docs": "docs/site", + "path_to_docs": "website", "use_repository_button": True, } master_doc = "index" diff --git a/docs/site/ftorch.rst b/website/ftorch.rst similarity index 88% rename from docs/site/ftorch.rst rename to website/ftorch.rst index 0819b9f5..1ad880bb 100644 --- a/docs/site/ftorch.rst +++ b/website/ftorch.rst @@ -55,19 +55,19 @@ We will use the following directory structure and files: For the main ``CMakeLists.txt`` file, we will set up the project and include the necessary CMake modules for Skala and FTorch: -.. literalinclude:: ../../model/examples/fortran/ftorch_integration/CMakeLists.txt +.. literalinclude:: ../model/examples/fortran/ftorch_integration/CMakeLists.txt :language: cmake :caption: CMakeLists.txt To ensure that we have the correct versions of our dependencies, we will include a CMake module that specifies the versions of Skala and FTorch: -.. literalinclude:: ../../model/examples/fortran/ftorch_integration/cmake/skala-dep-versions.cmake +.. literalinclude:: ../model/examples/fortran/ftorch_integration/cmake/skala-dep-versions.cmake :language: cmake :caption: cmake/skala-dep-versions.cmake Next, we will include the CMake modules for Skala and FTorch, which will handle finding the libraries and setting up the necessary include directories and link targets: -.. literalinclude:: ../../model/examples/fortran/ftorch_integration/cmake/skala-ftorch.cmake +.. literalinclude:: ../model/examples/fortran/ftorch_integration/cmake/skala-ftorch.cmake :language: cmake :caption: cmake/skala-ftorch.cmake @@ -83,11 +83,11 @@ However, we will not go into the details of these files here, as they are primar The files ``skala_ftorch.cxx`` and ``skala_ftorch.f90`` contain the C++ and Fortran code, respectively, that define the bindings between Skala and FTorch. These files include functions for loading Skala models, preparing input features, and computing exchange-correlation energies and potentials. - .. literalinclude:: ../../model/examples/fortran/ftorch_integration/src/skala_ftorch.cxx + .. literalinclude:: ../model/examples/fortran/ftorch_integration/src/skala_ftorch.cxx :language: c++ :caption: src/skala_ftorch.cxx - .. literalinclude:: ../../model/examples/fortran/ftorch_integration/src/skala_ftorch.f90 + .. literalinclude:: ../model/examples/fortran/ftorch_integration/src/skala_ftorch.f90 :language: fortran :caption: src/skala_ftorch.f90 @@ -98,35 +98,35 @@ Fortran application Finally, we have the Fortran application itself, which demonstrates how to use the Skala bindings to compute exchange-correlation energies and potentials. We start the main program with the necessary module imports and variable declarations: -.. literalinclude:: ../../model/examples/fortran/ftorch_integration/app/main.f90 +.. literalinclude:: ../model/examples/fortran/ftorch_integration/app/main.f90 :language: fortran :caption: app/main.f90 :lines: 1-18 First, we obtain the command line arguments for the model path and feature directory, and check that they are provided: -.. literalinclude:: ../../model/examples/fortran/ftorch_integration/app/main.f90 +.. literalinclude:: ../model/examples/fortran/ftorch_integration/app/main.f90 :language: fortran :caption: app/main.f90 :lines: 20-30 We define a small contained helper procedure to read the command line arguments: -.. literalinclude:: ../../model/examples/fortran/ftorch_integration/app/main.f90 +.. literalinclude:: ../model/examples/fortran/ftorch_integration/app/main.f90 :language: fortran :caption: app/main.f90 :lines: 227-248 The main types provided by the Skala bindings are the ``skala_model`` type, which extends the ``torch_model`` provided by FTorch and has a custom ``skala_model_load`` procedure for loading the Skala model and its meta data. -.. literalinclude:: ../../model/examples/fortran/ftorch_integration/app/main.f90 +.. literalinclude:: ../model/examples/fortran/ftorch_integration/app/main.f90 :language: fortran :caption: app/main.f90 :lines: 32-34 The input to the Skala model is passed via a dictionary of tensors, which we prepare by loading the necessary features from disk and converting them to the appropriate format. -.. literalinclude:: ../../model/examples/fortran/ftorch_integration/app/main.f90 +.. literalinclude:: ../model/examples/fortran/ftorch_integration/app/main.f90 :language: fortran :caption: app/main.f90 :lines: 36-70 @@ -135,7 +135,7 @@ The input to the Skala model is passed via a dictionary of tensors, which we pre To export the features from Python, you can use the provided ``prepare_inputs.py`` script. - .. literalinclude:: ../../model/examples/cpp/cpp_integration/prepare_inputs.py + .. literalinclude:: ../model/examples/cpp/cpp_integration/prepare_inputs.py :language: python :caption: prepare_inputs.py @@ -145,7 +145,7 @@ The input to the Skala model is passed via a dictionary of tensors, which we pre To place the features in the correct format for Skala, we add them to the input dictionary with the appropriate keys. -.. literalinclude:: ../../model/examples/fortran/ftorch_integration/app/main.f90 +.. literalinclude:: ../model/examples/fortran/ftorch_integration/app/main.f90 :language: fortran :caption: app/main.f90 :lines: 72-92 @@ -165,14 +165,14 @@ To place the features in the correct format for Skala, we add them to the input With this we can now compute the exchange-correlation energy and potential by calling the Skala model with the prepared inputs. -.. literalinclude:: ../../model/examples/fortran/ftorch_integration/app/main.f90 +.. literalinclude:: ../model/examples/fortran/ftorch_integration/app/main.f90 :language: fortran :caption: app/main.f90 :lines: 94-96 To get the exchange-correlation energy, we need to weight the exc values by the grid weights and sum over the grid points, which we can do using the provided tensor operations. -.. literalinclude:: ../../model/examples/fortran/ftorch_integration/app/main.f90 +.. literalinclude:: ../model/examples/fortran/ftorch_integration/app/main.f90 :language: fortran :caption: app/main.f90 :lines: 98-105 @@ -240,21 +240,21 @@ The output for the H2 molecule with the def2-QZVP basis set should look like thi The ``get_exc_vxc`` procedure computes the exchange-correlation energy and potential, which we can then access from the returned dictionary. The potential terms are stored under the same keys as the input features and can be extracted as tensors. -.. literalinclude:: ../../model/examples/fortran/ftorch_integration/app/main.f90 +.. literalinclude:: ../model/examples/fortran/ftorch_integration/app/main.f90 :language: fortran :caption: app/main.f90 :lines: 107-119 We can use those tensors for further processing in our application, for example to compute the norm of the potential -.. literalinclude:: ../../model/examples/fortran/ftorch_integration/app/main.f90 +.. literalinclude:: ../model/examples/fortran/ftorch_integration/app/main.f90 :language: fortran :caption: app/main.f90 :lines: 121-155 Or by converting them to Fortran arrays and using the built-in array operations. -.. literalinclude:: ../../model/examples/fortran/ftorch_integration/app/main.f90 +.. literalinclude:: ../model/examples/fortran/ftorch_integration/app/main.f90 :language: fortran :caption: app/main.f90 :lines: 162-225 diff --git a/docs/site/index.rst b/website/index.rst similarity index 100% rename from docs/site/index.rst rename to website/index.rst diff --git a/docs/site/installation.rst b/website/installation.rst similarity index 100% rename from docs/site/installation.rst rename to website/installation.rst diff --git a/docs/site/model-card/index.rst b/website/model-card/index.rst similarity index 100% rename from docs/site/model-card/index.rst rename to website/model-card/index.rst diff --git a/docs/site/model-card/skala-1.0.rst b/website/model-card/skala-1.0.rst similarity index 99% rename from docs/site/model-card/skala-1.0.rst rename to website/model-card/skala-1.0.rst index b6c3593e..fc2f3642 100644 --- a/docs/site/model-card/skala-1.0.rst +++ b/website/model-card/skala-1.0.rst @@ -163,7 +163,7 @@ License .. dropdown:: MIT License - .. literalinclude:: ../../../LICENSE.txt + .. literalinclude:: ../../LICENSE.txt :lines: 3- Citation diff --git a/docs/site/model-card/skala-1.1.rst b/website/model-card/skala-1.1.rst similarity index 99% rename from docs/site/model-card/skala-1.1.rst rename to website/model-card/skala-1.1.rst index 6085f56a..07557170 100644 --- a/docs/site/model-card/skala-1.1.rst +++ b/website/model-card/skala-1.1.rst @@ -196,7 +196,7 @@ License .. dropdown:: MIT License - .. literalinclude:: ../../../LICENSE.txt + .. literalinclude:: ../../LICENSE.txt :lines: 3- Citation diff --git a/docs/site/pyscf/gpu4pyscf.rst b/website/pyscf/gpu4pyscf.rst similarity index 100% rename from docs/site/pyscf/gpu4pyscf.rst rename to website/pyscf/gpu4pyscf.rst diff --git a/docs/site/pyscf/scf_settings.ipynb b/website/pyscf/scf_settings.ipynb similarity index 97% rename from docs/site/pyscf/scf_settings.ipynb rename to website/pyscf/scf_settings.ipynb index bbfd8a2a..dbfb0257 100644 --- a/docs/site/pyscf/scf_settings.ipynb +++ b/website/pyscf/scf_settings.ipynb @@ -16,8 +16,9 @@ "metadata": {}, "outputs": [], "source": [ - "from pyscf import gto\n", - "from skala.pyscf import SkalaKS" + "from skala.pyscf import SkalaKS\n", + "\n", + "from pyscf import gto" ] }, { diff --git a/docs/site/pyscf/singlepoint.ipynb b/website/pyscf/singlepoint.ipynb similarity index 98% rename from docs/site/pyscf/singlepoint.ipynb rename to website/pyscf/singlepoint.ipynb index b0e40e17..e4865ea6 100644 --- a/docs/site/pyscf/singlepoint.ipynb +++ b/website/pyscf/singlepoint.ipynb @@ -18,8 +18,9 @@ "metadata": {}, "outputs": [], "source": [ - "from pyscf import gto\n", - "from skala.pyscf import SkalaKS" + "from skala.pyscf import SkalaKS\n", + "\n", + "from pyscf import gto" ] }, { From 833c6e333524397c971356662ea4402ff5747def Mon Sep 17 00:00:00 2001 From: jenswehner Date: Wed, 26 Aug 2026 21:52:28 +0200 Subject: [PATCH 8/9] added version consistency test --- pixi.toml | 1 + pyproject.toml | 2 +- tests/test_package_metadata.py | 65 ++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 tests/test_package_metadata.py diff --git a/pixi.toml b/pixi.toml index fccbdf97..08948730 100644 --- a/pixi.toml +++ b/pixi.toml @@ -106,6 +106,7 @@ cutensor = ">=2" gpu4pyscf-cuda13x = "==1.8.1" [feature.test.dependencies] +packaging = "*" pytest = "*" pytest-benchmark = "*" pytest-cov = "*" diff --git a/pyproject.toml b/pyproject.toml index 4ca06e51..99beb84b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -54,7 +54,7 @@ line-length = 100 timeout = 300 addopts = "-m 'not profiling and not benchmark and not model_benchmark'" pythonpath = [".", "skala/src", "gauxc/src"] -testpaths = ["skala/tests", "model/tests", "gauxc/tests", "benchmark/tests"] +testpaths = ["tests", "skala/tests", "model/tests", "gauxc/tests", "benchmark/tests"] markers = [ "benchmark: performance measurements collected by pytest-benchmark", "gpu: requires a CUDA-capable GPU and GPU test dependencies", diff --git a/tests/test_package_metadata.py b/tests/test_package_metadata.py new file mode 100644 index 00000000..6c5d2d29 --- /dev/null +++ b/tests/test_package_metadata.py @@ -0,0 +1,65 @@ +# SPDX-License-Identifier: MIT + +"""Tests for consistent package and Skala dependency versions.""" + +import tomllib +from pathlib import Path +from typing import Any + +from packaging.requirements import Requirement +from packaging.utils import canonicalize_name +from packaging.version import Version + +REPOSITORY = Path(__file__).resolve().parents[1] +PACKAGE_DIRECTORIES = ("model", "benchmark", "skala") + + +def _load_project(package_directory: str) -> dict[str, Any]: + with (REPOSITORY / package_directory / "pyproject.toml").open("rb") as stream: + metadata = tomllib.load(stream) + return dict(metadata["project"]) + + +def _dependencies(project: dict[str, Any]) -> dict[str, Requirement]: + requirements = (Requirement(value) for value in project["dependencies"]) + return { + canonicalize_name(requirement.name): requirement for requirement in requirements + } + + +PROJECTS = {directory: _load_project(directory) for directory in PACKAGE_DIRECTORIES} +DEPENDENCIES = { + directory: _dependencies(project) for directory, project in PROJECTS.items() +} + + +def test_package_versions_match() -> None: + """All published Python packages use the same release version.""" + versions = { + directory: project["version"] for directory, project in PROJECTS.items() + } + + assert len(set(versions.values())) == 1, f"Package versions differ: {versions}" + + +def test_skala_dependency_versions_match_runtime_version() -> None: + """Every Skala dependency uses the version released alongside it.""" + runtime_version = Version(PROJECTS["skala"]["version"]) + + for package_directory, dependencies in DEPENDENCIES.items(): + requirement = dependencies.get("skala") + if requirement is None: + continue + + declared_versions = { + Version(specifier.version) + for specifier in requirement.specifier + if specifier.operator in {"==", ">=", "~="} + } + assert runtime_version in requirement.specifier, ( + f"{package_directory} requires {requirement}, which excludes Skala {runtime_version}" + ) + assert declared_versions == {runtime_version}, ( + f"{package_directory} requires {requirement}; its Skala dependency version " + f"must match {runtime_version}" + ) From 42f50eebed5ffcb8a5fe7406596b721802fc72b8 Mon Sep 17 00:00:00 2001 From: jenswehner Date: Wed, 26 Aug 2026 22:32:21 +0200 Subject: [PATCH 9/9] remove duplicate ruff --- .github/workflows/benchmark-test.yml | 2 +- AGENTS.md | 5 +- benchmark/README.md | 2 +- benchmark/src/skala_benchmark/runner.py | 3 +- benchmark/tests/test_docs.py | 2 +- gauxc/docs/scripts/export-h5.py | 3 +- gauxc/src/skala_gauxc/export.py | 1 + gauxc/tests/test_gauxc_export.py | 3 +- .../cpp/cpp_integration/prepare_inputs.py | 3 +- pixi.lock | 50 ------------------- pixi.toml | 1 - skala/src/skala/ase/calculator.py | 2 +- skala/src/skala/dispersion.py | 1 + skala/src/skala/gpu4pyscf/__init__.py | 1 - skala/src/skala/gpu4pyscf/dft.py | 2 +- skala/src/skala/gpu4pyscf/gradients.py | 2 +- skala/src/skala/gpu4pyscf/grids.py | 2 +- skala/src/skala/pyscf/__init__.py | 2 +- skala/src/skala/pyscf/ao_evaluation.py | 2 +- skala/src/skala/pyscf/backend.py | 2 +- skala/src/skala/pyscf/dft.py | 2 +- skala/src/skala/pyscf/features.py | 2 +- skala/src/skala/pyscf/gradients.py | 2 +- skala/src/skala/pyscf/grids.py | 2 +- skala/src/skala/pyscf/model_chunking.py | 2 +- skala/src/skala/pyscf/numint.py | 2 +- skala/src/skala/pyscf/spatial_grid_layout.py | 2 +- skala/src/skala/pyscf/xc_integrator.py | 2 +- skala/tests/test_ao_screening.py | 2 +- skala/tests/test_ao_screening_benchmark.py | 3 +- skala/tests/test_gpu4pyscf_ao_screening.py | 2 +- skala/tests/test_gpu4pyscf_classes.py | 2 +- skala/tests/test_gpu4pyscf_gradients.py | 2 +- skala/tests/test_model_chunking.py | 3 +- skala/tests/test_pyscf_classes.py | 3 +- skala/tests/test_pyscf_gradients.py | 2 +- skala/tests/test_scf_retry.py | 3 +- skala/tests/test_traditional.py | 3 +- skala/tests/test_xc_integrator.py | 2 +- website/model-card/skala-1.0.rst | 10 ++-- website/model-card/skala-1.1.rst | 6 +-- 41 files changed, 55 insertions(+), 95 deletions(-) diff --git a/.github/workflows/benchmark-test.yml b/.github/workflows/benchmark-test.yml index 9b96410c..1ca715bf 100644 --- a/.github/workflows/benchmark-test.yml +++ b/.github/workflows/benchmark-test.yml @@ -42,4 +42,4 @@ jobs: cache: false - name: Run benchmark unit tests - run: pytest -v benchmark/tests/ \ No newline at end of file + run: pytest -v benchmark/tests/ diff --git a/AGENTS.md b/AGENTS.md index 97153314..d1c42e6c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -41,7 +41,8 @@ Skala is a neural network-based exchange-correlation (XC) functional for density - Generated build, coverage, and documentation output is excluded from static analysis. When editing code: -- Run `ruff format ` and `ruff check --fix ` before committing. +- Run `pre-commit run ruff-format --files ` and + `pre-commit run ruff --files ` before committing. - Add type hints to new public functions and classes. - Use Google-style docstrings with `Args:`, `Returns:`, `Raises:` sections. @@ -95,7 +96,7 @@ When editing code: | Task | Command | |------|---------| -| Format code | `pixi run -e default ruff format skala/ model/ gauxc/ benchmark/ docs/` | +| 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/` | diff --git a/benchmark/README.md b/benchmark/README.md index 39184061..2a95c822 100644 --- a/benchmark/README.md +++ b/benchmark/README.md @@ -5,4 +5,4 @@ The default Pixi environment installs it as an editable package and provides the command. See the [benchmark documentation](../website/benchmarks.rst) for dataset setup, benchmark -execution, result collection, and report generation. \ No newline at end of file +execution, result collection, and report generation. diff --git a/benchmark/src/skala_benchmark/runner.py b/benchmark/src/skala_benchmark/runner.py index a5366fdd..329cfd9e 100644 --- a/benchmark/src/skala_benchmark/runner.py +++ b/benchmark/src/skala_benchmark/runner.py @@ -38,10 +38,11 @@ if TYPE_CHECKING: import torch - from pyscf import gto from pyscf.scf.hf import SCF from skala.functional.base import ExcFunctionalBase + from pyscf import gto + @dataclass(frozen=True, slots=True) class RunConfig: diff --git a/benchmark/tests/test_docs.py b/benchmark/tests/test_docs.py index 621fec7b..892eb731 100644 --- a/benchmark/tests/test_docs.py +++ b/benchmark/tests/test_docs.py @@ -11,7 +11,7 @@ def _load_extension() -> Any: - path = Path(__file__).parents[2] / "docs" / "site" / "_ext" / "benchmark_report.py" + path = Path(__file__).parents[2] / "website" / "_ext" / "benchmark_report.py" spec = importlib.util.spec_from_file_location("benchmark_report_test", path) assert spec is not None and spec.loader is not None module = importlib.util.module_from_spec(spec) diff --git a/gauxc/docs/scripts/export-h5.py b/gauxc/docs/scripts/export-h5.py index 75a00433..be29ca51 100644 --- a/gauxc/docs/scripts/export-h5.py +++ b/gauxc/docs/scripts/export-h5.py @@ -1,7 +1,8 @@ -from pyscf import gto 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() diff --git a/gauxc/src/skala_gauxc/export.py b/gauxc/src/skala_gauxc/export.py index 261fc8c9..5ecdfef1 100644 --- a/gauxc/src/skala_gauxc/export.py +++ b/gauxc/src/skala_gauxc/export.py @@ -2,6 +2,7 @@ import h5py import numpy as np + from pyscf import gto MOLECULE_DTYPE = { diff --git a/gauxc/tests/test_gauxc_export.py b/gauxc/tests/test_gauxc_export.py index f4cbe6c3..ba2a6162 100644 --- a/gauxc/tests/test_gauxc_export.py +++ b/gauxc/tests/test_gauxc_export.py @@ -4,9 +4,10 @@ import h5py import numpy as np import pytest -from pyscf import dft, gto 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: diff --git a/model/examples/cpp/cpp_integration/prepare_inputs.py b/model/examples/cpp/cpp_integration/prepare_inputs.py index 5508cd7a..6eda4b34 100755 --- a/model/examples/cpp/cpp_integration/prepare_inputs.py +++ b/model/examples/cpp/cpp_integration/prepare_inputs.py @@ -4,12 +4,13 @@ from pathlib import Path import torch -from pyscf import dft, gto from pyscf.dft import gen_grid from skala.functional.traditional import LDA from skala.pyscf.features import generate_features from skala_model import SkalaFunctional +from pyscf import dft, gto + def main() -> None: parser = argparse.ArgumentParser() diff --git a/pixi.lock b/pixi.lock index fe07a634..5733fe21 100644 --- a/pixi.lock +++ b/pixi.lock @@ -608,7 +608,6 @@ environments: - 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/ruff-0.16.4-hc991c3d_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 @@ -863,7 +862,6 @@ environments: - 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/ruff-0.16.4-h2337b2e_0.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 @@ -1188,7 +1186,6 @@ environments: - 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/ruff-0.16.4-h20cfa0c_0.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 @@ -3803,7 +3800,6 @@ environments: - 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/ruff-0.16.4-hc991c3d_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 @@ -11190,22 +11186,6 @@ packages: run_exports: {} size: 300259 timestamp: 1782831325201 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.16.4-hc991c3d_0.conda - noarch: python - sha256: f734f6f3f48c2bd044fd9cac20cba8598cb1874822ee31bf23db4f1f8dc6c7fd - md5: d3788f0b510e5357be1a2b7afac862e3 - depends: - - python - - __glibc >=2.17,<3.0.a0 - - libgcc >=15 - constrains: - - __glibc >=2.17 - license: MIT - purls: - - pkg:pypi/ruff?source=compressed-mapping - run_exports: {} - size: 8941917 - timestamp: 1787257899438 - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.5-h7e3ee7f_1.conda sha256: 7369ac21f3561e2203f5b1600ef0671270057380783ca4b9e15f679ba25db575 md5: fa1c00d999e83ec20173c9775f71a1f1 @@ -14210,21 +14190,6 @@ packages: - readline >=8.3,<9.0a0 size: 364344 timestamp: 1787033761576 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ruff-0.16.4-h2337b2e_0.conda - noarch: python - sha256: 93ef27a33abc50283f567291cae9a03fa892f40381b00d803b5d7df592e3f0f9 - md5: be358ac8e5f7daea999fa77b473daec1 - depends: - - python - - libgcc >=15 - constrains: - - __glibc >=2.17 - license: MIT - purls: - - pkg:pypi/ruff?source=compressed-mapping - run_exports: {} - size: 8647773 - timestamp: 1787257898184 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/s2n-1.7.5-h61cb6f2_1.conda sha256: 5d2d07970e83b069a9155e68f56ef32af2563aad01f61ce697f062d8076f928e md5: b38fcd3d4d7bffca304425358189726f @@ -19377,21 +19342,6 @@ packages: - readline >=8.3,<9.0a0 size: 314395 timestamp: 1787033878899 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.16.4-h20cfa0c_0.conda - noarch: python - sha256: 9d4aacc6049819bbe59be39ff3a26a8bd8ebf5f27a9eb6683eaf008b651eb16f - md5: a28840b14fb8bbb7b81fe1fde21d7f55 - depends: - - python - - __osx >=11.0 - constrains: - - __osx >=11.0 - license: MIT - purls: - - pkg:pypi/ruff?source=compressed-mapping - run_exports: {} - size: 8202144 - timestamp: 1787258082982 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/s2n-1.7.5-h1b28cb6_1.conda sha256: 47ec36bdd05117c974853a8dbaa9d89605a5f70b592d47c7d198b20252ddf1f4 md5: 94b3b302cd6c07c5ec68648b25c8c525 diff --git a/pixi.toml b/pixi.toml index 08948730..728c55f2 100644 --- a/pixi.toml +++ b/pixi.toml @@ -116,7 +116,6 @@ pytest-timeout = "*" [feature.lint.dependencies] mypy = ">=2" pre-commit = "*" -ruff = "*" [feature.lint.pypi-dependencies] pandas-stubs = "*" diff --git a/skala/src/skala/ase/calculator.py b/skala/src/skala/ase/calculator.py index c6d66d23..e7c7e15d 100644 --- a/skala/src/skala/ase/calculator.py +++ b/skala/src/skala/ase/calculator.py @@ -12,9 +12,9 @@ all_changes, ) from ase.units import Bohr, Debye, Hartree -from pyscf import grad, gto import skala.pyscf as skala_cpu +from pyscf import grad, gto from skala.functional.base import ExcFunctionalBase from skala.pyscf.retry import retry_scf diff --git a/skala/src/skala/dispersion.py b/skala/src/skala/dispersion.py index c1cb387e..90b51081 100644 --- a/skala/src/skala/dispersion.py +++ b/skala/src/skala/dispersion.py @@ -5,6 +5,7 @@ from typing import Self import numpy as np + from pyscf import gto try: diff --git a/skala/src/skala/gpu4pyscf/__init__.py b/skala/src/skala/gpu4pyscf/__init__.py index 586f5de6..1f883069 100644 --- a/skala/src/skala/gpu4pyscf/__init__.py +++ b/skala/src/skala/gpu4pyscf/__init__.py @@ -32,7 +32,6 @@ ) from e from pyscf import gto - from skala.functional import ExcFunctionalBase, load_functional from skala.gpu4pyscf import dft diff --git a/skala/src/skala/gpu4pyscf/dft.py b/skala/src/skala/gpu4pyscf/dft.py index b8e4ec49..dd8b16bf 100644 --- a/skala/src/skala/gpu4pyscf/dft.py +++ b/skala/src/skala/gpu4pyscf/dft.py @@ -59,8 +59,8 @@ import torch from gpu4pyscf import dft from gpu4pyscf.df import df_jk -from pyscf import gto +from pyscf import gto from skala.dispersion import DFTD3Dispersion from skala.functional.base import ExcFunctionalBase from skala.gpu4pyscf.gradients import SkalaRKSGradient, SkalaUKSGradient diff --git a/skala/src/skala/gpu4pyscf/gradients.py b/skala/src/skala/gpu4pyscf/gradients.py index ccc17e29..38ff3224 100644 --- a/skala/src/skala/gpu4pyscf/gradients.py +++ b/skala/src/skala/gpu4pyscf/gradients.py @@ -13,10 +13,10 @@ from gpu4pyscf.grad.rks import grids_noresponse_cc, grids_response_cc from gpu4pyscf.grad.uhf import Gradients as UHFGradient from gpu4pyscf.scf.hf import SCF -from pyscf import gto from torch.utils.dlpack import from_dlpack import skala.pyscf.features as feature +from pyscf import gto from skala.dispersion import DFTD3Dispersion from skala.features import Feature, FeatureMap from skala.functional.base import ExcFunctionalBase diff --git a/skala/src/skala/gpu4pyscf/grids.py b/skala/src/skala/gpu4pyscf/grids.py index b91a7a00..91d33cb4 100644 --- a/skala/src/skala/gpu4pyscf/grids.py +++ b/skala/src/skala/gpu4pyscf/grids.py @@ -5,8 +5,8 @@ import torch from gpu4pyscf.dft import gen_grid, numint -from pyscf import gto +from pyscf import gto from skala.pyscf.spatial_grid_layout import ( SpatialGridLayout, prepare_spatial_grid_layout, diff --git a/skala/src/skala/pyscf/__init__.py b/skala/src/skala/pyscf/__init__.py index 236de2ff..ed189188 100644 --- a/skala/src/skala/pyscf/__init__.py +++ b/skala/src/skala/pyscf/__init__.py @@ -11,9 +11,9 @@ from typing import Any import torch + from pyscf import dft as pyscf_dft from pyscf import gto - from skala.functional import ExcFunctionalBase, load_functional from skala.pyscf import dft diff --git a/skala/src/skala/pyscf/ao_evaluation.py b/skala/src/skala/pyscf/ao_evaluation.py index 19952524..bbb581f1 100644 --- a/skala/src/skala/pyscf/ao_evaluation.py +++ b/skala/src/skala/pyscf/ao_evaluation.py @@ -10,12 +10,12 @@ import numpy as np import torch -from pyscf import dft, gto from torch import Tensor from torch.autograd import Function from torch.autograd.function import FunctionCtx from torch.utils.dlpack import from_dlpack +from pyscf import dft, gto from skala.features import FeatureMap from skala.pyscf import feature_math from skala.pyscf.backend import ( diff --git a/skala/src/skala/pyscf/backend.py b/skala/src/skala/pyscf/backend.py index d64777d6..4a2bb7c6 100644 --- a/skala/src/skala/pyscf/backend.py +++ b/skala/src/skala/pyscf/backend.py @@ -11,9 +11,9 @@ import numpy as np import torch -from pyscf import dft from torch import Tensor +from pyscf import dft from skala.typing import F64 GPU_EXCEPTION: BaseException | None = None diff --git a/skala/src/skala/pyscf/dft.py b/skala/src/skala/pyscf/dft.py index 9e7d7ea0..a4ec53c6 100644 --- a/skala/src/skala/pyscf/dft.py +++ b/skala/src/skala/pyscf/dft.py @@ -56,9 +56,9 @@ import numpy as np import torch -from pyscf import dft, gto from pyscf.df import df_jk +from pyscf import dft, gto from skala.dispersion import DFTD3Dispersion from skala.functional.base import ExcFunctionalBase from skala.pyscf.gradients import SkalaRKSGradient, SkalaUKSGradient diff --git a/skala/src/skala/pyscf/features.py b/skala/src/skala/pyscf/features.py index 751c7dfd..40b64f6a 100644 --- a/skala/src/skala/pyscf/features.py +++ b/skala/src/skala/pyscf/features.py @@ -6,9 +6,9 @@ import numpy as np import torch -from pyscf import gto from torch import Tensor +from pyscf import gto from skala.features import Feature, FeatureMap from skala.pyscf import ao_evaluation, feature_math from skala.pyscf.backend import Grid, from_numpy_or_cupy diff --git a/skala/src/skala/pyscf/gradients.py b/skala/src/skala/pyscf/gradients.py index 091cc071..c7af698b 100644 --- a/skala/src/skala/pyscf/gradients.py +++ b/skala/src/skala/pyscf/gradients.py @@ -7,13 +7,13 @@ import numpy as np import torch -from pyscf import dft, gto from pyscf.grad.rhf import Gradients as RHFGradient from pyscf.grad.rks import grids_noresponse_cc, grids_response_cc from pyscf.grad.uks import Gradients as UHFGradient from pyscf.scf.hf import SCF import skala.pyscf.features as feature +from pyscf import dft, gto from skala.dispersion import DFTD3Dispersion from skala.features import Feature, FeatureMap from skala.functional.base import ExcFunctionalBase diff --git a/skala/src/skala/pyscf/grids.py b/skala/src/skala/pyscf/grids.py index c93e5c77..4c4cff63 100644 --- a/skala/src/skala/pyscf/grids.py +++ b/skala/src/skala/pyscf/grids.py @@ -4,9 +4,9 @@ from typing import Any import torch -from pyscf import gto from pyscf.dft import gen_grid +from pyscf import gto from skala.pyscf.spatial_grid_layout import ( CPU_AO_SCREENING_BLOCK_SIZE, SpatialGridLayout, diff --git a/skala/src/skala/pyscf/model_chunking.py b/skala/src/skala/pyscf/model_chunking.py index f041f5e6..85035080 100644 --- a/skala/src/skala/pyscf/model_chunking.py +++ b/skala/src/skala/pyscf/model_chunking.py @@ -12,9 +12,9 @@ from dataclasses import dataclass import torch -from pyscf import gto from torch import Tensor +from pyscf import gto from skala.features import Feature, FeatureMap from skala.pyscf import feature_math from skala.pyscf.backend import Grid diff --git a/skala/src/skala/pyscf/numint.py b/skala/src/skala/pyscf/numint.py index 6a7a2649..7ee79c39 100644 --- a/skala/src/skala/pyscf/numint.py +++ b/skala/src/skala/pyscf/numint.py @@ -5,9 +5,9 @@ import numpy as np import torch -from pyscf import gto from torch import Tensor +from pyscf import gto from skala.functional.base import ExcFunctionalBase from skala.pyscf.backend import ( KS, diff --git a/skala/src/skala/pyscf/spatial_grid_layout.py b/skala/src/skala/pyscf/spatial_grid_layout.py index 69cfb057..38946d19 100644 --- a/skala/src/skala/pyscf/spatial_grid_layout.py +++ b/skala/src/skala/pyscf/spatial_grid_layout.py @@ -20,9 +20,9 @@ import numpy as np import torch -from pyscf import dft, gto from torch import Tensor +from pyscf import dft, gto from skala.pyscf.backend import Grid, check_gpu_imports_were_successful from skala.typing import D1, D2, F64, I64 diff --git a/skala/src/skala/pyscf/xc_integrator.py b/skala/src/skala/pyscf/xc_integrator.py index 75bee4c8..8d34c5f4 100644 --- a/skala/src/skala/pyscf/xc_integrator.py +++ b/skala/src/skala/pyscf/xc_integrator.py @@ -7,10 +7,10 @@ from typing import TYPE_CHECKING, TypeAlias, TypeGuard import torch -from pyscf import gto from pyscf.dft import numint as pyscf_numint from torch import Tensor +from pyscf import gto from skala.features import Feature from skala.functional.base import ExcFunctionalBase from skala.pyscf import ao_evaluation, feature_math diff --git a/skala/tests/test_ao_screening.py b/skala/tests/test_ao_screening.py index ee2068d5..5a052866 100644 --- a/skala/tests/test_ao_screening.py +++ b/skala/tests/test_ao_screening.py @@ -5,7 +5,6 @@ import numpy as np import pytest import torch -from pyscf import dft, gto from skala.features import Feature, FeatureMap from skala.functional.base import ExcFunctionalBase from skala.pyscf import ao_evaluation as ao_evaluation_module @@ -34,6 +33,7 @@ from skala.pyscf.xc_integrator import XCIntegrator from skala.typing import F64 +from pyscf import dft, gto from tests.utils import QuadraticFunctional, force_ao_screening _NumPyNumInt: TypeAlias = SkalaNumInt[np.ndarray[Any, F64]] diff --git a/skala/tests/test_ao_screening_benchmark.py b/skala/tests/test_ao_screening_benchmark.py index c571aff2..e4d73112 100644 --- a/skala/tests/test_ao_screening_benchmark.py +++ b/skala/tests/test_ao_screening_benchmark.py @@ -18,7 +18,6 @@ import numpy as np import pytest import torch -from pyscf import dft, gto, lib from pytest_benchmark.fixture import BenchmarkFixture from skala.functional import load_functional from skala.functional.base import ExcFunctionalBase @@ -26,6 +25,8 @@ from skala.pyscf.numint import SkalaNumInt from torch.utils.dlpack import from_dlpack +from pyscf import dft, gto, lib + from .utils import force_ao_screening, require_gpu THREAD_COUNT = 4 diff --git a/skala/tests/test_gpu4pyscf_ao_screening.py b/skala/tests/test_gpu4pyscf_ao_screening.py index 4a18c8e4..35983962 100644 --- a/skala/tests/test_gpu4pyscf_ao_screening.py +++ b/skala/tests/test_gpu4pyscf_ao_screening.py @@ -7,9 +7,9 @@ import numpy as np import pytest import torch -from pyscf import dft, gto from torch.utils.dlpack import from_dlpack +from pyscf import dft, gto from tests.utils import QuadraticFunctional, force_ao_screening, require_gpu pytestmark = pytest.mark.gpu diff --git a/skala/tests/test_gpu4pyscf_classes.py b/skala/tests/test_gpu4pyscf_classes.py index c9d5cd28..1990669e 100644 --- a/skala/tests/test_gpu4pyscf_classes.py +++ b/skala/tests/test_gpu4pyscf_classes.py @@ -4,8 +4,8 @@ import numpy as np import pytest import torch -from pyscf import gto +from pyscf import gto from tests.utils import require_gpu pytestmark = pytest.mark.gpu diff --git a/skala/tests/test_gpu4pyscf_gradients.py b/skala/tests/test_gpu4pyscf_gradients.py index 7df96ac3..8bedf27a 100644 --- a/skala/tests/test_gpu4pyscf_gradients.py +++ b/skala/tests/test_gpu4pyscf_gradients.py @@ -13,7 +13,6 @@ from gpu4pyscf import dft, scf # noqa: E402 -from pyscf import gto # noqa: E402 from skala.features import Feature, FeatureMap # noqa: E402 from skala.functional.base import ExcFunctionalBase # noqa: E402 from skala.gpu4pyscf import SkalaKS # noqa: E402 @@ -28,6 +27,7 @@ from skala.pyscf.gradients import SkalaRKSGradient as CpuSkalaRKSGradient # noqa: E402 from skala.utils import torch_allocator # noqa: E402 +from pyscf import gto # noqa: E402 from tests.ridders import num_grad_ridders # noqa: E402 H2_SKALA_1_1_GRAD_REF = torch.tensor( diff --git a/skala/tests/test_model_chunking.py b/skala/tests/test_model_chunking.py index 0fdf05e3..6bd7d59b 100644 --- a/skala/tests/test_model_chunking.py +++ b/skala/tests/test_model_chunking.py @@ -4,13 +4,14 @@ import pytest import torch -from pyscf import gto from skala.features import Feature, FeatureMap from skala.pyscf import model_chunking from skala.pyscf.backend import Grid from skala.pyscf.evaluation import FeatureSpec from skala.pyscf.feature_math import MGGAFeatureFunction +from pyscf import gto + def test_model_feature_chunker_sorts_complete_atomic_grids( monkeypatch: pytest.MonkeyPatch, diff --git a/skala/tests/test_pyscf_classes.py b/skala/tests/test_pyscf_classes.py index c1a9fc79..515ccb3f 100644 --- a/skala/tests/test_pyscf_classes.py +++ b/skala/tests/test_pyscf_classes.py @@ -3,13 +3,14 @@ import numpy as np import pytest -from pyscf import dft, gto from skala.functional.base import ExcFunctionalBase from skala.pyscf import SkalaKS from skala.pyscf.dft import SkalaRKS, SkalaUKS from skala.pyscf.gradients import SkalaRKSGradient, SkalaUKSGradient from skala.pyscf.grids import SkalaGrids +from pyscf import dft, gto + @pytest.fixture(params=["skala-1.0", "skala-1.1"]) def skala_xc( diff --git a/skala/tests/test_pyscf_gradients.py b/skala/tests/test_pyscf_gradients.py index 706cf650..b3d064a7 100644 --- a/skala/tests/test_pyscf_gradients.py +++ b/skala/tests/test_pyscf_gradients.py @@ -3,7 +3,6 @@ import pytest import torch -from pyscf import dft, gto, scf from skala.features import Feature, FeatureMap from skala.functional.base import ExcFunctionalBase from skala.pyscf import SkalaKS @@ -14,6 +13,7 @@ veff_and_expl_nuc_grad, ) +from pyscf import dft, gto, scf from tests.ridders import num_grad_ridders from tests.utils import FULL_GRAD_REF diff --git a/skala/tests/test_scf_retry.py b/skala/tests/test_scf_retry.py index 1ff2d64f..abe873af 100644 --- a/skala/tests/test_scf_retry.py +++ b/skala/tests/test_scf_retry.py @@ -1,10 +1,11 @@ # SPDX-License-Identifier: MIT import pytest -from pyscf import dft, gto from pyscf.soscf.newton_ah import _CIAH_SOSCF from skala.pyscf.retry import retry_scf +from pyscf import dft, gto + SCF_CONFIG = { "conv_tol": 5e-6, "conv_tol_grad": 0.001, diff --git a/skala/tests/test_traditional.py b/skala/tests/test_traditional.py index d16068fa..e73242ad 100644 --- a/skala/tests/test_traditional.py +++ b/skala/tests/test_traditional.py @@ -4,12 +4,13 @@ from typing import cast import pytest -from pyscf import dft, gto from pytest import approx from skala.functional import ExcFunctionalBase from skala.pyscf import SkalaKS from torch import nn +from pyscf import dft, gto + @pytest.fixture(params=["HF", "Ar", "H"]) def mol(request: pytest.FixtureRequest) -> gto.Mole: diff --git a/skala/tests/test_xc_integrator.py b/skala/tests/test_xc_integrator.py index 6a0c4733..c4049a66 100644 --- a/skala/tests/test_xc_integrator.py +++ b/skala/tests/test_xc_integrator.py @@ -1,11 +1,11 @@ import pytest import torch -from pyscf import dft, gto from skala.features import Feature, FeatureMap from skala.pyscf import xc_integrator as xc_integrator_module from skala.pyscf.grids import SkalaGrids from skala.pyscf.xc_integrator import XCIntegrator, XCResult +from pyscf import dft, gto from tests.utils import QuadraticFunctional, force_ao_screening diff --git a/website/model-card/skala-1.0.rst b/website/model-card/skala-1.0.rst index fc2f3642..6a4b7547 100644 --- a/website/model-card/skala-1.0.rst +++ b/website/model-card/skala-1.0.rst @@ -22,7 +22,7 @@ On GMTKN55, which covers general main-group thermochemistry, kinetics, and nonco This accuracy is competitive with state-of-the-art range-separated hybrid functionals, while only requiring a cost comparable to semi-local DFT. With this work, we demonstrate the viability of our approach toward the universal density functional across all of chemistry. -Users of this model are expected to have a basic understanding of the field of quantum chemistry and density functional theory. +Users of this model are expected to have a basic understanding of the field of quantum chemistry and density functional theory. :Developed by: Chin-Wei Huang, Deniz Gunceler, Derk Kooi, Klaas Giesbertz, Giulia Luise, Jan Hermann, Megan Stanley, Paola Gori Giorgi, Rianne van den Berg, Sebastian Ehlert, Stephanie Lanius, Thijs Vogels, Wessel Bruinsma @@ -48,7 +48,7 @@ Direct intended uses Out-of-scope uses ----------------- -#. Evaluating the functional with a single pass given a fixed density as input is not the intended way to evaluate the model. The model's predictions should always be made by using it as part of an SCF procedure. +#. Evaluating the functional with a single pass given a fixed density as input is not the intended way to evaluate the model. The model's predictions should always be made by using it as part of an SCF procedure. #. We do not include a training pipeline for the Skala-1.0 functional in this code base. Risks and limitations @@ -176,13 +176,13 @@ When using Skala-1.0 in your research, please reference it including the version .. code:: bibtex @misc{luise2025, - title={Accurate and scalable exchange-correlation with deep learning}, + title={Accurate and scalable exchange-correlation with deep learning}, author={Giulia Luise and Chin-Wei Huang and Thijs Vogels and Derk P. Kooi and Sebastian Ehlert and Stephanie Lanius and Klaas J. H. Giesbertz and Amir Karton and Deniz Gunceler and Megan Stanley and Wessel P. Bruinsma and Lin Huang and Xinran Wei and José Garrido Torres and Abylay Katbashev and Rodrigo Chavez Zavaleta and Bálint Máté and Sékou-Oumar Kaba and Roberto Sordillo and Yingrong Chen and David B. Williams-Young and Christopher M. Bishop and Jan Hermann and Rianne van den Berg and Paola Gori-Giorgi}, year={2025}, eprint={2506.14665v5}, archivePrefix={arXiv}, primaryClass={physics.chem-ph}, - url={https://arxiv.org/abs/2506.14665v5}, + url={https://arxiv.org/abs/2506.14665v5}, } Model card contact @@ -196,4 +196,4 @@ Model card contact References ---------- -.. footbibliography:: \ No newline at end of file +.. footbibliography:: diff --git a/website/model-card/skala-1.1.rst b/website/model-card/skala-1.1.rst index 07557170..f4161e94 100644 --- a/website/model-card/skala-1.1.rst +++ b/website/model-card/skala-1.1.rst @@ -91,7 +91,7 @@ The following data is included in our training set: The reference energies were obtained from literature. :NCI-Atlas: - Five datasets from the `NCI-Atlas collection of non-covalent interactions `__: + Five datasets from the `NCI-Atlas collection of non-covalent interactions `__: - `D442x10 `__, dissociation curves for dispersion-bound van der Waals complexes - `SH250x10 `__, dissociation curves for sigma-hole-bound van der Waals complexes @@ -209,7 +209,7 @@ When using Skala-1.1 in your research, please reference it including the version .. code:: bibtex @misc{luise2025, - title={Accurate and scalable exchange-correlation with deep learning}, + title={Accurate and scalable exchange-correlation with deep learning}, author={Giulia Luise and Chin-Wei Huang and Thijs Vogels and Derk P. Kooi and Sebastian Ehlert and Stephanie Lanius and Klaas J. H. Giesbertz and Amir Karton and Deniz Gunceler and Megan Stanley and Wessel P. Bruinsma and Lin Huang and Xinran Wei and José Garrido Torres and Abylay Katbashev and Rodrigo Chavez Zavaleta and Bálint Máté and Sékou-Oumar Kaba and Roberto Sordillo and Yingrong Chen and David B. Williams-Young and Christopher M. Bishop and Jan Hermann and Rianne van den Berg and Paola Gori-Giorgi}, year={2025}, eprint={2506.14665}, @@ -229,4 +229,4 @@ Model card contact References ---------- -.. footbibliography:: \ No newline at end of file +.. footbibliography::