From 170ee1944d5a04b9905c19b9d75574464d731d39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20V=C3=A9ril?= Date: Thu, 12 Nov 2026 12:29:02 +0100 Subject: [PATCH 1/3] Migrate PySCF reference checks to 2.15 --- .github/workflows/ci.yml | 21 +++++++++++++++++++++ docs/src/development/manual-setup.md | 17 ++++++----------- docs/src/development/platforms.md | 10 ++++++---- docs/src/user-guide/hartree-fock.md | 2 +- docs/src/user-guide/json-output.md | 2 +- docs/src/user-guide/mp2.md | 2 +- pyproject.toml | 5 ++--- tools/reference/README.md | 10 +++++----- tools/reference/integrals.py | 2 +- tools/reference/test_integrals.py | 9 +++++++-- uv.lock | 26 ++++++++++++++++---------- 11 files changed, 67 insertions(+), 39 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7e72e61b..20f32e14 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -128,6 +128,27 @@ jobs: if: matrix.os == 'windows-latest' && matrix.python-version == '3.12' run: uv run --locked --python ${{ matrix.python-version }} pytest tools/reference/test_persistence_interop.py -k reads_rust + pyscf-native: + name: PySCF reference suite (${{ matrix.os }}) + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, ubuntu-24.04-arm, macos-15-intel, macos-14, windows-latest] + steps: + - name: Checkout + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + - name: Set up uv + uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3 + with: + python-version: '3.12' + - name: Install Rust stable + uses: dtolnay/rust-toolchain@4360b52568e2003a75bf9bc1d59f33a8e3fc893c # stable + - name: Cache Rust builds + uses: Swatinem/rust-cache@d1527c8f67ef9af357290475d4af4b0fab8f12e0 # v2.9.3 + - name: Run PySCF comparisons + run: uv run --locked pytest tools/reference + nix: name: Nix flake (${{ matrix.system }}) runs-on: ${{ matrix.os }} diff --git a/docs/src/development/manual-setup.md b/docs/src/development/manual-setup.md index 0575da67..d0ec5b66 100644 --- a/docs/src/development/manual-setup.md +++ b/docs/src/development/manual-setup.md @@ -10,8 +10,7 @@ dependencies through `Cargo.lock`, but does not pin the entire host environment. - **Platforms:** native Cargo supports the platforms in the [compatibility table](platforms.md), including Windows and Intel macOS. - Python development tools run natively on Windows; PySCF comparisons currently - require Linux, macOS, or WSL2. + Python development tools run natively on Windows; PySCF comparisons also run on Windows x86-64. - **HPC use:** this route can use the site's existing compiler environment without Docker or Nix. Build and run according to cluster policy, using the scheduler's assigned resources. A locally built binary still needs a @@ -52,21 +51,17 @@ uv run --locked pytest tools/test_book_links.py tools/test_release_smoke.py tool The project supports Python 3.12 through 3.14. The default groups install JupyterLab, ipykernel, Matplotlib, SciPy, NumPy, pytest, and Ruff. The lock -also includes PySCF 2.14.0 on Linux and macOS, but that pinned release has no -Windows wheel, so uv excludes it on native Windows. Binary wheels are required; +also includes PySCF 2.15.0 on Linux, macOS, and Windows x86-64. +Windows ARM64 remains excluded. Binary wheels are required; source builds remain disabled. Run the reference suite with: ```sh uv run --locked pytest tools/reference ``` -On native Windows, only the PySCF calculation tests in -`tools/reference/test_compare_pyscf.py` and `tools/reference/test_integrals.py` -are skipped. Helper tests in -`test_compare_pyscf_helpers.py`, report validation, and NumPy persistence tests, -including Rust-generated persistence artifacts, remain available. Use WSL2 -for PySCF comparisons and the scientific report -generator (`tools/reference/report.py`). These Python tools support +On Windows x86-64, the same command runs PySCF calculations, AO integral +comparisons, helper tests, and persistence interoperability tests. Use WSL2 +for PySCF on Windows ARM64. These Python tools support development and validation; building the RustiQ executable still requires the Rust toolchain and the Cargo commands above. diff --git a/docs/src/development/platforms.md b/docs/src/development/platforms.md index 5c658c41..25484ab4 100644 --- a/docs/src/development/platforms.md +++ b/docs/src/development/platforms.md @@ -42,9 +42,9 @@ Windows troubleshooting, and the configured VS Code extensions. The optional scientific Python tools have their own platform requirements. The project configures `uv` for Linux, macOS, and native Windows. The locked -PySCF release is excluded on native Windows; the remaining Python tools and -tests run there. The Nix environment provides PySCF on every declared Nix -system. For PySCF comparisons on Windows, use WSL2 or the Linux Dev Container. +PySCF 2.15.0 release includes native Windows x86-64 wheels; Windows ARM64 +remains excluded. The Nix environment provides PySCF on every declared Nix +system. For PySCF comparisons on Windows ARM64, use WSL2 or the Linux Dev Container. ## How compatibility is checked @@ -61,7 +61,9 @@ provides ongoing evidence for this support: and PySCF comparisons. Separate Windows and macOS host integrations are not exercised by these checks. - The standalone `uv` environment is checked on Linux and Windows x86_64 with - Python 3.12 and 3.14. Windows skips the PySCF comparison modules and also checks + Python 3.12 and 3.14. A native PySCF job runs the reference suite on Linux + x86-64 and ARM64, macOS Intel and Apple Silicon, and Windows x86-64. + Windows also checks Rust/NumPy persistence interoperability with Python 3.12. The [scheduled full Nix workflow](https://github.com/mveril/RustiQ/actions/workflows/nix-full.yml) diff --git a/docs/src/user-guide/hartree-fock.md b/docs/src/user-guide/hartree-fock.md index 115c3981..2ebcd542 100644 --- a/docs/src/user-guide/hartree-fock.md +++ b/docs/src/user-guide/hartree-fock.md @@ -165,7 +165,7 @@ The electronic HF energy includes electronic kinetic, electron–nuclear, and electron–electron terms. Total HF energy adds nuclear repulsion. Energies are in Hartree; input Angstrom coordinates are converted to Bohr internally. Terminal energies are rounded for display. The H₂/STO-3G example is checked -against a PySCF 2.14.0 reference in the project comparison suite with an +against a PySCF 2.15.0 reference in the project comparison suite with an absolute energy tolerance of \\(2\times10^{-10}\\) Hartree; the CLI test checks the rounded value. See [reference comparison coverage](../scientific-scope.md#reference-comparisons) and the [output guide](../getting-started/output.md). diff --git a/docs/src/user-guide/json-output.md b/docs/src/user-guide/json-output.md index 83cadc25..8c5932f9 100644 --- a/docs/src/user-guide/json-output.md +++ b/docs/src/user-guide/json-output.md @@ -107,6 +107,6 @@ for readability. Do not compare a rounded terminal value against a tight numerical tolerance. Existing JSON CLI tests validate both schemas and full-precision H₂ output in [`tests/json_output_cli.rs`](https://github.com/mveril/RustiQ/blob/main/tests/json_output_cli.rs). -The checked-in reference tests compare JSON values against PySCF 2.14.0 for +The checked-in reference tests compare JSON values against PySCF 2.15.0 for selected systems; see [scientific scope](../scientific-scope.md#reference-comparisons). For terminology used in result fields, see the [glossary](../glossary.md). diff --git a/docs/src/user-guide/mp2.md b/docs/src/user-guide/mp2.md index 078e4bc4..f5041ce8 100644 --- a/docs/src/user-guide/mp2.md +++ b/docs/src/user-guide/mp2.md @@ -159,7 +159,7 @@ budget resolution follows the shared [resource policy](https://github.com/mveril The H₂/STO-3G RHF-MP2 comparison checks the HF energy within \\(2\times10^{-10}\\) Hartree and MP2 correlation energy within \\(10^{-10}\\) Hartree against PySCF -2.14.0. The OH/STO-3G UHF-MP2 case checks HF energy within \\(5\times10^{-8}\\), +2.15.0. The OH/STO-3G UHF-MP2 case checks HF energy within \\(5\times10^{-8}\\), correlation energy within \\(5\times10^{-9}\\) Hartree, and spin expectation within \\(2\times10^{-5}\\). These are agreement tolerances for those inputs, not a measure of general chemical accuracy. See the diff --git a/pyproject.toml b/pyproject.toml index 44ed743b..4a156662 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,9 +3,8 @@ name = "rustiq-reference-tools" version = "0.0.0" description = "Python tooling used to validate RustiQ against reference implementations" requires-python = ">=3.12,<3.15" -# PySCF 2.14.0 predates upstream Windows-wheel publishing; PR #3424 adds Windows wheels to PyPI releases. -# Recheck this marker when upgrading PySCF: https://github.com/pyscf/pyscf/pull/3424 -dependencies = ["pyscf==2.14.0; sys_platform != 'win32'"] +# PySCF publishes native Windows wheels for x86-64; Windows ARM64 still requires WSL2. +dependencies = ["pyscf==2.15.0; sys_platform != 'win32' or platform_machine == 'AMD64' or platform_machine == 'x86_64'"] [dependency-groups] test = ["numpy", "pytest"] diff --git a/tools/reference/README.md b/tools/reference/README.md index 321bf3dc..6d8937d3 100644 --- a/tools/reference/README.md +++ b/tools/reference/README.md @@ -50,10 +50,10 @@ uv run --locked pytest tools/reference This uses the cross-platform lock for Python 3.12 through 3.14 and requires compatible binary wheels; it does not build Python packages from source. PySCF -supports Linux, macOS, and WSL2, but the pinned release has no native Windows -wheel. The lock excludes PySCF on native Windows. Windows uv jobs still run the -PySCF-independent report and helper tests; the PySCF comparison and AO -integral suites run in the Nix PySCF environment or WSL2. Cargo must remain on +2.15.0 provides binary wheels for Linux, macOS, and native Windows x86-64. +Windows ARM64 remains excluded; use WSL2 there. The native PySCF CI job runs +the full reference suite, including energy and AO integral comparisons, on +supported Linux, macOS, and Windows x86-64 runners. Cargo must remain on `PATH` when using the default `cargo run` invocation. Set `RUSTIQ_BIN` to an absolute executable path to compare a specific build instead; `nix run .#pyscf-check` supplies its Nix-built executable this way. @@ -265,7 +265,7 @@ reference, not a correlated MP2 spin expectation. ### Absolute tolerances -Measured errors with pinned PySCF 2.14.0 and single-thread BLAS/OpenMP are below. +Measured errors with PySCF 2.14.0 and single-thread BLAS/OpenMP are below. The tolerances leave a numerical margin over the observed errors for independent SCF termination and platform-dependent floating-point reductions; they do not represent physical error bars. No existing tolerance is increased. diff --git a/tools/reference/integrals.py b/tools/reference/integrals.py index e2f4b658..b9e04975 100644 --- a/tools/reference/integrals.py +++ b/tools/reference/integrals.py @@ -193,7 +193,7 @@ def validate(): env=env, ) except RuntimeError as error: - if not list(output.glob("*.json")): + if any(not (output / f"{name}.json").exists() for name, *_ in CASES): raise cargo_error = str(error) rust = [json.loads((output / f"{name}.json").read_text()) for name, *_ in CASES] diff --git a/tools/reference/test_integrals.py b/tools/reference/test_integrals.py index 1517b1a9..028de67c 100644 --- a/tools/reference/test_integrals.py +++ b/tools/reference/test_integrals.py @@ -6,7 +6,7 @@ import numpy as np import pytest -# PySCF is intentionally unavailable on Windows for the pinned reference suite. +# PySCF wheels are unavailable on some architectures, including Windows ARM64. # This module contains only tests that execute PySCF. pytest.importorskip("pyscf", reason="AO integral references require PySCF") @@ -24,8 +24,13 @@ def test_ao_integrals(): def test_checked_in_pyscf_references(): metadata, generated = generate_fixture() stored = json.loads(FIXTURE.read_text()) + # The checked-in arrays retain the PySCF version that generated them. + # Compare their values with the currently pinned PySCF independently. + metadata.pop("pyscf_version") assert metadata == { - key: value for key, value in stored.items() if key != "array_sha256" + key: value + for key, value in stored.items() + if key not in {"array_sha256", "pyscf_version"} } assert set(stored["array_sha256"]) == set(generated) for name, values in generated.items(): diff --git a/uv.lock b/uv.lock index 9c8d3e12..19c2b6a1 100644 --- a/uv.lock +++ b/uv.lock @@ -3,10 +3,10 @@ revision = 5 requires-python = ">=3.12, <3.15" resolution-markers = [ "python_full_version >= '3.14' and sys_platform == 'darwin'", - "python_full_version < '3.14' and sys_platform == 'darwin'", "python_full_version >= '3.14' and sys_platform == 'linux'", - "python_full_version < '3.14' and sys_platform == 'linux'", "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version < '3.14' and sys_platform == 'darwin'", + "python_full_version < '3.14' and sys_platform == 'linux'", "python_full_version < '3.14' and sys_platform == 'win32'", ] supported-markers = [ @@ -536,24 +536,28 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9e/e9/1a19e42cd43cc1365e127db6aae85e1c671da1d9a5d746f4d34a50edb577/h5py-3.16.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:dfc21898ff025f1e8e67e194965a95a8d4754f452f83454538f98f8a3fcb207e", size = 5405250, upload-time = "2026-03-06T13:48:09.628Z" }, { url = "https://files.pythonhosted.org/packages/b7/8e/9790c1655eabeb85b92b1ecab7d7e62a2069e53baefd58c98f0909c7a948/h5py-3.16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:698dd69291272642ffda44a0ecd6cd3bda5faf9621452d255f57ce91487b9794", size = 5190108, upload-time = "2026-03-06T13:48:11.26Z" }, { url = "https://files.pythonhosted.org/packages/51/d7/ab693274f1bd7e8c5f9fdd6c7003a88d59bedeaf8752716a55f532924fbb/h5py-3.16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2b2c02b0a160faed5fb33f1ba8a264a37ee240b22e049ecc827345d0d9043074", size = 5419216, upload-time = "2026-03-06T13:48:13.322Z" }, + { url = "https://files.pythonhosted.org/packages/03/c1/0976b235cf29ead553e22f2fb6385a8252b533715e00d0ae52ed7b900582/h5py-3.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:96b422019a1c8975c2d5dadcf61d4ba6f01c31f92bbde6e4649607885fe502d6", size = 3182868, upload-time = "2026-03-06T13:48:15.759Z" }, { url = "https://files.pythonhosted.org/packages/0f/9e/6142ebfda0cb6e9349c091eae73c2e01a770b7659255248d637bec54a88b/h5py-3.16.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:370a845f432c2c9619db8eed334d1e610c6015796122b0e57aa46312c22617d9", size = 3671808, upload-time = "2026-03-06T13:48:19.737Z" }, { url = "https://files.pythonhosted.org/packages/b0/65/5e088a45d0f43cd814bc5bec521c051d42005a472e804b1a36c48dada09b/h5py-3.16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42108e93326c50c2810025aade9eac9d6827524cdccc7d4b75a546e5ab308edb", size = 3045837, upload-time = "2026-03-06T13:48:21.854Z" }, { url = "https://files.pythonhosted.org/packages/da/1e/6172269e18cc5a484e2913ced33339aad588e02ba407fafd00d369e22ef3/h5py-3.16.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:099f2525c9dcf28de366970a5fb34879aab20491589fa89ce2863a84218bb524", size = 5193860, upload-time = "2026-03-06T13:48:24.071Z" }, { url = "https://files.pythonhosted.org/packages/bd/98/ef2b6fe2903e377cbe870c3b2800d62552f1e3dbe81ce49e1923c53d1c5c/h5py-3.16.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:9300ad32dea9dfc5171f94d5f6948e159ed93e4701280b0f508773b3f582f402", size = 5400417, upload-time = "2026-03-06T13:48:25.728Z" }, { url = "https://files.pythonhosted.org/packages/bc/81/5b62d760039eed64348c98129d17061fdfc7839fc9c04eaaad6dee1004e4/h5py-3.16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:171038f23bccddfc23f344cadabdfc9917ff554db6a0d417180d2747fe4c75a7", size = 5185214, upload-time = "2026-03-06T13:48:27.436Z" }, { url = "https://files.pythonhosted.org/packages/28/c4/532123bcd9080e250696779c927f2cb906c8bf3447df98f5ceb8dcded539/h5py-3.16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7e420b539fb6023a259a1b14d4c9f6df8cf50d7268f48e161169987a57b737ff", size = 5414598, upload-time = "2026-03-06T13:48:29.49Z" }, + { url = "https://files.pythonhosted.org/packages/c3/d9/a27997f84341fc0dfcdd1fe4179b6ba6c32a7aa880fdb8c514d4dad6fba3/h5py-3.16.0-cp313-cp313-win_amd64.whl", hash = "sha256:18f2bbcd545e6991412253b98727374c356d67caa920e68dc79eab36bf5fedad", size = 3175509, upload-time = "2026-03-06T13:48:31.131Z" }, { url = "https://files.pythonhosted.org/packages/48/3c/7fcd9b4c9eed82e91fb15568992561019ae7a829d1f696b2c844355d95dd/h5py-3.16.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:9c9d307c0ef862d1cd5714f72ecfafe0a5d7529c44845afa8de9f46e5ba8bd65", size = 3678608, upload-time = "2026-03-06T13:48:35.183Z" }, { url = "https://files.pythonhosted.org/packages/6a/b7/9366ed44ced9b7ef357ab48c94205280276db9d7f064aa3012a97227e966/h5py-3.16.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8c1eff849cdd53cbc73c214c30ebdb6f1bb8b64790b4b4fc36acdb5e43570210", size = 3054773, upload-time = "2026-03-06T13:48:37.139Z" }, { url = "https://files.pythonhosted.org/packages/58/a5/4964bc0e91e86340c2bbda83420225b2f770dcf1eb8a39464871ad769436/h5py-3.16.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:e2c04d129f180019e216ee5f9c40b78a418634091c8782e1f723a6ca3658b965", size = 5198886, upload-time = "2026-03-06T13:48:38.879Z" }, { url = "https://files.pythonhosted.org/packages/f1/16/d905e7f53e661ce2c24686c38048d8e2b750ffc4350009d41c4e6c6c9826/h5py-3.16.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:e4360f15875a532bc7b98196c7592ed4fc92672a57c0a621355961cafb17a6dd", size = 5404883, upload-time = "2026-03-06T13:48:41.324Z" }, { url = "https://files.pythonhosted.org/packages/4b/f2/58f34cb74af46d39f4cd18ea20909a8514960c5a3e5b92fd06a28161e0a8/h5py-3.16.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:3fae9197390c325e62e0a1aa977f2f62d994aa87aab182abbea85479b791197c", size = 5192039, upload-time = "2026-03-06T13:48:43.117Z" }, { url = "https://files.pythonhosted.org/packages/ce/ca/934a39c24ce2e2db017268c08da0537c20fa0be7e1549be3e977313fc8f5/h5py-3.16.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:43259303989ac8adacc9986695b31e35dba6fd1e297ff9c6a04b7da5542139cc", size = 5421526, upload-time = "2026-03-06T13:48:44.838Z" }, + { url = "https://files.pythonhosted.org/packages/3e/14/615a450205e1b56d16c6783f5ccd116cde05550faad70ae077c955654a75/h5py-3.16.0-cp314-cp314-win_amd64.whl", hash = "sha256:fa48993a0b799737ba7fd21e2350fa0a60701e58180fae9f2de834bc39a147ab", size = 3183263, upload-time = "2026-03-06T13:48:47.117Z" }, { url = "https://files.pythonhosted.org/packages/5d/32/0c8bb8aedb62c772cf7c1d427c7d1951477e8c2835f872bc0a13d1f85f86/h5py-3.16.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:15922e485844f77c0b9d275396d435db3baa58292a9c2176a386e072e0cf2491", size = 3760693, upload-time = "2026-03-06T13:48:50.453Z" }, { url = "https://files.pythonhosted.org/packages/1d/1f/fcc5977d32d6387c5c9a694afee716a5e20658ac08b3ff24fdec79fb05f2/h5py-3.16.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:df02dd29bd247f98674634dfe41f89fd7c16ba3d7de8695ec958f58404a4e618", size = 3181305, upload-time = "2026-03-06T13:48:52.221Z" }, { url = "https://files.pythonhosted.org/packages/f5/a1/af87f64b9f986889884243643621ebbd4ac72472ba8ec8cec891ac8e2ca1/h5py-3.16.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:0f456f556e4e2cebeebd9d66adf8dc321770a42593494a0b6f0af54a7567b242", size = 5074061, upload-time = "2026-03-06T13:48:54.089Z" }, { url = "https://files.pythonhosted.org/packages/cc/d0/146f5eaff3dc246a9c7f6e5e4f42bd45cc613bce16693bcd4d1f7c958bf5/h5py-3.16.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:3e6cb3387c756de6a9492d601553dffea3fe11b5f22b443aac708c69f3f55e16", size = 5279216, upload-time = "2026-03-06T13:48:56.75Z" }, { url = "https://files.pythonhosted.org/packages/a1/9d/12a13424f1e604fc7df9497b73c0356fb78c2fb206abd7465ce47226e8fd/h5py-3.16.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8389e13a1fd745ad2856873e8187fd10268b2d9677877bb667b41aebd771d8b7", size = 5070068, upload-time = "2026-03-06T13:48:59.169Z" }, { url = "https://files.pythonhosted.org/packages/41/8c/bbe98f813722b4873818a8db3e15aa3e625b59278566905ac439725e8070/h5py-3.16.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:346df559a0f7dcb31cf8e44805319e2ab24b8957c45e7708ce503b2ec79ba725", size = 5300253, upload-time = "2026-03-06T13:49:02.033Z" }, + { url = "https://files.pythonhosted.org/packages/32/9e/87e6705b4d6890e7cecdf876e2a7d3e40654a2ae37482d79a6f1b87f7b92/h5py-3.16.0-cp314-cp314t-win_amd64.whl", hash = "sha256:4c6ab014ab704b4feaa719ae783b86522ed0bf1f82184704ed3c9e4e3228796e", size = 3381671, upload-time = "2026-03-06T13:49:04.351Z" }, ] [[package]] @@ -1482,20 +1486,22 @@ wheels = [ [[package]] name = "pyscf" -version = "2.14.0" +version = "2.15.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "h5py" }, { name = "numpy" }, + { name = "psutil", marker = "sys_platform == 'win32'" }, { name = "scipy" }, { name = "setuptools" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3b/76/4b4f33877f4ee460733bd8b9af64cb9c13be9d5111fb8f6357d227c2c908/pyscf-2.14.0.tar.gz", hash = "sha256:9b6ea3c2470baac9d0492d93b335542c04ab96277e79f1abcbe1cea0eb063c5f", size = 11565773, upload-time = "2026-07-18T22:50:28.053Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/30/39707040412f20c61a91a7edcd921a5973c9b604c4d6095c2e0a5f7b35d3/pyscf-2.15.0.tar.gz", hash = "sha256:46601b24bb5fa8583f4734c65f096f1cb2006cd1a2c581b7761e1e740f36d74f", size = 10941454, upload-time = "2026-11-05T05:42:06.643Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/6e/16109bef2ed8b276c954e5a951e14eaa501d8f79ee928b64bc6fd0d2b440/pyscf-2.14.0-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:2f4964d64c5cbb7eaa363ed8a5d1b7cc8541f2008b9c3c81c22494d789fbcd33", size = 37156346, upload-time = "2026-07-18T22:27:48.81Z" }, - { url = "https://files.pythonhosted.org/packages/48/ed/bb4aeb728505b4ce7edd55e9b2e35bcbd99ad0b0cae5c45b59e48b9ed62d/pyscf-2.14.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a4bdc6f4155e258d78c90b4de0c88ab9260a45801264d6c471c3beec83a4da4c", size = 36492544, upload-time = "2026-07-18T22:24:50.025Z" }, - { url = "https://files.pythonhosted.org/packages/89/f2/24c58dad0c33ab417c5a090695a6788292d5d4edceae59bad055e5377e92/pyscf-2.14.0-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2c01234a5480e545e5e156d1fabe9b97264bf87ee274c62d14478ab9fe644100", size = 46031836, upload-time = "2026-07-19T00:57:07.889Z" }, - { url = "https://files.pythonhosted.org/packages/88/30/8e48717aff32f11fd78f981192d0b567971eb285ea048414b7dac2a211cf/pyscf-2.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b0bccc55450311a55318cd643e851353331ddeab4fc0c0065e83c905e41502", size = 52848663, upload-time = "2026-07-18T22:49:58.707Z" }, + { url = "https://files.pythonhosted.org/packages/70/ff/a8d1086c7029aa05e370b015f364e421a148af7fb6969b00ef5565a04eeb/pyscf-2.15.0-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:3640c34e938a09c4211fda448ee857374cf8a10eb345547f003ee25650d26392", size = 25301270, upload-time = "2026-11-05T05:41:29.587Z" }, + { url = "https://files.pythonhosted.org/packages/9c/e8/579b0353de0ba84621a2530fcccc4ca7ef9ca78e05697c1c4e3ce319a88a/pyscf-2.15.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:727f854866e7930f1c28722030a25efff61f594fcca78735e60c1a62829a4e62", size = 23364845, upload-time = "2026-11-05T05:37:05.523Z" }, + { url = "https://files.pythonhosted.org/packages/2f/1d/7e4e878248fae458f4934dc6f31ae2cbcf5f67230d6b4505b3655c8559bb/pyscf-2.15.0-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ca9427ae9f41c03e44c74763cc61d240e46be9a7cc75166c22817eebf1e0b87b", size = 33597044, upload-time = "2026-11-05T06:43:39.266Z" }, + { url = "https://files.pythonhosted.org/packages/bd/c4/ae16e0cf2d391e87bfa0e81a764fb5847253eabf1e8bdaf07959244c73e2/pyscf-2.15.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a372e4ac136b969ef4a22fb328905cfbc84513bcd4d85321026af0493345b94b", size = 40598332, upload-time = "2026-11-05T05:41:36.196Z" }, + { url = "https://files.pythonhosted.org/packages/7e/09/aaf029f524f4cf186a98e3d084ea81e2b9ee156d6e6fddc4fad17e5e99a4/pyscf-2.15.0-py3-none-win_amd64.whl", hash = "sha256:dadffed2a2e547d5d95d8ad7e96be7ef480ed73999b497c2f343c13cb278197d", size = 75095110, upload-time = "2026-11-05T05:45:23.381Z" }, ] [[package]] @@ -1807,7 +1813,7 @@ version = "0.0.0" source = { virtual = "." } default-groups = ["dev", "linting", "test"] dependencies = [ - { name = "pyscf", marker = "sys_platform != 'win32'" }, + { name = "pyscf", marker = "platform_machine == 'AMD64' or platform_machine == 'x86_64' or sys_platform != 'win32'" }, ] [package.dev-dependencies] @@ -1826,7 +1832,7 @@ test = [ ] [package.metadata] -requires-dist = [{ name = "pyscf", marker = "sys_platform != 'win32'", specifier = "==2.14.0" }] +requires-dist = [{ name = "pyscf", marker = "platform_machine == 'AMD64' or platform_machine == 'x86_64' or sys_platform != 'win32'", specifier = "==2.15.0" }] [package.metadata.requires-dev] dev = [ From a5d7cdd765cc40182fd89edbff4f9eb86874f22e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20V=C3=A9ril?= Date: Thu, 12 Nov 2026 12:40:38 +0100 Subject: [PATCH 2/3] Fix macOS runner for PySCF checks --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 20f32e14..61866dc8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -134,7 +134,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, ubuntu-24.04-arm, macos-15-intel, macos-14, windows-latest] + os: [ubuntu-latest, ubuntu-24.04-arm, macos-15-intel, macos-latest, windows-latest] steps: - name: Checkout uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 From 91d55299067c51c6c6218b77722669e125c0a7a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20V=C3=A9ril?= Date: Thu, 12 Nov 2026 12:46:38 +0100 Subject: [PATCH 3/3] Restore macOS Intel Python wheel compatibility --- pyproject.toml | 9 ++++++++- uv.lock | 34 +++++++++++++++++++++++++++++++--- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 4a156662..8c2696c1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,7 +8,14 @@ dependencies = ["pyscf==2.15.0; sys_platform != 'win32' or platform_machine == ' [dependency-groups] test = ["numpy", "pytest"] -dev = ["ipykernel", "jupyterlab", "matplotlib", "scipy"] +# 26.1.0 has no macOS Intel wheel; remove this constraint when one is published. +dev = [ + "ipykernel", + "jupyterlab", + "matplotlib", + "scipy", + "argon2-cffi-bindings==25.1.0; sys_platform == 'darwin' and platform_machine == 'x86_64'", +] linting = ["ruff"] [tool.uv] diff --git a/uv.lock b/uv.lock index 19c2b6a1..f474d291 100644 --- a/uv.lock +++ b/uv.lock @@ -42,23 +42,50 @@ name = "argon2-cffi" version = "25.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "argon2-cffi-bindings" }, + { name = "argon2-cffi-bindings", version = "25.1.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'linux' and sys_platform != 'win32'" }, + { name = "argon2-cffi-bindings", version = "26.1.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0e/89/ce5af8a7d472a67cc819d5d998aa8c82c5d860608c4db9f46f1162d7dab9/argon2_cffi-25.1.0.tar.gz", hash = "sha256:694ae5cc8a42f4c4e2bf2ca0e64e51e23a040c6a517a85074683d3959e1346c1", size = 45706, upload-time = "2025-06-03T06:55:32.073Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl", hash = "sha256:fdc8b074db390fccb6eb4a3604ae7231f219aa669a2652e0f20e16ba513d5741", size = 14657, upload-time = "2025-06-03T06:55:30.804Z" }, ] +[[package]] +name = "argon2-cffi-bindings" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'darwin'", + "python_full_version < '3.14' and sys_platform == 'darwin'", +] +dependencies = [ + { name = "cffi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5c/2d/db8af0df73c1cf454f71b2bbe5e356b8c1f8041c979f505b3d3186e520a9/argon2_cffi_bindings-25.1.0.tar.gz", hash = "sha256:b957f3e6ea4d55d820e40ff76f450952807013d361a65d7f28acc0acbf29229d", size = 1783441, upload-time = "2025-07-30T10:02:05.147Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/97/3c0a35f46e52108d4707c44b95cfe2afcafc50800b5450c197454569b776/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:3d3f05610594151994ca9ccb3c771115bdb4daef161976a266f0dd8aa9996b8f", size = 54393, upload-time = "2025-07-30T10:01:40.97Z" }, + { url = "https://files.pythonhosted.org/packages/9d/f4/98bbd6ee89febd4f212696f13c03ca302b8552e7dbf9c8efa11ea4a388c3/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8b8efee945193e667a396cbc7b4fb7d357297d6234d30a489905d96caabde56b", size = 29328, upload-time = "2025-07-30T10:01:41.916Z" }, + { url = "https://files.pythonhosted.org/packages/43/24/90a01c0ef12ac91a6be05969f29944643bc1e5e461155ae6559befa8f00b/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3c6702abc36bf3ccba3f802b799505def420a1b7039862014a65db3205967f5a", size = 31269, upload-time = "2025-07-30T10:01:42.716Z" }, + { url = "https://files.pythonhosted.org/packages/1d/57/96b8b9f93166147826da5f90376e784a10582dd39a393c99bb62cfcf52f0/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:aecba1723ae35330a008418a91ea6cfcedf6d31e5fbaa056a166462ff066d500", size = 54121, upload-time = "2025-07-30T10:01:50.815Z" }, + { url = "https://files.pythonhosted.org/packages/0a/08/a9bebdb2e0e602dde230bdde8021b29f71f7841bd54801bcfd514acb5dcf/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2630b6240b495dfab90aebe159ff784d08ea999aa4b0d17efa734055a07d2f44", size = 29177, upload-time = "2025-07-30T10:01:51.681Z" }, + { url = "https://files.pythonhosted.org/packages/b6/02/d297943bcacf05e4f2a94ab6f462831dc20158614e5d067c35d4e63b9acb/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:7aef0c91e2c0fbca6fc68e7555aa60ef7008a739cbe045541e438373bc54d2b0", size = 31090, upload-time = "2025-07-30T10:01:53.184Z" }, +] + [[package]] name = "argon2-cffi-bindings" version = "26.1.0" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'linux'", + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version < '3.14' and sys_platform == 'linux'", + "python_full_version < '3.14' and sys_platform == 'win32'", +] dependencies = [ { name = "cffi" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0b/43/bb8b6e8708d49a5ab36781333af092d9f483b198a2710d01281204640055/argon2_cffi_bindings-26.1.0.tar.gz", hash = "sha256:63505c71542a44b68b1e38060450fb006404170da375feb31af153e7f9c6205d", size = 1790807, upload-time = "2026-08-20T07:44:22.492Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/d2/0ae991f1b2181e5be49007c574710a800ad36c2978683addb3e67c474e55/argon2_cffi_bindings-26.1.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:21ca0396fe5ec995dd54431c32698189666f9224810acfa752e50d2bd94d9df2", size = 25521, upload-time = "2026-08-20T07:32:43.019Z" }, { url = "https://files.pythonhosted.org/packages/7e/e4/ad91d8297638aa2258aad4501c306aca99480dfe76ccd638173fa3702db9/argon2_cffi_bindings-26.1.0-cp310-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:78de2d65e0b9ea7ce9d1b1c3e87297b2d7305a02c266ee2a2d6910daddd7ee69", size = 27177, upload-time = "2026-08-20T07:32:44.158Z" }, { url = "https://files.pythonhosted.org/packages/6f/86/5363df11b86d02cf3662208e7406496327649cc90eb365bf6f4e8a54a41f/argon2_cffi_bindings-26.1.0-cp310-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:27f1821903e2ceadcb88ec2b45ef190897b7682449c772f4d9b53e42c520cf29", size = 26597, upload-time = "2026-08-20T07:32:45.172Z" }, { url = "https://files.pythonhosted.org/packages/f4/b5/a14dcc592652347dad23ee93b278a4da5d2a25c9ed3ebd10d68eea823a4f/argon2_cffi_bindings-26.1.0-cp310-abi3-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d88e5f7e60f28ae0b0cc6b2f16c43e87cd642a196a86f85e0d8bb6fe016fc16d", size = 27403, upload-time = "2026-08-20T07:32:46.13Z" }, @@ -70,7 +97,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4e/db/d83cf2af140547f0b9cdaece05b2dc2dcbf991be4667331d073eff771435/argon2_cffi_bindings-26.1.0-cp310-abi3-win_arm64.whl", hash = "sha256:f9c4420a7a864fe1b86ce35befc95b8e39fb852493b81cf798671ddc265de638", size = 24478, upload-time = "2026-08-20T07:32:52.111Z" }, { url = "https://files.pythonhosted.org/packages/bb/5f/f652055e18d2627e2eed94c7f31a792127cfe38df786635395d742321674/argon2_cffi_bindings-26.1.0-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:af11ac37a7c53dc16cb7950a6190851b0870fe218b6c60c0bb7ac355234e3083", size = 15434, upload-time = "2026-08-20T07:32:53.143Z" }, { url = "https://files.pythonhosted.org/packages/76/38/de696045960f5b846d428c0fb6c130ed3da87aac2af209b05c193815404c/argon2_cffi_bindings-26.1.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:db0fcd827ca61622a01b220aadfbece01939acf53888f2cb98cd93e9b1e2c97e", size = 15449, upload-time = "2026-08-20T07:32:54.075Z" }, - { url = "https://files.pythonhosted.org/packages/91/0a/c25af768f6b75a5a71e31207f87c540656b2808c015260444a22763221ad/argon2_cffi_bindings-26.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:28524438cd3e723f25412f63d4fd516ff5bae9ae5aa56acbe2a1404398a0cf31", size = 25683, upload-time = "2026-08-20T07:32:55.05Z" }, { url = "https://files.pythonhosted.org/packages/a8/7e/be212c751ab0bcea7f646615f933bf262e8e50b3f7bef32f861d0a2d066b/argon2_cffi_bindings-26.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac82fc756a446b6ccd7139ce70efa9d8bbe541e7ad579a12dcb52764b7175c5f", size = 27311, upload-time = "2026-08-20T07:32:56.166Z" }, { url = "https://files.pythonhosted.org/packages/a6/ee/f84b28e4afd13d3cac36c1d8fa8c239d2dc2c51cd978d02ee5d5ad98d9bb/argon2_cffi_bindings-26.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6a4e68eed961a8de6928d1c17ff3dc2a547e0e923c17f8f1cd79fb7bc9502f98", size = 26771, upload-time = "2026-08-20T07:32:57.206Z" }, { url = "https://files.pythonhosted.org/packages/21/c3/95c07a023691ecd529da9cb6a8f0779e13ebc1bdfaa86d145fdc1c6e7e79/argon2_cffi_bindings-26.1.0-cp314-cp314t-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:151dfaad9de753f4af2a7854e707e4784f2acc434340ade64239c5b104b2d605", size = 27568, upload-time = "2026-08-20T07:32:58.361Z" }, @@ -1818,6 +1844,7 @@ dependencies = [ [package.dev-dependencies] dev = [ + { name = "argon2-cffi-bindings", version = "25.1.0", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64' and sys_platform != 'linux' and sys_platform != 'win32'" }, { name = "ipykernel" }, { name = "jupyterlab" }, { name = "matplotlib" }, @@ -1836,6 +1863,7 @@ requires-dist = [{ name = "pyscf", marker = "platform_machine == 'AMD64' or plat [package.metadata.requires-dev] dev = [ + { name = "argon2-cffi-bindings", marker = "platform_machine == 'x86_64' and sys_platform == 'darwin'", specifier = "==25.1.0" }, { name = "ipykernel" }, { name = "jupyterlab" }, { name = "matplotlib" },