From 01f8792f41e52c386a83d2dc54c2bae81bbf8a9f Mon Sep 17 00:00:00 2001 From: Ciaran Ryan-Anderson Date: Wed, 27 May 2026 19:30:02 -0600 Subject: [PATCH 01/26] Update toml_edit to 0.25. --- Cargo.lock | 52 ++++++++++------------------------------------------ Cargo.toml | 2 +- 2 files changed, 11 insertions(+), 43 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ffffaffbf..c8a201504 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2715,6 +2715,7 @@ checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown 0.12.3", + "rayon", "serde", ] @@ -2726,7 +2727,6 @@ checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", "hashbrown 0.17.1", - "rayon", "serde", "serde_core", ] @@ -3818,7 +3818,7 @@ dependencies = [ "tempfile", "thiserror 2.0.18", "toml", - "toml_edit 0.22.27", + "toml_edit", "xz2", "zip", ] @@ -4891,7 +4891,7 @@ version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ - "toml_edit 0.25.11+spec-1.1.0", + "toml_edit", ] [[package]] @@ -5797,7 +5797,7 @@ dependencies = [ "fixedbitset 0.5.7", "foldhash 0.1.5", "hashbrown 0.15.5", - "indexmap 2.14.0", + "indexmap 1.9.3", "ndarray 0.16.1", "num-traits", "petgraph 0.8.3", @@ -6776,18 +6776,12 @@ dependencies = [ "indexmap 2.14.0", "serde_core", "serde_spanned", - "toml_datetime 1.1.1+spec-1.1.0", + "toml_datetime", "toml_parser", "toml_writer", - "winnow 1.0.2", + "winnow", ] -[[package]] -name = "toml_datetime" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" - [[package]] name = "toml_datetime" version = "1.1.1+spec-1.1.0" @@ -6797,18 +6791,6 @@ dependencies = [ "serde_core", ] -[[package]] -name = "toml_edit" -version = "0.22.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" -dependencies = [ - "indexmap 2.14.0", - "toml_datetime 0.6.11", - "toml_write", - "winnow 0.7.15", -] - [[package]] name = "toml_edit" version = "0.25.11+spec-1.1.0" @@ -6816,9 +6798,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" dependencies = [ "indexmap 2.14.0", - "toml_datetime 1.1.1+spec-1.1.0", + "toml_datetime", "toml_parser", - "winnow 1.0.2", + "toml_writer", + "winnow", ] [[package]] @@ -6827,15 +6810,9 @@ version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ - "winnow 1.0.2", + "winnow", ] -[[package]] -name = "toml_write" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" - [[package]] name = "toml_writer" version = "1.1.1+spec-1.1.0" @@ -8002,15 +7979,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" -[[package]] -name = "winnow" -version = "0.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" -dependencies = [ - "memchr", -] - [[package]] name = "winnow" version = "1.0.2" diff --git a/Cargo.toml b/Cargo.toml index 1e2c2a3b7..912dfc0c2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,7 +41,7 @@ serde = { version = "1", features = ["derive"] } serde_json = "1" ron = "0.12" toml = "1" -toml_edit = "0.22" +toml_edit = "0.25" # --- CLI --- clap = { version = "4", features = ["derive"] } From 8bdec31487d2767f5f9640c710eafdf4e0aaf392 Mon Sep 17 00:00:00 2001 From: Ciaran Ryan-Anderson Date: Wed, 27 May 2026 19:34:19 -0600 Subject: [PATCH 02/26] Update wasmtime to 45. --- Cargo.lock | 149 +++++++++++++++++++++++------------------------------ Cargo.toml | 2 +- 2 files changed, 65 insertions(+), 86 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c8a201504..be03da802 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -961,27 +961,27 @@ dependencies = [ [[package]] name = "cranelift-assembler-x64" -version = "0.131.1" +version = "0.132.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8628cc4ba7f88a9205a7ee42327697abc61195a1e3d92cfae172d6a946e722e" +checksum = "8c80cf55a351448317210f26c434be761bcb25e7b36116ec92f89540b73e2833" dependencies = [ "cranelift-assembler-x64-meta", ] [[package]] name = "cranelift-assembler-x64-meta" -version = "0.131.1" +version = "0.132.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d582754487e6c9a065a91c42ccf1bdd8d5977af33468dac5ae9bec0ce88acb3e" +checksum = "07937ca8617b340162fe3a4716be885b5847e9b56d6c7a89abbe4d42340fdc91" dependencies = [ "cranelift-srcgen", ] [[package]] name = "cranelift-bforest" -version = "0.131.1" +version = "0.132.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb59c81ace12ee7c33074db7903d4d75d1f40b28cd3e8e6f491de57b29129eb9" +checksum = "88217b08180882436d54c0133274885c590698ae854e352bede1cda041230800" dependencies = [ "cranelift-entity", "wasmtime-internal-core", @@ -989,9 +989,9 @@ dependencies = [ [[package]] name = "cranelift-bitset" -version = "0.131.1" +version = "0.132.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f25c06993a681be9cf3140798a3d4ac5bec955e7444416a2fdc87fda8567285d" +checksum = "d5c3cf7ba29fa56e56040848e34835d4e45988b2760ef212413409af95ffd8c1" dependencies = [ "serde", "serde_derive", @@ -1000,9 +1000,9 @@ dependencies = [ [[package]] name = "cranelift-codegen" -version = "0.131.1" +version = "0.132.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b61f95c5a211918f5d336254a61a488b36a5818de47a868e8c4658dce9cccc" +checksum = "ebe1aac2efd4cba2047845fce38a68519935a30e20c8a6294ba7e2f448fe722d" dependencies = [ "bumpalo", "cranelift-assembler-x64", @@ -1014,7 +1014,7 @@ dependencies = [ "cranelift-entity", "cranelift-isle", "gimli", - "hashbrown 0.16.1", + "hashbrown 0.17.1", "libm", "log", "pulley-interpreter", @@ -1028,9 +1028,9 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" -version = "0.131.1" +version = "0.132.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b85aa822fce72080d041d7c2cf7c3f5c6ecdea7afae68379ba4ef85269c4fa5" +checksum = "0909eaf9d6f18f5bf802d50608cb4368ac340fbd03cc44f2888d1cfcc3faa64e" dependencies = [ "cranelift-assembler-x64-meta", "cranelift-codegen-shared", @@ -1041,24 +1041,24 @@ dependencies = [ [[package]] name = "cranelift-codegen-shared" -version = "0.131.1" +version = "0.132.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "833eb9fc89326cd072cc19e96892f09b5692c0dfe17cd4da2858ba30c2cd85c0" +checksum = "c95a8da8be283f49cda7d0ef228c94f10d791e517b27b0c7e282dadd2e79ce45" [[package]] name = "cranelift-control" -version = "0.131.1" +version = "0.132.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d005320f487e6e8a3edcc7f2fd4f43fcc9946d1013bf206ea649789ac1617fc" +checksum = "f5b19c81145146da1f7afda2e7f52111842fe6793512e740ad5cf3f5639e6212" dependencies = [ "arbitrary", ] [[package]] name = "cranelift-entity" -version = "0.131.1" +version = "0.132.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e62ef34c6e720f347a79ece043e8584e242d168911da640bac654a33a6aaaf5" +checksum = "4a55309b47e6633ab05821304206cb1e92952e845b1224985562bb7ac1e92323" dependencies = [ "cranelift-bitset", "serde", @@ -1068,9 +1068,9 @@ dependencies = [ [[package]] name = "cranelift-frontend" -version = "0.131.1" +version = "0.132.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfa2ad00399dd47e7e7e33cb1dc23b0e39ed9dcd01e8f026fc37af91655031b8" +checksum = "064d2d3533d9608f1cf44c8899cf2f7f33feb70300b0fb83e687b0d9e7b91147" dependencies = [ "cranelift-codegen", "log", @@ -1080,15 +1080,15 @@ dependencies = [ [[package]] name = "cranelift-isle" -version = "0.131.1" +version = "0.132.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02c51975ed217b4e8e5a7fd11e9ec83a96104bdff311dddcb505d1d8a9fd7fc6" +checksum = "1ac4e0bc095b2dab2212d1e99d7a74b62afc1485db023f1c0cb34a68758f7bd1" [[package]] name = "cranelift-native" -version = "0.131.1" +version = "0.132.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9b1889e00da9729d8f8525f3c12998ded86ea709058ff844ebe00b97548de0e" +checksum = "09a40053f5cb925451dd1d57393d14ad3145c8e0786701c27b5415ebb9a3ba4f" dependencies = [ "cranelift-codegen", "libc", @@ -1097,9 +1097,9 @@ dependencies = [ [[package]] name = "cranelift-srcgen" -version = "0.131.1" +version = "0.132.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5a8f82fd5124f009f72167e60139245cd3b56cfd4b53050f22110c48c5f4da1" +checksum = "a3ceab9a53f7d362c89841fbaa8e63e44d47c40e91dc96ee6f777fca5d6b323b" [[package]] name = "crc" @@ -2257,8 +2257,6 @@ dependencies = [ "allocator-api2", "equivalent", "foldhash 0.2.0", - "serde", - "serde_core", ] [[package]] @@ -2268,6 +2266,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" dependencies = [ "foldhash 0.2.0", + "serde", + "serde_core", ] [[package]] @@ -2715,7 +2715,6 @@ checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown 0.12.3", - "rayon", "serde", ] @@ -2727,6 +2726,7 @@ checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", "hashbrown 0.17.1", + "rayon", "serde", "serde_core", ] @@ -4967,9 +4967,9 @@ dependencies = [ [[package]] name = "pulley-interpreter" -version = "44.0.1" +version = "45.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9326e3a0093d170582cf64ed9e4cf253b8aac155ec4a294ff62330450bbf094" +checksum = "e9204ad9435f2a6fe3bd13bba52389fb8488fa20ba497e35c5d2db638166019d" dependencies = [ "cranelift-bitset", "log", @@ -4979,9 +4979,9 @@ dependencies = [ [[package]] name = "pulley-macros" -version = "44.0.1" +version = "45.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00c6433917e3789605b1f4cd2a589f637ff17212344e7fa5ba99544625ba52c7" +checksum = "53009b033747e0d79a76549a744da58e84c9da8076492c7e6d491fdc6cc41b95" dependencies = [ "proc-macro2", "quote", @@ -5797,7 +5797,7 @@ dependencies = [ "fixedbitset 0.5.7", "foldhash 0.1.5", "hashbrown 0.15.5", - "indexmap 1.9.3", + "indexmap 2.14.0", "ndarray 0.16.1", "num-traits", "petgraph 0.8.3", @@ -7180,16 +7180,6 @@ dependencies = [ "wasmparser 0.244.0", ] -[[package]] -name = "wasm-encoder" -version = "0.246.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61fb705ce81adde29d2a8e99d87995e39a6e927358c91398f374474746070ef7" -dependencies = [ - "leb128fmt", - "wasmparser 0.246.2", -] - [[package]] name = "wasm-encoder" version = "0.248.0" @@ -7224,19 +7214,6 @@ dependencies = [ "semver", ] -[[package]] -name = "wasmparser" -version = "0.246.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71cde4757396defafd25417cfb36aa3161027d06d865b0c24baaae229aac005d" -dependencies = [ - "bitflags 2.11.1", - "hashbrown 0.16.1", - "indexmap 2.14.0", - "semver", - "serde", -] - [[package]] name = "wasmparser" version = "0.248.0" @@ -7244,26 +7221,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa4439c5eee9df71ee0c6efb37f63b1fcb1fec38f85f5142c54e7ed05d33091a" dependencies = [ "bitflags 2.11.1", + "hashbrown 0.17.1", "indexmap 2.14.0", "semver", + "serde", ] [[package]] name = "wasmprinter" -version = "0.246.2" +version = "0.248.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e41f7493ba994b8a779430a4c25ff550fd5a40d291693af43a6ef48688f00e3" +checksum = "30b264a5410b008d4d199a92bf536eae703cbd614482fc1ec53831cf19e1c183" dependencies = [ "anyhow", "termcolor", - "wasmparser 0.246.2", + "wasmparser 0.248.0", ] [[package]] name = "wasmtime" -version = "44.0.1" +version = "45.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "372db8bbad8ec962038101f75ab2c3ffcd18797d7d3ae877a58ab9873cd0c4bd" +checksum = "d35aec1e932d00a7c941f816ad589e65ad8db948b9e971bf8ec655a1669f1f67" dependencies = [ "addr2line", "async-trait", @@ -7284,7 +7263,7 @@ dependencies = [ "serde_derive", "smallvec", "target-lexicon", - "wasmparser 0.246.2", + "wasmparser 0.248.0", "wasmtime-environ", "wasmtime-internal-core", "wasmtime-internal-cranelift", @@ -7299,9 +7278,9 @@ dependencies = [ [[package]] name = "wasmtime-environ" -version = "44.0.1" +version = "45.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e15aa0d1545e48d9b25ca604e9e27b4cd6d5886d30ac5787b57b3a2daf85b57" +checksum = "d7da3dcce82a7e784121c19c8c9c5f69a743088264ff5212033e4a1f1b9dfaaf" dependencies = [ "anyhow", "cpp_demangle", @@ -7309,7 +7288,7 @@ dependencies = [ "cranelift-bitset", "cranelift-entity", "gimli", - "hashbrown 0.16.1", + "hashbrown 0.17.1", "indexmap 2.14.0", "log", "object", @@ -7320,28 +7299,28 @@ dependencies = [ "sha2 0.10.9", "smallvec", "target-lexicon", - "wasm-encoder 0.246.2", - "wasmparser 0.246.2", + "wasm-encoder 0.248.0", + "wasmparser 0.248.0", "wasmprinter", "wasmtime-internal-core", ] [[package]] name = "wasmtime-internal-core" -version = "44.0.1" +version = "45.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f2c7fa6523647262bfb4095dbdf4087accefe525813e783f81a0c682f418ce4" +checksum = "1bdae4b55b15a23d774b15f6e7cd90ae0d0aa17c47c12b4db098b3dd11ba9d58" dependencies = [ - "hashbrown 0.16.1", + "hashbrown 0.17.1", "libm", "serde", ] [[package]] name = "wasmtime-internal-cranelift" -version = "44.0.1" +version = "45.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98c032f422e39061dfc43f32190c0a3526b04161ec4867f362958f3fe9d1fe29" +checksum = "5773b36b87566239b020f1d01aa753a35626df85030485e40e36fc42a97acf4f" dependencies = [ "cfg-if", "cranelift-codegen", @@ -7357,7 +7336,7 @@ dependencies = [ "smallvec", "target-lexicon", "thiserror 2.0.18", - "wasmparser 0.246.2", + "wasmparser 0.248.0", "wasmtime-environ", "wasmtime-internal-core", "wasmtime-internal-unwinder", @@ -7366,9 +7345,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-fiber" -version = "44.0.1" +version = "45.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8dd76d80adf450cc260ba58f23c28030401930b19149695b1d121f7d621e791" +checksum = "402cce4bba4c8c92a6fbaff39a6b23f8aa626d64b218ecf6dd3eeee8705cf096" dependencies = [ "cc", "cfg-if", @@ -7381,9 +7360,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-jit-debug" -version = "44.0.1" +version = "45.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab453cc600b28ee5d3f9495aa6d4cb2c81eda40903e9287296b548fba8b2391d" +checksum = "8b426a5d0ec9c11a1a4525ed4e973b7caf40223b6d392588bb9f6468e4ae9d29" dependencies = [ "cc", "wasmtime-internal-versioned-export-macros", @@ -7391,9 +7370,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-jit-icache-coherence" -version = "44.0.1" +version = "45.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a1859e920871515d324fb9757c3e448d6ed1512ca6ccdff14b6e016505d6ada" +checksum = "8a312ba8bb77955dcd44294a223e7f124c3071ff966583d385d3f6a4639c62e3" dependencies = [ "cfg-if", "libc", @@ -7403,9 +7382,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-unwinder" -version = "44.0.1" +version = "45.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1dfe405bd6adb1386d935a30f16a236bd4ef0d3c383e7cbbab98d063c9d9b73" +checksum = "4a62ad422ee3cbf1e87c2242dc0717a01c7a5878fbc3a68abc4b4d2fff3e85e1" dependencies = [ "cfg-if", "cranelift-codegen", @@ -7416,9 +7395,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-versioned-export-macros" -version = "44.0.1" +version = "45.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a9b9165fc45d42c81edfe3e9cb458e58720594ad5db6553c4079ea041a4a581" +checksum = "2c660c5b091648cffdd84a34dc24ffcdb9d027f9048fe7bd5e01896adbd0935f" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 912dfc0c2..cdab4bb98 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -76,7 +76,7 @@ tket-qsystem = { version = "0.23", default-features = false } hugr-core = "=0.25.6" # --- WebAssembly --- -wasmtime = { version = "44", default-features = false, features = [ +wasmtime = { version = "45", default-features = false, features = [ "cranelift", "runtime", "wat", From 6c5cebfb01d84baea61b611a9918c2a08d49b737 Mon Sep 17 00:00:00 2001 From: Ciaran Ryan-Anderson Date: Wed, 27 May 2026 19:37:38 -0600 Subject: [PATCH 03/26] Update nalgebra to 0.35. --- Cargo.lock | 154 +++++++---------------------------------------------- Cargo.toml | 2 +- 2 files changed, 19 insertions(+), 137 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index be03da802..6f13e8218 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -375,7 +375,7 @@ dependencies = [ "rand 0.10.1", "rand_xoshiro 0.8.0", "rapidhash", - "wide 1.4.0", + "wide", ] [[package]] @@ -2038,96 +2038,6 @@ dependencies = [ "xml-rs", ] -[[package]] -name = "glam" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "333928d5eb103c5d4050533cec0384302db6be8ef7d3cebd30ec6a35350353da" - -[[package]] -name = "glam" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3abb554f8ee44336b72d522e0a7fe86a29e09f839a36022fa869a7dfe941a54b" - -[[package]] -name = "glam" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4126c0479ccf7e8664c36a2d719f5f2c140fbb4f9090008098d2c291fa5b3f16" - -[[package]] -name = "glam" -version = "0.17.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01732b97afd8508eee3333a541b9f7610f454bb818669e66e90f5f57c93a776" - -[[package]] -name = "glam" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525a3e490ba77b8e326fb67d4b44b4bd2f920f44d4cc73ccec50adc68e3bee34" - -[[package]] -name = "glam" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b8509e6791516e81c1a630d0bd7fbac36d2fa8712a9da8662e716b52d5051ca" - -[[package]] -name = "glam" -version = "0.20.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43e957e744be03f5801a55472f593d43fabdebf25a4585db250f04d86b1675f" - -[[package]] -name = "glam" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "518faa5064866338b013ff9b2350dc318e14cc4fcd6cb8206d7e7c9886c98815" - -[[package]] -name = "glam" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f597d56c1bd55a811a1be189459e8fad2bbc272616375602443bdfb37fa774" - -[[package]] -name = "glam" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e4afd9ad95555081e109fe1d21f2a30c691b5f0919c67dfa690a2e1eb6bd51c" - -[[package]] -name = "glam" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5418c17512bdf42730f9032c74e1ae39afc408745ebb2acf72fbc4691c17945" - -[[package]] -name = "glam" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "151665d9be52f9bb40fc7966565d39666f2d1e69233571b71b87791c7e0528b3" - -[[package]] -name = "glam" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e05e7e6723e3455f4818c7b26e855439f7546cf617ef669d1adedb8669e5cb9" - -[[package]] -name = "glam" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "779ae4bf7e8421cf91c0b3b64e7e8b40b862fba4d393f59150042de7c4965a94" - -[[package]] -name = "glam" -version = "0.29.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8babf46d4c1c9d92deac9f7be466f76dfc4482b6452fc5024b5e8daf6ffeb3ee" - [[package]] name = "glam" version = "0.30.10" @@ -2146,6 +2056,12 @@ version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f70749695b063ecbf6b62949ccccde2e733ec3ecbbd71d467dca4e5c6c97cca0" +[[package]] +name = "glam" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fb167719045debebe9f532320accc7b5c993c5a3b813f5696a11d5ca7bdc57b" + [[package]] name = "glob" version = "0.3.3" @@ -3325,29 +3241,15 @@ dependencies = [ [[package]] name = "nalgebra" -version = "0.34.2" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df76ea0ff5c7e6b88689085804d6132ded0ddb9de5ca5b8aeb9eeadc0508a70a" +checksum = "adc43a60c217b0c6ff46e47f26911015ad8d2e5a8be1af668c67e370d99a4346" dependencies = [ "approx 0.5.1", - "glam 0.14.0", - "glam 0.15.2", - "glam 0.16.0", - "glam 0.17.3", - "glam 0.18.0", - "glam 0.19.0", - "glam 0.20.5", - "glam 0.21.3", - "glam 0.22.0", - "glam 0.23.0", - "glam 0.24.2", - "glam 0.25.0", - "glam 0.27.0", - "glam 0.28.0", - "glam 0.29.3", "glam 0.30.10", "glam 0.31.1", "glam 0.32.1", + "glam 0.33.0", "matrixmultiply", "nalgebra-macros", "num-complex 0.4.6", @@ -3981,7 +3883,7 @@ dependencies = [ "pecos-random", "pecos-simulators", "rand 0.10.1", - "wide 1.4.0", + "wide", ] [[package]] @@ -4274,7 +4176,7 @@ dependencies = [ "serde_json", "smallvec", "thiserror 2.0.18", - "wide 1.4.0", + "wide", ] [[package]] @@ -4346,7 +4248,7 @@ dependencies = [ "rand_xoshiro 0.8.0", "random_tester", "rapidhash", - "wide 1.4.0", + "wide", ] [[package]] @@ -4522,7 +4424,7 @@ dependencies = [ "rand 0.10.1", "rayon", "smallvec", - "wide 1.4.0", + "wide", ] [[package]] @@ -5827,15 +5729,6 @@ version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" -[[package]] -name = "safe_arch" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b02de82ddbe1b636e6170c21be622223aea188ef2e139be0a5b219ec215323" -dependencies = [ - "bytemuck", -] - [[package]] name = "safe_arch" version = "1.0.0" @@ -6151,15 +6044,14 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "simba" -version = "0.9.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c99284beb21666094ba2b75bbceda012e610f5479dfcc2d6e2426f53197ffd95" +checksum = "8f45c644a9f3a386f9288625d9f0c1e999e1acf07a37df35d0516c7f199d9cb2" dependencies = [ "approx 0.5.1", "num-complex 0.4.6", "num-traits", - "paste", - "wide 0.7.33", + "wide", ] [[package]] @@ -7641,16 +7533,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "wide" -version = "0.7.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce5da8ecb62bcd8ec8b7ea19f69a51275e91299be594ea5cc6ef7819e16cd03" -dependencies = [ - "bytemuck", - "safe_arch 0.7.4", -] - [[package]] name = "wide" version = "1.4.0" @@ -7658,7 +7540,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a7714cd0430a663154667c74da5d09325c2387695bee18b3f7f72825aa3693a" dependencies = [ "bytemuck", - "safe_arch 1.0.0", + "safe_arch", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index cdab4bb98..eca284162 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -90,7 +90,7 @@ pest_derive = "2" regex = "1" # --- Numerical computing --- -nalgebra = "0.34" +nalgebra = "0.35" num = "0.4" num-complex = "0.4" num-traits = "0.2" From 517dd701f4846da2fe9b9895b035c926cbd3c356 Mon Sep 17 00:00:00 2001 From: Ciaran Ryan-Anderson Date: Sun, 31 May 2026 10:12:53 -0600 Subject: [PATCH 04/26] Update dependencies and LLVM tooling. --- Cargo.lock | 146 ++-- Cargo.toml | 13 +- Justfile | 15 +- crates/pecos-build/Cargo.toml | 1 + crates/pecos-build/README.md | 7 +- crates/pecos-build/src/cargo_config.rs | 16 +- crates/pecos-build/src/home.rs | 8 +- crates/pecos-build/src/lib.rs | 2 +- crates/pecos-build/src/llvm.rs | 219 +++-- crates/pecos-build/src/llvm/config.rs | 74 +- crates/pecos-build/src/llvm/installer.rs | 800 +++++++++++++----- crates/pecos-build/src/prompt.rs | 2 +- crates/pecos-cli/src/cli.rs | 11 +- crates/pecos-cli/src/cli/env_cmd.rs | 53 +- crates/pecos-cli/src/cli/info.rs | 14 +- crates/pecos-cli/src/cli/install_cmd.rs | 60 +- crates/pecos-cli/src/cli/list.rs | 10 +- crates/pecos-cli/src/cli/llvm_cmd.rs | 85 +- crates/pecos-cli/src/cli/rust_cmd.rs | 84 +- crates/pecos-cli/src/cli/setup_cmd.rs | 27 +- crates/pecos-cli/src/main.rs | 41 +- crates/pecos-hugr-qis/Cargo.toml | 3 + crates/pecos-hugr-qis/src/array.rs | 8 +- crates/pecos-hugr-qis/src/compiler.rs | 7 +- crates/pecos-hugr/Cargo.toml | 3 - crates/pecos-llvm/Cargo.toml | 1 - crates/pecos-llvm/README.md | 6 +- crates/pecos-llvm/build.rs | 54 +- crates/pecos-llvm/src/lib.rs | 4 +- crates/pecos-llvm/src/llvm_compat.rs | 145 +++- crates/pecos-llvm/src/prelude.rs | 4 +- crates/pecos-qis/Cargo.toml | 1 - crates/pecos-qis/build.rs | 56 +- crates/pecos-qis/build_selene.rs | 6 +- crates/pecos-qis/src/executor.rs | 29 +- crates/pecos-qis/src/lib.rs | 2 +- crates/pecos/README.md | 2 +- crates/pecos/src/lib.rs | 2 +- docs/README.md | 2 +- docs/development/DEVELOPMENT.md | 10 +- docs/development/dev-tools.md | 39 +- docs/user-guide/cli.md | 6 +- docs/user-guide/llvm-setup.md | 133 ++- python/pecos-rslib-llvm/Cargo.toml | 2 +- python/pecos-rslib-llvm/src/llvm_bindings.rs | 135 ++- python/pecos-rslib/src/lib.rs | 11 +- .../tests/test_llvm_comprehensive.py | 40 + python/quantum-pecos/README.md | 4 +- .../pecos/simulators/mps_pytket/__init__.py | 3 + .../simulators/mps_pytket/_nvmath_compat.py | 62 ++ .../tests/guppy/test_hugr_compiler_parity.py | 24 +- .../ast_guppy/test_tier2_semantic.py | 6 +- scripts/native_bench/bench_pecos/Cargo.lock | 235 +---- scripts/win-msvc-bootstrap.ps1 | 2 +- 54 files changed, 1845 insertions(+), 890 deletions(-) create mode 100644 python/quantum-pecos/src/pecos/simulators/mps_pytket/_nvmath_compat.py diff --git a/Cargo.lock b/Cargo.lock index 6f13e8218..c607f580a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -387,7 +387,7 @@ dependencies = [ "bitflags 2.11.1", "cexpr", "clang-sys", - "itertools 0.13.0", + "itertools 0.10.5", "log", "prettyplease", "proc-macro2", @@ -853,7 +853,7 @@ checksum = "af491d569909a7e4dee0ad7db7f5341fef5c614d5b8ec8cf765732aba3cff681" dependencies = [ "serde", "termcolor", - "unicode-width 0.2.2", + "unicode-width 0.1.14", ] [[package]] @@ -1783,6 +1783,7 @@ checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" dependencies = [ "crc32fast", "miniz_oxide", + "zlib-rs", ] [[package]] @@ -2161,7 +2162,6 @@ dependencies = [ "allocator-api2", "equivalent", "foldhash 0.1.5", - "rayon", ] [[package]] @@ -2308,21 +2308,20 @@ checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "hugr" -version = "0.25.6" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc11e18017e6ff91448e08e7180e786ca3247c7539de190f01253298442c92a9" +checksum = "e91648ee98355c1d502a0d466eec0b67ca2612f81ef5d261e62fca8aa567ab52" dependencies = [ "hugr-core", "hugr-llvm", "hugr-model", - "hugr-passes", ] [[package]] name = "hugr-core" -version = "0.25.6" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37961239a500fb1eb128b990de804e32902979682263c326694328e36e95f0ad" +checksum = "dbea3356943ad488326fcea465519c25d03ab792198331610d1292c324d209b8" dependencies = [ "base64", "cgmath", @@ -2349,7 +2348,7 @@ dependencies = [ "smallvec", "smol_str", "static_assertions", - "strum 0.27.2", + "strum 0.28.0", "thiserror 2.0.18", "tracing", "typetag", @@ -2358,9 +2357,9 @@ dependencies = [ [[package]] name = "hugr-llvm" -version = "0.25.6" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d903c4878c5329fb754550460421fbdd35825e5ba6d4bf7ae16336b6e9e7c84" +checksum = "de92b58fa5e8e0c2d03aab5a6a9cd50b4021ad5e3c0ca68d6ffeb604833337ca" dependencies = [ "anyhow", "cc", @@ -2373,14 +2372,14 @@ dependencies = [ "petgraph 0.8.3", "portgraph", "rstest 0.26.1", - "strum 0.27.2", + "strum 0.28.0", ] [[package]] name = "hugr-model" -version = "0.25.7" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3b422e3b24b6586f683abe93393f8b9b8bb8b0d028723a13d4c48816039935e" +checksum = "9699c56c272a729b110e989d799e63beb6f077b5bcc118cd76c088453693615e" dependencies = [ "base64", "bumpalo", @@ -2398,25 +2397,6 @@ dependencies = [ "thiserror 2.0.18", ] -[[package]] -name = "hugr-passes" -version = "0.25.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d566bdb985b053d8b02cfbe443f225a3fbc3ef2656193f5072d1c70b6abfe827" -dependencies = [ - "ascent", - "derive_more 2.1.1", - "fxhash", - "hugr-core", - "itertools 0.14.0", - "pastey", - "petgraph 0.8.3", - "portgraph", - "serde_json", - "strum 0.27.2", - "thiserror 2.0.18", -] - [[package]] name = "hybrid-array" version = "0.4.12" @@ -2663,22 +2643,22 @@ dependencies = [ [[package]] name = "inkwell" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1def4112dfb2ce2993db7027f7acdb43c1f4ee1c70a082a2eef306ed5d0df365" +checksum = "7decbc9dfa45a4a827a6ff7b822c113b1285678a937e84213417d4ca8a095782" dependencies = [ + "bitflags 2.11.1", "inkwell_internals", "libc", "llvm-sys", - "once_cell", "thiserror 2.0.18", ] [[package]] name = "inkwell_internals" -version = "0.13.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63736175c9a30ea123f7018de9f26163e0b39cd6978990ae486b510c4f3bad69" +checksum = "6cfe97ee860815a90ed17e09639513269e39420a7440f3f4c996f238c514cf8d" dependencies = [ "proc-macro2", "quote", @@ -3011,14 +2991,15 @@ checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" [[package]] name = "llvm-sys" -version = "140.1.3" +version = "211.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3dc78e9857c0231ec11e3bdccf63870493fdc7d0570b0ea7d50bf5df0cb1a0c" +checksum = "44007a7a44b73bdd877fa9c9ccef256036511220e90f65b4d50e7a15773c0ee3" dependencies = [ + "anyhow", "cc", "lazy_static", "libc", - "regex", + "regex-lite", "semver", ] @@ -3313,7 +3294,7 @@ dependencies = [ "num-complex 0.4.6", "num-traits", "py_literal", - "zip", + "zip 2.4.2", ] [[package]] @@ -3722,7 +3703,8 @@ dependencies = [ "toml", "toml_edit", "xz2", - "zip", + "zip 8.6.0", + "zstd", ] [[package]] @@ -3954,7 +3936,6 @@ name = "pecos-hugr" version = "0.2.0-dev.0" dependencies = [ "anyhow", - "hugr-core", "log", "pecos-core", "pecos-engines", @@ -3974,6 +3955,7 @@ name = "pecos-hugr-qis" version = "0.2.0-dev.0" dependencies = [ "anyhow", + "inkwell", "log", "pecos-core", "serde_json", @@ -4642,9 +4624,9 @@ dependencies = [ [[package]] name = "portgraph" -version = "0.15.3" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d2bc5f0a75d052384bd7f73a30b8e264041cebeeab29cfee0c6b72224bfd57f" +checksum = "6a1395575e261a0c0dd2d360ac4e3b14a4c9f68647ee12e59d96af959e4c0f79" dependencies = [ "bitvec", "delegate", @@ -5378,6 +5360,12 @@ dependencies = [ "regex-syntax 0.8.10", ] +[[package]] +name = "regex-lite" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab834c73d247e67f4fae452806d17d3c7501756d98c8808d7c9c7aa7d18f973" + [[package]] name = "regex-syntax" version = "0.6.29" @@ -5427,7 +5415,7 @@ dependencies = [ "derive_more 0.99.20", "fxhash", "itertools 0.13.0", - "petgraph 0.8.3", + "petgraph 0.6.5", "serde", "slotmap_fork_lmondada", "thiserror 1.0.69", @@ -5698,7 +5686,7 @@ checksum = "aaeee6f84153fd6f62507fc22bfe9499c8485075b44186dcbb918166ef75116f" dependencies = [ "fixedbitset 0.5.7", "foldhash 0.1.5", - "hashbrown 0.15.5", + "hashbrown 0.14.5", "indexmap 2.14.0", "ndarray 0.16.1", "num-traits", @@ -6247,15 +6235,6 @@ version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" -[[package]] -name = "strum" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" -dependencies = [ - "strum_macros 0.27.2", -] - [[package]] name = "strum" version = "0.28.0" @@ -6278,18 +6257,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "strum_macros" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "strum_macros" version = "0.28.0" @@ -6564,11 +6531,12 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tket" -version = "0.17.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7717a9c758bb7f2082d31bb0c021c20ebe816cbc479205e27d9d83bfd82ea4c" +checksum = "640b38c8fcfc7a6232b0f3afa9a9685a26e35c08d80faa2a264c69c219359181" dependencies = [ "anyhow", + "ascent", "bytemuck", "cgmath", "chrono", @@ -6583,6 +6551,7 @@ dependencies = [ "itertools 0.14.0", "lazy_static", "num-rational", + "pastey", "pest", "pest_derive", "petgraph 0.8.3", @@ -6593,7 +6562,8 @@ dependencies = [ "serde_json", "serde_with", "smol_str", - "strum 0.27.2", + "strum 0.28.0", + "thiserror 2.0.18", "tket-json-rs", "tracing", "typetag", @@ -6615,9 +6585,9 @@ dependencies = [ [[package]] name = "tket-qsystem" -version = "0.23.0" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d11f18e7cd1fd264a9e5c4492c92770de342524979e72de5854fa0555b2644e8" +checksum = "04aecdc44b24c95bba3ba49cb9a022d199fa0aa22dc015519a1abbb77e5e037e" dependencies = [ "anyhow", "delegate", @@ -6629,7 +6599,7 @@ dependencies = [ "lazy_static", "serde", "smol_str", - "strum 0.27.2", + "strum 0.28.0", "tket", "tket-json-rs", "typetag", @@ -6799,6 +6769,12 @@ version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" +[[package]] +name = "typed-path" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e28f89b80c87b8fb0cf04ab448d5dd0dd0ade2f8891bae878de66a75a28600e" + [[package]] name = "typeid" version = "1.0.3" @@ -8109,6 +8085,26 @@ dependencies = [ "zopfli", ] +[[package]] +name = "zip" +version = "8.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d04a6b5381502aa6087c94c669499eb1602eb9c5e8198e534de571f7154809b" +dependencies = [ + "crc32fast", + "flate2", + "indexmap 2.14.0", + "memchr", + "typed-path", + "zopfli", +] + +[[package]] +name = "zlib-rs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be3d40e40a133f9c916ee3f9f4fa2d9d63435b5fbe1bfc6d9dae0aa0ada1513" + [[package]] name = "zmij" version = "1.0.21" diff --git a/Cargo.toml b/Cargo.toml index eca284162..9be85f048 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -65,15 +65,11 @@ libc = "0.2" libloading = "0.9" # --- LLVM --- -inkwell = "0.8" +inkwell = { version = "0.9", features = ["llvm21-1-prefer-dynamic"] } # --- HUGR / tket --- -tket = { version = "0.17", default-features = false } -tket-qsystem = { version = "0.23", default-features = false } -# Pin hugr-core to 0.25.6: hugr-core 0.25.7 widened strum to >=0.27.2,<0.29 which lets the -# resolver pick strum 0.28, conflicting with tket 0.17 (requires strum ^0.27). -# Remove this pin once tket-qsystem releases a version compatible with tket 0.18. -hugr-core = "=0.25.6" +tket = { version = "0.18", default-features = false } +tket-qsystem = { version = "0.24", default-features = false } # --- WebAssembly --- wasmtime = { version = "45", default-features = false, features = [ @@ -137,7 +133,8 @@ tar = "0.4" xz2 = "0.1" bzip2 = "0.6" sevenz-rust = "0.6" -zip = { version = "2.4", default-features = false, features = ["deflate"] } +zip = { version = "8", default-features = false, features = ["deflate"] } +zstd = "0.13" # --- Logging --- log = "0.4" diff --git a/Justfile b/Justfile index 470aee204..c7c5022c8 100644 --- a/Justfile +++ b/Justfile @@ -70,17 +70,18 @@ doctor: _msvc-bootstrap ok() { echo " [OK] $1: $2"; } fail() { echo " [!!] $1: $2"; PROBLEMS=$((PROBLEMS + 1)); } - echo "LLVM 14:" + echo "LLVM 21.1:" if LLVM_DIR=$({{pecos}} llvm find 2>/dev/null); then VERSION=$("$LLVM_DIR/bin/llvm-config" --version 2>/dev/null || {{pecos}} llvm version 2>/dev/null | head -1 || echo "unknown") - ok "installed" "$VERSION at $LLVM_DIR" + LINK_MODE=$("$LLVM_DIR/bin/llvm-config" --shared-mode 2>/dev/null || echo "unknown") + ok "installed" "$VERSION ($LINK_MODE LLVM) at $LLVM_DIR" else fail "installed" "not found (run: just setup)" fi - if [ -f .cargo/config.toml ] && grep -q "LLVM_SYS_140_PREFIX" .cargo/config.toml 2>/dev/null; then - ok ".cargo/config.toml" "LLVM_SYS_140_PREFIX configured" + if [ -f .cargo/config.toml ] && grep -q "LLVM_SYS_211_PREFIX" .cargo/config.toml 2>/dev/null; then + ok ".cargo/config.toml" "LLVM_SYS_211_PREFIX configured" else - fail ".cargo/config.toml" "LLVM_SYS_140_PREFIX not set (run: pecos llvm configure)" + fail ".cargo/config.toml" "LLVM_SYS_211_PREFIX not set (run: pecos llvm configure)" fi echo "" @@ -458,7 +459,7 @@ docs-test: # Deps Management (prefer `just setup` or `pecos install `) # ============================================================================= -# Install LLVM 14 +# Install PECOS-managed LLVM 21.1 where supported [group('deps')] install-llvm: _msvc-bootstrap {{pecos}} install llvm @@ -473,7 +474,7 @@ install-cuda: _msvc-bootstrap configure-llvm: _msvc-bootstrap {{pecos}} llvm configure -# Check LLVM 14 installation status +# Check LLVM 21.1 installation status [group('deps')] check-llvm: _msvc-bootstrap -{{pecos}} llvm check diff --git a/crates/pecos-build/Cargo.toml b/crates/pecos-build/Cargo.toml index 66e0c692c..2164401fa 100644 --- a/crates/pecos-build/Cargo.toml +++ b/crates/pecos-build/Cargo.toml @@ -31,6 +31,7 @@ bzip2.workspace = true xz2.workspace = true sevenz-rust.workspace = true zip.workspace = true +zstd.workspace = true # Error handling thiserror.workspace = true diff --git a/crates/pecos-build/README.md b/crates/pecos-build/README.md index 169a2a2af..96a70c7eb 100644 --- a/crates/pecos-build/README.md +++ b/crates/pecos-build/README.md @@ -8,9 +8,9 @@ Used by build scripts (`build.rs`) to manage external dependencies. Handles down ## Key Features -- **LLVM 14 management**: Install, configure, and find LLVM 14 +- **LLVM 21.1 management**: Install where PECOS can provide shared LLVM, configure, and find LLVM 21.1 - **Dependency downloads**: QuEST, Qulacs, Stim, Eigen, etc. -- **Tool finding**: `find_tool("llvm-as")`, `find_llvm_14()` +- **Tool finding**: `find_tool("llvm-as")`, `find_llvm()` - **Manifest parsing**: Load `pecos.toml` for dependency versions ## PECOS Home Directory @@ -20,8 +20,7 @@ All dependencies managed under `~/.pecos/`: ``` ~/.pecos/ ├── cache/ # Downloaded archives -├── deps/ # Extracted source trees -├── llvm/ # LLVM installation +├── deps/ # Extracted toolchains and source trees, including llvm-21.1/ └── tmp/ # Temporary files ``` diff --git a/crates/pecos-build/src/cargo_config.rs b/crates/pecos-build/src/cargo_config.rs index 100d0ccf5..5a1328b65 100644 --- a/crates/pecos-build/src/cargo_config.rs +++ b/crates/pecos-build/src/cargo_config.rs @@ -133,11 +133,11 @@ mod tests { fn creates_forced_env_in_empty_project() { let tmp = tempfile::tempdir().unwrap(); let mut cfg = CargoConfig::open(tmp.path()).unwrap(); - cfg.set_env("LLVM_SYS_140_PREFIX", "C:/llvm", true).unwrap(); + cfg.set_env("LLVM_SYS_211_PREFIX", "C:/llvm", true).unwrap(); assert!(cfg.save().unwrap()); let parsed: toml::Value = toml::from_str(&read(tmp.path())).unwrap(); - let env = &parsed["env"]["LLVM_SYS_140_PREFIX"]; + let env = &parsed["env"]["LLVM_SYS_211_PREFIX"]; assert_eq!(env["value"].as_str().unwrap(), "C:/llvm"); assert!(env["force"].as_bool().unwrap()); } @@ -162,7 +162,7 @@ mod tests { let tmp = tempfile::tempdir().unwrap(); // First writer: LLVM. let mut a = CargoConfig::open(tmp.path()).unwrap(); - a.set_env("LLVM_SYS_140_PREFIX", "/llvm", true).unwrap(); + a.set_env("LLVM_SYS_211_PREFIX", "/llvm", true).unwrap(); a.save().unwrap(); // Second writer: cuQuantum -- must merge into the same [env]. let mut b = CargoConfig::open(tmp.path()).unwrap(); @@ -174,7 +174,7 @@ mod tests { // Both keys survive and parse. let parsed: toml::Value = toml::from_str(&text).unwrap(); assert_eq!( - parsed["env"]["LLVM_SYS_140_PREFIX"]["value"], + parsed["env"]["LLVM_SYS_211_PREFIX"]["value"], "/llvm".into() ); assert_eq!(parsed["env"]["CUQUANTUM_ROOT"]["value"], "/cq".into()); @@ -192,14 +192,14 @@ mod tests { .unwrap(); let mut cfg = CargoConfig::open(tmp.path()).unwrap(); - cfg.set_env("LLVM_SYS_140_PREFIX", "/llvm", true).unwrap(); + cfg.set_env("LLVM_SYS_211_PREFIX", "/llvm", true).unwrap(); cfg.save().unwrap(); let parsed: toml::Value = toml::from_str(&read(tmp.path())).unwrap(); assert_eq!(parsed["build"]["jobs"].as_integer().unwrap(), 4); assert_eq!(parsed["env"]["FOO"].as_str().unwrap(), "bar"); assert_eq!( - parsed["env"]["LLVM_SYS_140_PREFIX"]["value"], + parsed["env"]["LLVM_SYS_211_PREFIX"]["value"], "/llvm".into() ); } @@ -231,11 +231,11 @@ mod tests { fn save_is_idempotent_no_rewrite_when_unchanged() { let tmp = tempfile::tempdir().unwrap(); let mut cfg = CargoConfig::open(tmp.path()).unwrap(); - cfg.set_env("LLVM_SYS_140_PREFIX", "/llvm", true).unwrap(); + cfg.set_env("LLVM_SYS_211_PREFIX", "/llvm", true).unwrap(); assert!(cfg.save().unwrap(), "first write should change the file"); let mut again = CargoConfig::open(tmp.path()).unwrap(); - again.set_env("LLVM_SYS_140_PREFIX", "/llvm", true).unwrap(); + again.set_env("LLVM_SYS_211_PREFIX", "/llvm", true).unwrap(); assert!( !again.save().unwrap(), "re-applying the same value must not rewrite the file" diff --git a/crates/pecos-build/src/home.rs b/crates/pecos-build/src/home.rs index dd7cc4e1e..91555b62d 100644 --- a/crates/pecos-build/src/home.rs +++ b/crates/pecos-build/src/home.rs @@ -6,7 +6,7 @@ //! ~/.pecos/ //! ├── cache/ # Downloaded archives (tar.gz, 7z, etc.) //! ├── deps/ # All dependencies, versioned by name -//! │ ├── llvm-14/ +//! │ ├── llvm-21.1/ //! │ ├── cuda-12.6.3/ //! │ ├── quest-v4.2.0/ //! │ ├── stim-bd60b73525fd/ @@ -159,8 +159,8 @@ pub fn resolve_dep_path(name: &str, version: &str) -> Result { Ok(versioned) } -/// LLVM major version used by PECOS -pub const LLVM_VERSION: &str = "14"; +/// LLVM version used by PECOS +pub const LLVM_VERSION: &str = crate::llvm::REQUIRED_VERSION; /// Get the vendored cmake installation directory path (without creating it) /// @@ -339,7 +339,7 @@ pub fn print_legacy_warning(name: &str, old_path: &Path) { /// Description of a single legacy dep that can be migrated. pub struct LegacyDep { - /// Human-readable name (e.g. "LLVM 14") + /// Human-readable name (e.g. "LLVM 21.1") pub name: &'static str, /// Old path pub old: PathBuf, diff --git a/crates/pecos-build/src/lib.rs b/crates/pecos-build/src/lib.rs index f6c9a9a2c..09f21d22d 100644 --- a/crates/pecos-build/src/lib.rs +++ b/crates/pecos-build/src/lib.rs @@ -3,7 +3,7 @@ //! This crate provides build script utilities for managing external dependencies: //! //! - Downloading and extracting C++ libraries (`QuEST`, Qulacs, Stim, etc.) -//! - Managing LLVM 14 installation +//! - Managing LLVM 21.1 installation //! - Managing the `~/.pecos/` home directory //! //! # PECOS Home Directory diff --git a/crates/pecos-build/src/llvm.rs b/crates/pecos-build/src/llvm.rs index 572476012..a3c98f1bb 100644 --- a/crates/pecos-build/src/llvm.rs +++ b/crates/pecos-build/src/llvm.rs @@ -1,6 +1,6 @@ //! LLVM detection and management //! -//! This module provides functionality to locate, install, and configure LLVM 14 +//! This module provides functionality to locate, install, and configure LLVM 21.1 //! for PECOS across different platforms. pub mod config; @@ -30,26 +30,39 @@ pub fn get_pecos_command() -> &'static str { "cargo run -p pecos --" } -/// LLVM version required by PECOS -pub const REQUIRED_VERSION: &str = "14"; +/// LLVM version required by PECOS. +pub const REQUIRED_VERSION: &str = "21.1"; -/// Find LLVM 14 installation on the system. +/// Cargo/llvm-sys environment variable for the required LLVM version. +pub const LLVM_SYS_PREFIX_ENV: &str = "LLVM_SYS_211_PREFIX"; + +/// Return whether an `llvm-config --version` string is compatible with PECOS. +#[must_use] +pub fn is_required_llvm_version(version: &str) -> bool { + let version = version.trim(); + version == REQUIRED_VERSION + || version + .strip_prefix(REQUIRED_VERSION) + .is_some_and(|rest| rest.starts_with('.')) +} + +/// Find a compatible LLVM installation on the system. /// -/// This function searches for LLVM 14 in the following priority order: -/// 1. PECOS deps directory: `~/.pecos/deps/llvm/` +/// This function searches for LLVM in the following priority order: +/// 1. PECOS deps directory: `~/.pecos/deps/llvm-{version}/` /// 2. Legacy PECOS path: `~/.pecos/llvm/` (prints deprecation warning) -/// - Windows also checks: `~/.pecos/LLVM-14` +/// - Windows also checks: `~/.pecos/LLVM-{version}` /// 3. Project-local installation (`llvm/` directory relative to repository root) /// 4. System installations (platform-specific locations) /// /// # Returns -/// - `Some(PathBuf)` if LLVM 14 is found and valid -/// - `None` if LLVM 14 is not found +/// - `Some(PathBuf)` if a compatible LLVM is found and valid +/// - `None` if a compatible LLVM is not found #[must_use] -pub fn find_llvm_14(repo_root: Option) -> Option { - // 1. Check new deps path: ~/.pecos/deps/llvm/ +pub fn find_llvm(repo_root: Option) -> Option { + // 1. Check versioned deps path: ~/.pecos/deps/llvm-{version}/ if let Ok(deps_llvm) = crate::home::get_llvm_dir_path() - && is_valid_llvm_14(&deps_llvm) + && is_valid_llvm(&deps_llvm) { return Some(deps_llvm); } @@ -60,15 +73,15 @@ pub fn find_llvm_14(repo_root: Option) -> Option { #[cfg(target_os = "windows")] { - let user_llvm_new = pecos_dir.join("LLVM-14"); - if is_valid_llvm_14(&user_llvm_new) { + let user_llvm_new = pecos_dir.join(format!("LLVM-{REQUIRED_VERSION}")); + if is_valid_llvm(&user_llvm_new) { crate::home::print_legacy_warning("LLVM", &user_llvm_new); return Some(user_llvm_new); } } let user_llvm_legacy = pecos_dir.join("llvm"); - if is_valid_llvm_14(&user_llvm_legacy) { + if is_valid_llvm(&user_llvm_legacy) { crate::home::print_legacy_warning("LLVM", &user_llvm_legacy); return Some(user_llvm_legacy); } @@ -77,32 +90,48 @@ pub fn find_llvm_14(repo_root: Option) -> Option { // 3. Check for project-local LLVM if let Some(root) = repo_root { let local_llvm = root.join("llvm"); - if is_valid_llvm_14(&local_llvm) { + if is_valid_llvm(&local_llvm) { return Some(local_llvm); } } // 4. Check system installations - find_system_llvm_14() + find_system_llvm() } -/// Find LLVM 14 in system-wide locations (platform-specific) -fn find_system_llvm_14() -> Option { +/// Find the LLVM installation Cargo should use for this project. +/// +/// An explicit `.cargo/config.toml` setting takes priority because `cargo` +/// applies it to build scripts. If no valid project config exists, this falls +/// back to the normal managed/system detection order. +#[must_use] +pub fn find_configured_or_detected_llvm(repo_root: Option) -> Option { + if let Some(configured_path) = config::read_configured_llvm_path() + && is_valid_llvm(&configured_path) + { + return Some(configured_path); + } + + find_llvm(repo_root) +} + +/// Find LLVM in system-wide locations (platform-specific) +fn find_system_llvm() -> Option { #[cfg(target_os = "macos")] { - if let Ok(output) = Command::new("brew").args(["--prefix", "llvm@14"]).output() + if let Ok(output) = Command::new("brew").args(["--prefix", "llvm@21"]).output() && output.status.success() { let path_str = String::from_utf8_lossy(&output.stdout).trim().to_string(); let path = PathBuf::from(path_str); - if is_valid_llvm_14(&path) { + if is_valid_llvm(&path) { return Some(path); } } - for path_str in ["/opt/homebrew/opt/llvm@14", "/usr/local/opt/llvm@14"] { + for path_str in ["/opt/homebrew/opt/llvm@21", "/usr/local/opt/llvm@21"] { let llvm_path = PathBuf::from(path_str); - if is_valid_llvm_14(&llvm_path) { + if is_valid_llvm(&llvm_path) { return Some(llvm_path); } } @@ -110,23 +139,23 @@ fn find_system_llvm_14() -> Option { #[cfg(target_os = "linux")] { - if let Ok(output) = Command::new("llvm-config-14").arg("--prefix").output() + if let Ok(output) = Command::new("llvm-config-21").arg("--prefix").output() && output.status.success() { let path_str = String::from_utf8_lossy(&output.stdout).trim().to_string(); let path = PathBuf::from(path_str); - if is_valid_llvm_14(&path) { + if is_valid_llvm(&path) { return Some(path); } } for path_str in [ - "/usr/lib/llvm-14", - "/usr/local/llvm-14", - "/usr/lib/x86_64-linux-gnu/llvm-14", + "/usr/lib/llvm-21", + "/usr/local/llvm-21", + "/usr/lib/x86_64-linux-gnu/llvm-21", ] { let llvm_path = PathBuf::from(path_str); - if is_valid_llvm_14(&llvm_path) { + if is_valid_llvm(&llvm_path) { return Some(llvm_path); } } @@ -137,11 +166,11 @@ fn find_system_llvm_14() -> Option { for path_str in [ "C:\\Program Files\\LLVM", "C:\\LLVM", - "C:\\Program Files\\LLVM-14", - "C:\\LLVM-14", + "C:\\Program Files\\LLVM-21", + "C:\\LLVM-21", ] { let llvm_path = PathBuf::from(path_str); - if is_valid_llvm_14(&llvm_path) { + if is_valid_llvm(&llvm_path) { return Some(llvm_path); } } @@ -150,9 +179,9 @@ fn find_system_llvm_14() -> Option { None } -/// Check if a given path contains a valid LLVM 14 installation +/// Check if a given path contains a compatible LLVM installation #[must_use] -pub fn is_valid_llvm_14(path: &Path) -> bool { +pub fn is_valid_llvm(path: &Path) -> bool { if !path.exists() { return false; } @@ -171,7 +200,7 @@ pub fn is_valid_llvm_14(path: &Path) -> bool { && output.status.success() { let version = String::from_utf8_lossy(&output.stdout); - return version.starts_with("14."); + return is_required_llvm_version(&version); } false @@ -183,13 +212,7 @@ pub fn is_valid_llvm_14(path: &Path) -> bool { /// /// Returns an error if LLVM is not found or version cannot be determined pub fn get_llvm_version(path: &Path) -> Result { - #[cfg(target_os = "windows")] - let llvm_config = path.join("bin").join("llvm-config.exe"); - - #[cfg(not(target_os = "windows"))] - let llvm_config = path.join("bin").join("llvm-config"); - - let output = Command::new(&llvm_config) + let output = Command::new(llvm_config_path(path)) .arg("--version") .output() .map_err(|e| Error::Llvm(format!("Failed to run llvm-config: {e}")))?; @@ -201,11 +224,83 @@ pub fn get_llvm_version(path: &Path) -> Result { Ok(String::from_utf8_lossy(&output.stdout).trim().to_string()) } +/// Get LLVM's configured shared/static library mode. +/// +/// # Errors +/// +/// Returns an error if `llvm-config --shared-mode` fails. +pub fn get_llvm_shared_mode(path: &Path) -> Result { + let output = Command::new(llvm_config_path(path)) + .arg("--shared-mode") + .output() + .map_err(|e| Error::Llvm(format!("Failed to run llvm-config: {e}")))?; + + if !output.status.success() { + return Err(Error::Llvm( + "llvm-config --shared-mode returned non-zero status".into(), + )); + } + + Ok(String::from_utf8_lossy(&output.stdout).trim().to_string()) +} + +/// Get the shared LLVM library names reported by `llvm-config`, if available. +#[must_use] +pub fn get_llvm_shared_libraries(path: &Path) -> Option { + let output = Command::new(llvm_config_path(path)) + .args(["--libnames", "--link-shared", "core"]) + .output() + .ok()?; + + if !output.status.success() { + return None; + } + + let libraries = String::from_utf8_lossy(&output.stdout).trim().to_string(); + if libraries.is_empty() { + None + } else { + Some(libraries) + } +} + +/// Get LLVM's library directory as reported by `llvm-config --libdir`. +/// +/// # Errors +/// +/// Returns an error if `llvm-config --libdir` fails. +pub fn get_llvm_libdir(path: &Path) -> Result { + let output = Command::new(llvm_config_path(path)) + .arg("--libdir") + .output() + .map_err(|e| Error::Llvm(format!("Failed to run llvm-config: {e}")))?; + + if !output.status.success() { + return Err(Error::Llvm( + "llvm-config --libdir returned non-zero status".into(), + )); + } + + Ok(PathBuf::from( + String::from_utf8_lossy(&output.stdout).trim(), + )) +} + +fn llvm_config_path(path: &Path) -> PathBuf { + let exe_name = if cfg!(windows) { + "llvm-config.exe" + } else { + "llvm-config" + }; + + path.join("bin").join(exe_name) +} + /// Find a specific LLVM tool by name #[must_use] pub fn find_tool(tool_name: &str) -> Option { let repo_root = get_repo_root_from_manifest(); - let llvm_path = find_llvm_14(repo_root)?; + let llvm_path = find_configured_or_detected_llvm(repo_root)?; let tool_path = if cfg!(windows) { llvm_path.join("bin").join(format!("{tool_name}.exe")) @@ -273,26 +368,28 @@ fn find_cargo_project_root_from(start: &Path) -> Option { first_match } -/// Print a helpful error message when LLVM 14 is not found +/// Print a helpful error message when the required LLVM version is not found pub fn print_llvm_not_found_error() { let cmd = get_pecos_command(); eprintln!("\n═══════════════════════════════════════════════════════════════"); - eprintln!("ERROR: LLVM 14 not found!"); + eprintln!("ERROR: LLVM {REQUIRED_VERSION} not found!"); eprintln!("═══════════════════════════════════════════════════════════════"); eprintln!(); - eprintln!("PECOS requires LLVM version 14 for QIS program execution."); - eprintln!(); - eprintln!("Option 1 - Install LLVM 14 for PECOS (recommended):"); - eprintln!(); - eprintln!(" {cmd} install llvm"); + eprintln!("PECOS requires LLVM version {REQUIRED_VERSION} for QIS program execution."); eprintln!(); + if installer::managed_install_unavailable_reason().is_none() { + eprintln!("Option 1 - Install LLVM {REQUIRED_VERSION} for PECOS (recommended):"); + eprintln!(); + eprintln!(" {cmd} install llvm"); + eprintln!(); + } #[cfg(target_os = "macos")] { - eprintln!("Option 2 - Use system LLVM via Homebrew:"); + eprintln!("Use system LLVM via Homebrew:"); eprintln!(); - eprintln!(" brew install llvm@14"); + eprintln!(" brew install llvm@21"); eprintln!(" {cmd} llvm configure"); eprintln!(); } @@ -301,14 +398,18 @@ pub fn print_llvm_not_found_error() { { eprintln!("Option 2 - Use system LLVM via package manager:"); eprintln!(); - eprintln!(" sudo apt install llvm-14 # Debian/Ubuntu"); + eprintln!(" Install LLVM 21.1 through your distribution packages if available"); eprintln!(" {cmd} llvm configure"); eprintln!(); } #[cfg(target_os = "windows")] { - eprintln!("For Windows, use the PECOS installer (Option 1) above."); + eprintln!("Windows MSVC LLVM builds do not provide shared libLLVM."); + eprintln!("Use WSL2/Linux for the full HUGR test lane, or configure a full"); + eprintln!("LLVM 21 package for targeted static LLVM builds:"); + eprintln!(); + eprintln!(" {cmd} llvm configure C:\\path\\to\\llvm"); eprintln!(); } @@ -420,4 +521,14 @@ mod tests { let result = find_cargo_project_root_from(&deep); assert_eq!(result.as_deref(), Some(root)); } + + #[test] + fn required_llvm_version_matches_only_21_1_series() { + assert!(is_required_llvm_version("21.1")); + assert!(is_required_llvm_version("21.1.8")); + assert!(is_required_llvm_version("21.1.8git")); + assert!(!is_required_llvm_version("21.0.9")); + assert!(!is_required_llvm_version("21.10.0")); + assert!(!is_required_llvm_version("22.0.0")); + } } diff --git a/crates/pecos-build/src/llvm/config.rs b/crates/pecos-build/src/llvm/config.rs index 9ebd6a09f..0702c41f1 100644 --- a/crates/pecos-build/src/llvm/config.rs +++ b/crates/pecos-build/src/llvm/config.rs @@ -2,8 +2,8 @@ use crate::errors::{Error, Result}; use crate::llvm::{ - find_cargo_project_root, find_llvm_14, get_pecos_command, get_repo_root_from_manifest, - is_valid_llvm_14, + LLVM_SYS_PREFIX_ENV, REQUIRED_VERSION, find_cargo_project_root, find_llvm, get_pecos_command, + get_repo_root_from_manifest, is_valid_llvm, }; use std::fs; use std::path::{Path, PathBuf}; @@ -15,9 +15,9 @@ pub struct ConfigValidation { pub configured_path: Option, /// Whether the configured path exists pub path_exists: bool, - /// Whether the configured path is valid LLVM 14 - pub path_is_valid_llvm14: bool, - /// Path that `find_llvm_14` would return + /// Whether the configured path is the required LLVM version + pub path_is_valid_llvm: bool, + /// Path that `find_llvm` would return pub detected_path: Option, /// Whether config matches detected LLVM pub config_matches_detected: bool, @@ -27,7 +27,7 @@ impl ConfigValidation { /// Check if the configuration is healthy #[must_use] pub fn is_healthy(&self) -> bool { - self.configured_path.is_some() && self.path_exists && self.path_is_valid_llvm14 + self.configured_path.is_some() && self.path_exists && self.path_is_valid_llvm } /// Print validation warnings if there are issues @@ -44,21 +44,21 @@ impl ConfigValidation { ); eprintln!(); eprintln!("To fix this:"); - eprintln!(" 1. Install LLVM 14 for PECOS (recommended):"); + eprintln!(" 1. Install LLVM {REQUIRED_VERSION} for PECOS (recommended):"); eprintln!(" {cmd} install llvm"); if self.detected_path.is_some() { eprintln!(" 2. Or use the detected system LLVM:"); eprintln!(" {cmd} llvm configure"); } - } else if !self.path_is_valid_llvm14 { + } else if !self.path_is_valid_llvm { eprintln!(); eprintln!( - "Warning: .cargo/config.toml points to {} which is not valid LLVM 14", + "Warning: .cargo/config.toml points to {} which is not valid LLVM {REQUIRED_VERSION}", configured.display() ); eprintln!(); eprintln!("To fix this:"); - eprintln!(" 1. Install LLVM 14 for PECOS (recommended):"); + eprintln!(" 1. Install LLVM {REQUIRED_VERSION} for PECOS (recommended):"); eprintln!(" {cmd} install llvm"); if self.detected_path.is_some() { eprintln!(" 2. Or use the detected system LLVM:"); @@ -83,7 +83,7 @@ impl ConfigValidation { eprintln!("Warning: No LLVM configured in .cargo/config.toml"); eprintln!(); eprintln!("To fix this:"); - eprintln!(" 1. Install LLVM 14 for PECOS (recommended):"); + eprintln!(" 1. Install LLVM {REQUIRED_VERSION} for PECOS (recommended):"); eprintln!(" {cmd} install llvm"); eprintln!(" 2. Or use the detected system LLVM:"); eprintln!(" {cmd} llvm configure"); @@ -94,8 +94,8 @@ impl ConfigValidation { /// Read the configured LLVM path from .cargo/config.toml /// /// Handles both TOML formats: -/// `LLVM_SYS_140_PREFIX = "/path/to/llvm"` -/// `LLVM_SYS_140_PREFIX = { value = "/path/to/llvm", force = true }` +/// `LLVM_SYS_211_PREFIX = "/path/to/llvm"` +/// `LLVM_SYS_211_PREFIX = { value = "/path/to/llvm", force = true }` #[must_use] pub fn read_configured_llvm_path() -> Option { let project_root = find_cargo_project_root()?; @@ -104,14 +104,14 @@ pub fn read_configured_llvm_path() -> Option { let table: toml::Table = content.parse().ok()?; let env = table.get("env")?; - let entry = env.get("LLVM_SYS_140_PREFIX")?; + let entry = env.get(LLVM_SYS_PREFIX_ENV)?; - // Simple string: LLVM_SYS_140_PREFIX = "/path" + // Simple string: LLVM_SYS_211_PREFIX = "/path" if let Some(s) = entry.as_str() { return Some(PathBuf::from(s)); } - // Inline table: LLVM_SYS_140_PREFIX = { value = "/path", force = true } + // Inline table: LLVM_SYS_211_PREFIX = { value = "/path", force = true } if let Some(t) = entry.as_table() && let Some(v) = t.get("value").and_then(|v| v.as_str()) { @@ -126,10 +126,10 @@ pub fn read_configured_llvm_path() -> Option { pub fn validate_llvm_config() -> ConfigValidation { let configured_path = read_configured_llvm_path(); let repo_root = get_repo_root_from_manifest(); - let detected_path = find_llvm_14(repo_root); + let detected_path = find_llvm(repo_root); - let (path_exists, path_is_valid_llvm14) = if let Some(ref path) = configured_path { - (path.exists(), is_valid_llvm_14(path)) + let (path_exists, path_is_valid_llvm) = if let Some(ref path) = configured_path { + (path.exists(), is_valid_llvm(path)) } else { (false, false) }; @@ -143,7 +143,7 @@ pub fn validate_llvm_config() -> ConfigValidation { ConfigValidation { configured_path, path_exists, - path_is_valid_llvm14, + path_is_valid_llvm, detected_path, config_matches_detected, } @@ -151,18 +151,18 @@ pub fn validate_llvm_config() -> ConfigValidation { /// Automatically configure LLVM for PECOS /// -/// This function determines the best LLVM 14 installation to use and writes +/// This function determines the best LLVM installation to use and writes /// it to `.cargo/config.toml` with `force=true`. /// /// Priority order: -/// 1. `~/.pecos/deps/llvm` (PECOS-managed LLVM, new path) +/// 1. `~/.pecos/deps/llvm-{version}` (PECOS-managed LLVM, new path) /// 2. `~/.pecos/llvm` (legacy path) -/// 3. `LLVM_SYS_140_PREFIX` environment variable -/// 4. System LLVM 14 (Homebrew, system paths, etc.) +/// 3. `LLVM_SYS_211_PREFIX` environment variable +/// 4. System LLVM (Homebrew, system paths, etc.) /// /// # Errors /// -/// Returns an error if no suitable LLVM 14 installation could be found +/// Returns an error if no suitable LLVM installation could be found pub fn auto_configure_llvm(project_root: Option) -> Result { // Priority 1 & 2: Check ~/.pecos/deps/llvm and legacy ~/.pecos/llvm let mut pecos_llvm_paths = Vec::new(); @@ -174,11 +174,15 @@ pub fn auto_configure_llvm(project_root: Option) -> Result { } #[cfg(target_os = "windows")] if let Some(home_dir) = dirs::home_dir() { - pecos_llvm_paths.push(home_dir.join(".pecos").join("LLVM-14")); + pecos_llvm_paths.push( + home_dir + .join(".pecos") + .join(format!("LLVM-{REQUIRED_VERSION}")), + ); } for pecos_llvm in pecos_llvm_paths { - if is_valid_llvm_14(&pecos_llvm) { + if is_valid_llvm(&pecos_llvm) { let project_root = project_root .or_else(get_repo_root_from_manifest) .or_else(find_cargo_project_root) @@ -189,10 +193,10 @@ pub fn auto_configure_llvm(project_root: Option) -> Result { } } - // Priority 2: Check LLVM_SYS_140_PREFIX - if let Ok(sys_prefix) = std::env::var("LLVM_SYS_140_PREFIX") { + // Priority 2: Check LLVM_SYS_211_PREFIX + if let Ok(sys_prefix) = std::env::var(LLVM_SYS_PREFIX_ENV) { let path = PathBuf::from(&sys_prefix); - if is_valid_llvm_14(&path) { + if is_valid_llvm(&path) { let project_root = project_root .or_else(get_repo_root_from_manifest) .or_else(find_cargo_project_root) @@ -203,9 +207,9 @@ pub fn auto_configure_llvm(project_root: Option) -> Result { } } - // Priority 3: Scan system for LLVM 14 + // Priority 3: Scan system for LLVM let repo_root = get_repo_root_from_manifest(); - if let Some(detected_path) = find_llvm_14(repo_root) { + if let Some(detected_path) = find_llvm(repo_root) { let project_root = project_root .or_else(get_repo_root_from_manifest) .or_else(find_cargo_project_root) @@ -215,7 +219,9 @@ pub fn auto_configure_llvm(project_root: Option) -> Result { return Ok(detected_path); } - Err(Error::Llvm("No suitable LLVM 14 installation found".into())) + Err(Error::Llvm(format!( + "No suitable LLVM {REQUIRED_VERSION} installation found" + ))) } /// Write or update `.cargo/config.toml` with LLVM configuration @@ -233,7 +239,7 @@ pub fn write_cargo_config(project_root: &Path, llvm_path: &Path, force: bool) -> // Forward slashes keep the value backslash-escape-free in TOML. let llvm_path_str = llvm_path.to_string_lossy().replace('\\', "/"); let mut cfg = crate::cargo_config::CargoConfig::open(project_root)?; - cfg.set_env("LLVM_SYS_140_PREFIX", &llvm_path_str, force)?; + cfg.set_env(LLVM_SYS_PREFIX_ENV, &llvm_path_str, force)?; cfg.save()?; Ok(()) } diff --git a/crates/pecos-build/src/llvm/installer.rs b/crates/pecos-build/src/llvm/installer.rs index ac02ef691..d0a327f62 100644 --- a/crates/pecos-build/src/llvm/installer.rs +++ b/crates/pecos-build/src/llvm/installer.rs @@ -1,38 +1,90 @@ -//! LLVM 14.0.6 installation functionality +//! LLVM 21.1 installation functionality #![allow(clippy::case_sensitive_file_extension_comparisons)] use crate::errors::{Error, Result}; +#[cfg(target_os = "linux")] use sha2::{Digest, Sha256}; use std::fs; use std::io; use std::path::{Path, PathBuf}; -/// Known SHA256 checksums for LLVM 14.0.6 downloads -const LLVM_CHECKSUMS: &[(&str, &str)] = &[ - ( - "clang+llvm-14.0.6-x86_64-apple-darwin.tar.xz", - "e6cc6b8279661fd4452c2847cb8e55ce1e54e1faf4ab497b37c85ffdb6685e7c", - ), - ( - "clang+llvm-14.0.6-arm64-apple-darwin22.3.0.tar.xz", - "82f4f7607a16c9aaf7314b945bde6a4639836ec9d2b474ebb3a31dee33e3c15a", - ), - ( - "clang+llvm-14.0.6-x86_64-linux-gnu-rhel-8.4.tar.xz", - "7412026be8bb8f6b4c25ef58c7a1f78ed5ea039d94f0fa633a386de9c60a6942", - ), - ( - "clang+llvm-14.0.6-aarch64-linux-gnu.tar.xz", - "1a81fda984f5e607584916fdf69cf41e5385b219b983544d2c1a14950d5a65cf", - ), - ( - "LLVM-14.0.6-win64.7z", - "611e7a39363a2b63267d012a05f83ea9ce2b432a448890459c9412233327ac11", - ), +const LLVM_RELEASE_VERSION: &str = "21.1.8"; + +/// LLVM release version installed by the managed installer. +#[must_use] +pub const fn release_version() -> &'static str { + LLVM_RELEASE_VERSION +} + +/// Explain why PECOS cannot provide a managed shared LLVM install here. +#[must_use] +pub fn managed_install_unavailable_reason() -> Option<&'static str> { + #[cfg(target_os = "linux")] + { + None + } + + #[cfg(target_os = "macos")] + { + Some( + "PECOS-managed shared LLVM is currently available only on \ + Debian/Ubuntu-compatible Linux. On macOS, install LLVM 21 with \ + Homebrew (`brew install llvm@21`) and run `pecos llvm configure`.", + ) + } + + #[cfg(target_os = "windows")] + { + Some( + "PECOS-managed shared LLVM is not available on Windows MSVC because \ + LLVM does not provide the libLLVM shared-library target there. Use \ + WSL2/Linux for the full HUGR test lane, or configure a full LLVM 21 \ + package for targeted static LLVM builds with `pecos llvm configure \ + C:\\path\\to\\llvm`.", + ) + } + + #[cfg(not(any(target_os = "linux", target_os = "macos", target_os = "windows")))] + { + Some( + "PECOS-managed shared LLVM is currently available only on \ + Debian/Ubuntu-compatible Linux. Install shared LLVM 21 with your \ + system package manager and run `pecos llvm configure /path/to/llvm`.", + ) + } +} + +#[cfg(target_os = "linux")] +const APT_LLVM_PACKAGES: &[&str] = &[ + "libllvm21", + "llvm-21", + "llvm-21-dev", + "llvm-21-linker-tools", + "clang-21", + "libclang-common-21-dev", + "libclang-cpp21", + "libclang1-21", ]; -/// Install LLVM 14.0.6 to `~/.pecos/deps/llvm/` +#[cfg(target_os = "linux")] +#[derive(Clone, Debug)] +struct AptLlvmSource { + base_url: String, + codename: String, + deb_arch: String, +} + +#[cfg(target_os = "linux")] +#[derive(Clone, Debug)] +struct AptPackage { + name: String, + version: String, + filename: String, + sha256: String, +} + +/// Install LLVM 21.1 to `~/.pecos/deps/llvm-21.1/` /// /// # Arguments /// * `force` - Force reinstall even if already present @@ -48,32 +100,59 @@ pub fn install_llvm(force: bool, no_configure: bool) -> Result { // Check if already installed if llvm_dir.exists() { if is_valid_installation(&llvm_dir) { - if !force { - return Err(Error::Llvm( - "LLVM is already installed. Use --force to reinstall.".into(), - )); + if is_shared_installation(&llvm_dir) { + if !force { + return Err(Error::Llvm( + "LLVM is already installed. Use --force to reinstall.".into(), + )); + } + } else if !force { + let recovery = managed_install_unavailable_reason().map_or_else( + || { + "Run `pecos install llvm --force` to replace it with shared LLVM, \ + or configure your own shared LLVM with `pecos llvm configure /path/to/llvm`." + .to_string() + }, + |reason| { + format!( + "{reason} Remove the static managed install manually if you no longer need it." + ) + }, + ); + return Err(Error::Llvm(format!( + "Existing PECOS-managed LLVM is static. {recovery}" + ))); } } else if !force { + let recovery = managed_install_unavailable_reason().map_or_else( + || "Use --force to reinstall.".to_string(), + |reason| { + format!("{reason} Remove the invalid managed install manually if you no longer need it.") + }, + ); return Err(Error::Llvm(format!( - "Existing LLVM directory is not a valid LLVM 14 installation: {}. \ - Use --force to reinstall.", + "Existing LLVM directory is not a valid LLVM {} installation: {}. {recovery}", + super::REQUIRED_VERSION, llvm_dir.display() ))); } } + if let Some(reason) = managed_install_unavailable_reason() { + return Err(Error::Llvm(reason.into())); + } + // Remove existing if force if force && llvm_dir.exists() { println!("Removing existing LLVM installation..."); fs::remove_dir_all(&llvm_dir)?; } - println!("Installing LLVM 14.0.6..."); - println!("This will download ~400MB and may take 5-10 minutes."); + println!("Installing LLVM {LLVM_RELEASE_VERSION}..."); + println!("PECOS-managed LLVM uses a shared LLVM library when available."); + println!("This downloads a large toolchain and may take several minutes."); println!(); - let (url, archive_name) = get_download_url()?; - // Create parent directory if let Some(parent) = llvm_dir.parent() { fs::create_dir_all(parent)?; @@ -83,13 +162,8 @@ pub fn install_llvm(force: bool, no_configure: bool) -> Result { let temp_base = llvm_dir.parent().unwrap_or(&llvm_dir).join("tmp"); let temp_dir = temp_base.join("llvm"); fs::create_dir_all(&temp_dir)?; - let archive_path = temp_dir.join(&archive_name); - // Download and verify - download_and_verify_with_retry(&url, &archive_path, &archive_name)?; - - // Extract - extract_llvm(&archive_path, &llvm_dir)?; + install_managed_llvm_payload(&llvm_dir, &temp_dir)?; // Cleanup fs::remove_dir_all(&temp_dir)?; @@ -103,12 +177,22 @@ pub fn install_llvm(force: bool, no_configure: bool) -> Result { "Installation completed but verification failed".into(), )); } + if !is_shared_installation(&llvm_dir) { + return Err(Error::Llvm( + "Managed LLVM installation is static. PECOS requires managed LLVM to provide \ + shared libLLVM; configure a shared system LLVM with `pecos llvm configure /path/to/llvm`." + .into(), + )); + } verify_llvm_runtime(&llvm_dir)?; println!(); println!("Installation complete!"); - println!("LLVM 14.0.6 installed to: {}", llvm_dir.display()); + println!( + "LLVM {LLVM_RELEASE_VERSION} installed to: {}", + llvm_dir.display() + ); if no_configure { println!(); @@ -136,106 +220,175 @@ pub fn install_llvm(force: bool, no_configure: bool) -> Result { Ok(llvm_dir) } -fn get_download_url() -> Result<(String, String)> { - let os = std::env::consts::OS; - let arch = std::env::consts::ARCH; - - match os { - "macos" => { - if arch == "aarch64" { - Ok(( - "https://github.com/llvm/llvm-project/releases/download/llvmorg-14.0.6/clang+llvm-14.0.6-arm64-apple-darwin22.3.0.tar.xz".to_string(), - "clang+llvm-14.0.6-arm64-apple-darwin22.3.0.tar.xz".to_string(), - )) - } else { - Ok(( - "https://github.com/llvm/llvm-project/releases/download/llvmorg-14.0.6/clang+llvm-14.0.6-x86_64-apple-darwin.tar.xz".to_string(), - "clang+llvm-14.0.6-x86_64-apple-darwin.tar.xz".to_string(), - )) - } - } - "linux" => { - if arch == "x86_64" { - Ok(( - "https://github.com/llvm/llvm-project/releases/download/llvmorg-14.0.6/clang+llvm-14.0.6-x86_64-linux-gnu-rhel-8.4.tar.xz".to_string(), - "clang+llvm-14.0.6-x86_64-linux-gnu-rhel-8.4.tar.xz".to_string(), - )) - } else if arch == "aarch64" { - Ok(( - "https://github.com/llvm/llvm-project/releases/download/llvmorg-14.0.6/clang+llvm-14.0.6-aarch64-linux-gnu.tar.xz".to_string(), - "clang+llvm-14.0.6-aarch64-linux-gnu.tar.xz".to_string(), - )) - } else { - Err(Error::Llvm(format!("Unsupported Linux architecture: {arch}"))) - } +fn install_managed_llvm_payload(llvm_dir: &Path, temp_dir: &Path) -> Result<()> { + #[cfg(target_os = "linux")] + { + if let Some(source) = detect_apt_llvm_source() { + return install_linux_apt_llvm(llvm_dir, temp_dir, &source); } - "windows" => Ok(( - "https://github.com/PLC-lang/llvm-package-windows/releases/download/v14.0.6/LLVM-14.0.6-win64.7z".to_string(), - "LLVM-14.0.6-win64.7z".to_string(), - )), - _ => Err(Error::Llvm(format!("Unsupported operating system: {os}"))), + + Err(Error::Llvm( + "PECOS-managed shared LLVM on Linux currently requires a Debian/Ubuntu-compatible \ + apt.llvm.org repository. Install shared LLVM 21 with your system package manager and \ + run `pecos llvm configure /path/to/llvm`." + .into(), + )) + } + + #[cfg(not(target_os = "linux"))] + { + let _ = (llvm_dir, temp_dir); + Err(Error::Llvm( + managed_install_unavailable_reason() + .unwrap_or("PECOS-managed shared LLVM is not available on this platform.") + .into(), + )) } } -fn download_and_verify_with_retry(url: &str, dest: &PathBuf, archive_name: &str) -> Result<()> { - const MAX_RETRIES: u32 = 5; - const BASE_DELAY_SECS: u64 = 10; - - for attempt in 1..=MAX_RETRIES { - if attempt > 1 { - // Exponential backoff: 10s, 20s, 40s, 80s - let delay_secs = BASE_DELAY_SECS * (1 << (attempt - 2)); - println!(); - println!("Retry attempt {attempt}/{MAX_RETRIES} (waiting {delay_secs}s)..."); - std::thread::sleep(std::time::Duration::from_secs(delay_secs)); - } +#[cfg(target_os = "linux")] +fn detect_apt_llvm_source() -> Option { + let os_release = fs::read_to_string("/etc/os-release").ok()?; + let codename = os_release_value(&os_release, "UBUNTU_CODENAME") + .or_else(|| os_release_value(&os_release, "VERSION_CODENAME"))?; + let deb_arch = match std::env::consts::ARCH { + "x86_64" => "amd64", + "aarch64" => "arm64", + _ => return None, + }; - let _ = fs::remove_file(dest); + Some(AptLlvmSource { + base_url: "https://apt.llvm.org".to_string(), + codename, + deb_arch: deb_arch.to_string(), + }) +} - if let Err(e) = download_llvm(url, dest) { - if attempt < MAX_RETRIES { - eprintln!("Download error: {e}"); - continue; - } - return Err(e); +#[cfg(target_os = "linux")] +fn os_release_value(contents: &str, key: &str) -> Option { + contents.lines().find_map(|line| { + let (name, value) = line.split_once('=')?; + if name != key { + return None; } + let value = value.trim().trim_matches('"').to_string(); + (!value.is_empty()).then_some(value) + }) +} + +#[cfg(target_os = "linux")] +fn install_linux_apt_llvm(llvm_dir: &Path, temp_dir: &Path, source: &AptLlvmSource) -> Result<()> { + println!( + "Using apt.llvm.org shared LLVM packages for {} {}.", + source.codename, source.deb_arch + ); + + let packages_url = format!( + "{}/{}/dists/llvm-toolchain-{}-21/main/binary-{}/Packages.gz", + source.base_url, source.codename, source.codename, source.deb_arch + ); + let packages_gz = temp_dir.join("Packages.gz"); + download_file(&packages_url, &packages_gz, "LLVM package index")?; + + let packages = read_apt_packages(&packages_gz)?; + let selected = select_apt_packages(&packages)?; + let deb_dir = temp_dir.join("debs"); + let root_dir = temp_dir.join("root"); + fs::create_dir_all(&deb_dir)?; + fs::create_dir_all(&root_dir)?; + + for package in selected { + let url = format!( + "{}/{}/{}", + source.base_url, source.codename, package.filename + ); + let filename = Path::new(&package.filename).file_name().ok_or_else(|| { + Error::Archive(format!("Invalid package filename: {}", package.filename)) + })?; + let deb_path = deb_dir.join(filename); + println!("Downloading {} {}...", package.name, package.version); + download_file(&url, &deb_path, &package.name)?; + verify_checksum_value(&deb_path, &package.sha256)?; + extract_deb_data(&deb_path, &root_dir)?; + } - // Check for empty downloads (CDN/rate limit issues) - let file_size = fs::metadata(dest).map_or(0, |m| m.len()); - if file_size == 0 { - if attempt < MAX_RETRIES { - eprintln!("Download returned empty file (possible CDN issue)"); - continue; + install_apt_root_as_llvm_prefix(&root_dir, llvm_dir, &source.deb_arch)?; + Ok(()) +} + +#[cfg(target_os = "linux")] +fn read_apt_packages(packages_gz: &Path) -> Result> { + let file = fs::File::open(packages_gz)?; + let mut decoder = flate2::read::GzDecoder::new(file); + let mut contents = String::new(); + io::Read::read_to_string(&mut decoder, &mut contents)?; + + let mut packages = Vec::new(); + for stanza in contents.split("\n\n") { + let mut name = None; + let mut version = None; + let mut filename = None; + let mut sha256 = None; + + for line in stanza.lines() { + if let Some(value) = line.strip_prefix("Package: ") { + name = Some(value.trim().to_string()); + } else if let Some(value) = line.strip_prefix("Version: ") { + version = Some(value.trim().to_string()); + } else if let Some(value) = line.strip_prefix("Filename: ") { + filename = Some(value.trim().to_string()); + } else if let Some(value) = line.strip_prefix("SHA256: ") { + sha256 = Some(value.trim().to_string()); } - return Err(Error::Llvm( - "Download returned empty file after all retries".into(), - )); } - match verify_checksum(dest, archive_name) { - Ok(()) => return Ok(()), - Err(e) => { - if attempt < MAX_RETRIES { - eprintln!(); - eprintln!("Checksum verification failed. Retrying..."); - let _ = fs::remove_file(dest); - continue; - } - return Err(e); - } + if let (Some(name), Some(version), Some(filename), Some(sha256)) = + (name, version, filename, sha256) + { + packages.push(AptPackage { + name, + version, + filename, + sha256, + }); } } - Err(Error::Llvm( - "Download and verification failed after all retries".into(), - )) + Ok(packages) } -fn download_llvm(url: &str, dest: &PathBuf) -> Result<()> { - print!("Downloading LLVM... "); +#[cfg(target_os = "linux")] +fn select_apt_packages(packages: &[AptPackage]) -> Result> { + let mut selected = Vec::with_capacity(APT_LLVM_PACKAGES.len()); + for package_name in APT_LLVM_PACKAGES { + let package = packages + .iter() + .rev() + .find(|package| { + package.name == *package_name && package.version.contains(LLVM_RELEASE_VERSION) + }) + .ok_or_else(|| { + Error::Llvm(format!( + "apt.llvm.org package {package_name} {LLVM_RELEASE_VERSION} was not found" + )) + })?; + selected.push(package.clone()); + } + Ok(selected) +} + +#[cfg(target_os = "linux")] +fn download_file(url: &str, dest: &Path, label: &str) -> Result<()> { + print!("Downloading {label}... "); io::Write::flush(&mut io::stdout())?; let response = reqwest::blocking::get(url).map_err(|e| Error::Http(e.to_string()))?; + if !response.status().is_success() { + return Err(Error::Http(format!( + "GET {url} failed: {}", + response.status() + ))); + } let total_size = response.content_length().unwrap_or(0); let mut file = fs::File::create(dest)?; @@ -257,143 +410,261 @@ fn download_llvm(url: &str, dest: &PathBuf) -> Result<()> { #[allow(clippy::cast_precision_loss)] let progress = (downloaded as f64 / total_size as f64) * 100.0; if progress - last_print >= 1.0 { - print!("\rDownloading LLVM... {progress:.0}%"); + print!("\rDownloading {label}... {progress:.0}%"); io::Write::flush(&mut io::stdout())?; last_print = progress; } } } - println!("\rDownloading LLVM... Done ({} MB)", downloaded / 1_000_000); + println!( + "\rDownloading {label}... Done ({} MB)", + downloaded / 1_000_000 + ); Ok(()) } -fn verify_checksum(file_path: &PathBuf, archive_name: &str) -> Result<()> { +#[cfg(target_os = "linux")] +fn verify_checksum_value(file_path: &Path, expected: &str) -> Result<()> { print!("Verifying checksum... "); io::Write::flush(&mut io::stdout())?; + let computed_hash = sha256_file(file_path)?; + if computed_hash == expected { + println!("OK"); + Ok(()) + } else { + println!("FAILED"); + Err(Error::Sha256Mismatch { + expected: expected.to_string(), + actual: computed_hash, + }) + } +} + +#[cfg(target_os = "linux")] +fn sha256_file(file_path: &Path) -> Result { let data = fs::read(file_path)?; let mut hasher = Sha256::new(); Digest::update(&mut hasher, &data); - let computed_hash = hasher.finalize().iter().fold(String::new(), |mut s, b| { + Ok(hasher.finalize().iter().fold(String::new(), |mut s, b| { use std::fmt::Write; write!(s, "{b:02x}").unwrap(); s - }); - - let expected_hash = LLVM_CHECKSUMS - .iter() - .find(|(name, _)| *name == archive_name) - .map(|(_, hash)| *hash); - - match expected_hash { - Some(expected) if !expected.is_empty() => { - if computed_hash == expected { - println!("OK"); - Ok(()) - } else { - println!("FAILED"); - Err(Error::Sha256Mismatch { - expected: expected.to_string(), - actual: computed_hash, - }) - } + })) +} + +#[cfg(target_os = "linux")] +fn extract_deb_data(deb_path: &Path, dest: &Path) -> Result<()> { + let data = fs::read(deb_path)?; + if !data.starts_with(b"!\n") { + return Err(Error::Archive(format!( + "{} is not a Debian ar archive", + deb_path.display() + ))); + } + + let mut offset = 8usize; + while offset + 60 <= data.len() { + let header = &data[offset..offset + 60]; + offset += 60; + + let name = String::from_utf8_lossy(&header[0..16]) + .trim() + .trim_end_matches('/') + .to_string(); + let size_text = String::from_utf8_lossy(&header[48..58]).trim().to_string(); + let size: usize = size_text.parse().map_err(|e| { + Error::Archive(format!( + "Invalid ar member size in {}: {e}", + deb_path.display() + )) + })?; + if offset + size > data.len() { + return Err(Error::Archive(format!( + "Truncated ar member in {}", + deb_path.display() + ))); } - _ => { - println!("Skipped (checksum not available)"); - Ok(()) + + let member = &data[offset..offset + size]; + offset += size + (size % 2); + + match name.as_str() { + "data.tar.zst" => { + let decoder = zstd::stream::read::Decoder::new(member)?; + let mut archive = tar::Archive::new(decoder); + archive.unpack(dest)?; + return Ok(()); + } + "data.tar.xz" => { + let decoder = xz2::read::XzDecoder::new(member); + let mut archive = tar::Archive::new(decoder); + archive.unpack(dest)?; + return Ok(()); + } + "data.tar.gz" => { + let decoder = flate2::read::GzDecoder::new(member); + let mut archive = tar::Archive::new(decoder); + archive.unpack(dest)?; + return Ok(()); + } + _ => {} } } -} -fn extract_llvm(archive: &PathBuf, dest: &PathBuf) -> Result<()> { - print!("Extracting LLVM... "); - io::Write::flush(&mut io::stdout())?; - - let file_name = archive - .file_name() - .and_then(|n| n.to_str()) - .ok_or_else(|| Error::Archive("Could not determine archive name".into()))?; + Err(Error::Archive(format!( + "{} did not contain a supported data.tar member", + deb_path.display() + ))) +} - if file_name.ends_with(".tar.xz") { - extract_tar_xz(archive, dest)?; - } else if file_name.ends_with(".7z") { - extract_7z(archive, dest)?; - } else { +#[cfg(target_os = "linux")] +fn install_apt_root_as_llvm_prefix(root_dir: &Path, llvm_dir: &Path, deb_arch: &str) -> Result<()> { + let apt_prefix = root_dir.join("usr").join("lib").join("llvm-21"); + if !apt_prefix.exists() { return Err(Error::Archive(format!( - "Unsupported archive format: {file_name}" + "apt.llvm.org packages did not provide {}", + apt_prefix.display() ))); } - println!("Done"); + if llvm_dir.exists() { + fs::remove_dir_all(llvm_dir)?; + } + fs::rename(&apt_prefix, llvm_dir)?; + + let gnu_arch = match deb_arch { + "amd64" => "x86_64-linux-gnu", + "arm64" => "aarch64-linux-gnu", + _ => { + return Err(Error::Archive(format!( + "Unsupported Debian architecture: {deb_arch}" + ))); + } + }; + let system_lib_dir = root_dir.join("usr").join("lib").join(gnu_arch); + let llvm_lib_dir = llvm_dir.join("lib"); + fs::create_dir_all(&llvm_lib_dir)?; + + install_apt_headers(root_dir, llvm_dir)?; + copy_shared_libraries(&system_lib_dir, &llvm_lib_dir)?; + fix_local_shared_library_links(&llvm_lib_dir)?; Ok(()) } -fn extract_tar_xz(archive: &PathBuf, dest: &PathBuf) -> Result<()> { - use tar::Archive; - use xz2::read::XzDecoder; +#[cfg(target_os = "linux")] +fn install_apt_headers(root_dir: &Path, llvm_dir: &Path) -> Result<()> { + let include_dir = llvm_dir.join("include"); + fs::create_dir_all(&include_dir)?; + + copy_dir_contents( + &root_dir + .join("usr") + .join("include") + .join("llvm-21") + .join("llvm"), + &include_dir.join("llvm"), + )?; + copy_dir_contents( + &root_dir + .join("usr") + .join("include") + .join("llvm-c-21") + .join("llvm-c"), + &include_dir.join("llvm-c"), + )?; + Ok(()) +} - let file = fs::File::open(archive)?; - let decompressor = XzDecoder::new(file); - let mut tar_archive = Archive::new(decompressor); +#[cfg(target_os = "linux")] +fn copy_dir_contents(source: &Path, dest: &Path) -> Result<()> { + if !source.exists() { + return Err(Error::Archive(format!( + "apt.llvm.org packages did not provide {}", + source.display() + ))); + } - let extract_to = dest - .parent() - .ok_or_else(|| Error::Archive("Invalid destination path".into()))?; - tar_archive.unpack(extract_to)?; + if dest.exists() || fs::symlink_metadata(dest).is_ok() { + let metadata = fs::symlink_metadata(dest)?; + if metadata.is_dir() { + fs::remove_dir_all(dest)?; + } else { + fs::remove_file(dest)?; + } + } + fs::create_dir_all(dest)?; - // Find and rename extracted directory - let archive_name = archive.file_stem().and_then(|s| s.to_str()).unwrap_or(""); - let archive_path_buf = PathBuf::from(archive_name); - let base_name = archive_path_buf - .file_stem() - .and_then(|s| s.to_str()) - .unwrap_or(archive_name); - let extracted_dir = extract_to.join(base_name); + for entry in fs::read_dir(source)? { + let entry = entry?; + let source_path = entry.path(); + let dest_path = dest.join(entry.file_name()); + let file_type = entry.file_type()?; + if file_type.is_dir() { + copy_dir_contents(&source_path, &dest_path)?; + } else if file_type.is_file() { + fs::copy(&source_path, &dest_path)?; + } else if file_type.is_symlink() { + let target = fs::read_link(&source_path)?; + std::os::unix::fs::symlink(target, dest_path)?; + } + } + Ok(()) +} - if extracted_dir.exists() && !dest.exists() { - fs::rename(&extracted_dir, dest)?; +#[cfg(target_os = "linux")] +fn copy_shared_libraries(source_dir: &Path, dest_dir: &Path) -> Result<()> { + if !source_dir.exists() { + return Ok(()); } + for entry in fs::read_dir(source_dir)? { + let entry = entry?; + let path = entry.path(); + let Some(file_name) = path.file_name().and_then(|name| name.to_str()) else { + continue; + }; + if !file_name.starts_with("lib") || !file_name.contains(".so") { + continue; + } + + let dest = dest_dir.join(file_name); + if dest.exists() || fs::symlink_metadata(&dest).is_ok() { + let _ = fs::remove_file(&dest); + } + fs::copy(&path, dest)?; + } Ok(()) } -fn extract_7z(archive: &PathBuf, dest: &PathBuf) -> Result<()> { - use sevenz_rust::{Password, SevenZReader}; +#[cfg(target_os = "linux")] +fn fix_local_shared_library_links(lib_dir: &Path) -> Result<()> { + replace_symlink(lib_dir, "libLLVM-21.so", "libLLVM.so.21.1")?; + replace_symlink(lib_dir, "libLLVM.so", "libLLVM.so.21.1")?; + replace_symlink(lib_dir, "libLLVM.so.1", "libLLVM.so.21.1")?; - let file = fs::File::open(archive)?; - let len = file.metadata()?.len(); - let password = Password::empty(); - let mut reader = - SevenZReader::new(file, len, password).map_err(|e| Error::Archive(e.to_string()))?; + if lib_dir.join("libclang-cpp.so.21.1").exists() { + replace_symlink(lib_dir, "libclang-cpp.so.21", "libclang-cpp.so.21.1")?; + replace_symlink(lib_dir, "libclang-cpp.so", "libclang-cpp.so.21.1")?; + } - // Windows LLVM archives have flat structure (bin/, lib/, etc. at root) - // Extract directly to destination - fs::create_dir_all(dest)?; + Ok(()) +} - reader - .for_each_entries(|entry, reader| { - let entry_name = entry.name(); - - if entry.is_directory() { - let dir_path = dest.join(entry_name); - fs::create_dir_all(&dir_path).ok(); - } else { - let file_path = dest.join(entry_name); - if let Some(parent) = file_path.parent() { - fs::create_dir_all(parent).ok(); - } - let mut output = fs::File::create(&file_path)?; - io::copy(reader, &mut output)?; - } - Ok(true) - }) - .map_err(|e| Error::Archive(e.to_string()))?; +#[cfg(target_os = "linux")] +fn replace_symlink(lib_dir: &Path, link: &str, target: &str) -> Result<()> { + use std::os::unix::fs::symlink; + let link_path = lib_dir.join(link); + if link_path.exists() || fs::symlink_metadata(&link_path).is_ok() { + let _ = fs::remove_file(&link_path); + } + symlink(target, link_path)?; Ok(()) } -/// Remove local LLVM installation (`~/.pecos/llvm/`) +/// Remove local LLVM installation (`~/.pecos/deps/llvm-{version}/`) /// /// # Errors /// @@ -402,7 +673,10 @@ pub fn uninstall_llvm() -> Result<()> { let llvm_dir = crate::home::get_llvm_dir_path()?; if !llvm_dir.exists() { - println!("LLVM is not installed in ~/.pecos/deps/llvm/"); + println!( + "LLVM is not installed in ~/.pecos/deps/llvm-{}/", + super::REQUIRED_VERSION + ); return Ok(()); } @@ -413,7 +687,7 @@ pub fn uninstall_llvm() -> Result<()> { Ok(()) } -/// Validate that a path contains a complete LLVM 14 installation +/// Validate that a path contains a complete LLVM installation #[must_use] pub fn is_valid_installation(path: &Path) -> bool { let exe_ext = if cfg!(windows) { ".exe" } else { "" }; @@ -429,7 +703,14 @@ pub fn is_valid_installation(path: &Path) -> bool { } } - super::get_llvm_version(path).is_ok_and(|version| version.starts_with("14.")) + super::get_llvm_version(path).is_ok_and(|version| super::is_required_llvm_version(&version)) +} + +/// Return whether an LLVM installation reports shared libLLVM support. +#[must_use] +pub fn is_shared_installation(path: &Path) -> bool { + super::get_llvm_shared_mode(path).is_ok_and(|mode| mode.trim().eq_ignore_ascii_case("shared")) + && super::get_llvm_shared_libraries(path).is_some() } fn verify_llvm_runtime(llvm_dir: &Path) -> Result<()> { @@ -449,8 +730,10 @@ fn verify_llvm_runtime(llvm_dir: &Path) -> Result<()> { if output.status.success() { let version = String::from_utf8_lossy(&output.stdout).trim().to_string(); - if version.starts_with("14.0") { - println!("OK (version {version})"); + if super::is_required_llvm_version(&version) { + let link_mode = + super::get_llvm_shared_mode(llvm_dir).unwrap_or_else(|_| "unknown".into()); + println!("OK (version {version}, link mode {link_mode})"); Ok(()) } else { println!("FAILED"); @@ -496,7 +779,86 @@ fn apply_platform_fixes(llvm_dir: &Path) -> Result<()> { Ok(()) } -#[cfg(not(target_os = "macos"))] +#[cfg(target_os = "linux")] +fn apply_platform_fixes(llvm_dir: &Path) -> Result<()> { + use std::os::unix::fs::{PermissionsExt, symlink}; + use std::process::Command; + + print!("Applying Linux platform fixes... "); + io::Write::flush(&mut io::stdout())?; + + let llvm_config = llvm_dir.join("bin").join("llvm-config"); + let llvm_config_real = llvm_dir.join("bin").join("llvm-config.real"); + let gnu_arch = match std::env::consts::ARCH { + "x86_64" => "x86_64-linux-gnu", + "aarch64" => "aarch64-linux-gnu", + _ => { + println!("Skipped (unsupported architecture)"); + return Ok(()); + } + }; + let missing_zstd_static = format!("/usr/lib/{gnu_arch}/libzstd.a"); + let system_zstd_runtime = [ + PathBuf::from(format!("/lib/{gnu_arch}/libzstd.so.1")), + PathBuf::from(format!("/usr/lib/{gnu_arch}/libzstd.so.1")), + ] + .into_iter() + .find(|path| path.exists()); + + let Ok(output) = Command::new(&llvm_config) + .args(["--system-libs", "--link-static"]) + .output() + else { + println!("Skipped (llvm-config unavailable)"); + return Ok(()); + }; + + let system_libs = String::from_utf8_lossy(&output.stdout); + let Some(system_zstd_runtime) = system_zstd_runtime else { + println!("Skipped"); + return Ok(()); + }; + + if !system_libs.contains(&missing_zstd_static) || Path::new(&missing_zstd_static).exists() { + println!("Skipped"); + return Ok(()); + } + + let local_zstd = llvm_dir.join("lib").join("libzstd.so"); + if !local_zstd.exists() { + symlink(&system_zstd_runtime, &local_zstd)?; + } + + if !llvm_config_real.exists() { + fs::rename(&llvm_config, &llvm_config_real)?; + } + + let escaped_zstd_static = missing_zstd_static.replace('/', "\\/"); + let wrapper = r#"#!/usr/bin/env bash +real="$(dirname "$0")/llvm-config.real" +output="$("$real" "$@")" +status=$? +if [ "$status" -ne 0 ]; then + exit "$status" +fi +case " $* " in + *" --system-libs "*) + output="${output//__PECOS_ZSTD_STATIC__/-lzstd}" + ;; +esac +printf '%s\n' "$output" +"# + .replace("__PECOS_ZSTD_STATIC__", &escaped_zstd_static); + fs::write(&llvm_config, wrapper)?; + let mut permissions = fs::metadata(&llvm_config)?.permissions(); + permissions.set_mode(0o755); + fs::set_permissions(&llvm_config, permissions)?; + + println!("OK"); + Ok(()) +} + +#[cfg(not(any(target_os = "macos", target_os = "linux")))] #[allow(clippy::unnecessary_wraps)] fn apply_platform_fixes(_llvm_dir: &Path) -> Result<()> { Ok(()) diff --git a/crates/pecos-build/src/prompt.rs b/crates/pecos-build/src/prompt.rs index ce650a333..a4850e9b9 100644 --- a/crates/pecos-build/src/prompt.rs +++ b/crates/pecos-build/src/prompt.rs @@ -18,7 +18,7 @@ pub enum PromptMode { /// Prompt the user with a yes/no question. /// -/// - `message`: The question to display (e.g. "Install LLVM 14 to ~/.pecos/deps/llvm/ (~400MB)?") +/// - `message`: The question to display (e.g. "Install LLVM 21.1 to ~/.pecos/deps/llvm-21.1/?") /// - `default_yes`: Whether the default answer is yes (`[Y/n]`) or no (`[y/N]`) /// - `mode`: How to resolve the prompt /// diff --git a/crates/pecos-cli/src/cli.rs b/crates/pecos-cli/src/cli.rs index 1dab58b1e..d0f2ea8de 100644 --- a/crates/pecos-cli/src/cli.rs +++ b/crates/pecos-cli/src/cli.rs @@ -188,12 +188,12 @@ pub enum SeleneCommands { #[derive(Subcommand, Clone)] pub enum LlvmCommands { - /// Check if LLVM 14 is available + /// Check if LLVM 21.1 is available Check { #[arg(short, long)] quiet: bool, }, - /// Ensure LLVM 14 is installed and runtime-valid + /// Ensure LLVM 21.1 is installed and runtime-valid Ensure { /// Require the PECOS-managed installation under ~/.pecos/deps #[arg(long)] @@ -203,8 +203,11 @@ pub enum LlvmCommands { #[arg(long)] no_configure: bool, }, - /// Configure .cargo/config.toml with LLVM path - Configure, + /// Configure .cargo/config.toml with detected LLVM or an explicit LLVM path + Configure { + /// LLVM installation prefix to configure, e.g. /usr/lib/llvm-21 + path: Option, + }, /// Find LLVM installation path Find { #[arg(long)] diff --git a/crates/pecos-cli/src/cli/env_cmd.rs b/crates/pecos-cli/src/cli/env_cmd.rs index 4ad0fc4a0..70a19412d 100644 --- a/crates/pecos-cli/src/cli/env_cmd.rs +++ b/crates/pecos-cli/src/cli/env_cmd.rs @@ -24,6 +24,7 @@ //! pecos env --github-actions # write GitHub Actions env/path files use std::collections::BTreeMap; +use std::ffi::OsString; use std::fmt::Write; use std::fs::OpenOptions; use std::io::Write as IoWrite; @@ -31,6 +32,7 @@ use std::path::Path; use pecos_build::Result; use pecos_build::errors::Error; +use pecos_build::llvm::LLVM_SYS_PREFIX_ENV; /// Collect the build environment for the current platform. /// @@ -41,10 +43,10 @@ pub fn collect_env() -> BTreeMap { let mut env = BTreeMap::new(); // LLVM - if let Some(llvm_path) = pecos_build::llvm::find_llvm_14(None) { + if let Some(llvm_path) = pecos_build::llvm::find_configured_or_detected_llvm(None) { let llvm_str = llvm_path.display().to_string(); env.insert("PECOS_LLVM".into(), llvm_str.clone()); - env.insert("LLVM_SYS_140_PREFIX".into(), llvm_str); + env.insert(LLVM_SYS_PREFIX_ENV.into(), llvm_str); // Add LLVM bin to PATH let bin_path = llvm_path.join("bin"); @@ -56,6 +58,13 @@ pub fn collect_env() -> BTreeMap { env.insert("PATH".into(), path.to_string_lossy().into_owned()); } } + + if pecos_build::llvm::get_llvm_shared_mode(&llvm_path) + .is_ok_and(|mode| mode.trim().eq_ignore_ascii_case("shared")) + && let Ok(libdir) = pecos_build::llvm::get_llvm_libdir(&llvm_path) + { + add_llvm_runtime_library_path(&mut env, &libdir); + } } // macOS-specific @@ -122,6 +131,36 @@ pub fn collect_env() -> BTreeMap { env } +#[cfg(any(target_os = "linux", target_os = "freebsd"))] +fn add_llvm_runtime_library_path(env: &mut BTreeMap, libdir: &Path) { + prepend_path_env(env, "LD_LIBRARY_PATH", libdir); +} + +#[cfg(target_os = "macos")] +fn add_llvm_runtime_library_path(env: &mut BTreeMap, libdir: &Path) { + prepend_path_env(env, "DYLD_LIBRARY_PATH", libdir); +} + +#[cfg(target_os = "windows")] +fn add_llvm_runtime_library_path(_env: &mut BTreeMap, _libdir: &Path) { + // Windows LLVM DLLs are expected in bin/, which is already prepended to PATH. +} + +fn prepend_path_env(env: &mut BTreeMap, key: &str, first: &Path) { + let current = env + .get(key) + .map(OsString::from) + .or_else(|| std::env::var_os(key)); + let mut entries = vec![first.to_path_buf()]; + if let Some(current) = current { + entries.extend(std::env::split_paths(¤t)); + } + + if let Ok(joined) = std::env::join_paths(entries) { + env.insert(key.to_string(), joined.to_string_lossy().into_owned()); + } +} + /// Print environment in shell-eval format: `export KEY="VALUE"` pub fn print_shell(env: &BTreeMap) { for (key, value) in env { @@ -191,7 +230,7 @@ fn write_github_actions_files( .append(true) .create(true) .open(github_path)?; - if let Some(llvm_path) = env.get("LLVM_SYS_140_PREFIX") { + if let Some(llvm_path) = env.get(LLVM_SYS_PREFIX_ENV) { writeln!(path_file, "{}", Path::new(llvm_path).join("bin").display())?; } @@ -226,15 +265,15 @@ mod tests { let env_path = std::env::temp_dir().join(format!("pecos-gh-env-{unique}")); let path_path = std::env::temp_dir().join(format!("pecos-gh-path-{unique}")); - let llvm_prefix = Path::new("/opt/pecos/llvm-14"); + let llvm_prefix = Path::new("/opt/pecos/llvm-21.1"); let llvm_prefix_str = llvm_prefix.display().to_string(); let llvm_bin_str = llvm_prefix.join("bin").display().to_string(); let mut env = BTreeMap::new(); - env.insert("LLVM_SYS_140_PREFIX".to_string(), llvm_prefix_str.clone()); + env.insert(LLVM_SYS_PREFIX_ENV.to_string(), llvm_prefix_str.clone()); env.insert( "PATH".to_string(), - "/opt/pecos/llvm-14/bin:/usr/bin".to_string(), + "/opt/pecos/llvm-21.1/bin:/usr/bin".to_string(), ); env.insert("PECOS_LLVM".to_string(), llvm_prefix_str.clone()); @@ -243,7 +282,7 @@ mod tests { let env_file = std::fs::read_to_string(&env_path).unwrap(); let path_file = std::fs::read_to_string(&path_path).unwrap(); - assert!(env_file.contains(&format!("LLVM_SYS_140_PREFIX={llvm_prefix_str}"))); + assert!(env_file.contains(&format!("{LLVM_SYS_PREFIX_ENV}={llvm_prefix_str}"))); assert!(env_file.contains(&format!("PECOS_LLVM={llvm_prefix_str}"))); assert!(!env_file.contains("PATH=")); assert_eq!(path_file.trim(), llvm_bin_str); diff --git a/crates/pecos-cli/src/cli/info.rs b/crates/pecos-cli/src/cli/info.rs index 182cb1a39..7ae10d8e1 100644 --- a/crates/pecos-cli/src/cli/info.rs +++ b/crates/pecos-cli/src/cli/info.rs @@ -3,7 +3,9 @@ use pecos_build::cuda::{find_cuda, get_cuda_version}; use pecos_build::cuquantum::{find_cuquantum, get_cuquantum_version}; use pecos_build::home::{get_cache_dir, get_deps_dir, get_llvm_dir, get_pecos_home}; -use pecos_build::llvm::{find_llvm_14, get_llvm_version, get_repo_root_from_manifest}; +use pecos_build::llvm::{ + LLVM_SYS_PREFIX_ENV, find_llvm, get_llvm_version, get_repo_root_from_manifest, +}; use std::process::Command; /// Run the info command @@ -99,8 +101,8 @@ pub fn run() { println!(" PECOS_CACHE_DIR = {val}"); has_overrides = true; } - if let Ok(val) = std::env::var("LLVM_SYS_140_PREFIX") { - println!(" LLVM_SYS_140_PREFIX = {val}"); + if let Ok(val) = std::env::var(LLVM_SYS_PREFIX_ENV) { + println!(" {LLVM_SYS_PREFIX_ENV} = {val}"); has_overrides = true; } @@ -115,11 +117,11 @@ fn print_toolchain_status() { // LLVM let repo_root = get_repo_root_from_manifest(); - if let Some(llvm_path) = find_llvm_14(repo_root) { + if let Some(llvm_path) = find_llvm(repo_root) { let version = get_llvm_version(&llvm_path).unwrap_or_else(|_| "unknown".to_string()); - println!(" LLVM 14: {} ({})", version, llvm_path.display()); + println!(" LLVM 21.1: {} ({})", version, llvm_path.display()); } else { - println!(" LLVM 14: not found"); + println!(" LLVM 21.1: not found"); } // CUDA diff --git a/crates/pecos-cli/src/cli/install_cmd.rs b/crates/pecos-cli/src/cli/install_cmd.rs index 6c988b03f..9dc8e348c 100644 --- a/crates/pecos-cli/src/cli/install_cmd.rs +++ b/crates/pecos-cli/src/cli/install_cmd.rs @@ -8,7 +8,13 @@ use pecos_build::prompt::{PromptMode, confirm}; const KNOWN_TARGETS: &[&str] = &["cuda", "llvm", "cuquantum", "cmake"]; /// Run the install command -pub fn run(targets: &[String], force: bool, all: bool, no_configure: bool) -> Result<()> { +pub fn run( + targets: &[String], + force: bool, + all: bool, + no_configure: bool, + yes: bool, +) -> Result<()> { let targets: Vec<&str> = if all { KNOWN_TARGETS.to_vec() } else { @@ -58,10 +64,14 @@ pub fn run(targets: &[String], force: bool, all: bool, no_configure: bool) -> Re if confirm( " Install a PECOS-managed copy to ~/.pecos/deps/ instead?", false, - PromptMode::Interactive, + if yes { + PromptMode::AcceptAll + } else { + PromptMode::Interactive + }, ) { println!(); - install_target(target, true, no_configure)?; + install_target(target, true, no_configure, yes)?; } } if *target == "llvm" { @@ -70,7 +80,7 @@ pub fn run(targets: &[String], force: bool, all: bool, no_configure: bool) -> Re } else { println!("[{}/{}] Installing {target}...", i + 1, total); println!(); - install_target(target, force, no_configure)?; + install_target(target, force, no_configure, yes)?; } println!(); } @@ -83,7 +93,7 @@ pub fn run(targets: &[String], force: bool, all: bool, no_configure: bool) -> Re fn find_existing(target: &str) -> Option { match target { "cuda" => pecos_build::cuda::find_cuda(), - "llvm" => pecos_build::llvm::find_llvm_14(None), + "llvm" => pecos_build::llvm::find_llvm(None), "cuquantum" => pecos_build::cuquantum::find_cuquantum(), "cmake" => pecos_build::cmake::find_cmake(), _ => None, @@ -91,12 +101,13 @@ fn find_existing(target: &str) -> Option { } /// Install a single target -fn install_target(target: &str, force: bool, no_configure: bool) -> Result<()> { +fn install_target(target: &str, force: bool, no_configure: bool, yes: bool) -> Result<()> { match target { "cuda" => { pecos_build::cuda::installer::install_cuda(force)?; } "llvm" => { + confirm_managed_llvm_install(yes)?; pecos_build::llvm::installer::install_llvm(force, no_configure)?; } "cuquantum" => { @@ -110,6 +121,43 @@ fn install_target(target: &str, force: bool, no_configure: bool) -> Result<()> { Ok(()) } +fn confirm_managed_llvm_install(yes: bool) -> Result<()> { + let version = pecos_build::llvm::installer::release_version(); + let install_dir = pecos_build::home::get_llvm_dir_path()?; + + if let Some(reason) = pecos_build::llvm::installer::managed_install_unavailable_reason() { + return Err(Error::Config(reason.into())); + } + + println!("PECOS-managed LLVM is the recommended development setup."); + println!( + "This will install LLVM {version} to {}.", + install_dir.display() + ); + println!("Expect a large download and several GB of extracted files."); + println!("The managed install is shared-first; static LLVM is not accepted for"); + println!("the full workspace HUGR test lane because LLVM 21.1 static links can"); + println!("use substantial memory."); + println!(); + println!("To use your own LLVM instead, run:"); + println!(" pecos llvm configure /path/to/llvm"); + println!(); + + let mode = if yes { + PromptMode::AcceptAll + } else { + PromptMode::Interactive + }; + + if confirm("Continue with PECOS-managed LLVM install?", true, mode) { + Ok(()) + } else { + Err(Error::Config( + "LLVM installation cancelled. Configure an existing LLVM with `pecos llvm configure /path/to/llvm`.".into(), + )) + } +} + /// Ensure LLVM is configured in .cargo/config.toml when already installed. /// Auto-configures if not healthy, unless --no-configure was passed. fn ensure_llvm_configured(no_configure: bool) { diff --git a/crates/pecos-cli/src/cli/list.rs b/crates/pecos-cli/src/cli/list.rs index 3290620b7..8b94108a1 100644 --- a/crates/pecos-cli/src/cli/list.rs +++ b/crates/pecos-cli/src/cli/list.rs @@ -4,7 +4,7 @@ use pecos_build::cuda::find_cuda; use pecos_build::cuquantum::find_cuquantum; use pecos_build::deps::list_dependencies; use pecos_build::home::{get_cache_dir, get_deps_dir}; -use pecos_build::llvm::{find_llvm_14, get_llvm_version, get_repo_root_from_manifest}; +use pecos_build::llvm::{find_llvm, get_llvm_version, get_repo_root_from_manifest}; use std::fs; use std::path::Path; @@ -16,13 +16,15 @@ pub fn run(verbose: bool) { // LLVM status let repo_root = get_repo_root_from_manifest(); - if let Some(llvm_path) = find_llvm_14(repo_root) { + if let Some(llvm_path) = find_llvm(repo_root) { let version = get_llvm_version(&llvm_path) .map(|v| format!(" ({v})")) .unwrap_or_default(); - println!("LLVM 14: {}{version}", llvm_path.display()); + println!("LLVM 21.1: {}{version}", llvm_path.display()); + } else if pecos_build::llvm::installer::managed_install_unavailable_reason().is_some() { + println!("LLVM 21.1: not found (configure shared LLVM 21 manually)"); } else { - println!("LLVM 14: not found (install with: pecos install llvm)"); + println!("LLVM 21.1: not found (install with: pecos install llvm)"); } // CUDA status diff --git a/crates/pecos-cli/src/cli/llvm_cmd.rs b/crates/pecos-cli/src/cli/llvm_cmd.rs index c415a5c3a..1d83f987e 100644 --- a/crates/pecos-cli/src/cli/llvm_cmd.rs +++ b/crates/pecos-cli/src/cli/llvm_cmd.rs @@ -2,10 +2,14 @@ use super::LlvmCommands; use pecos_build::Result; -use pecos_build::llvm::config::{auto_configure_llvm, validate_llvm_config}; +use pecos_build::llvm::config::{auto_configure_llvm, validate_llvm_config, write_cargo_config}; use pecos_build::llvm::{ - find_llvm_14, find_tool, get_llvm_version, get_pecos_command, get_repo_root_from_manifest, + LLVM_SYS_PREFIX_ENV, REQUIRED_VERSION, find_cargo_project_root, + find_configured_or_detected_llvm, find_llvm, find_tool, get_llvm_shared_libraries, + get_llvm_shared_mode, get_llvm_version, get_pecos_command, get_repo_root_from_manifest, + is_valid_llvm, }; +use std::path::Path; /// Run an LLVM subcommand pub fn run(command: LlvmCommands) -> Result<()> { @@ -18,7 +22,7 @@ pub fn run(command: LlvmCommands) -> Result<()> { managed, no_configure, } => run_ensure(managed, no_configure), - LlvmCommands::Configure => run_configure(), + LlvmCommands::Configure { path } => run_configure(path), LlvmCommands::Find { export } => { run_find(export); Ok(()) @@ -34,12 +38,13 @@ pub fn run(command: LlvmCommands) -> Result<()> { fn run_check(quiet: bool) { let repo_root = get_repo_root_from_manifest(); - if let Some(llvm_path) = find_llvm_14(repo_root) { + if let Some(llvm_path) = find_configured_or_detected_llvm(repo_root) { if !quiet { - println!("LLVM 14 found at: {}", llvm_path.display()); + println!("LLVM 21.1 found at: {}", llvm_path.display()); if let Ok(version) = get_llvm_version(&llvm_path) { println!("Version: {version}"); } + print_link_info(&llvm_path); // Validate configuration let validation = validate_llvm_config(); @@ -53,9 +58,17 @@ fn run_check(quiet: bool) { } else { if !quiet { let cmd = get_pecos_command(); - eprintln!("LLVM 14 not found"); + eprintln!("LLVM 21.1 not found"); eprintln!(); - eprintln!("Install with: `{cmd} install llvm`"); + if let Some(reason) = pecos_build::llvm::installer::managed_install_unavailable_reason() + { + eprintln!("{reason}"); + eprintln!(); + eprintln!("After installing LLVM 21, configure it with:"); + eprintln!(" {cmd} llvm configure /path/to/llvm"); + } else { + eprintln!("Install with: `{cmd} install llvm`"); + } } std::process::exit(1); } @@ -64,7 +77,7 @@ fn run_check(quiet: bool) { fn run_ensure(managed: bool, no_configure: bool) -> Result<()> { let llvm_path = if managed { ensure_managed_llvm(no_configure)? - } else if let Some(path) = find_llvm_14(get_repo_root_from_manifest()) { + } else if let Some(path) = find_llvm(get_repo_root_from_manifest()) { if !no_configure { auto_configure_llvm(None)?; } @@ -99,8 +112,27 @@ fn ensure_managed_llvm(no_configure: bool) -> Result { Ok(llvm_path) } -fn run_configure() -> Result<()> { - let llvm_path = auto_configure_llvm(None)?; +fn run_configure(path: Option) -> Result<()> { + let llvm_path = if let Some(path) = path { + let llvm_path = std::path::PathBuf::from(path); + if !is_valid_llvm(&llvm_path) { + return Err(pecos_build::errors::Error::Llvm(format!( + "{} is not a valid LLVM {REQUIRED_VERSION} installation", + llvm_path.display() + ))); + } + + let project_root = get_repo_root_from_manifest() + .or_else(find_cargo_project_root) + .ok_or_else(|| { + pecos_build::errors::Error::Config("Could not find Cargo project root".into()) + })?; + write_cargo_config(&project_root, &llvm_path, true)?; + llvm_path + } else { + auto_configure_llvm(None)? + }; + println!("Configured LLVM path: {}", llvm_path.display()); println!("Updated .cargo/config.toml"); Ok(()) @@ -108,27 +140,27 @@ fn run_configure() -> Result<()> { fn run_find(export: bool) { let repo_root = get_repo_root_from_manifest(); - if let Some(llvm_path) = find_llvm_14(repo_root) { + if let Some(llvm_path) = find_configured_or_detected_llvm(repo_root) { if export { - println!("export LLVM_SYS_140_PREFIX=\"{}\"", llvm_path.display()); + println!("export {LLVM_SYS_PREFIX_ENV}=\"{}\"", llvm_path.display()); } else { println!("{}", llvm_path.display()); } } else { - eprintln!("LLVM 14 not found"); + eprintln!("LLVM 21.1 not found"); std::process::exit(1); } } fn run_version() -> Result<()> { let repo_root = get_repo_root_from_manifest(); - if let Some(llvm_path) = find_llvm_14(repo_root) { + if let Some(llvm_path) = find_configured_or_detected_llvm(repo_root) { let version = get_llvm_version(&llvm_path)?; println!("LLVM version: {version}"); println!("Location: {}", llvm_path.display()); Ok(()) } else { - eprintln!("LLVM 14 not found"); + eprintln!("LLVM 21.1 not found"); std::process::exit(1); } } @@ -138,9 +170,9 @@ fn run_validate(path: Option) -> Result<()> { std::path::PathBuf::from(p) } else { let repo_root = get_repo_root_from_manifest(); - find_llvm_14(repo_root).ok_or_else(|| { + find_configured_or_detected_llvm(repo_root).ok_or_else(|| { pecos_build::errors::Error::Llvm( - "LLVM 14 not found. Specify a path or install first.".into(), + "LLVM 21.1 not found. Specify a path or install first.".into(), ) })? }; @@ -172,10 +204,10 @@ fn run_validate(path: Option) -> Result<()> { // Check version println!(); if let Ok(version) = get_llvm_version(&llvm_path) { - if version.starts_with("14.") { + if pecos_build::llvm::is_required_llvm_version(&version) { println!("Version: {version} [OK]"); } else { - println!("Version: {version} [WARNING: expected 14.x]"); + println!("Version: {version} [WARNING: expected {REQUIRED_VERSION}]"); all_present = false; } } else { @@ -183,6 +215,9 @@ fn run_validate(path: Option) -> Result<()> { all_present = false; } + print_link_info(&llvm_path); + println!(); + println!(); if all_present { println!("Validation: PASSED"); @@ -202,3 +237,15 @@ fn run_tool(name: &str) { std::process::exit(1); } } + +fn print_link_info(llvm_path: &Path) { + if let Ok(mode) = get_llvm_shared_mode(llvm_path) { + println!("Link mode: {mode}"); + } + + if let Some(libraries) = get_llvm_shared_libraries(llvm_path) { + println!("Shared library: {libraries}"); + } else { + println!("Shared library: unavailable"); + } +} diff --git a/crates/pecos-cli/src/cli/rust_cmd.rs b/crates/pecos-cli/src/cli/rust_cmd.rs index 8ddda43e0..4ac013805 100644 --- a/crates/pecos-cli/src/cli/rust_cmd.rs +++ b/crates/pecos-cli/src/cli/rust_cmd.rs @@ -3,6 +3,7 @@ use pecos_build::Result; use pecos_build::errors::Error; use serde_json::Value; +use std::path::PathBuf; use std::process::Command; /// FFI crates that need a non-Rust toolchain or external SDK to check / @@ -63,6 +64,65 @@ enum GpuProbeResult { ProbeFailed(String), } +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +enum LlvmLinkMode { + Shared, + Static, + Unknown, +} + +impl LlvmLinkMode { + fn from_llvm_config(output: &str) -> Self { + match output.trim().to_ascii_lowercase().as_str() { + "shared" => Self::Shared, + "static" => Self::Static, + _ => Self::Unknown, + } + } +} + +fn detect_cargo_llvm_link_mode() -> Option<(PathBuf, LlvmLinkMode)> { + let llvm_path = pecos_build::llvm::find_configured_or_detected_llvm(None)?; + let link_mode = pecos_build::llvm::get_llvm_shared_mode(&llvm_path) + .map_or(LlvmLinkMode::Unknown, |mode| { + LlvmLinkMode::from_llvm_config(&mode) + }); + Some((llvm_path, link_mode)) +} + +fn reject_static_llvm_workspace_test() -> Result<()> { + let Some((llvm_path, link_mode)) = detect_cargo_llvm_link_mode() else { + return Ok(()); + }; + if matches!(link_mode, LlvmLinkMode::Shared) { + return Ok(()); + } + + let mode = if matches!(link_mode, LlvmLinkMode::Static) { + "static" + } else { + "unknown" + }; + + let setup_hint = pecos_build::llvm::installer::managed_install_unavailable_reason().map_or( + "Install/configure shared LLVM 21.1 instead, for example `pecos install llvm --force` \ + or `pecos llvm configure /path/to/llvm`." + .to_string(), + |reason| { + format!( + "{reason} `pecos rust test` requires shared LLVM; use targeted Cargo tests if you must build against static LLVM." + ) + }, + ); + + Err(Error::Config(format!( + "Refusing full workspace HUGR tests with {mode} LLVM at {}. \ + LLVM 21.1 static workspace tests can spawn many multi-GB linker jobs. \ + {setup_hint}", + llvm_path.display() + ))) +} + /// Run the rust subcommand pub fn run(command: &super::RustCommands) -> Result<()> { match command { @@ -202,7 +262,7 @@ fn is_tool_available(tool: &str) -> bool { /// Run a cargo command and return success status. /// -/// Applies the PECOS build environment (`CMAKE`, `LLVM_SYS_140_PREFIX`, +/// Applies the PECOS build environment (`CMAKE`, `LLVM_SYS_211_PREFIX`, /// `SDKROOT`, etc.) so build scripts like highs-sys's cmake-rs invocation /// find the PECOS-managed cmake without further plumbing. fn run_cargo_command(args: &[&str]) -> bool { @@ -478,6 +538,7 @@ fn run_test(profile: super::BuildProfile, include_ffi: bool) -> Result<()> { ]); args.extend(profile_args); + reject_static_llvm_workspace_test()?; if !run(&args) { return Err(Error::Config("cargo test (workspace) failed".to_string())); @@ -550,3 +611,24 @@ fn run_test(profile: super::BuildProfile, include_ffi: bool) -> Result<()> { println!("cargo test completed successfully"); Ok(()) } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn llvm_link_mode_parses_llvm_config_output() { + assert_eq!( + LlvmLinkMode::from_llvm_config("shared\n"), + LlvmLinkMode::Shared + ); + assert_eq!( + LlvmLinkMode::from_llvm_config("STATIC"), + LlvmLinkMode::Static + ); + assert_eq!( + LlvmLinkMode::from_llvm_config("unknown"), + LlvmLinkMode::Unknown + ); + } +} diff --git a/crates/pecos-cli/src/cli/setup_cmd.rs b/crates/pecos-cli/src/cli/setup_cmd.rs index c24311310..0b28e1883 100644 --- a/crates/pecos-cli/src/cli/setup_cmd.rs +++ b/crates/pecos-cli/src/cli/setup_cmd.rs @@ -67,7 +67,7 @@ pub fn run( } fn has_missing_deps(skip_llvm: bool, skip_cuda: bool, skip_cmake: bool) -> bool { - if !skip_llvm && pecos_build::llvm::find_llvm_14(None).is_none() { + if !skip_llvm && pecos_build::llvm::find_llvm(None).is_none() { return true; } if !skip_cuda && cuda_platform_supported() && pecos_build::cuda::find_cuda().is_none() { @@ -97,11 +97,15 @@ fn print_status_summary(skip_llvm: bool, skip_cuda: bool, skip_cmake: bool) { // LLVM if skip_llvm { - println!(" LLVM 14: skipped (--skip-llvm)"); - } else if let Some(path) = pecos_build::llvm::find_llvm_14(None) { - println!(" LLVM 14: {}", path.display()); + println!(" LLVM 21.1: skipped (--skip-llvm)"); + } else if let Some(path) = pecos_build::llvm::find_llvm(None) { + println!(" LLVM 21.1: {}", path.display()); + } else if pecos_build::llvm::installer::managed_install_unavailable_reason().is_some() { + println!(" LLVM 21.1: not found (configure a shared LLVM 21 install manually)"); } else { - println!(" LLVM 14: not found (~400 MB, required for QIR/HUGR compilation)"); + println!( + " LLVM 21.1: not found (several hundred MB, required for QIR/HUGR compilation)" + ); } // CUDA @@ -282,14 +286,23 @@ fn check_legacy_deps(mode: PromptMode) -> Result<()> { // ── LLVM ──────────────────────────────────────────────────────────────────── fn setup_llvm(mode: PromptMode) -> Result<()> { - if pecos_build::llvm::find_llvm_14(None).is_some() { + if pecos_build::llvm::find_llvm(None).is_some() { ensure_llvm_configured(); return Ok(()); } + if let Some(reason) = pecos_build::llvm::installer::managed_install_unavailable_reason() { + println!(" LLVM 21.1 not found."); + println!(" {reason}"); + println!(" QIR/HUGR features will not be available until LLVM is configured."); + return Ok(()); + } + let version = pecos_build::home::LLVM_VERSION; if confirm( - &format!("Install LLVM {version}? (~400 MB download, required for QIR/HUGR)"), + &format!( + "Install PECOS-managed LLVM {version}? (large download, several GB extracted, shared LLVM required; use `pecos llvm configure /path/to/llvm` for your own install)" + ), true, mode, ) { diff --git a/crates/pecos-cli/src/main.rs b/crates/pecos-cli/src/main.rs index 7cbf4ad67..eab5089b5 100644 --- a/crates/pecos-cli/src/main.rs +++ b/crates/pecos-cli/src/main.rs @@ -24,7 +24,7 @@ use pecos_build::cuda::find_cuda; #[cfg(feature = "runtime")] use pecos_build::cuquantum::{find_cuquantum, get_cuquantum_version}; #[cfg(feature = "runtime")] -use pecos_build::llvm::get_llvm_version; +use pecos_build::llvm::{LLVM_SYS_PREFIX_ENV, get_llvm_version}; #[cfg(feature = "runtime")] use std::io::Write; @@ -97,7 +97,7 @@ enum Commands { #[command(subcommand)] command: GpuCommands, }, - /// LLVM 14 inspection, validation, and configuration + /// LLVM 21.1 inspection, validation, and configuration Llvm { #[command(subcommand)] command: LlvmCommands, @@ -189,6 +189,10 @@ enum Commands { /// Skip automatic configuration after installation (applies to llvm) #[arg(long)] no_configure: bool, + + /// Accept installation prompts + #[arg(short, long)] + yes: bool, }, /// Uninstall optional dependencies (cuda, llvm, cuquantum) /// @@ -728,7 +732,8 @@ fn main() -> Result<(), Box> { force, all, no_configure, - } => cli::install_cmd::run(targets, *force, *all, *no_configure)?, + yes, + } => cli::install_cmd::run(targets, *force, *all, *no_configure, *yes)?, Commands::Uninstall { targets, all, yes } => { cli::uninstall_cmd::run(targets, *all, *yes)?; } @@ -903,8 +908,8 @@ fn run_doctor() { let mut problems: Vec = Vec::new(); let mut hints: Vec = Vec::new(); - // --- LLVM 14 --- - println!("LLVM 14:"); + // --- LLVM 21.1 --- + println!("LLVM 21.1:"); let llvm_config = pecos_build::llvm::config::validate_llvm_config(); if let Some(ref path) = llvm_config.detected_path { let version = get_llvm_version(path).unwrap_or_else(|_| "unknown".into()); @@ -915,11 +920,15 @@ fn run_doctor() { ); } else { print_check("installed", false, "not found"); - problems.push("LLVM 14 not installed. Run: pecos install llvm".into()); + if let Some(reason) = pecos_build::llvm::installer::managed_install_unavailable_reason() { + problems.push(format!("LLVM 21.1 not installed. {reason}")); + } else { + problems.push("LLVM 21.1 not installed. Run: pecos install llvm".into()); + } } if let Some(ref path) = llvm_config.configured_path { - if llvm_config.path_is_valid_llvm14 { + if llvm_config.path_is_valid_llvm { print_check(".cargo/config.toml", true, &format!("{}", path.display())); } else if !llvm_config.path_exists { print_check( @@ -932,32 +941,36 @@ fn run_doctor() { print_check( ".cargo/config.toml", false, - &format!("path exists but is not valid LLVM 14: {}", path.display()), + &format!("path exists but is not valid LLVM 21.1: {}", path.display()), ); problems.push( - "LLVM path in .cargo/config.toml is not valid LLVM 14. Run: pecos llvm configure" + "LLVM path in .cargo/config.toml is not valid LLVM 21.1. Run: pecos llvm configure" .into(), ); } } else { - print_check(".cargo/config.toml", false, "LLVM_SYS_140_PREFIX not set"); + print_check( + ".cargo/config.toml", + false, + &format!("{LLVM_SYS_PREFIX_ENV} not set"), + ); if llvm_config.detected_path.is_some() { problems.push("LLVM installed but not configured. Run: pecos llvm configure".into()); } } - if let Ok(env_val) = std::env::var("LLVM_SYS_140_PREFIX") { + if let Ok(env_val) = std::env::var(LLVM_SYS_PREFIX_ENV) { let env_path = std::path::Path::new(&env_val); if env_path.exists() { - print_check("LLVM_SYS_140_PREFIX env", true, &env_val); + print_check(&format!("{LLVM_SYS_PREFIX_ENV} env"), true, &env_val); } else { print_check( - "LLVM_SYS_140_PREFIX env", + &format!("{LLVM_SYS_PREFIX_ENV} env"), false, &format!("set but path missing: {env_val}"), ); problems.push(format!( - "LLVM_SYS_140_PREFIX={env_val} but path does not exist" + "{LLVM_SYS_PREFIX_ENV}={env_val} but path does not exist" )); } } diff --git a/crates/pecos-hugr-qis/Cargo.toml b/crates/pecos-hugr-qis/Cargo.toml index f6c4a6937..1a6f641a6 100644 --- a/crates/pecos-hugr-qis/Cargo.toml +++ b/crates/pecos-hugr-qis/Cargo.toml @@ -24,6 +24,9 @@ pecos-core = { workspace = true, features = ["anyhow"] } # LLVM features are required for this crate's core functionality tket = { workspace = true, features = ["llvm"] } tket-qsystem = { workspace = true, features = ["llvm"] } +# `hugr-llvm` only exposes plain `llvm21-1`; this keeps its transitive +# inkwell/llvm-sys build preferring libLLVM when a shared LLVM is available. +inkwell.workspace = true [features] default = [] diff --git a/crates/pecos-hugr-qis/src/array.rs b/crates/pecos-hugr-qis/src/array.rs index 772b8a979..6ddd3b73d 100644 --- a/crates/pecos-hugr-qis/src/array.rs +++ b/crates/pecos-hugr-qis/src/array.rs @@ -21,10 +21,8 @@ impl ArrayCodegen for SeleneHeapArrayCodegen { size: IntValue<'c>, ) -> Result> { let iw_ctx = ctx.typing_session().iw_context(); - let malloc_sig = iw_ctx - .i8_type() - .ptr_type(AddressSpace::default()) - .fn_type(&[iw_ctx.i64_type().into()], false); + let ptr_ty = iw_ctx.ptr_type(AddressSpace::default()); + let malloc_sig = ptr_ty.fn_type(&[iw_ctx.i64_type().into()], false); let malloc = ctx.get_extern_func("heap_alloc", malloc_sig)?; let res = ctx .builder() @@ -40,7 +38,7 @@ impl ArrayCodegen for SeleneHeapArrayCodegen { ptr: PointerValue<'c>, ) -> Result<()> { let iw_ctx = ctx.typing_session().iw_context(); - let ptr_ty = iw_ctx.i8_type().ptr_type(AddressSpace::default()); + let ptr_ty = iw_ctx.ptr_type(AddressSpace::default()); let ptr = ctx.builder().build_bit_cast(ptr, ptr_ty, "")?; let free_sig = iw_ctx.void_type().fn_type(&[ptr_ty.into()], false); diff --git a/crates/pecos-hugr-qis/src/compiler.rs b/crates/pecos-hugr-qis/src/compiler.rs index 91bf4eb0d..e1348c085 100644 --- a/crates/pecos-hugr-qis/src/compiler.rs +++ b/crates/pecos-hugr-qis/src/compiler.rs @@ -53,6 +53,7 @@ use tket::hugr::llvm::{ use tket::hugr::ops::DataflowParent; use tket::hugr::{Hugr, HugrView, Node}; use tket::llvm::rotation::RotationCodegenExtension; +use tket::passes::ComposablePass; use tket_qsystem::QSystemPass; use tket_qsystem::llvm::array_utils::ArrayLowering; use tket_qsystem::llvm::futures::FuturesCodegenExtension; @@ -494,7 +495,9 @@ pub fn compile_hugr_bytes_to_bitcode_with_options( let module = compile(args, &context, &mut hugr) .map_err(|e| PecosError::Generic(format!("Compilation failed: {e}")))?; - // Write to memory buffer and get bitcode + // Write to memory buffer and get bitcode. `as_slice()` includes LLVM's + // trailing C-string NUL, which is not part of the bitcode stream. let buffer = module.write_bitcode_to_memory(); - Ok(buffer.as_slice().to_vec()) + let bitcode = buffer.as_slice(); + Ok(bitcode[..bitcode.len().saturating_sub(1)].to_vec()) } diff --git a/crates/pecos-hugr/Cargo.toml b/crates/pecos-hugr/Cargo.toml index 117ea07e8..2b509302c 100644 --- a/crates/pecos-hugr/Cargo.toml +++ b/crates/pecos-hugr/Cargo.toml @@ -29,9 +29,6 @@ serde_json.workspace = true # HUGR support tket.workspace = true tket-qsystem.workspace = true -# Pin hugr-core to 0.25.6 to avoid strum 0.27/0.28 conflict with tket 0.17. -# See workspace Cargo.toml for details. Remove once tket supports strum 0.28+. -hugr-core.workspace = true # Workspace dependencies pecos-core.workspace = true diff --git a/crates/pecos-llvm/Cargo.toml b/crates/pecos-llvm/Cargo.toml index 2e4cf0752..70aca136c 100644 --- a/crates/pecos-llvm/Cargo.toml +++ b/crates/pecos-llvm/Cargo.toml @@ -17,7 +17,6 @@ pecos-core.workspace = true # Inkwell for LLVM IR generation [dependencies.inkwell] workspace = true -features = ["llvm14-0"] [features] default = [] diff --git a/crates/pecos-llvm/README.md b/crates/pecos-llvm/README.md index b67c55385..e6a5fb748 100644 --- a/crates/pecos-llvm/README.md +++ b/crates/pecos-llvm/README.md @@ -16,12 +16,12 @@ Provides Rust types for generating LLVM IR, designed to be compatible with Pytho ## Relationship to pecos-build -- **pecos-build**: Manages LLVM 14 *installation* (downloading, finding) -- **pecos-llvm**: *Uses* LLVM 14 (via inkwell) for IR generation +- **pecos-build**: Manages LLVM 21.1 *installation* (downloading, finding) +- **pecos-llvm**: *Uses* LLVM 21.1 (via inkwell) for IR generation ## Requirements -Requires LLVM 14. Install with: +Requires LLVM 21.1. Install with: ```bash cargo run -p pecos -- install llvm ``` diff --git a/crates/pecos-llvm/build.rs b/crates/pecos-llvm/build.rs index 10908bd87..40337fad9 100644 --- a/crates/pecos-llvm/build.rs +++ b/crates/pecos-llvm/build.rs @@ -5,44 +5,48 @@ fn main() { } fn validate_llvm() { - use pecos_build::llvm::is_valid_llvm_14; + use pecos_build::llvm::{LLVM_SYS_PREFIX_ENV, REQUIRED_VERSION, is_valid_llvm}; use std::env; use std::path::PathBuf; - // Check if LLVM_SYS_140_PREFIX is already set and valid - if let Ok(sys_prefix) = env::var("LLVM_SYS_140_PREFIX") { + // Check if LLVM_SYS_PREFIX_ENV is already set and valid + if let Ok(sys_prefix) = env::var(LLVM_SYS_PREFIX_ENV) { let path = PathBuf::from(&sys_prefix); - if is_valid_llvm_14(&path) { + if is_valid_llvm(&path) { // LLVM is configured and valid, we're good! return; } eprintln!("\n═══════════════════════════════════════════════════════════════"); - eprintln!("ERROR: Invalid LLVM_SYS_140_PREFIX"); + eprintln!("ERROR: Invalid {LLVM_SYS_PREFIX_ENV}"); eprintln!("═══════════════════════════════════════════════════════════════"); eprintln!(); - eprintln!("LLVM_SYS_140_PREFIX is set to: {sys_prefix}"); - eprintln!("But this is not a valid LLVM 14 installation."); + eprintln!("{LLVM_SYS_PREFIX_ENV} is set to: {sys_prefix}"); + eprintln!("But this is not a valid LLVM {REQUIRED_VERSION} installation."); eprintln!(); eprintln!("Please either:"); - eprintln!(" 1. Fix the path to point to a valid LLVM 14 installation"); + eprintln!(" 1. Fix the path to point to a valid LLVM {REQUIRED_VERSION} installation"); eprintln!(" 2. Unset it and configure LLVM:"); - eprintln!(" unset LLVM_SYS_140_PREFIX"); + eprintln!(" unset {LLVM_SYS_PREFIX_ENV}"); eprintln!(" pecos llvm configure"); eprintln!("═══════════════════════════════════════════════════════════════\n"); - panic!("Invalid LLVM_SYS_140_PREFIX. See error message above."); + panic!("Invalid {LLVM_SYS_PREFIX_ENV}. See error message above."); } - // LLVM_SYS_140_PREFIX not set - print setup instructions + // LLVM_SYS_PREFIX_ENV not set - print setup instructions print_llvm_not_found_error_extended(); - panic!("LLVM 14 not configured. See error message above for setup instructions."); + panic!( + "LLVM {REQUIRED_VERSION} not configured. See error message above for setup instructions." + ); } fn print_llvm_not_found_error_extended() { + use pecos_build::llvm::{LLVM_SYS_PREFIX_ENV, REQUIRED_VERSION}; + eprintln!("\n═══════════════════════════════════════════════════════════════"); - eprintln!("LLVM 14 Setup Required for pecos-qir"); + eprintln!("LLVM {REQUIRED_VERSION} Setup Required for pecos-qir"); eprintln!("═══════════════════════════════════════════════════════════════"); eprintln!(); - eprintln!("The pecos-qir crate requires LLVM 14 for QIR generation."); + eprintln!("The pecos-qir crate requires LLVM {REQUIRED_VERSION} for QIR generation."); eprintln!("Choose one of these installation methods:"); eprintln!(); eprintln!("Option 1: Use pecos setup (recommended)"); @@ -50,14 +54,16 @@ fn print_llvm_not_found_error_extended() { eprintln!(" cargo build"); eprintln!(); eprintln!(" This detects and installs all missing dependencies."); - eprintln!(" (LLVM 14: ~400 MB download, installs to ~/.pecos/deps/llvm-14/)"); + eprintln!( + " (LLVM {REQUIRED_VERSION}: several hundred MB download, installs to ~/.pecos/deps/llvm-{REQUIRED_VERSION}/)" + ); eprintln!(); #[cfg(target_os = "macos")] { eprintln!("Option 2: Install via Homebrew"); - eprintln!(" # Install LLVM 14"); - eprintln!(" brew install llvm@14"); + eprintln!(" # Install LLVM 21"); + eprintln!(" brew install llvm@21"); eprintln!(); eprintln!(" # Configure PECOS to use it"); eprintln!(" pecos llvm configure"); @@ -75,14 +81,14 @@ fn print_llvm_not_found_error_extended() { eprintln!(); eprintln!(" Debian/Ubuntu:"); eprintln!(" sudo apt update"); - eprintln!(" sudo apt install llvm-14 llvm-14-dev"); + eprintln!(" sudo apt install llvm-21 llvm-21-dev"); eprintln!(); eprintln!(" Fedora/RHEL:"); - eprintln!(" sudo dnf install llvm14 llvm14-devel"); + eprintln!(" sudo dnf install llvm21 llvm21-devel"); eprintln!(); eprintln!(" Arch Linux:"); - eprintln!(" # LLVM 14 may need to be built from AUR"); - eprintln!(" yay -S llvm14"); + eprintln!(" # LLVM 21 may need to come from an alternate repository"); + eprintln!(" yay -S llvm21"); eprintln!(); eprintln!(" Then configure and build:"); eprintln!(" pecos llvm configure"); @@ -102,7 +108,7 @@ fn print_llvm_not_found_error_extended() { eprintln!(" https://github.com/vovkos/llvm-package-windows"); eprintln!(); eprintln!(" After extracting to C:\\LLVM (or similar):"); - eprintln!(" set LLVM_SYS_140_PREFIX=C:\\LLVM"); + eprintln!(" set {LLVM_SYS_PREFIX_ENV}=C:\\LLVM"); eprintln!(" pecos llvm configure"); eprintln!(" cargo build"); eprintln!(); @@ -112,9 +118,9 @@ fn print_llvm_not_found_error_extended() { eprintln!(" Instead of 'configure', you can set environment variables:"); eprintln!(); #[cfg(target_os = "windows")] - eprintln!(" set LLVM_SYS_140_PREFIX=C:\\path\\to\\llvm"); + eprintln!(" set {LLVM_SYS_PREFIX_ENV}=C:\\path\\to\\llvm"); #[cfg(not(target_os = "windows"))] - eprintln!(" export LLVM_SYS_140_PREFIX=/path/to/llvm"); + eprintln!(" export {LLVM_SYS_PREFIX_ENV}=/path/to/llvm"); #[cfg(not(target_os = "windows"))] eprintln!(" Or add llvm-config to PATH:"); #[cfg(not(target_os = "windows"))] diff --git a/crates/pecos-llvm/src/lib.rs b/crates/pecos-llvm/src/lib.rs index 8919bcb8b..4563acf94 100644 --- a/crates/pecos-llvm/src/lib.rs +++ b/crates/pecos-llvm/src/lib.rs @@ -25,6 +25,6 @@ pub mod prelude; // Re-export main types at crate root for convenience pub use llvm_compat::{ - LLConstant, LLContext, LLFunction, LLFunctionType, LLIRBuilder, LLModule, LLResult, LLType, - LLValue, + LLConstant, LLContext, LLFunction, LLFunctionType, LLIRBuilder, LLModule, LLPointerValue, + LLResult, LLType, LLValue, gep_result_pointee_type, }; diff --git a/crates/pecos-llvm/src/llvm_compat.rs b/crates/pecos-llvm/src/llvm_compat.rs index 90ad38f80..4a2f5b92c 100644 --- a/crates/pecos-llvm/src/llvm_compat.rs +++ b/crates/pecos-llvm/src/llvm_compat.rs @@ -32,14 +32,13 @@ use inkwell::basic_block::BasicBlock; use inkwell::builder::Builder; use inkwell::context::Context; use inkwell::module::Module; -use inkwell::types::{ - ArrayType, BasicType, BasicTypeEnum, FloatType, IntType, PointerType, StructType, -}; +use inkwell::types::{ArrayType, BasicTypeEnum, FloatType, IntType, PointerType, StructType}; use inkwell::values::{ ArrayValue, BasicValueEnum, FloatValue, FunctionValue, GlobalValue, IntValue, PointerValue, }; use inkwell::{AddressSpace, IntPredicate}; use pecos_core::prelude::PecosError; +use std::num::NonZeroU32; pub type LLResult = Result; @@ -117,7 +116,9 @@ impl<'ctx> LLModule<'ctx> { /// Get the LLVM bitcode as bytes pub fn to_bitcode(&self) -> Vec { - self.module.write_bitcode_to_memory().as_slice().to_vec() + let buffer = self.module.write_bitcode_to_memory(); + let bitcode = buffer.as_slice(); + bitcode[..bitcode.len().saturating_sub(1)].to_vec() } /// Get an identified (opaque) type by name, creating it if it doesn't exist @@ -146,7 +147,7 @@ impl<'ctx> LLModule<'ctx> { match init_val { LLValue::Int(v) => global.set_initializer(&v), LLValue::Float(v) => global.set_initializer(&v), - LLValue::Pointer(v) => global.set_initializer(&v), + LLValue::Pointer(v) => global.set_initializer(&v.value()), LLValue::Array(v) => global.set_initializer(&v), } } @@ -236,6 +237,37 @@ pub enum LLType<'ctx> { Array(ArrayType<'ctx>), } +fn basic_type_to_ll_type(ty: BasicTypeEnum<'_>) -> Option> { + match ty { + BasicTypeEnum::ArrayType(t) => Some(LLType::Array(t)), + BasicTypeEnum::FloatType(t) => Some(LLType::Float(t)), + BasicTypeEnum::IntType(t) => Some(LLType::Int(t)), + BasicTypeEnum::PointerType(t) => Some(LLType::Pointer(t)), + BasicTypeEnum::StructType(t) => Some(LLType::Struct(t)), + BasicTypeEnum::ScalableVectorType(_) | BasicTypeEnum::VectorType(_) => None, + } +} + +#[must_use] +pub fn gep_result_pointee_type<'ctx>( + pointee_type: LLType<'ctx>, + indices: &[IntValue<'ctx>], +) -> Option> { + let mut current = pointee_type; + for index in indices.iter().skip(1) { + current = match current { + LLType::Array(t) => basic_type_to_ll_type(t.get_element_type())?, + LLType::Struct(t) => { + let field_index = u32::try_from(index.get_zero_extended_constant()?).ok()?; + basic_type_to_ll_type(t.get_field_type_at_index(field_index)?)? + } + LLType::Int(_) | LLType::Float(_) | LLType::Pointer(_) => current, + LLType::Void => return None, + }; + } + Some(current) +} + // inkwell 0.8.0 only derives `Hash` for `IntType`; the other type wrappers // are `Eq` (LLVM type-ref pointer equality) but not `Hash`. Hash the same // `LLVMTypeRef` pointer so `Hash` stays consistent with that `Eq`. @@ -282,13 +314,21 @@ impl<'ctx> LLType<'ctx> { match bits { // Use custom_width_int_type(1) instead of bool_type() to match llvmlite // llvmlite renders i1 constants as "i1 1" and "i1 0", not "i1 true" and "i1 false" - 1 => LLType::Int(context.custom_width_int_type(1)), + 1 => LLType::Int( + context + .custom_width_int_type(NonZeroU32::new(1).expect("nonzero width")) + .expect("i1 is a valid LLVM integer width"), + ), 8 => LLType::Int(context.i8_type()), 16 => LLType::Int(context.i16_type()), 32 => LLType::Int(context.i32_type()), 64 => LLType::Int(context.i64_type()), 128 => LLType::Int(context.i128_type()), - _ => LLType::Int(context.custom_width_int_type(bits)), + _ => LLType::Int( + context + .custom_width_int_type(NonZeroU32::new(bits).expect("nonzero width")) + .expect("valid LLVM integer width"), + ), } } @@ -315,15 +355,12 @@ impl<'ctx> LLType<'ctx> { #[must_use] pub fn as_pointer(&self, context: &'ctx Context) -> LLType<'ctx> { match self { - LLType::Void => { - // Void pointers are represented as i8* - LLType::Pointer(context.i8_type().ptr_type(AddressSpace::default())) - } - LLType::Int(t) => LLType::Pointer(t.ptr_type(AddressSpace::default())), - LLType::Float(t) => LLType::Pointer(t.ptr_type(AddressSpace::default())), + LLType::Void + | LLType::Int(_) + | LLType::Float(_) + | LLType::Struct(_) + | LLType::Array(_) => LLType::Pointer(context.ptr_type(AddressSpace::default())), LLType::Pointer(t) => LLType::Pointer(*t), // Already a pointer - LLType::Struct(t) => LLType::Pointer(t.ptr_type(AddressSpace::default())), - LLType::Array(t) => LLType::Pointer(t.ptr_type(AddressSpace::default())), } } @@ -372,12 +409,39 @@ impl<'ctx> LLType<'ctx> { // Value wrappers // ============================================================================ +/// Pointer value plus the pointee type needed by LLVM opaque-pointer APIs. +#[derive(Clone, Copy)] +pub struct LLPointerValue<'ctx> { + value: PointerValue<'ctx>, + pointee_type: Option>, +} + +impl<'ctx> LLPointerValue<'ctx> { + #[must_use] + pub fn new(value: PointerValue<'ctx>, pointee_type: Option>) -> Self { + Self { + value, + pointee_type, + } + } + + #[must_use] + pub fn value(self) -> PointerValue<'ctx> { + self.value + } + + #[must_use] + pub fn pointee_type(self) -> Option> { + self.pointee_type + } +} + /// Wrapper for LLVM values that mirrors llvmlite's value types #[derive(Clone, Copy)] pub enum LLValue<'ctx> { Int(IntValue<'ctx>), Float(FloatValue<'ctx>), - Pointer(PointerValue<'ctx>), + Pointer(LLPointerValue<'ctx>), Array(ArrayValue<'ctx>), } @@ -387,7 +451,7 @@ impl<'ctx> LLValue<'ctx> { match self { LLValue::Int(v) => (*v).into(), LLValue::Float(v) => (*v).into(), - LLValue::Pointer(v) => (*v).into(), + LLValue::Pointer(v) => v.value().into(), LLValue::Array(v) => (*v).into(), } } @@ -411,7 +475,15 @@ impl<'ctx> LLValue<'ctx> { #[must_use] pub fn as_pointer_value(&self) -> PointerValue<'ctx> { match self { - LLValue::Pointer(v) => *v, + LLValue::Pointer(v) => v.value(), + _ => panic!("Expected pointer value"), + } + } + + #[must_use] + pub fn pointer_pointee_type(&self) -> Option> { + match self { + LLValue::Pointer(v) => v.pointee_type(), _ => panic!("Expected pointer value"), } } @@ -686,7 +758,7 @@ impl<'ctx> LLIRBuilder<'ctx> { Ok(call_site.try_as_basic_value().basic().map(|v| match v { BasicValueEnum::IntValue(i) => LLValue::Int(i), - BasicValueEnum::PointerValue(p) => LLValue::Pointer(p), + BasicValueEnum::PointerValue(p) => LLValue::Pointer(LLPointerValue::new(p, None)), _ => panic!("Unsupported return value type"), })) } @@ -740,13 +812,28 @@ impl<'ctx> LLIRBuilder<'ctx> { name: &str, ) -> LLResult> { let idx_values: Vec<_> = indices.iter().map(LLValue::as_int_value).collect(); + let pointee_type = ptr + .pointer_pointee_type() + .ok_or_else(|| PecosError::Generic("gep: pointer pointee type is unknown".into()))?; + let basic_pointee_type = pointee_type + .to_basic_metadata_type() + .ok_or_else(|| PecosError::Generic("gep: pointer to void is not supported".into()))?; + let result_pointee_type = gep_result_pointee_type(pointee_type, &idx_values); unsafe { let result = self .builder - .build_gep(ptr.as_pointer_value(), &idx_values, name) + .build_gep( + basic_pointee_type, + ptr.as_pointer_value(), + &idx_values, + name, + ) .map_err(|e| PecosError::Generic(format!("Failed to build gep: {e}")))?; - Ok(LLValue::Pointer(result)) + Ok(LLValue::Pointer(LLPointerValue::new( + result, + result_pointee_type, + ))) } } @@ -764,19 +851,25 @@ impl<'ctx> LLIRBuilder<'ctx> { .builder .build_alloca(basic_ty, name) .map_err(|e| PecosError::Generic(format!("Failed to build alloca: {e}")))?; - Ok(LLValue::Pointer(result)) + Ok(LLValue::Pointer(LLPointerValue::new(result, Some(ll_type)))) } - /// `load` (LLVM-14 typed pointer: pointee inferred from `ptr`). + /// `load` (LLVM opaque-pointer API requires an explicit pointee type). pub fn load(&self, ptr: LLValue<'ctx>, name: &str) -> LLResult> { + let pointee_type = ptr + .pointer_pointee_type() + .ok_or_else(|| PecosError::Generic("load: pointer pointee type is unknown".into()))?; + let basic_pointee_type = pointee_type + .to_basic_metadata_type() + .ok_or_else(|| PecosError::Generic("load: pointer to void is not supported".into()))?; let result = self .builder - .build_load(ptr.as_pointer_value(), name) + .build_load(basic_pointee_type, ptr.as_pointer_value(), name) .map_err(|e| PecosError::Generic(format!("Failed to build load: {e}")))?; Ok(match result { BasicValueEnum::IntValue(v) => LLValue::Int(v), BasicValueEnum::FloatValue(v) => LLValue::Float(v), - BasicValueEnum::PointerValue(v) => LLValue::Pointer(v), + BasicValueEnum::PointerValue(v) => LLValue::Pointer(LLPointerValue::new(v, None)), BasicValueEnum::ArrayValue(v) => LLValue::Array(v), other => { return Err(PecosError::Generic(format!( @@ -905,7 +998,7 @@ impl LLConstant { match ll_type { LLType::Int(t) => Ok(LLValue::Int(t.const_zero())), LLType::Float(t) => Ok(LLValue::Float(t.const_zero())), - LLType::Pointer(t) => Ok(LLValue::Pointer(t.const_zero())), + LLType::Pointer(t) => Ok(LLValue::Pointer(LLPointerValue::new(t.const_zero(), None))), LLType::Array(t) => Ok(LLValue::Array(t.const_zero())), LLType::Void | LLType::Struct(_) => Err(PecosError::Generic( "Cannot create a zero constant for void/struct type".to_string(), diff --git a/crates/pecos-llvm/src/prelude.rs b/crates/pecos-llvm/src/prelude.rs index d87f93232..06c7224ab 100644 --- a/crates/pecos-llvm/src/prelude.rs +++ b/crates/pecos-llvm/src/prelude.rs @@ -17,6 +17,6 @@ //! This module re-exports the main public API for LLVM IR generation. pub use crate::llvm_compat::{ - LLConstant, LLContext, LLFunction, LLFunctionType, LLIRBuilder, LLModule, LLResult, LLType, - LLValue, + LLConstant, LLContext, LLFunction, LLFunctionType, LLIRBuilder, LLModule, LLPointerValue, + LLResult, LLType, LLValue, gep_result_pointee_type, }; diff --git a/crates/pecos-qis/Cargo.toml b/crates/pecos-qis/Cargo.toml index d58b89ef1..ee8636375 100644 --- a/crates/pecos-qis/Cargo.toml +++ b/crates/pecos-qis/Cargo.toml @@ -55,7 +55,6 @@ libloading.workspace = true # Inkwell for LLVM support (optional) [dependencies.inkwell] workspace = true -features = ["llvm14-0"] optional = true [dependencies.selene-simple-runtime] diff --git a/crates/pecos-qis/build.rs b/crates/pecos-qis/build.rs index 8b4d9bcc6..ccaede835 100644 --- a/crates/pecos-qis/build.rs +++ b/crates/pecos-qis/build.rs @@ -20,7 +20,7 @@ fn main() { validate_llvm(); // Embed LLVM bin path at compile time for runtime use - if let Ok(llvm_prefix) = env::var("LLVM_SYS_140_PREFIX") { + if let Ok(llvm_prefix) = env::var(pecos_build::llvm::LLVM_SYS_PREFIX_ENV) { let llvm_bin = PathBuf::from(&llvm_prefix).join("bin"); println!("cargo:rustc-env=PECOS_LLVM_BIN_PATH={}", llvm_bin.display()); } @@ -32,57 +32,63 @@ fn main() { #[cfg(feature = "llvm")] fn validate_llvm() { - use pecos_build::llvm::is_valid_llvm_14; + use pecos_build::llvm::{LLVM_SYS_PREFIX_ENV, REQUIRED_VERSION, is_valid_llvm}; - // Check if LLVM_SYS_140_PREFIX is already set and valid - if let Ok(sys_prefix) = env::var("LLVM_SYS_140_PREFIX") { + // Check if LLVM_SYS_PREFIX_ENV is already set and valid + if let Ok(sys_prefix) = env::var(LLVM_SYS_PREFIX_ENV) { let path = PathBuf::from(&sys_prefix); - if is_valid_llvm_14(&path) { + if is_valid_llvm(&path) { // LLVM is configured and valid, we're good! return; } eprintln!("\n═══════════════════════════════════════════════════════════════"); - eprintln!("ERROR: Invalid LLVM_SYS_140_PREFIX"); + eprintln!("ERROR: Invalid {LLVM_SYS_PREFIX_ENV}"); eprintln!("═══════════════════════════════════════════════════════════════"); eprintln!(); - eprintln!("LLVM_SYS_140_PREFIX is set to: {sys_prefix}"); - eprintln!("But this is not a valid LLVM 14 installation."); + eprintln!("{LLVM_SYS_PREFIX_ENV} is set to: {sys_prefix}"); + eprintln!("But this is not a valid LLVM {REQUIRED_VERSION} installation."); eprintln!(); eprintln!("Please either:"); - eprintln!(" 1. Fix the path to point to a valid LLVM 14 installation"); + eprintln!(" 1. Fix the path to point to a valid LLVM {REQUIRED_VERSION} installation"); eprintln!(" 2. Unset it and configure LLVM:"); - eprintln!(" unset LLVM_SYS_140_PREFIX"); + eprintln!(" unset {LLVM_SYS_PREFIX_ENV}"); eprintln!(" pecos llvm configure"); eprintln!("═══════════════════════════════════════════════════════════════\n"); - panic!("Invalid LLVM_SYS_140_PREFIX. See error message above."); + panic!("Invalid {LLVM_SYS_PREFIX_ENV}. See error message above."); } - // LLVM_SYS_140_PREFIX not set - print setup instructions + // LLVM_SYS_PREFIX_ENV not set - print setup instructions print_llvm_not_found_error_extended(); - panic!("LLVM 14 not configured. See error message above for setup instructions."); + panic!( + "LLVM {REQUIRED_VERSION} not configured. See error message above for setup instructions." + ); } #[cfg(feature = "llvm")] fn print_llvm_not_found_error_extended() { + use pecos_build::llvm::{LLVM_SYS_PREFIX_ENV, REQUIRED_VERSION}; + eprintln!("\n═══════════════════════════════════════════════════════════════"); - eprintln!("LLVM 14 Setup Required"); + eprintln!("LLVM {REQUIRED_VERSION} Setup Required"); eprintln!("═══════════════════════════════════════════════════════════════"); eprintln!(); - eprintln!("PECOS needs LLVM 14. Choose one of these installation methods:"); + eprintln!("PECOS needs LLVM {REQUIRED_VERSION}. Choose one of these installation methods:"); eprintln!(); eprintln!("Option 1: Use pecos setup (recommended)"); eprintln!(" pecos setup"); eprintln!(" cargo build"); eprintln!(); eprintln!(" This detects and installs all missing dependencies."); - eprintln!(" (LLVM 14: ~400 MB download, installs to ~/.pecos/deps/llvm-14/)"); + eprintln!( + " (LLVM {REQUIRED_VERSION}: several hundred MB download, installs to ~/.pecos/deps/llvm-{REQUIRED_VERSION}/)" + ); eprintln!(); #[cfg(target_os = "macos")] { eprintln!("Option 2: Install via Homebrew"); - eprintln!(" # Install LLVM 14"); - eprintln!(" brew install llvm@14"); + eprintln!(" # Install LLVM 21"); + eprintln!(" brew install llvm@21"); eprintln!(); eprintln!(" # Configure PECOS to use it"); eprintln!(" pecos llvm configure"); @@ -100,14 +106,14 @@ fn print_llvm_not_found_error_extended() { eprintln!(); eprintln!(" Debian/Ubuntu:"); eprintln!(" sudo apt update"); - eprintln!(" sudo apt install llvm-14 llvm-14-dev"); + eprintln!(" sudo apt install llvm-21 llvm-21-dev"); eprintln!(); eprintln!(" Fedora/RHEL:"); - eprintln!(" sudo dnf install llvm14 llvm14-devel"); + eprintln!(" sudo dnf install llvm21 llvm21-devel"); eprintln!(); eprintln!(" Arch Linux:"); - eprintln!(" # LLVM 14 may need to be built from AUR"); - eprintln!(" yay -S llvm14"); + eprintln!(" # LLVM 21 may need to come from an alternate repository"); + eprintln!(" yay -S llvm21"); eprintln!(); eprintln!(" Then configure and build:"); eprintln!(" pecos llvm configure"); @@ -127,7 +133,7 @@ fn print_llvm_not_found_error_extended() { eprintln!(" https://github.com/vovkos/llvm-package-windows"); eprintln!(); eprintln!(" After extracting to C:\\LLVM (or similar):"); - eprintln!(" set LLVM_SYS_140_PREFIX=C:\\LLVM"); + eprintln!(" set {LLVM_SYS_PREFIX_ENV}=C:\\LLVM"); eprintln!(" pecos llvm configure"); eprintln!(" cargo build"); eprintln!(); @@ -137,9 +143,9 @@ fn print_llvm_not_found_error_extended() { eprintln!(" Instead of 'configure', you can set environment variables:"); eprintln!(); #[cfg(target_os = "windows")] - eprintln!(" set LLVM_SYS_140_PREFIX=C:\\path\\to\\llvm"); + eprintln!(" set {LLVM_SYS_PREFIX_ENV}=C:\\path\\to\\llvm"); #[cfg(not(target_os = "windows"))] - eprintln!(" export LLVM_SYS_140_PREFIX=/path/to/llvm"); + eprintln!(" export {LLVM_SYS_PREFIX_ENV}=/path/to/llvm"); #[cfg(not(target_os = "windows"))] eprintln!(" Or add llvm-config to PATH:"); #[cfg(not(target_os = "windows"))] diff --git a/crates/pecos-qis/build_selene.rs b/crates/pecos-qis/build_selene.rs index 11a44ec00..599bc3098 100644 --- a/crates/pecos-qis/build_selene.rs +++ b/crates/pecos-qis/build_selene.rs @@ -4,6 +4,8 @@ //! It is only compiled when the `selene` feature is enabled. use log::info; +#[cfg(target_os = "windows")] +use pecos_build::llvm::LLVM_SYS_PREFIX_ENV; use std::env; use std::path::{Path, PathBuf}; use std::process::Command; @@ -186,7 +188,7 @@ EXPORTS // Try to use llvm-dlltool (from LLVM) or dlltool (from MinGW) to generate import library // First try llvm-dlltool which should be available with our LLVM installation - let dlltool_result = if let Ok(llvm_prefix) = env::var("LLVM_SYS_140_PREFIX") { + let dlltool_result = if let Ok(llvm_prefix) = env::var(LLVM_SYS_PREFIX_ENV) { let llvm_dlltool = PathBuf::from(llvm_prefix) .join("bin") .join("llvm-dlltool.exe"); @@ -208,7 +210,7 @@ EXPORTS } else { Err(std::io::Error::new( std::io::ErrorKind::NotFound, - "LLVM_SYS_140_PREFIX not set", + format!("{LLVM_SYS_PREFIX_ENV} not set"), )) }; diff --git a/crates/pecos-qis/src/executor.rs b/crates/pecos-qis/src/executor.rs index d1ba56774..6bf0764d8 100644 --- a/crates/pecos-qis/src/executor.rs +++ b/crates/pecos-qis/src/executor.rs @@ -593,7 +593,7 @@ fn find_helios_lib() -> Result { /// Find an LLVM tool with the following priority: /// 1. Embedded path from build time (`PECOS_LLVM_BIN_PATH`) -/// 2. Runtime `LLVM_SYS_140_PREFIX` environment variable +/// 2. Runtime `LLVM_SYS_211_PREFIX` environment variable /// 3. Fall back to PATH fn find_llvm_tool(tool_name: &str) -> PathBuf { let tool_exe = if cfg!(windows) { @@ -617,13 +617,13 @@ fn find_llvm_tool(tool_name: &str) -> PathBuf { } }) .or_else(|| { - std::env::var("LLVM_SYS_140_PREFIX") + std::env::var("LLVM_SYS_211_PREFIX") .ok() .and_then(|prefix| { let path = PathBuf::from(prefix).join("bin").join(&tool_exe); if path.exists() { debug!( - "Using {} from LLVM_SYS_140_PREFIX: {}", + "Using {} from LLVM_SYS_211_PREFIX: {}", tool_name, path.display() ); @@ -1556,26 +1556,9 @@ entry: so_path_for_clang.display() ); - // Build clang command with platform-specific flags - // Try to find clang: first check LLVM_SYS_140_PREFIX, then fall back to PATH - let clang_cmd_path = std::env::var("LLVM_SYS_140_PREFIX") - .ok() - .and_then(|prefix| { - let mut path = PathBuf::from(prefix); - path.push("bin"); - path.push(if cfg!(windows) { "clang.exe" } else { "clang" }); - if path.exists() { - debug!("Using clang from LLVM_SYS_140_PREFIX: {}", path.display()); - Some(path) - } else { - None - } - }) - .unwrap_or_else(|| { - debug!("Using clang from PATH"); - PathBuf::from("clang") - }); - + // Use the same LLVM tool resolver as llvm-as/llvm-link so runtime linking + // honors the build-time LLVM prefix embedded in Python wheels. + let clang_cmd_path = find_llvm_tool("clang"); let mut clang_cmd = Command::new(&clang_cmd_path); // On Windows, we need to be more careful with paths and flags diff --git a/crates/pecos-qis/src/lib.rs b/crates/pecos-qis/src/lib.rs index 44478f886..76338a0fd 100644 --- a/crates/pecos-qis/src/lib.rs +++ b/crates/pecos-qis/src/lib.rs @@ -34,7 +34,7 @@ //! //! # LLVM Setup //! -//! This crate requires LLVM 14 for QIR (Quantum Intermediate Representation) support. +//! This crate requires LLVM 21.1 for QIR (Quantum Intermediate Representation) support. //! //! If the build fails, run: //! diff --git a/crates/pecos/README.md b/crates/pecos/README.md index 47fc78eea..2c01e426d 100644 --- a/crates/pecos/README.md +++ b/crates/pecos/README.md @@ -15,6 +15,6 @@ Provides a unified API for PECOS users. Most users should depend on this crate r ## Feature Flags - `runtime` (default): Full simulation with QASM/PHIR support -- `qis`: QIS/LLVM IR execution (requires LLVM 14) +- `qis`: QIS/LLVM IR execution (requires LLVM 21.1) - `hugr`: HUGR program support - `quest`, `qulacs`: Additional quantum backends diff --git a/crates/pecos/src/lib.rs b/crates/pecos/src/lib.rs index 95244ce20..7e4ad9700 100644 --- a/crates/pecos/src/lib.rs +++ b/crates/pecos/src/lib.rs @@ -5,7 +5,7 @@ //! - **`core`**: Core types and error handling //! - **`sim`**: Quantum simulation (includes core + num) //! - **`runtime`**: Full simulation with QASM + PHIR support -//! - **`qis`**: QIS/LLVM IR execution (requires LLVM 14) +//! - **`qis`**: QIS/LLVM IR execution (requires LLVM 21.1) //! - **`hugr`**: HUGR program support //! - **`quest`/`qulacs`/`cppsparsestab`**: Simulator backends //! - **`num`**: Numerical computing (scipy-like) diff --git a/docs/README.md b/docs/README.md index 9eab704d6..d0db09e6f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -101,7 +101,7 @@ For OpenQASM, PHIR, or other formats, see the [User Guide](user-guide/getting-st - **Fast Simulation**: Leverages a fast stabilizer simulation algorithm. - **Multi-language extensions**: Core functionalities implemented via Rust for performance and safety. Additional add-ons and extension support in C/C++ via Cython. -- **QIR Support**: Execute Quantum Intermediate Representation programs (requires LLVM version 14). +- **QIR Support**: Execute Quantum Intermediate Representation programs (requires LLVM version 21.1). ## Available Implementations diff --git a/docs/development/DEVELOPMENT.md b/docs/development/DEVELOPMENT.md index 750b79a05..87207b00c 100644 --- a/docs/development/DEVELOPMENT.md +++ b/docs/development/DEVELOPMENT.md @@ -67,9 +67,9 @@ For developers who want to contribute or modify PECOS: Combine groups with multiple `--group` flags (e.g. `uv sync --group examples --group cuda`). -6. **LLVM 14 Setup (Required for LLVM IR/QIS Support)** +6. **LLVM 21.1 Setup (Required for LLVM IR/QIS Support)** - PECOS requires LLVM version 14 for LLVM IR execution features. + PECOS requires LLVM version 21.1 for LLVM IR execution features. **Quick setup:** ```sh @@ -77,7 +77,9 @@ For developers who want to contribute or modify PECOS: cargo build ``` - For detailed installation instructions for all platforms (macOS, Linux, Windows), see the [**LLVM Setup Guide**](../user-guide/llvm-setup.md). + `pecos install llvm` is the managed shared-LLVM path on supported + Debian/Ubuntu-compatible Linux systems. For macOS, Windows, and other Linux + distributions, see the [**LLVM Setup Guide**](../user-guide/llvm-setup.md). 7. You may wish to explicitly activate the environment for development. To do so: @@ -176,7 +178,7 @@ PECOS uses `~/.pecos/` to store external dependencies and build artifacts that c ``` ~/.pecos/ -├── llvm/ # LLVM-14 installation (for QIR/LLVM IR execution) +├── deps/llvm-21.1/ # LLVM 21.1 installation (for QIR/LLVM IR execution) ├── deps/ # Downloaded C++ dependencies (Stim, etc.) └── cache/ # Build artifacts and intermediate files ``` diff --git a/docs/development/dev-tools.md b/docs/development/dev-tools.md index 774dacfae..9c11440af 100644 --- a/docs/development/dev-tools.md +++ b/docs/development/dev-tools.md @@ -24,7 +24,7 @@ pecos python build --profile release # Release build pecos python build --profile native # Release + native-CPU codegen (Rust and C++) # Dependency installation -pecos install llvm # Install LLVM 14 to ~/.pecos/deps/llvm-14/ +pecos install llvm # Install managed LLVM 21.1 where supported pecos install cuda # Install CUDA Toolkit to ~/.pecos/deps/cuda/ pecos install cuquantum # Install cuQuantum SDK to ~/.pecos/deps/cuquantum/ pecos install --all # Install all optional dependencies @@ -33,7 +33,8 @@ pecos upgrade llvm # Upgrade (force reinstall) LLVM # Inspection pecos llvm check # Check LLVM installation status -pecos llvm configure # Configure .cargo/config.toml +pecos llvm configure # Configure .cargo/config.toml using detected LLVM +pecos llvm configure /path/to/llvm # Configure an explicit user-managed LLVM pecos cuda check # Check CUDA availability pecos sys-info # Show toolchain and environment info @@ -100,9 +101,12 @@ Run `just --list` to see all available commands. ### Install LLVM ```bash -# Automated installation (downloads pre-built binaries) +# Automated installation where PECOS can provide shared LLVM pecos install llvm +# Accept the managed-install prompt +pecos install llvm --yes + # Force reinstall pecos install llvm --force @@ -110,7 +114,21 @@ pecos install llvm --force pecos install llvm --no-configure ``` -This downloads and installs LLVM 14 to `~/.pecos/deps/llvm-14/`. +On Debian/Ubuntu-compatible Linux systems this downloads apt.llvm.org shared +LLVM packages into `~/.pecos/deps/llvm-21.1/` without `sudo`. The managed +install is the preferred developer path where it is available, but it is a +large toolchain install. `pecos install llvm` prints what it is about to install +and asks for confirmation before downloading. + +On macOS, install Homebrew LLVM 21 (`brew install llvm@21`) and run +`pecos llvm configure`. On native Windows MSVC, LLVM does not provide shared +`libLLVM`; use WSL2/Linux for the full HUGR test lane, or configure a full LLVM +development package for targeted static builds. + +`pecos rust test` requires shared LLVM for the workspace HUGR test lane. LLVM +21.1 static test links can use multiple GB of RAM each, so PECOS fails early +instead of letting `just dev` spawn enough concurrent linkers to overwhelm a +normal development machine. ### Check LLVM Status @@ -125,9 +143,12 @@ pecos llvm check --quiet ```bash pecos llvm configure + +# Or explicitly use a system/Homebrew/apt LLVM instead of the managed install +pecos llvm configure /path/to/llvm ``` -Updates `.cargo/config.toml` with the correct `LLVM_SYS_140_PREFIX` environment variable. +Updates `.cargo/config.toml` with the correct `LLVM_SYS_211_PREFIX` environment variable. ### Find LLVM Path @@ -188,7 +209,7 @@ Use `just check-all` before a broad PR; it runs the build, tests, lint gate, and | Variable | Description | Default | |----------|-------------|---------| | `PECOS_HOME` | PECOS cache and data directory | `~/.pecos` | -| `LLVM_SYS_140_PREFIX` | LLVM 14 installation path | auto-detected | +| `LLVM_SYS_211_PREFIX` | LLVM 21.1 installation path | auto-detected | | `RUST_LOG` | Log level for build output (`info` shows download progress) | `warn` | ## Typical Workflows @@ -199,13 +220,17 @@ Use `just check-all` before a broad PR; it runs the build, tests, lint gate, and # 1. Check if LLVM is already available pecos llvm check -# 2. If not, install it +# 2. If not, install it where managed shared LLVM is supported pecos install llvm # 3. Now you can build with LLVM support cargo build -p pecos --features llvm ``` +On macOS use `brew install llvm@21 && pecos llvm configure`. On native Windows +MSVC, use WSL2/Linux for the full HUGR test lane or configure a full LLVM 21 +package for targeted static builds. + Or using Justfile: ```bash just install-llvm diff --git a/docs/user-guide/cli.md b/docs/user-guide/cli.md index 660b064ce..2d3fdfee7 100644 --- a/docs/user-guide/cli.md +++ b/docs/user-guide/cli.md @@ -126,9 +126,9 @@ For quick checks without compilation, use `just doctor`: ```bash $ just doctor -LLVM 14: - [OK] installed: 14.0.6 at /home/user/.pecos/deps/llvm - [OK] .cargo/config.toml: LLVM_SYS_140_PREFIX configured +LLVM 21.1: + [OK] installed: 21.1.8 at /home/user/.pecos/deps/llvm-21.1 + [OK] .cargo/config.toml: LLVM_SYS_211_PREFIX configured Python: [OK] uv: uv 0.11.3 diff --git a/docs/user-guide/llvm-setup.md b/docs/user-guide/llvm-setup.md index 3a523ea88..f2e0f0747 100644 --- a/docs/user-guide/llvm-setup.md +++ b/docs/user-guide/llvm-setup.md @@ -21,12 +21,12 @@ If you don't need QIS LLVM IR/QIR execution features, you can skip LLVM installa ## Installation Options -### Option 1: Automatic Installation (Recommended) +### Option 1: PECOS-Managed Installation (Recommended Where Available) -Use the `pecos` CLI (`pecos install llvm`, or `cargo run -p pecos-cli -- install llvm` in a source checkout) to automatically download and install LLVM 14.0.6: +Use the `pecos` CLI (`pecos install llvm`, or `cargo run -p pecos-cli -- install llvm` in a source checkout) to automatically download and install LLVM 21.1.8 where PECOS can provide a verified shared LLVM package: ```bash -# Install LLVM 14.0.6 to ~/.pecos/deps/llvm-14/ (~400MB, ~5 minutes) +# Install LLVM 21.1.8 to ~/.pecos/deps/llvm-21.1/ cargo run -p pecos-cli -- install llvm # Build PECOS with LLVM support @@ -35,19 +35,30 @@ cargo build --features llvm The `install` command automatically: -- Downloads the correct LLVM binary for your platform -- Extracts it to `~/.pecos/deps/llvm-14/` +- Downloads a shared LLVM toolchain on supported platforms +- Extracts it to `~/.pecos/deps/llvm-21.1/` - Configures PECOS by updating `.cargo/config.toml` -This is the **recommended approach** for all platforms, especially Windows where system package managers may not provide LLVM 14 development files. +This is the **recommended approach** where PECOS can provide a verified shared +LLVM package. On Debian/Ubuntu-compatible Linux distributions, PECOS downloads +the apt.llvm.org LLVM 21 packages into `~/.pecos/deps/llvm-21.1/` without using +`sudo`. On macOS, use Homebrew for LLVM 21. On Windows MSVC, LLVM does not +provide the shared `libLLVM` target PECOS requires for the full workspace HUGR +test lane; use WSL2/Linux for that lane, or configure a full LLVM package for +targeted static LLVM builds. + +This is a developer toolchain install: the CLI prints the install size/behavior +and asks for confirmation before downloading. Use `--yes` to accept the prompt +in scripts. Depending on platform and archive layout, the extracted toolchain +can occupy several GB. ### Option 2: System Package Manager -Install LLVM 14 using your system's package manager, then configure PECOS: +Install LLVM 21.1 using your system's package manager, then configure PECOS: === "macOS" ```bash - brew install llvm@14 + brew install llvm@21 cargo run -p pecos-cli -- llvm configure cargo build --features llvm ``` @@ -57,32 +68,35 @@ Install LLVM 14 using your system's package manager, then configure PECOS: === "Linux (Debian/Ubuntu)" ```bash sudo apt update - sudo apt install llvm-14 llvm-14-dev + sudo apt install llvm-21 llvm-21-dev cargo run -p pecos-cli -- llvm configure cargo build --features llvm ``` + If your distribution repositories do not provide LLVM 21, use the LLVM + project's Debian/Ubuntu repository at . + === "Linux (Fedora/RHEL)" ```bash - sudo dnf install llvm14 llvm14-devel + sudo dnf install llvm21 llvm21-devel cargo run -p pecos-cli -- llvm configure cargo build --features llvm ``` === "Linux (Arch)" ```bash - yay -S llvm14 # May need to build from AUR + yay -S llvm21 # May need to build from AUR cargo run -p pecos-cli -- llvm configure cargo build --features llvm ``` === "Windows" !!! warning "Windows LLVM Requirement" - The official LLVM Windows installer (`LLVM-*.exe`) is **toolchain-only** and lacks required development files (`llvm-config.exe` and headers). + The official LLVM Windows installer (`LLVM-*.exe`) is **toolchain-only** and lacks required development files (`llvm-config.exe` and headers). LLVM's MSVC builds also do not provide shared `libLLVM`, so `pecos rust test` / `just dev` with the full HUGR test lane is not supported on native Windows. - **Recommended:** Use Option 1 (automatic installation) above. + **Recommended for full development tests:** Use WSL2/Linux and Option 1 above. - **Alternative:** Download a full development package from: + **Alternative for targeted static LLVM builds:** Download a full development package from: - [bitgate/llvm-windows-full-builds](https://github.com/bitgate/llvm-windows-full-builds) (recommended) - [vovkos/llvm-package-windows](https://github.com/vovkos/llvm-package-windows) @@ -90,8 +104,8 @@ Install LLVM 14 using your system's package manager, then configure PECOS: Extract to `C:\LLVM`, then: ```cmd - set LLVM_SYS_140_PREFIX=C:\LLVM - cargo run -p pecos-cli -- llvm configure + set LLVM_SYS_211_PREFIX=C:\LLVM + cargo run -p pecos-cli -- llvm configure C:\LLVM cargo build --features llvm ``` @@ -100,7 +114,7 @@ Install LLVM 14 using your system's package manager, then configure PECOS: After installing LLVM, you can verify the installation using these commands: ```bash -# Check if LLVM 14 is detected +# Check if LLVM 21.1 is detected cargo run -p pecos-cli -- llvm check # Show LLVM version and path @@ -110,13 +124,24 @@ cargo run -p pecos-cli -- llvm version cargo run -p pecos-cli -- llvm find ``` +`llvm check` also reports LLVM's link mode. PECOS Rust builds prefer +`libLLVM-21.so` when a shared LLVM 21.1 installation is available; static LLVM +is only suitable for targeted builds. + +For `pecos rust test` and `just dev`, PECOS requires shared LLVM. On a Linux +x86_64 developer machine, one static LLVM test link measured about 4 GB peak +RSS, while the same target linked against shared LLVM measured about 0.8 GB. +Failing early on static LLVM is intentional: full workspace tests can spawn +many LLVM-linking test binaries at once. + ## `pecos llvm` CLI Reference The `pecos llvm` subcommand provides several useful commands: ### `install` -Download and install LLVM 14.0.6 to `~/.pecos/deps/llvm-14/`: +Download and install LLVM 21.1.8 to `~/.pecos/deps/llvm-21.1/` on supported +platforms: ```bash cargo run -p pecos-cli -- install llvm @@ -134,13 +159,16 @@ Auto-configure PECOS to use detected LLVM installation: ```bash cargo run -p pecos-cli -- llvm configure + +# Or explicitly configure a user-managed LLVM installation +cargo run -p pecos-cli -- llvm configure /path/to/llvm ``` This updates `.cargo/config.toml` with the LLVM path. ### `check` -Verify LLVM 14 is available: +Verify LLVM 21.1 is available: ```bash cargo run -p pecos-cli -- llvm check @@ -195,7 +223,7 @@ cargo run -p pecos-cli -- llvm tool llvm-link ### Version Requirement -PECOS specifically requires **LLVM version 14.x** (14.0.x). Other versions are not compatible with the current implementation. +PECOS specifically requires **LLVM version 21.1.x** (21.1.x). Other versions are not compatible with the current implementation. ### Configuration File @@ -203,7 +231,7 @@ The `configure` command updates `.cargo/config.toml` in the project root with: ```toml [env] -LLVM_SYS_140_PREFIX = { value = "/path/to/llvm", force = true } +LLVM_SYS_211_PREFIX = { value = "/path/to/llvm", force = true } ``` **Important notes:** @@ -212,39 +240,62 @@ LLVM_SYS_140_PREFIX = { value = "/path/to/llvm", force = true } - It's in `.gitignore` and should not be committed - The `force = true` setting ensures the configured LLVM path takes priority over environment variables +### Shared vs Static LLVM + +PECOS enables inkwell's `llvm21-1-prefer-dynamic` feature. That means Rust +builds use `libLLVM-21.so` / `libLLVM.dylib` when `llvm-config --link-shared` +can provide it. The managed installer rejects static LLVM because the normal +development test path links many LLVM-using test binaries. + +System package manager installs usually provide shared LLVM. On Debian/Ubuntu +compatible Linux distributions, the managed installer uses the apt.llvm.org +LLVM 21 packages locally under `~/.pecos/deps/llvm-21.1/`, without installing +system packages. + +When LLVM is shared, PECOS CLI commands add LLVM's `libdir` to the runtime +library path for child Cargo commands. That lets locally configured shared LLVM +installs work without editing your shell startup files. + ### Detection Priority -The `pecos llvm` tooling searches for LLVM 14 in this order: +Build commands that need to match Cargo's behavior first honor +`.cargo/config.toml` if it sets `LLVM_SYS_211_PREFIX`, then fall back to the +normal detector. The normal `pecos llvm` detector searches for LLVM 21.1 in +this order: 1. **Home directory:** - - Windows: `~/.pecos/deps/llvm-14` - - Unix: `~/.pecos/deps/llvm-14` + - Windows: `~/.pecos/deps/llvm-21.1` + - Unix: `~/.pecos/deps/llvm-21.1` + +2. **Legacy home directory:** `~/.pecos/llvm` -2. **Project-local:** `/llvm/` +3. **Project-local:** `/llvm/` -3. **System installations:** - - **macOS:** Homebrew locations (`/opt/homebrew/opt/llvm@14`, `/usr/local/opt/llvm@14`) - - **Linux:** Via `llvm-config-14` command and common paths +4. **System installations:** + - **macOS:** Homebrew locations (`/opt/homebrew/opt/llvm@21`, `/usr/local/opt/llvm@21`) + - **Linux:** Via `llvm-config-21` command and common paths - **Windows:** Common paths (`C:\Program Files\LLVM`, `C:\LLVM`, etc.) ### Platform-Specific Notes **macOS:** -- Supports both Intel and Apple Silicon architectures +- Use Homebrew LLVM 21: `brew install llvm@21` - Automatically detects Homebrew installations -- Downloads appropriate binary for each platform **Linux:** -- Detects system LLVM via `llvm-config-14` command -- Supports x86_64 and aarch64 architectures +- Detects system LLVM via `llvm-config-21` command +- Managed install uses apt.llvm.org on Debian/Ubuntu-compatible x86_64 and + aarch64 systems +- Other Linux distributions should install shared LLVM 21 through their package + manager and run `pecos llvm configure /path/to/llvm` **Windows:** -- Uses `.7z` archives for distribution -- Pure Rust extraction (no external tools required) -- Official LLVM Windows installer lacks development files - use `pecos install llvm` or community packages +- Native Windows LLVM is static-only for PECOS's purposes +- Use WSL2/Linux for the full HUGR test lane +- For targeted static LLVM builds, configure a full development package with `pecos llvm configure C:\path\to\llvm` ### Security @@ -271,7 +322,7 @@ cargo run -p pecos-cli -- llvm version ### Wrong LLVM version detected -PECOS requires LLVM 14.x. If you have multiple LLVM versions installed, the tool will prioritize LLVM 14. Use the `find` command to see which installation is detected: +PECOS requires LLVM 21.1.x. If you have multiple LLVM versions installed, the tool will prioritize LLVM 21.1. Use the `find` command to see which installation is detected: ```bash cargo run -p pecos-cli -- llvm find @@ -283,27 +334,27 @@ If automatic configuration doesn't work, you can manually set the environment va ```bash # Unix/macOS -export LLVM_SYS_140_PREFIX=/path/to/llvm +export LLVM_SYS_211_PREFIX=/path/to/llvm # Windows -set LLVM_SYS_140_PREFIX=C:\path\to\llvm +set LLVM_SYS_211_PREFIX=C:\path\to\llvm ``` Or add to `.cargo/config.toml`: ```toml [env] -LLVM_SYS_140_PREFIX = { value = "/path/to/llvm", force = true } +LLVM_SYS_211_PREFIX = { value = "/path/to/llvm", force = true } ``` ## PECOS Home Directory -LLVM is installed to `~/.pecos/deps/llvm-14/`, which is part of the PECOS home directory structure: +LLVM is installed to `~/.pecos/deps/llvm-21.1/`, which is part of the PECOS home directory structure: ``` ~/.pecos/ ├── deps/ -│ ├── llvm/ # LLVM-14 installation +│ ├── llvm-21.1/ # LLVM 21.1 installation │ ├── cuda/ # CUDA Toolkit │ └── cuquantum/ # cuQuantum SDK └── cache/ # Build artifacts diff --git a/python/pecos-rslib-llvm/Cargo.toml b/python/pecos-rslib-llvm/Cargo.toml index 8c230b0a4..3a81db1af 100644 --- a/python/pecos-rslib-llvm/Cargo.toml +++ b/python/pecos-rslib-llvm/Cargo.toml @@ -26,7 +26,7 @@ extension-module = [ [dependencies] pecos-llvm.workspace = true -inkwell = { workspace = true, features = ["llvm14-0"] } +inkwell.workspace = true pyo3.workspace = true regex.workspace = true tempfile.workspace = true diff --git a/python/pecos-rslib-llvm/src/llvm_bindings.rs b/python/pecos-rslib-llvm/src/llvm_bindings.rs index 4cf3cefbf..45b736379 100644 --- a/python/pecos-rslib-llvm/src/llvm_bindings.rs +++ b/python/pecos-rslib-llvm/src/llvm_bindings.rs @@ -290,6 +290,8 @@ impl PyLLVMModule { function: ll_function.get(), // Get the underlying FunctionValue context_ptr: self.context_ptr, module_id: self.module_ptr as usize, + ret_pointee_type: func_type.ret_pointee_type, + param_pointee_types: func_type.param_pointee_types.clone(), } } @@ -309,6 +311,7 @@ impl PyLLVMModule { let global = module.add_global(name, ll_type, init_val); PyGlobalVariable { global, + value_type: ll_type, context_ptr: self.context_ptr, } } @@ -377,7 +380,12 @@ impl PyModuleContext { is_var_arg: Option, ) -> PyFunctionType { let context = unsafe { &*self.context_ptr }; + let ret_pointee_type = return_type.pointer_pointee_type(); let ret_ty = return_type.to_ll_type(context); + let param_pointee_types: Vec<_> = param_types + .iter() + .map(PyAnyType::pointer_pointee_type) + .collect(); let param_tys: Vec<_> = param_types .into_iter() .map(|pt| pt.to_ll_type(context)) @@ -385,7 +393,9 @@ impl PyModuleContext { PyFunctionType { ret_type: ret_ty, + ret_pointee_type, param_types: param_tys, + param_pointee_types, var_args: is_var_arg.unwrap_or(false), context_ptr: self.context_ptr, } @@ -428,6 +438,17 @@ impl PyAnyType { PyAnyType::Array(t) => t.ll_type, } } + + fn pointer_pointee_type(&self) -> Option> { + match self { + PyAnyType::Pointer(t) => t.pointee_type, + PyAnyType::Int(_) + | PyAnyType::Double(_) + | PyAnyType::Void(_) + | PyAnyType::Struct(_) + | PyAnyType::Array(_) => None, + } + } } /// Type equality by LLVM `LLVMTypeRef` identity within one `Context` @@ -462,6 +483,38 @@ fn lltype_hash(a: LLType<'static>) -> u64 { std::hash::Hasher::finish(&h) } +fn pointer_type_richcmp( + py: Python<'_>, + this: &PyPointerType, + other: &Bound<'_, PyAny>, + op: CompareOp, +) -> Py { + match op { + CompareOp::Eq | CompareOp::Ne => { + let eq = other.extract::().is_ok_and(|o| match o { + PyAnyType::Pointer(p) => { + this.ll_type == p.ll_type && this.pointee_type == p.pointee_type + } + _ => this.ll_type == o.ll_type(), + }); + let val = if matches!(op, CompareOp::Eq) { eq } else { !eq }; + val.into_pyobject(py) + .expect("bool -> PyBool is infallible") + .to_owned() + .into_any() + .unbind() + } + _ => py.NotImplemented(), + } +} + +fn pointer_type_hash(pointer: PyPointerType) -> u64 { + let mut h = std::collections::hash_map::DefaultHasher::new(); + std::hash::Hash::hash(&pointer.ll_type, &mut h); + std::hash::Hash::hash(&pointer.pointee_type, &mut h); + std::hash::Hasher::finish(&h) +} + /// Python wrapper for struct types #[pyclass(name = "StructType", from_py_object)] #[derive(Copy, Clone)] @@ -482,6 +535,7 @@ impl PyStructType { let ptr_type = ll_type.as_pointer(context); PyPointerType { ll_type: ptr_type, + pointee_type: Some(ll_type), context_ptr: self.context_ptr, } } @@ -492,6 +546,7 @@ impl PyStructType { #[derive(Copy, Clone)] pub struct PyPointerType { ll_type: LLType<'static>, + pointee_type: Option>, context_ptr: *mut Context, } @@ -501,10 +556,10 @@ unsafe impl Sync for PyPointerType {} #[pymethods] impl PyPointerType { fn __richcmp__(&self, py: Python<'_>, other: &Bound<'_, PyAny>, op: CompareOp) -> Py { - lltype_richcmp(py, self.ll_type, other, op) + pointer_type_richcmp(py, self, other, op) } fn __hash__(&self) -> u64 { - lltype_hash(self.ll_type) + pointer_type_hash(*self) } fn as_pointer(&self) -> PyPointerType { @@ -512,6 +567,7 @@ impl PyPointerType { let ptr_type = self.ll_type.as_pointer(context); PyPointerType { ll_type: ptr_type, + pointee_type: Some(self.ll_type), context_ptr: self.context_ptr, } } @@ -542,6 +598,7 @@ impl PyIntType { let ptr_type = self.ll_type.as_pointer(context); PyPointerType { ll_type: ptr_type, + pointee_type: Some(self.ll_type), context_ptr: self.context_ptr, } } @@ -581,6 +638,7 @@ impl PyDoubleType { let ptr_type = self.ll_type.as_pointer(context); PyPointerType { ll_type: ptr_type, + pointee_type: Some(self.ll_type), context_ptr: self.context_ptr, } } @@ -642,6 +700,7 @@ impl PyArrayType { let ptr_type = self.ll_type.as_pointer(context); PyPointerType { ll_type: ptr_type, + pointee_type: Some(self.ll_type), context_ptr: self.context_ptr, } } @@ -902,9 +961,18 @@ impl PyIRBuilder { let result = builder .call(function.function, &arg_values, name) .map_err(|e| PyRuntimeError::new_err(format!("call failed: {e}")))?; - Ok(result.map(|value| PyLLValue { - value, - context_ptr: self.context_ptr, + Ok(result.map(|value| { + let value = match value { + LLValue::Pointer(pointer) => LLValue::Pointer(LLPointerValue::new( + pointer.value(), + function.ret_pointee_type, + )), + LLValue::Int(_) | LLValue::Float(_) | LLValue::Array(_) => value, + }; + PyLLValue { + value, + context_ptr: self.context_ptr, + } })) } @@ -945,7 +1013,7 @@ impl PyIRBuilder { }) } - /// Load from a pointer (`load`; LLVM-14 typed-pointer pointee). + /// Load from a pointer (`load`; uses the tracked pointee type for opaque pointers). #[pyo3(signature = (ptr, name=""))] fn load(&mut self, ptr: PyLLValue, name: &str) -> PyResult { let builder = unsafe { &mut *self.builder_ptr }; @@ -1275,6 +1343,8 @@ pub struct PyFunction { context_ptr: *mut Context, /// Module ID for comment tracking module_id: usize, + ret_pointee_type: Option>, + param_pointee_types: Vec>>, } unsafe impl Send for PyFunction {} @@ -1300,11 +1370,17 @@ impl PyFunction { // Get function parameters and wrap in PyLLValue self.function .get_param_iter() - .map(|param| { + .enumerate() + .map(|(index, param)| { // Convert BasicValueEnum to LLValue - only supporting types in LLValue enum let value = match param { inkwell::values::BasicValueEnum::IntValue(v) => LLValue::Int(v), - inkwell::values::BasicValueEnum::PointerValue(v) => LLValue::Pointer(v), + inkwell::values::BasicValueEnum::PointerValue(v) => { + LLValue::Pointer(LLPointerValue::new( + v, + self.param_pointee_types.get(index).copied().flatten(), + )) + } inkwell::values::BasicValueEnum::ArrayValue(v) => LLValue::Array(v), _ => panic!("Unsupported parameter type (float values not in LLValue enum)"), }; @@ -1335,7 +1411,9 @@ unsafe impl Sync for PyBasicBlock {} #[derive(Clone)] pub struct PyFunctionType { ret_type: LLType<'static>, + ret_pointee_type: Option>, param_types: Vec>, + param_pointee_types: Vec>>, var_args: bool, #[allow(dead_code)] context_ptr: *mut Context, @@ -1363,7 +1441,12 @@ impl PyFunctionType { }; let context = unsafe { &*context_ptr }; + let ret_pointee_type = return_type.pointer_pointee_type(); let ret_ty = return_type.to_ll_type(context); + let param_pointee_types: Vec<_> = param_types + .iter() + .map(PyAnyType::pointer_pointee_type) + .collect(); let param_tys: Vec<_> = param_types .into_iter() .map(|pt| pt.to_ll_type(context)) @@ -1371,7 +1454,9 @@ impl PyFunctionType { Self { ret_type: ret_ty, + ret_pointee_type, param_types: param_tys, + param_pointee_types, var_args, context_ptr, } @@ -1410,7 +1495,7 @@ impl PyLLValue { let ptr_val = int_val.const_to_pointer(target_ptr_type); Ok(Self { - value: LLValue::Pointer(ptr_val), + value: LLValue::Pointer(LLPointerValue::new(ptr_val, ptr_type.pointee_type)), context_ptr: self.context_ptr, }) } @@ -1429,7 +1514,8 @@ impl PyLLValue { context_ptr: self.context_ptr, }), LLValue::Pointer(v) => PyAnyType::Pointer(PyPointerType { - ll_type: LLType::Pointer(v.get_type()), + ll_type: LLType::Pointer(v.value().get_type()), + pointee_type: v.pointee_type(), context_ptr: self.context_ptr, }), LLValue::Array(v) => PyAnyType::Array(PyArrayType { @@ -1448,6 +1534,7 @@ impl PyLLValue { #[pyclass(name = "GlobalVariable")] pub struct PyGlobalVariable { global: inkwell::values::GlobalValue<'static>, + value_type: LLType<'static>, context_ptr: *mut Context, } @@ -1467,6 +1554,7 @@ impl PyGlobalVariable { let global = module_ref.add_global(name, ll_type, None); Self { global, + value_type: ll_type, context_ptr: module.context_ptr, } } @@ -1477,7 +1565,7 @@ impl PyGlobalVariable { match &value.value { LLValue::Int(v) => self.global.set_initializer(v), LLValue::Float(v) => self.global.set_initializer(v), - LLValue::Pointer(v) => self.global.set_initializer(v), + LLValue::Pointer(v) => self.global.set_initializer(&v.value()), LLValue::Array(v) => self.global.set_initializer(v), } } @@ -1516,11 +1604,20 @@ impl PyGlobalVariable { .collect(); let int_indices = int_indices?; + let basic_ty = self + .value_type + .to_basic_metadata_type() + .ok_or_else(|| PyRuntimeError::new_err("Cannot GEP into a void global"))?; // Use const_gep for global variables - let gep_val = unsafe { self.global.as_pointer_value().const_gep(&int_indices) }; + let gep_val = unsafe { + self.global + .as_pointer_value() + .const_gep(basic_ty, &int_indices) + }; + let pointee_type = gep_result_pointee_type(self.value_type, &int_indices); Ok(PyLLValue { - value: LLValue::Pointer(gep_val), + value: LLValue::Pointer(LLPointerValue::new(gep_val, pointee_type)), context_ptr: self.context_ptr, }) } @@ -1528,7 +1625,10 @@ impl PyGlobalVariable { /// Get the pointer value of this global fn as_pointer_value(&self) -> PyLLValue { PyLLValue { - value: LLValue::Pointer(self.global.as_pointer_value()), + value: LLValue::Pointer(LLPointerValue::new( + self.global.as_pointer_value(), + Some(self.value_type), + )), context_ptr: self.context_ptr, } } @@ -1827,9 +1927,12 @@ impl PyModuleRef { }) })?; - // Write module to bitcode + // `MemoryBuffer::as_slice()` includes LLVM's trailing C-string NUL; + // that byte is not part of the bitcode stream and strict readers + // reject it. let bitcode_buffer = module.write_bitcode_to_memory(); - Ok(bitcode_buffer.as_slice().to_vec()) + let bitcode = bitcode_buffer.as_slice(); + Ok(bitcode[..bitcode.len().saturating_sub(1)].to_vec()) } } diff --git a/python/pecos-rslib/src/lib.rs b/python/pecos-rslib/src/lib.rs index f22d4f96d..c01231733 100644 --- a/python/pecos-rslib/src/lib.rs +++ b/python/pecos-rslib/src/lib.rs @@ -102,11 +102,12 @@ use wasm_foreign_object_bindings::PyWasmForeignObject; /// Find an LLVM tool by name (e.g., "llvm-as", "llc", "opt"). /// -/// This searches for the tool in the LLVM 14 installation using the same +/// This searches for the tool in the LLVM 21.1 installation using the same /// logic as the pecos-build crate: -/// 1. ~/.pecos/llvm/ (PECOS managed installation) -/// 2. Project-local llvm/ directory -/// 3. System installations (Homebrew on macOS, package manager on Linux) +/// 1. ~/.pecos/deps/llvm-21.1/ (PECOS-managed installation where supported) +/// 2. ~/.pecos/llvm/ (legacy path) +/// 3. Project-local llvm/ directory +/// 4. System installations (Homebrew on macOS, package manager on Linux) /// /// Returns None if the tool is not found. #[pyfunction] @@ -187,7 +188,7 @@ fn pecos_rslib(_py: Python<'_>, m: &Bound<'_, PyModule>) -> PyResult<()> { setup_cuda_library_path(); // CRITICAL: Preload libselene_simple_runtime.so with RTLD_GLOBAL BEFORE anything else - // This prevents conflicts with LLVM-14 when the Selene runtime is loaded later + // This prevents conflicts with LLVM-21.1 when the Selene runtime is loaded later #[cfg(unix)] { use std::ffi::CString; diff --git a/python/pecos-rslib/tests/test_llvm_comprehensive.py b/python/pecos-rslib/tests/test_llvm_comprehensive.py index ea4b5de94..c255ad6d8 100644 --- a/python/pecos-rslib/tests/test_llvm_comprehensive.py +++ b/python/pecos-rslib/tests/test_llvm_comprehensive.py @@ -68,6 +68,46 @@ def test_function_creation(qir_module) -> None: _ = main_func, h_gate, mz_func +def test_load_pointer_function_argument(qir_module) -> None: + from pecos_rslib_llvm import ir + + module, ctx = qir_module + + i32 = ctx.int_type(32) + void = ctx.void_type() + func_type = ctx.function_type(void, [i32.as_pointer()], False) + test_func = module.add_function("load_arg", func_type) + entry = test_func.append_basic_block("entry") + builder = ir.IRBuilder(entry) + + loaded = builder.load(test_func.args[0], "loaded") + builder.ret_void() + + _ = loaded + + +def test_load_pointer_return_value(qir_module) -> None: + from pecos_rslib_llvm import ir + + module, ctx = qir_module + + i32 = ctx.int_type(32) + callee_type = ctx.function_type(i32.as_pointer(), [], False) + callee = module.add_function("returns_i32_ptr", callee_type) + + void = ctx.void_type() + caller_type = ctx.function_type(void, [], False) + caller = module.add_function("load_call_result", caller_type) + entry = caller.append_basic_block("entry") + builder = ir.IRBuilder(entry) + + ptr = builder.call(callee, [], "ptr") + loaded = builder.load(ptr, "loaded") + builder.ret_void() + + _ = loaded + + def test_global_variables(qir_module) -> None: from pecos_rslib_llvm import ir diff --git a/python/quantum-pecos/README.md b/python/quantum-pecos/README.md index 2014f26f0..bbb2d2dca 100644 --- a/python/quantum-pecos/README.md +++ b/python/quantum-pecos/README.md @@ -22,7 +22,7 @@ calls to Wasm VMs, conditional branching, and more. - Fast Simulation: Leverages a fast stabilizer simulation algorithm. - Multi-language extensions: Core functionalities implemented via Rust for performance and safety. Additional add-ons and extension support in C/C++ via Cython. -- LLVM IR Support: Execute LLVM Intermediate Representation programs for hybrid quantum/classical computing. LLVM support is optional - PECOS can be built without LLVM by using `--no-default-features` when building the Rust crates. When LLVM is enabled (default), requires LLVM version 14. +- LLVM IR Support: Execute LLVM Intermediate Representation programs for hybrid quantum/classical computing. LLVM support is optional - PECOS can be built without LLVM by using `--no-default-features` when building the Rust crates. When LLVM is enabled (default), requires LLVM version 21.1. ## Getting Started @@ -116,7 +116,7 @@ pecos = "0.x.x" # Replace with the latest version #### Optional Dependencies -- **LLVM version 14**: Required for LLVM IR execution support (optional) +- **LLVM version 21.1**: Required for LLVM IR execution support (optional) PECOS provides an automated installer or you can install manually: diff --git a/python/quantum-pecos/src/pecos/simulators/mps_pytket/__init__.py b/python/quantum-pecos/src/pecos/simulators/mps_pytket/__init__.py index b96f5c02d..370d53bc5 100644 --- a/python/quantum-pecos/src/pecos/simulators/mps_pytket/__init__.py +++ b/python/quantum-pecos/src/pecos/simulators/mps_pytket/__init__.py @@ -15,4 +15,7 @@ # specific language governing permissions and limitations under the License. from pecos.simulators.mps_pytket import bindings +from pecos.simulators.mps_pytket._nvmath_compat import patch_nvmath_cupy_external_stream from pecos.simulators.mps_pytket.state import MPS + +patch_nvmath_cupy_external_stream() diff --git a/python/quantum-pecos/src/pecos/simulators/mps_pytket/_nvmath_compat.py b/python/quantum-pecos/src/pecos/simulators/mps_pytket/_nvmath_compat.py new file mode 100644 index 000000000..9efe60971 --- /dev/null +++ b/python/quantum-pecos/src/pecos/simulators/mps_pytket/_nvmath_compat.py @@ -0,0 +1,62 @@ +# Copyright 2026 The PECOS Developers +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with +# the License.You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the +# specific language governing permissions and limitations under the License. + +"""Compatibility patches for pytket-cutensornet's nvmath dependency.""" + +from __future__ import annotations + +from importlib import import_module + +_PATCHED_ATTR = "_pecos_cupy_stream_from_external_patch" + + +class _CudaStreamHolder: + """Adapter object implementing the CUDA stream protocol for a raw stream handle.""" + + def __init__(self, handle: int) -> None: + self.handle = int(handle) + + def __cuda_stream__(self) -> tuple[int, int]: + return (0, self.handle) + + +def patch_nvmath_cupy_external_stream() -> bool: + """Use CuPy's supported external-stream API in nvmath when it is available. + + nvmath-python 0.9.0 still wraps raw CUDA stream pointers with + ``cupy.cuda.ExternalStream``, which is deprecated in CuPy 14. CuPy's + replacement API accepts an object implementing the CUDA stream protocol. + """ + try: + cp = import_module("cupy") + package_ifc_cupy = import_module("nvmath.internal.package_ifc_cupy") + except ImportError: + return False + + try: + cupy_package = package_ifc_cupy.CupyPackage + from_external = getattr(cp.cuda.Stream, "from_external", None) + except AttributeError: + return False + + if getattr(cupy_package, _PATCHED_ATTR, False): + return True + + if from_external is None: + return False + + def create_external_stream(device_id: int, stream_ptr: int) -> object: + del device_id + return from_external(_CudaStreamHolder(stream_ptr)) + + cupy_package.create_external_stream = staticmethod(create_external_stream) + setattr(cupy_package, _PATCHED_ATTR, True) + return True diff --git a/python/quantum-pecos/tests/guppy/test_hugr_compiler_parity.py b/python/quantum-pecos/tests/guppy/test_hugr_compiler_parity.py index b1e810606..3c79feda8 100644 --- a/python/quantum-pecos/tests/guppy/test_hugr_compiler_parity.py +++ b/python/quantum-pecos/tests/guppy/test_hugr_compiler_parity.py @@ -4,6 +4,7 @@ for the same HUGR input. """ +from collections import Counter from pathlib import Path import pytest @@ -99,18 +100,27 @@ def compare_compilers( if selene_qis == rust_qis: return True, "QIS calls match exactly" - # If not exact match, provide diagnostic info - selene_set = set(selene_qis) - rust_set = set(rust_qis) + selene_counts = Counter(selene_qis) + rust_counts = Counter(rust_qis) + selene_set = set(selene_counts) + rust_set = set(rust_counts) - only_selene = selene_set - rust_set - only_rust = rust_set - selene_set + # LLVM 21 can peel runtime loops, duplicating static call sites while + # preserving the dynamic behavior. In that case exact call-site + # multiplicity is not a robust parity signal. + if selene_set == rust_set and ( + "llvm.loop.peeled.count" in selene_ir or "llvm.loop.peeled.count" in rust_ir + ): + return True, "QIS call set matches; static call counts differ only after LLVM loop peeling" + + only_selene = selene_counts - rust_counts + only_rust = rust_counts - selene_counts msg = "QIS calls differ:\n" if only_selene: - msg += f" Only in Selene: {only_selene}\n" + msg += f" Only in Selene: {dict(only_selene)}\n" if only_rust: - msg += f" Only in Rust: {only_rust}\n" + msg += f" Only in Rust: {dict(only_rust)}\n" return False, msg diff --git a/python/quantum-pecos/tests/slr_tests/ast_guppy/test_tier2_semantic.py b/python/quantum-pecos/tests/slr_tests/ast_guppy/test_tier2_semantic.py index 49ae0685a..f24209932 100644 --- a/python/quantum-pecos/tests/slr_tests/ast_guppy/test_tier2_semantic.py +++ b/python/quantum-pecos/tests/slr_tests/ast_guppy/test_tier2_semantic.py @@ -44,10 +44,8 @@ bitcode via the bundled `selene_helios_qis_plugin` (+ Helios QIR runtime) -- `selene_sim.build(BitcodeString(...)) -> run_shots(Stim)`. So the direct `qir_to_qis -> Selene` - differential long claimed "blocked" (an - alleged LLVM 14<->21 / opaque-vs-typed bridge) is in fact - available with zero PECOS LLVM work: PECOS-Rust stays LLVM-14; - the LLVM-21 capability lives entirely in the qir-qis + + differential long claimed "blocked" by LLVM version or pointer + representation differences is available through the qir-qis + selene_sim *Python* deps. Layer D (`test_tier2_executable_differential`) lands the **representative** executable differential (deterministic diff --git a/scripts/native_bench/bench_pecos/Cargo.lock b/scripts/native_bench/bench_pecos/Cargo.lock index 5030ea8a4..7a6893b8c 100644 --- a/scripts/native_bench/bench_pecos/Cargo.lock +++ b/scripts/native_bench/bench_pecos/Cargo.lock @@ -97,15 +97,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "arbitrary" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" -dependencies = [ - "derive_arbitrary", -] - [[package]] name = "arrayvec" version = "0.7.6" @@ -576,17 +567,6 @@ dependencies = [ "powerfmt", ] -[[package]] -name = "derive_arbitrary" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "digest" version = "0.10.7" @@ -767,6 +747,7 @@ checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" dependencies = [ "crc32fast", "miniz_oxide", + "zlib-rs", ] [[package]] @@ -913,96 +894,6 @@ dependencies = [ "xml-rs", ] -[[package]] -name = "glam" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "333928d5eb103c5d4050533cec0384302db6be8ef7d3cebd30ec6a35350353da" - -[[package]] -name = "glam" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3abb554f8ee44336b72d522e0a7fe86a29e09f839a36022fa869a7dfe941a54b" - -[[package]] -name = "glam" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4126c0479ccf7e8664c36a2d719f5f2c140fbb4f9090008098d2c291fa5b3f16" - -[[package]] -name = "glam" -version = "0.17.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01732b97afd8508eee3333a541b9f7610f454bb818669e66e90f5f57c93a776" - -[[package]] -name = "glam" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525a3e490ba77b8e326fb67d4b44b4bd2f920f44d4cc73ccec50adc68e3bee34" - -[[package]] -name = "glam" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b8509e6791516e81c1a630d0bd7fbac36d2fa8712a9da8662e716b52d5051ca" - -[[package]] -name = "glam" -version = "0.20.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43e957e744be03f5801a55472f593d43fabdebf25a4585db250f04d86b1675f" - -[[package]] -name = "glam" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "518faa5064866338b013ff9b2350dc318e14cc4fcd6cb8206d7e7c9886c98815" - -[[package]] -name = "glam" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f597d56c1bd55a811a1be189459e8fad2bbc272616375602443bdfb37fa774" - -[[package]] -name = "glam" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e4afd9ad95555081e109fe1d21f2a30c691b5f0919c67dfa690a2e1eb6bd51c" - -[[package]] -name = "glam" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5418c17512bdf42730f9032c74e1ae39afc408745ebb2acf72fbc4691c17945" - -[[package]] -name = "glam" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "151665d9be52f9bb40fc7966565d39666f2d1e69233571b71b87791c7e0528b3" - -[[package]] -name = "glam" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e05e7e6723e3455f4818c7b26e855439f7546cf617ef669d1adedb8669e5cb9" - -[[package]] -name = "glam" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "779ae4bf7e8421cf91c0b3b64e7e8b40b862fba4d393f59150042de7c4965a94" - -[[package]] -name = "glam" -version = "0.29.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8babf46d4c1c9d92deac9f7be466f76dfc4482b6452fc5024b5e8daf6ffeb3ee" - [[package]] name = "glam" version = "0.30.10" @@ -1021,6 +912,12 @@ version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f70749695b063ecbf6b62949ccccde2e733ec3ecbbd71d467dca4e5c6c97cca0" +[[package]] +name = "glam" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fb167719045debebe9f532320accc7b5c993c5a3b813f5696a11d5ca7bdc57b" + [[package]] name = "glob" version = "0.3.3" @@ -1703,29 +1600,15 @@ dependencies = [ [[package]] name = "nalgebra" -version = "0.34.2" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df76ea0ff5c7e6b88689085804d6132ded0ddb9de5ca5b8aeb9eeadc0508a70a" +checksum = "adc43a60c217b0c6ff46e47f26911015ad8d2e5a8be1af668c67e370d99a4346" dependencies = [ "approx", - "glam 0.14.0", - "glam 0.15.2", - "glam 0.16.0", - "glam 0.17.3", - "glam 0.18.0", - "glam 0.19.0", - "glam 0.20.5", - "glam 0.21.3", - "glam 0.22.0", - "glam 0.23.0", - "glam 0.24.2", - "glam 0.25.0", - "glam 0.27.0", - "glam 0.28.0", - "glam 0.29.3", "glam 0.30.10", "glam 0.31.1", "glam 0.32.1", + "glam 0.33.0", "matrixmultiply", "nalgebra-macros", "num-complex", @@ -1979,12 +1862,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - [[package]] name = "pecos-build" version = "0.2.0-dev.0" @@ -2102,7 +1979,7 @@ dependencies = [ "rand 0.10.1", "rand_core 0.10.0", "rapidhash", - "wide 1.2.0", + "wide", ] [[package]] @@ -2117,7 +1994,7 @@ dependencies = [ "rand 0.10.1", "rayon", "smallvec", - "wide 1.2.0", + "wide", ] [[package]] @@ -2704,15 +2581,6 @@ dependencies = [ "rayon-cond", ] -[[package]] -name = "safe_arch" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b02de82ddbe1b636e6170c21be622223aea188ef2e139be0a5b219ec215323" -dependencies = [ - "bytemuck", -] - [[package]] name = "safe_arch" version = "1.0.0" @@ -2878,15 +2746,14 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "simba" -version = "0.9.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c99284beb21666094ba2b75bbceda012e610f5479dfcc2d6e2426f53197ffd95" +checksum = "8f45c644a9f3a386f9288625d9f0c1e999e1acf07a37df35d0516c7f199d9cb2" dependencies = [ "approx", "num-complex", "num-traits", - "paste", - "wide 0.7.33", + "wide", ] [[package]] @@ -3138,18 +3005,12 @@ dependencies = [ "indexmap", "serde_core", "serde_spanned", - "toml_datetime 1.1.1+spec-1.1.0", + "toml_datetime", "toml_parser", "toml_writer", - "winnow 1.0.1", + "winnow", ] -[[package]] -name = "toml_datetime" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" - [[package]] name = "toml_datetime" version = "1.1.1+spec-1.1.0" @@ -3161,14 +3022,15 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.27" +version = "0.25.12+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7" dependencies = [ "indexmap", - "toml_datetime 0.6.11", - "toml_write", - "winnow 0.7.15", + "toml_datetime", + "toml_parser", + "toml_writer", + "winnow", ] [[package]] @@ -3177,15 +3039,9 @@ version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ - "winnow 1.0.1", + "winnow", ] -[[package]] -name = "toml_write" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" - [[package]] name = "toml_writer" version = "1.1.1+spec-1.1.0" @@ -3262,6 +3118,12 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "typed-path" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e28f89b80c87b8fb0cf04ab448d5dd0dd0ade2f8891bae878de66a75a28600e" + [[package]] name = "typenum" version = "1.19.0" @@ -3662,16 +3524,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "wide" -version = "0.7.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce5da8ecb62bcd8ec8b7ea19f69a51275e91299be594ea5cc6ef7819e16cd03" -dependencies = [ - "bytemuck", - "safe_arch 0.7.4", -] - [[package]] name = "wide" version = "1.2.0" @@ -3679,7 +3531,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "198f6abc41fab83526d10880fa5c17e2b4ee44e763949b4bb34e2fd1e8ca48e4" dependencies = [ "bytemuck", - "safe_arch 1.0.0", + "safe_arch", ] [[package]] @@ -4025,19 +3877,13 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" -version = "0.7.15" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" dependencies = [ "memchr", ] -[[package]] -name = "winnow" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" - [[package]] name = "wit-bindgen" version = "0.51.0" @@ -4271,21 +4117,24 @@ dependencies = [ [[package]] name = "zip" -version = "2.4.2" +version = "8.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabe6324e908f85a1c52063ce7aa26b68dcb7eb6dbc83a2d148403c9bc3eba50" +checksum = "2d04a6b5381502aa6087c94c669499eb1602eb9c5e8198e534de571f7154809b" dependencies = [ - "arbitrary", "crc32fast", - "crossbeam-utils", - "displaydoc", "flate2", "indexmap", "memchr", - "thiserror 2.0.18", + "typed-path", "zopfli", ] +[[package]] +name = "zlib-rs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be3d40e40a133f9c916ee3f9f4fa2d9d63435b5fbe1bfc6d9dae0aa0ada1513" + [[package]] name = "zmij" version = "1.0.21" diff --git a/scripts/win-msvc-bootstrap.ps1 b/scripts/win-msvc-bootstrap.ps1 index 01b4a3ad5..c53cd5d54 100644 --- a/scripts/win-msvc-bootstrap.ps1 +++ b/scripts/win-msvc-bootstrap.ps1 @@ -22,7 +22,7 @@ # # This script is the ONLY writer of the `[target.x86_64-pc-windows-msvc]` table # and the MSVC subset of `[env]` (LIB/INCLUDE/LIBPATH). It does a *scoped* merge -# so it never disturbs the keys the Rust writers own (LLVM_SYS_140_PREFIX, +# so it never disturbs the keys the Rust writers own (LLVM_SYS_211_PREFIX, # CUQUANTUM_ROOT) or any other table, and never emits a duplicate `[env]`. # # Inert (exit 0) on non-Windows so it is safe as an unconditional just prereq. From 384ca5e32cd0b81a89cf47a0bc863acd13ad1f3b Mon Sep 17 00:00:00 2001 From: Ciaran Ryan-Anderson Date: Sun, 31 May 2026 18:03:31 -0600 Subject: [PATCH 05/26] Fix LLVM 21 migration and pointer metadata. --- crates/pecos-build/src/home.rs | 224 ++++++++++- crates/pecos-cli/src/cli/install_cmd.rs | 3 +- crates/pecos-cli/src/cli/llvm_cmd.rs | 8 +- crates/pecos-cli/src/cli/migrate_cmd.rs | 57 ++- crates/pecos-cli/src/cli/setup_cmd.rs | 50 ++- crates/pecos-cli/src/main.rs | 25 +- crates/pecos-llvm/src/llvm_compat.rs | 371 ++++++++++++++++-- docs/development/dev-tools.md | 3 + docs/user-guide/llvm-setup.md | 4 + python/pecos-rslib-llvm/src/llvm_bindings.rs | 23 +- .../tests/test_llvm_comprehensive.py | 14 + 11 files changed, 714 insertions(+), 68 deletions(-) diff --git a/crates/pecos-build/src/home.rs b/crates/pecos-build/src/home.rs index 91555b62d..4b68a649e 100644 --- a/crates/pecos-build/src/home.rs +++ b/crates/pecos-build/src/home.rs @@ -347,6 +347,25 @@ pub struct LegacyDep { pub new: PathBuf, } +/// Description of a legacy dep that cannot be migrated safely. +pub struct IncompatibleLegacyDep { + /// Human-readable name (e.g. "LLVM") + pub name: &'static str, + /// Legacy path + pub old: PathBuf, + /// Why the dependency cannot be migrated + pub reason: String, +} + +/// Result of scanning legacy dependency paths. +#[derive(Default)] +pub struct LegacyDepStatus { + /// Legacy dependencies that can be moved to versioned paths. + pub migratable: Vec, + /// Legacy dependencies that need user action instead of migration. + pub incompatible: Vec, +} + /// Check for legacy top-level installs that should be migrated. /// /// Returns a list of deps whose old path exists but new path does not. @@ -355,9 +374,22 @@ pub struct LegacyDep { /// /// Returns an error if unable to determine paths. pub fn find_legacy_deps() -> Result> { - let mut found = Vec::new(); + Ok(find_legacy_dep_status()?.migratable) +} + +/// Check legacy installs and report both migratable and incompatible entries. +/// +/// # Errors +/// +/// Returns an error if unable to determine paths. +pub fn find_legacy_dep_status() -> Result { let deps_dir = get_deps_dir_path()?; + let home = get_pecos_home_path()?; + Ok(find_legacy_dep_status_at(&home, &deps_dir)) +} +fn find_legacy_dep_status_at(home: &Path, deps_dir: &Path) -> LegacyDepStatus { + let mut status = LegacyDepStatus::default(); let checks: &[(&str, &str)] = &[ ("LLVM", LLVM_VERSION), ("CUDA", crate::cuda::CUDA_VERSION), @@ -367,33 +399,64 @@ pub fn find_legacy_deps() -> Result> { for &(name, version) in checks { let lower = name.to_lowercase(); let versioned = deps_dir.join(format!("{lower}-{version}")); - if versioned.exists() { - continue; // Already at versioned path - } + let versioned_exists = versioned.exists(); + let mut migration_queued = false; // Check unversioned deps/ path (e.g. deps/llvm/) let unversioned = deps_dir.join(&lower); if unversioned.exists() { - found.push(LegacyDep { - name, - old: unversioned, - new: versioned.clone(), - }); - continue; + if let Some(reason) = legacy_incompatibility_reason(name, &unversioned) { + status.incompatible.push(IncompatibleLegacyDep { + name, + old: unversioned, + reason, + }); + } else if !versioned_exists { + status.migratable.push(LegacyDep { + name, + old: unversioned, + new: versioned.clone(), + }); + migration_queued = true; + } } // Check top-level legacy path (e.g. ~/.pecos/llvm/) - if let Ok(top_level) = get_pecos_home_path().map(|h| h.join(&lower)) - && top_level.exists() - { - found.push(LegacyDep { - name, - old: top_level, - new: versioned, - }); + let top_level = home.join(&lower); + if top_level.exists() { + if let Some(reason) = legacy_incompatibility_reason(name, &top_level) { + status.incompatible.push(IncompatibleLegacyDep { + name, + old: top_level, + reason, + }); + continue; + } + if !versioned_exists && !migration_queued { + status.migratable.push(LegacyDep { + name, + old: top_level, + new: versioned, + }); + } } } - Ok(found) + status +} + +fn legacy_incompatibility_reason(name: &str, old_path: &Path) -> Option { + if name != "LLVM" { + return None; + } + + if crate::llvm::is_valid_llvm(old_path) { + None + } else { + Some(format!( + "not a valid LLVM {} installation; it may be an older LLVM 14 install", + crate::llvm::REQUIRED_VERSION + )) + } } /// Migrate a single legacy dep by renaming old -> new. @@ -409,6 +472,16 @@ pub fn migrate_legacy_dep(dep: &LegacyDep) -> Result<()> { Ok(()) } +/// Remove an incompatible legacy dependency path. +/// +/// # Errors +/// +/// Returns an error if the directory cannot be removed. +pub fn remove_incompatible_legacy_dep(dep: &IncompatibleLegacyDep) -> Result<()> { + fs::remove_dir_all(&dep.old)?; + Ok(()) +} + /// Get information about the PECOS home directory #[derive(Debug)] pub struct HomeInfo { @@ -469,6 +542,26 @@ mod tests { std::env::temp_dir().join(format!("pecos_test_{prefix}_{pid}_{id}")) } + #[cfg(unix)] + fn create_fake_llvm_config(llvm_dir: &Path, version: &str) { + use std::os::unix::fs::PermissionsExt; + + let bin_dir = llvm_dir.join("bin"); + fs::create_dir_all(&bin_dir).expect("Should create fake llvm bin dir"); + let llvm_config = bin_dir.join("llvm-config"); + fs::write( + &llvm_config, + format!("#!/bin/sh\nif [ \"$1\" = \"--version\" ]; then echo \"{version}\"; fi\n"), + ) + .expect("Should write fake llvm-config"); + let mut permissions = fs::metadata(&llvm_config) + .expect("Should stat fake llvm-config") + .permissions(); + permissions.set_mode(0o755); + fs::set_permissions(&llvm_config, permissions) + .expect("Should make fake llvm-config executable"); + } + #[test] fn test_get_pecos_home_default() { // Test that default home ends with .pecos (uses real home dir) @@ -544,4 +637,97 @@ mod tests { // Cleanup let _ = std::fs::remove_dir_all(&test_home); } + + #[test] + fn legacy_migration_skips_invalid_llvm() { + let test_home = unique_test_dir("legacy_invalid_llvm"); + let deps = test_home.join("deps"); + let legacy_llvm = test_home.join("llvm"); + fs::create_dir_all(&legacy_llvm).expect("Should create legacy llvm dir"); + + let status = find_legacy_dep_status_at(&test_home, &deps); + assert!( + status.migratable.iter().all(|dep| dep.name != "LLVM"), + "invalid legacy LLVM must not migrate into llvm-21.1" + ); + assert_eq!(status.incompatible.len(), 1); + assert_eq!(status.incompatible[0].name, "LLVM"); + assert_eq!(status.incompatible[0].old, legacy_llvm); + + let _ = std::fs::remove_dir_all(&test_home); + } + + #[test] + fn legacy_migration_reports_invalid_unversioned_llvm() { + let test_home = unique_test_dir("legacy_invalid_unversioned_llvm"); + let deps = test_home.join("deps"); + let legacy_llvm = deps.join("llvm"); + fs::create_dir_all(&legacy_llvm).expect("Should create legacy llvm dir"); + + let status = find_legacy_dep_status_at(&test_home, &deps); + assert!( + status.migratable.iter().all(|dep| dep.name != "LLVM"), + "invalid unversioned LLVM must not migrate into llvm-21.1" + ); + assert_eq!(status.incompatible.len(), 1); + assert_eq!(status.incompatible[0].name, "LLVM"); + assert_eq!(status.incompatible[0].old, legacy_llvm); + + let _ = std::fs::remove_dir_all(&test_home); + } + + #[test] + fn legacy_migration_reports_invalid_llvm_when_versioned_path_exists() { + let test_home = unique_test_dir("legacy_invalid_llvm_with_current"); + let deps = test_home.join("deps"); + let legacy_llvm = test_home.join("llvm"); + let versioned_llvm = deps.join(format!("llvm-{LLVM_VERSION}")); + fs::create_dir_all(&legacy_llvm).expect("Should create legacy llvm dir"); + fs::create_dir_all(&versioned_llvm).expect("Should create versioned llvm dir"); + + let status = find_legacy_dep_status_at(&test_home, &deps); + assert!(status.migratable.is_empty()); + assert_eq!(status.incompatible.len(), 1); + assert_eq!(status.incompatible[0].name, "LLVM"); + assert_eq!(status.incompatible[0].old, legacy_llvm); + + let _ = std::fs::remove_dir_all(&test_home); + } + + #[cfg(unix)] + #[test] + fn legacy_migration_reports_top_level_invalid_llvm_when_unversioned_can_migrate() { + let test_home = unique_test_dir("legacy_invalid_top_level_with_unversioned"); + let deps = test_home.join("deps"); + let unversioned_llvm = deps.join("llvm"); + let top_level_llvm = test_home.join("llvm"); + create_fake_llvm_config(&unversioned_llvm, crate::llvm::REQUIRED_VERSION); + fs::create_dir_all(&top_level_llvm).expect("Should create top-level llvm dir"); + + let status = find_legacy_dep_status_at(&test_home, &deps); + assert_eq!(status.migratable.len(), 1); + assert_eq!(status.migratable[0].name, "LLVM"); + assert_eq!(status.migratable[0].old, unversioned_llvm); + assert_eq!(status.incompatible.len(), 1); + assert_eq!(status.incompatible[0].name, "LLVM"); + assert_eq!(status.incompatible[0].old, top_level_llvm); + + let _ = std::fs::remove_dir_all(&test_home); + } + + #[test] + fn legacy_migration_still_finds_non_llvm_deps() { + let test_home = unique_test_dir("legacy_cuda"); + let deps = test_home.join("deps"); + let legacy_cuda = test_home.join("cuda"); + fs::create_dir_all(&legacy_cuda).expect("Should create legacy cuda dir"); + + let status = find_legacy_dep_status_at(&test_home, &deps); + assert_eq!(status.migratable.len(), 1); + assert_eq!(status.incompatible.len(), 0); + assert_eq!(status.migratable[0].name, "CUDA"); + assert_eq!(status.migratable[0].old, legacy_cuda); + + let _ = std::fs::remove_dir_all(&test_home); + } } diff --git a/crates/pecos-cli/src/cli/install_cmd.rs b/crates/pecos-cli/src/cli/install_cmd.rs index 9dc8e348c..b3119ae44 100644 --- a/crates/pecos-cli/src/cli/install_cmd.rs +++ b/crates/pecos-cli/src/cli/install_cmd.rs @@ -123,7 +123,8 @@ fn install_target(target: &str, force: bool, no_configure: bool, yes: bool) -> R fn confirm_managed_llvm_install(yes: bool) -> Result<()> { let version = pecos_build::llvm::installer::release_version(); - let install_dir = pecos_build::home::get_llvm_dir_path()?; + let install_dir = + pecos_build::home::get_versioned_dep_path("llvm", pecos_build::home::LLVM_VERSION)?; if let Some(reason) = pecos_build::llvm::installer::managed_install_unavailable_reason() { return Err(Error::Config(reason.into())); diff --git a/crates/pecos-cli/src/cli/llvm_cmd.rs b/crates/pecos-cli/src/cli/llvm_cmd.rs index 1d83f987e..b46bf4b49 100644 --- a/crates/pecos-cli/src/cli/llvm_cmd.rs +++ b/crates/pecos-cli/src/cli/llvm_cmd.rs @@ -114,7 +114,13 @@ fn ensure_managed_llvm(no_configure: bool) -> Result { fn run_configure(path: Option) -> Result<()> { let llvm_path = if let Some(path) = path { - let llvm_path = std::path::PathBuf::from(path); + let input_path = std::path::PathBuf::from(&path); + let llvm_path = input_path.canonicalize().map_err(|e| { + pecos_build::errors::Error::Llvm(format!( + "Could not resolve LLVM path {}: {e}", + input_path.display() + )) + })?; if !is_valid_llvm(&llvm_path) { return Err(pecos_build::errors::Error::Llvm(format!( "{} is not a valid LLVM {REQUIRED_VERSION} installation", diff --git a/crates/pecos-cli/src/cli/migrate_cmd.rs b/crates/pecos-cli/src/cli/migrate_cmd.rs index b9c86561e..197537871 100644 --- a/crates/pecos-cli/src/cli/migrate_cmd.rs +++ b/crates/pecos-cli/src/cli/migrate_cmd.rs @@ -4,7 +4,8 @@ //! into `~/.pecos/deps/` to match the new directory layout. use pecos_build::Result; -use pecos_build::home::{find_legacy_deps, migrate_legacy_dep}; +use pecos_build::home::{find_legacy_dep_status, migrate_legacy_dep}; +use pecos_build::prompt::{PromptMode, confirm}; use std::path::PathBuf; fn find_project_root() -> Result { @@ -20,16 +21,58 @@ fn find_project_root() -> Result { } /// Run the migrate command. -pub fn run() -> Result<()> { - let legacy = find_legacy_deps()?; +pub fn run(mode: PromptMode) -> Result<()> { + let legacy = find_legacy_dep_status()?; - if legacy.is_empty() { - println!("Nothing to migrate. All dependencies are already under ~/.pecos/deps/."); + if !legacy.incompatible.is_empty() { + println!("Found legacy dependencies that cannot be migrated safely:"); + for dep in &legacy.incompatible { + println!(" {} at {}", dep.name, dep.old.display()); + println!(" {}", dep.reason); + if dep.name == "LLVM" { + println!(" This path will not be moved into ~/.pecos/deps/llvm-21.1/."); + println!(" Remove it before installing/configuring LLVM 21.1."); + println!(" Then install LLVM 21.1 with `pecos install llvm`, or configure"); + println!( + " an existing LLVM 21.1 install with `pecos llvm configure /path/to/llvm`." + ); + } + } + println!(); + + for dep in &legacy.incompatible { + if dep.name != "LLVM" { + continue; + } + if confirm( + &format!("Remove incompatible legacy LLVM at {}?", dep.old.display()), + true, + mode, + ) { + print!(" Removing old LLVM..."); + pecos_build::home::remove_incompatible_legacy_dep(dep)?; + println!(" done"); + } else { + println!( + " Keeping old LLVM at {}. It will not be used as LLVM 21.1.", + dep.old.display() + ); + } + } + println!(); + } + + if legacy.migratable.is_empty() { + if legacy.incompatible.is_empty() { + println!("Nothing to migrate. All dependencies are already under ~/.pecos/deps/."); + } else { + println!("No compatible legacy dependencies can be migrated automatically."); + } return Ok(()); } println!("Migrating legacy dependencies to ~/.pecos/deps/:"); - for dep in &legacy { + for dep in &legacy.migratable { print!( " {} : {} -> {}", dep.name, @@ -42,7 +85,7 @@ pub fn run() -> Result<()> { // Update .cargo/config.toml to point to the new paths let llvm_dir = pecos_build::home::get_llvm_dir_path()?; - if llvm_dir.exists() + if pecos_build::llvm::is_valid_llvm(&llvm_dir) && let Ok(project_root) = find_project_root() && pecos_build::llvm::config::write_cargo_config(&project_root, &llvm_dir, true).is_ok() { diff --git a/crates/pecos-cli/src/cli/setup_cmd.rs b/crates/pecos-cli/src/cli/setup_cmd.rs index 0b28e1883..c0bba7f1f 100644 --- a/crates/pecos-cli/src/cli/setup_cmd.rs +++ b/crates/pecos-cli/src/cli/setup_cmd.rs @@ -254,13 +254,55 @@ fn find_repo_root() -> Option { // ── Migration ────────────────────────────────────────────────────────────── fn check_legacy_deps(mode: PromptMode) -> Result<()> { - let legacy = pecos_build::home::find_legacy_deps()?; - if legacy.is_empty() { + let legacy = pecos_build::home::find_legacy_dep_status()?; + if legacy.migratable.is_empty() && legacy.incompatible.is_empty() { + return Ok(()); + } + + if !legacy.incompatible.is_empty() { + println!("Found legacy dependencies that need manual action:"); + for dep in &legacy.incompatible { + println!(" {} at {}", dep.name, dep.old.display()); + println!(" {}", dep.reason); + if dep.name == "LLVM" { + println!(" This will not be migrated into ~/.pecos/deps/llvm-21.1/."); + println!(" Remove it before installing/configuring LLVM 21.1."); + println!(" Then install LLVM 21.1 with `pecos install llvm`, or configure"); + println!( + " an existing LLVM 21.1 install with `pecos llvm configure /path/to/llvm`." + ); + } + } + println!(); + + for dep in &legacy.incompatible { + if dep.name != "LLVM" { + continue; + } + if confirm( + &format!("Remove incompatible legacy LLVM at {}?", dep.old.display()), + true, + mode, + ) { + print!(" Removing old LLVM..."); + pecos_build::home::remove_incompatible_legacy_dep(dep)?; + println!(" done"); + } else { + println!( + " Keeping old LLVM at {}. It will not be used as LLVM 21.1.", + dep.old.display() + ); + } + } + println!(); + } + + if legacy.migratable.is_empty() { return Ok(()); } println!("Found dependencies at legacy paths:"); - for dep in &legacy { + for dep in &legacy.migratable { println!(" {} -> {}", dep.old.display(), dep.new.display()); } @@ -269,7 +311,7 @@ fn check_legacy_deps(mode: PromptMode) -> Result<()> { true, mode, ) { - for dep in &legacy { + for dep in &legacy.migratable { print!(" Moving {}...", dep.name); pecos_build::home::migrate_legacy_dep(dep)?; println!(" done"); diff --git a/crates/pecos-cli/src/main.rs b/crates/pecos-cli/src/main.rs index eab5089b5..ac5f7dd94 100644 --- a/crates/pecos-cli/src/main.rs +++ b/crates/pecos-cli/src/main.rs @@ -168,8 +168,18 @@ enum Commands { /// Migrate legacy deps from ~/.pecos/ to ~/.pecos/deps/ /// /// Moves LLVM, CUDA, and cuQuantum installations from the old top-level - /// paths into the unified deps/ directory. - Migrate, + /// paths into the unified deps/ directory. Legacy LLVM installations that + /// are not valid LLVM 21.1 installs can be removed before installing the + /// current managed LLVM. + Migrate { + /// Accept all prompts without asking + #[arg(long, conflicts_with = "no")] + yes: bool, + + /// Decline all prompts without asking + #[arg(long, conflicts_with = "yes")] + no: bool, + }, /// Install optional dependencies (cuda, llvm, cuquantum) /// /// Example: pecos install cuda cuquantum @@ -726,7 +736,16 @@ fn main() -> Result<(), Box> { }; cli::setup_cmd::run(mode, *skip_llvm, *skip_cuda, *skip_cmake, *quiet)?; } - Commands::Migrate => cli::migrate_cmd::run()?, + Commands::Migrate { yes, no } => { + let mode = if *yes { + pecos_build::prompt::PromptMode::AcceptAll + } else if *no { + pecos_build::prompt::PromptMode::DeclineAll + } else { + pecos_build::prompt::PromptMode::Interactive + }; + cli::migrate_cmd::run(mode)?; + } Commands::Install { targets, force, diff --git a/crates/pecos-llvm/src/llvm_compat.rs b/crates/pecos-llvm/src/llvm_compat.rs index 4a2f5b92c..4780dd5eb 100644 --- a/crates/pecos-llvm/src/llvm_compat.rs +++ b/crates/pecos-llvm/src/llvm_compat.rs @@ -138,7 +138,9 @@ impl<'ctx> LLModule<'ctx> { LLType::Array(t) => self.module.add_global(t, None, name), LLType::Int(t) => self.module.add_global(t, None, name), LLType::Float(t) => self.module.add_global(t, None, name), - LLType::Pointer(t) => self.module.add_global(t, None, name), + LLType::Pointer(t) | LLType::TypedPointer(t, _) => { + self.module.add_global(t, None, name) + } LLType::Struct(t) => self.module.add_global(t, None, name), LLType::Void => panic!("Cannot create global variable of void type"), }; @@ -157,8 +159,17 @@ impl<'ctx> LLModule<'ctx> { /// Add a function declaration (mirrors llvmlite's ir.Function) pub fn add_function(&mut self, name: &str, fn_type: LLFunctionType<'ctx>) -> LLFunction<'ctx> { - let function = self.module.add_function(name, fn_type.get(), None); - LLFunction { function } + let LLFunctionType { + fn_type, + ret_pointee_type, + param_pointee_types, + } = fn_type; + let function = self.module.add_function(name, fn_type, None); + LLFunction { + function, + ret_pointee_type, + param_pointee_types, + } } } @@ -167,9 +178,11 @@ impl<'ctx> LLModule<'ctx> { // ============================================================================ /// Wrapper for LLVM function types (mirrors llvmlite's ir.FunctionType) -#[derive(Copy, Clone)] +#[derive(Clone)] pub struct LLFunctionType<'ctx> { fn_type: inkwell::types::FunctionType<'ctx>, + ret_pointee_type: Option>, + param_pointee_types: Vec>>, } impl<'ctx> LLFunctionType<'ctx> { @@ -188,12 +201,19 @@ impl<'ctx> LLFunctionType<'ctx> { } LLType::Int(t) => t.fn_type(¶ms, var_args), LLType::Float(t) => t.fn_type(¶ms, var_args), - LLType::Pointer(t) => t.fn_type(¶ms, var_args), + LLType::Pointer(t) | LLType::TypedPointer(t, _) => t.fn_type(¶ms, var_args), LLType::Struct(t) => t.fn_type(¶ms, var_args), LLType::Array(t) => t.fn_type(¶ms, var_args), }; - Self { fn_type } + Self { + fn_type, + ret_pointee_type: return_type.pointer_pointee_type(), + param_pointee_types: param_types + .iter() + .map(LLType::pointer_pointee_type) + .collect(), + } } #[must_use] @@ -212,31 +232,114 @@ impl<'ctx> LLFunctionType<'ctx> { LLType::Void => context.void_type().fn_type(¶ms, var_args), LLType::Int(t) => t.fn_type(¶ms, var_args), LLType::Float(t) => t.fn_type(¶ms, var_args), - LLType::Pointer(t) => t.fn_type(¶ms, var_args), + LLType::Pointer(t) | LLType::TypedPointer(t, _) => t.fn_type(¶ms, var_args), LLType::Struct(t) => t.fn_type(¶ms, var_args), LLType::Array(t) => t.fn_type(¶ms, var_args), }; - Self { fn_type } + Self { + fn_type, + ret_pointee_type: return_type.pointer_pointee_type(), + param_pointee_types: param_types + .iter() + .map(LLType::pointer_pointee_type) + .collect(), + } } #[must_use] pub fn get(&self) -> inkwell::types::FunctionType<'ctx> { self.fn_type } + + #[must_use] + pub fn ret_pointee_type(&self) -> Option> { + self.ret_pointee_type + } + + #[must_use] + pub fn param_pointee_types(&self) -> &[Option>] { + &self.param_pointee_types + } } -/// Wrapper for LLVM types that mirrors llvmlite's type hierarchy +/// Wrapper for LLVM types that mirrors llvmlite's type hierarchy. +/// +/// LLVM 21 uses opaque pointer types. `TypedPointer` carries one level of +/// pointee metadata for APIs like load and GEP that still need the element +/// type; nested pointers keep only the immediate pointer pointee. #[derive(Clone, Copy, PartialEq, Eq)] pub enum LLType<'ctx> { Void, Int(IntType<'ctx>), Float(FloatType<'ctx>), Pointer(PointerType<'ctx>), + TypedPointer(PointerType<'ctx>, LLPointeeType<'ctx>), Struct(StructType<'ctx>), Array(ArrayType<'ctx>), } +/// One-level pointee metadata for opaque LLVM pointer types. +#[derive(Clone, Copy, PartialEq, Eq)] +pub enum LLPointeeType<'ctx> { + Int(IntType<'ctx>), + Float(FloatType<'ctx>), + Pointer(PointerType<'ctx>), + Struct(StructType<'ctx>), + Array(ArrayType<'ctx>), +} + +impl<'ctx> LLPointeeType<'ctx> { + fn from_ll_type(ty: LLType<'ctx>) -> Option { + match ty { + LLType::Void => None, + LLType::Int(t) => Some(Self::Int(t)), + LLType::Float(t) => Some(Self::Float(t)), + LLType::Pointer(t) | LLType::TypedPointer(t, _) => Some(Self::Pointer(t)), + LLType::Struct(t) => Some(Self::Struct(t)), + LLType::Array(t) => Some(Self::Array(t)), + } + } + + fn to_ll_type(self) -> LLType<'ctx> { + match self { + Self::Int(t) => LLType::Int(t), + Self::Float(t) => LLType::Float(t), + Self::Pointer(t) => LLType::Pointer(t), + Self::Struct(t) => LLType::Struct(t), + Self::Array(t) => LLType::Array(t), + } + } +} + +impl std::hash::Hash for LLPointeeType<'_> { + fn hash(&self, state: &mut H) { + use inkwell::types::AsTypeRef; + match self { + LLPointeeType::Int(t) => { + 1u8.hash(state); + (t.as_type_ref() as usize).hash(state); + } + LLPointeeType::Float(t) => { + 2u8.hash(state); + (t.as_type_ref() as usize).hash(state); + } + LLPointeeType::Pointer(t) => { + 3u8.hash(state); + (t.as_type_ref() as usize).hash(state); + } + LLPointeeType::Struct(t) => { + 4u8.hash(state); + (t.as_type_ref() as usize).hash(state); + } + LLPointeeType::Array(t) => { + 5u8.hash(state); + (t.as_type_ref() as usize).hash(state); + } + } + } +} + fn basic_type_to_ll_type(ty: BasicTypeEnum<'_>) -> Option> { match ty { BasicTypeEnum::ArrayType(t) => Some(LLType::Array(t)), @@ -261,7 +364,9 @@ pub fn gep_result_pointee_type<'ctx>( let field_index = u32::try_from(index.get_zero_extended_constant()?).ok()?; basic_type_to_ll_type(t.get_field_type_at_index(field_index)?)? } - LLType::Int(_) | LLType::Float(_) | LLType::Pointer(_) => current, + LLType::Int(_) | LLType::Float(_) | LLType::Pointer(_) | LLType::TypedPointer(_, _) => { + current + } LLType::Void => return None, }; } @@ -288,6 +393,11 @@ impl std::hash::Hash for LLType<'_> { 3u8.hash(state); (t.as_type_ref() as usize).hash(state); } + LLType::TypedPointer(t, pointee_type) => { + 3u8.hash(state); + (t.as_type_ref() as usize).hash(state); + pointee_type.hash(state); + } LLType::Struct(t) => { 4u8.hash(state); (t.as_type_ref() as usize).hash(state); @@ -344,7 +454,7 @@ impl<'ctx> LLType<'ctx> { match element_type { LLType::Int(t) => LLType::Array(t.array_type(count)), LLType::Float(t) => LLType::Array(t.array_type(count)), - LLType::Pointer(t) => LLType::Array(t.array_type(count)), + LLType::Pointer(t) | LLType::TypedPointer(t, _) => LLType::Array(t.array_type(count)), LLType::Struct(t) => LLType::Array(t.array_type(count)), LLType::Array(t) => LLType::Array(t.array_type(count)), LLType::Void => panic!("Cannot create array of void type"), @@ -355,15 +465,41 @@ impl<'ctx> LLType<'ctx> { #[must_use] pub fn as_pointer(&self, context: &'ctx Context) -> LLType<'ctx> { match self { - LLType::Void - | LLType::Int(_) - | LLType::Float(_) - | LLType::Struct(_) - | LLType::Array(_) => LLType::Pointer(context.ptr_type(AddressSpace::default())), - LLType::Pointer(t) => LLType::Pointer(*t), // Already a pointer + LLType::Void => LLType::Pointer(context.ptr_type(AddressSpace::default())), + LLType::Int(_) | LLType::Float(_) | LLType::Struct(_) | LLType::Array(_) => { + let ptr_type = context.ptr_type(AddressSpace::default()); + LLType::TypedPointer( + ptr_type, + LLPointeeType::from_ll_type(*self).expect("non-void pointee"), + ) + } + LLType::Pointer(t) | LLType::TypedPointer(t, _) => { + LLType::TypedPointer(*t, LLPointeeType::Pointer(*t)) + } + } + } + + /// Return tracked pointee metadata for typed opaque pointer types. + #[must_use] + pub fn pointer_pointee_type(&self) -> Option> { + match self { + LLType::TypedPointer(_, pointee_type) => Some(pointee_type.to_ll_type()), + _ => None, } } + /// Build an opaque pointer type with explicit one-level pointee metadata. + #[must_use] + pub fn typed_pointer( + pointer_type: PointerType<'ctx>, + pointee_type: LLType<'ctx>, + ) -> Option { + Some(LLType::TypedPointer( + pointer_type, + LLPointeeType::from_ll_type(pointee_type)?, + )) + } + /// Get the underlying inkwell type for function signatures #[must_use] pub fn to_basic_metadata_type(&self) -> Option> { @@ -371,7 +507,7 @@ impl<'ctx> LLType<'ctx> { LLType::Void => None, LLType::Int(t) => Some((*t).into()), LLType::Float(t) => Some((*t).into()), - LLType::Pointer(t) => Some((*t).into()), + LLType::Pointer(t) | LLType::TypedPointer(t, _) => Some((*t).into()), LLType::Struct(t) => Some((*t).into()), LLType::Array(t) => Some((*t).into()), } @@ -390,7 +526,7 @@ impl<'ctx> LLType<'ctx> { #[must_use] pub fn as_pointer_type(&self) -> PointerType<'ctx> { match self { - LLType::Pointer(t) => *t, + LLType::Pointer(t) | LLType::TypedPointer(t, _) => *t, _ => panic!("Expected pointer type"), } } @@ -502,8 +638,11 @@ impl<'ctx> LLValue<'ctx> { // ============================================================================ /// Wrapper around inkwell's `FunctionValue` that mirrors llvmlite's ir.Function +#[derive(Clone)] pub struct LLFunction<'ctx> { function: FunctionValue<'ctx>, + ret_pointee_type: Option>, + param_pointee_types: Vec>>, } impl<'ctx> LLFunction<'ctx> { @@ -522,14 +661,19 @@ impl<'ctx> LLFunction<'ctx> { LLType::Void => module.context().void_type().fn_type(¶m_types, false), LLType::Int(t) => t.fn_type(¶m_types, false), LLType::Float(t) => t.fn_type(¶m_types, false), - LLType::Pointer(t) => t.fn_type(¶m_types, false), + LLType::Pointer(t) | LLType::TypedPointer(t, _) => t.fn_type(¶m_types, false), LLType::Struct(t) => t.fn_type(¶m_types, false), LLType::Array(t) => t.fn_type(¶m_types, false), }; let function = module.get_mut().add_function(name, fn_type, None); + let ret_pointee_type = return_type.pointer_pointee_type(); - Self { function } + Self { + function, + ret_pointee_type, + param_pointee_types: arg_types.iter().map(LLType::pointer_pointee_type).collect(), + } } #[must_use] @@ -537,6 +681,34 @@ impl<'ctx> LLFunction<'ctx> { self.function } + #[must_use] + pub fn ret_pointee_type(&self) -> Option> { + self.ret_pointee_type + } + + #[must_use] + pub fn param_pointee_type(&self, index: usize) -> Option> { + self.param_pointee_types.get(index).copied().flatten() + } + + /// Return function parameters with tracked pointer metadata where known. + #[must_use] + pub fn args(&self) -> Vec> { + self.function + .get_param_iter() + .enumerate() + .map(|(index, param)| match param { + BasicValueEnum::IntValue(v) => LLValue::Int(v), + BasicValueEnum::FloatValue(v) => LLValue::Float(v), + BasicValueEnum::PointerValue(v) => { + LLValue::Pointer(LLPointerValue::new(v, self.param_pointee_type(index))) + } + BasicValueEnum::ArrayValue(v) => LLValue::Array(v), + _ => panic!("Unsupported parameter type"), + }) + .collect() + } + /// Append a basic block to this function (mirrors llvmlite's `func.append_basic_block`) #[must_use] pub fn append_basic_block(&self, context: &'ctx Context, name: &str) -> BasicBlock<'ctx> { @@ -548,6 +720,38 @@ impl<'ctx> LLFunction<'ctx> { // IRBuilder wrapper // ============================================================================ +pub struct LLCallable<'ctx> { + function: FunctionValue<'ctx>, + ret_pointee_type: Option>, +} + +impl<'ctx> From> for LLCallable<'ctx> { + fn from(function: FunctionValue<'ctx>) -> Self { + Self { + function, + ret_pointee_type: None, + } + } +} + +impl<'ctx> From> for LLCallable<'ctx> { + fn from(function: LLFunction<'ctx>) -> Self { + Self { + function: function.get(), + ret_pointee_type: function.ret_pointee_type(), + } + } +} + +impl<'ctx> From<&LLFunction<'ctx>> for LLCallable<'ctx> { + fn from(function: &LLFunction<'ctx>) -> Self { + Self { + function: function.get(), + ret_pointee_type: function.ret_pointee_type(), + } + } +} + /// Wrapper around inkwell's Builder that mirrors llvmlite's ir.IRBuilder pub struct LLIRBuilder<'ctx> { builder: Builder<'ctx>, @@ -743,22 +947,28 @@ impl<'ctx> LLIRBuilder<'ctx> { // Function calls // ======================================================================== - pub fn call( + pub fn call( &self, - function: FunctionValue<'ctx>, + function: F, args: &[LLValue<'ctx>], name: &str, - ) -> LLResult>> { + ) -> LLResult>> + where + F: Into>, + { + let function = function.into(); let arg_values: Vec<_> = args.iter().map(|v| v.to_basic_value().into()).collect(); let call_site = self .builder - .build_call(function, &arg_values, name) + .build_call(function.function, &arg_values, name) .map_err(|e| PecosError::Generic(format!("Failed to build call: {e}")))?; Ok(call_site.try_as_basic_value().basic().map(|v| match v { BasicValueEnum::IntValue(i) => LLValue::Int(i), - BasicValueEnum::PointerValue(p) => LLValue::Pointer(LLPointerValue::new(p, None)), + BasicValueEnum::PointerValue(p) => { + LLValue::Pointer(LLPointerValue::new(p, function.ret_pointee_type)) + } _ => panic!("Unsupported return value type"), })) } @@ -998,7 +1208,9 @@ impl LLConstant { match ll_type { LLType::Int(t) => Ok(LLValue::Int(t.const_zero())), LLType::Float(t) => Ok(LLValue::Float(t.const_zero())), - LLType::Pointer(t) => Ok(LLValue::Pointer(LLPointerValue::new(t.const_zero(), None))), + LLType::Pointer(t) | LLType::TypedPointer(t, _) => Ok(LLValue::Pointer( + LLPointerValue::new(t.const_zero(), ll_type.pointer_pointee_type()), + )), LLType::Array(t) => Ok(LLValue::Array(t.const_zero())), LLType::Void | LLType::Struct(_) => Err(PecosError::Generic( "Cannot create a zero constant for void/struct type".to_string(), @@ -1006,3 +1218,108 @@ impl LLConstant { } } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn call_preserves_pointer_return_pointee_type_for_load() { + let context = Context::create(); + let mut module = LLModule::new(&context, "call_pointer_return"); + let i32_type = LLType::int(&context, 32); + let i32_ptr_type = i32_type.as_pointer(&context); + + let callee_type = LLFunctionType::new(i32_ptr_type, &[], false); + let callee = module.add_function("get_i32_ptr", callee_type); + + let caller_type = LLFunctionType::new_with_context(&context, LLType::Void, &[], false); + let caller = module.add_function("caller", caller_type); + let block = caller.append_basic_block(&context, "entry"); + let builder = LLIRBuilder::new(&context, block); + + let ptr = builder + .call(&callee, &[], "ptr") + .expect("call should build") + .expect("callee returns a pointer"); + let loaded = builder + .load(ptr, "loaded") + .expect("call result should keep pointee metadata"); + assert!(matches!(loaded, LLValue::Int(_))); + builder.ret_void().expect("return should build"); + } + + #[test] + fn raw_function_value_call_has_unknown_pointer_pointee_type() { + let context = Context::create(); + let mut module = LLModule::new(&context, "raw_call_pointer_return"); + let i32_type = LLType::int(&context, 32); + let i32_ptr_type = i32_type.as_pointer(&context); + + let callee_type = LLFunctionType::new(i32_ptr_type, &[], false); + let callee = module.add_function("get_i32_ptr", callee_type); + + let caller_type = LLFunctionType::new_with_context(&context, LLType::Void, &[], false); + let caller = module.add_function("caller", caller_type); + let block = caller.append_basic_block(&context, "entry"); + let builder = LLIRBuilder::new(&context, block); + + let ptr = builder + .call(callee.get(), &[], "ptr") + .expect("call should build") + .expect("callee returns a pointer"); + let Err(err) = builder.load(ptr, "loaded") else { + panic!("raw FunctionValue should not carry pointee metadata"); + }; + assert!(err.to_string().contains("pointer pointee type is unknown")); + builder.ret_void().expect("return should build"); + } + + #[test] + fn as_pointer_on_typed_pointer_models_pointer_to_pointer() { + let context = Context::create(); + let mut module = LLModule::new(&context, "double_pointer_return"); + let i32_type = LLType::int(&context, 32); + let i32_ptr_type = i32_type.as_pointer(&context); + let i32_ptr_ptr_type = i32_ptr_type.as_pointer(&context); + + let callee_type = LLFunctionType::new(i32_ptr_ptr_type, &[], false); + let callee = module.add_function("get_i32_ptr_ptr", callee_type); + + let caller_type = LLFunctionType::new_with_context(&context, LLType::Void, &[], false); + let caller = module.add_function("caller", caller_type); + let block = caller.append_basic_block(&context, "entry"); + let builder = LLIRBuilder::new(&context, block); + + let ptr_to_ptr = builder + .call(&callee, &[], "ptr_to_ptr") + .expect("call should build") + .expect("callee returns a pointer"); + let loaded_ptr = builder + .load(ptr_to_ptr, "loaded_ptr") + .expect("double pointer load should load a pointer"); + assert!(matches!(loaded_ptr, LLValue::Pointer(_))); + builder.ret_void().expect("return should build"); + } + + #[test] + fn function_args_preserve_pointer_pointee_type_for_load() { + let context = Context::create(); + let mut module = LLModule::new(&context, "pointer_arg"); + let i32_type = LLType::int(&context, 32); + let i32_ptr_type = i32_type.as_pointer(&context); + + let function_type = + LLFunctionType::new_with_context(&context, LLType::Void, &[i32_ptr_type], false); + let function = module.add_function("takes_i32_ptr", function_type); + let block = function.append_basic_block(&context, "entry"); + let builder = LLIRBuilder::new(&context, block); + + let args = function.args(); + let loaded = builder + .load(args[0], "loaded") + .expect("pointer arg should keep pointee metadata"); + assert!(matches!(loaded, LLValue::Int(_))); + builder.ret_void().expect("return should build"); + } +} diff --git a/docs/development/dev-tools.md b/docs/development/dev-tools.md index 9c11440af..1be1a64f5 100644 --- a/docs/development/dev-tools.md +++ b/docs/development/dev-tools.md @@ -149,6 +149,9 @@ pecos llvm configure /path/to/llvm ``` Updates `.cargo/config.toml` with the correct `LLVM_SYS_211_PREFIX` environment variable. +Explicit paths are canonicalized, so configuring a symlink records the resolved +LLVM directory. Re-run `pecos llvm configure /path/to/llvm` after repointing the +symlink. ### Find LLVM Path diff --git a/docs/user-guide/llvm-setup.md b/docs/user-guide/llvm-setup.md index f2e0f0747..32de5edcc 100644 --- a/docs/user-guide/llvm-setup.md +++ b/docs/user-guide/llvm-setup.md @@ -166,6 +166,10 @@ cargo run -p pecos-cli -- llvm configure /path/to/llvm This updates `.cargo/config.toml` with the LLVM path. +Explicit paths are canonicalized before being written. If `/path/to/llvm` is a +symlink, PECOS writes the resolved LLVM directory into `.cargo/config.toml`; run +`pecos llvm configure /path/to/llvm` again after repointing that symlink. + ### `check` Verify LLVM 21.1 is available: diff --git a/python/pecos-rslib-llvm/src/llvm_bindings.rs b/python/pecos-rslib-llvm/src/llvm_bindings.rs index 45b736379..fcc3877c7 100644 --- a/python/pecos-rslib-llvm/src/llvm_bindings.rs +++ b/python/pecos-rslib-llvm/src/llvm_bindings.rs @@ -1487,7 +1487,9 @@ impl PyLLValue { }; // Get the pointer type from PyPointerType - let LLType::Pointer(target_ptr_type) = ptr_type.ll_type else { + let (LLType::Pointer(target_ptr_type) | LLType::TypedPointer(target_ptr_type, _)) = + ptr_type.ll_type + else { return Err(PyRuntimeError::new_err("Target must be a pointer type")); }; @@ -1513,11 +1515,20 @@ impl PyLLValue { ll_type: LLType::Float(v.get_type()), context_ptr: self.context_ptr, }), - LLValue::Pointer(v) => PyAnyType::Pointer(PyPointerType { - ll_type: LLType::Pointer(v.value().get_type()), - pointee_type: v.pointee_type(), - context_ptr: self.context_ptr, - }), + LLValue::Pointer(v) => { + let pointee_type = v.pointee_type(); + let ll_type = pointee_type + .and_then(|pointee_type| { + LLType::typed_pointer(v.value().get_type(), pointee_type) + }) + .unwrap_or_else(|| LLType::Pointer(v.value().get_type())); + + PyAnyType::Pointer(PyPointerType { + ll_type, + pointee_type, + context_ptr: self.context_ptr, + }) + } LLValue::Array(v) => PyAnyType::Array(PyArrayType { ll_type: LLType::Array(v.get_type()), context_ptr: self.context_ptr, diff --git a/python/pecos-rslib/tests/test_llvm_comprehensive.py b/python/pecos-rslib/tests/test_llvm_comprehensive.py index c255ad6d8..7d96c280b 100644 --- a/python/pecos-rslib/tests/test_llvm_comprehensive.py +++ b/python/pecos-rslib/tests/test_llvm_comprehensive.py @@ -37,6 +37,20 @@ def test_pointer_types(qir_module) -> None: _ = qubit_ptr, result_ptr +def test_inttoptr_accepts_typed_pointer_targets(qir_module) -> None: + from pecos_rslib_llvm import ir + + module, ctx = qir_module + + i64 = ctx.int_type(64) + qubit_ty = module.context.get_identified_type("Qubit") + qubit_ptr = qubit_ty.as_pointer() + + ptr = ir.Constant(i64, 0).inttoptr(qubit_ptr) + + assert ptr.type == qubit_ptr + + def test_array_types(qir_module) -> None: _, ctx = qir_module From fa89af225b683a02190d58372b9774d1951ab427 Mon Sep 17 00:00:00 2001 From: Ciaran Ryan-Anderson Date: Mon, 1 Jun 2026 10:28:26 -0600 Subject: [PATCH 06/26] Update tket and LLVM 21 QIR tests --- Cargo.lock | 242 ++-- Cargo.toml | 4 +- crates/pecos-hugr-qis/src/compiler.rs | 9 +- .../ast_guppy/test_tier2_semantic.py | 26 +- .../pecos/unit/slr/test_basic_permutation.py | 9 +- .../unit/slr/test_complex_permutation.py | 2 +- .../pecos/unit/slr/test_creg_permutation.py | 4 +- .../unit/slr/test_measurement_permutation.py | 2 +- .../unit/slr/test_register_permutation.py | 4 +- uv.lock | 1209 +++++++++-------- 10 files changed, 819 insertions(+), 692 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c607f580a..2286043f7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -306,15 +306,15 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "aws-lc-rs" -version = "1.16.3" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ec6fb3fe69024a75fa7e1bfb48aa6cf59706a101658ea01bfd33b2b248a038f" +checksum = "5ec2f1fc3ec205783a5da9a7e6c1509cc69dedf09a1949e412c1e18469326d00" dependencies = [ "aws-lc-sys", "zeroize", @@ -322,9 +322,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.40.0" +version = "0.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f50037ee5e1e41e7b8f9d161680a725bd1626cb6f8c7e901f91f942850852fe7" +checksum = "1a2f9779ce85b93ab6170dd940ad0169b5766ff848247aff13bb788b832fe3f4" dependencies = [ "cc", "cmake", @@ -373,7 +373,7 @@ dependencies = [ "pecos-stab-tn", "quizx", "rand 0.10.1", - "rand_xoshiro 0.8.0", + "rand_xoshiro 0.8.1", "rapidhash", "wide", ] @@ -387,14 +387,14 @@ dependencies = [ "bitflags 2.11.1", "cexpr", "clang-sys", - "itertools 0.10.5", + "itertools 0.13.0", "log", "prettyplease", "proc-macro2", "quote", "regex", "rustc-hash 2.1.2", - "shlex", + "shlex 1.3.0", "syn 2.0.117", ] @@ -560,9 +560,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.20.2" +version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" dependencies = [ "allocator-api2", ] @@ -658,14 +658,14 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.62" +version = "1.2.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98" +checksum = "556e016178bb5662a08681bbe0f00f8e17631781a4dfc8c45e466e4b185ec27f" dependencies = [ "find-msvc-tools", "jobserver", "libc", - "shlex", + "shlex 2.0.1", ] [[package]] @@ -853,7 +853,7 @@ checksum = "af491d569909a7e4dee0ad7db7f5341fef5c614d5b8ec8cf765732aba3cff681" dependencies = [ "serde", "termcolor", - "unicode-width 0.1.14", + "unicode-width 0.2.2", ] [[package]] @@ -1212,9 +1212,9 @@ dependencies = [ [[package]] name = "crypto-common" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77727bb15fa921304124b128af125e7e3b968275d1b108b379190264f4423710" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" dependencies = [ "hybrid-array", ] @@ -1508,7 +1508,7 @@ checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" dependencies = [ "block-buffer 0.12.0", "const-oid", - "crypto-common 0.2.1", + "crypto-common 0.2.2", ] [[package]] @@ -1565,9 +1565,9 @@ dependencies = [ [[package]] name = "displaydoc" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" dependencies = [ "proc-macro2", "quote", @@ -1618,9 +1618,9 @@ checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "either" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" [[package]] name = "embedded-io" @@ -1725,9 +1725,9 @@ checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" [[package]] name = "filetime" -version = "0.2.28" +version = "0.2.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d5b2eef6fafbf69f877e55509ce5b11a760690ac9700a2921be067aa6afaef6" +checksum = "5c287a33c7f0a620c38e641e7f60827713987b3c0f26e8ddc9462cc69cf75759" dependencies = [ "cfg-if", "libc", @@ -1935,9 +1935,9 @@ checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] name = "futures-timer" -version = "3.0.3" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" +checksum = "af43fadb8a98512d547e37b4e92e0ced13e205c061b87b4623eff01d918d6968" [[package]] name = "futures-util" @@ -2162,6 +2162,7 @@ dependencies = [ "allocator-api2", "equivalent", "foldhash 0.1.5", + "rayon", ] [[package]] @@ -2269,9 +2270,9 @@ dependencies = [ [[package]] name = "http" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +checksum = "8be7462df143984c4598a256ef469b251d7d7f9e271135073e78fc535414f3d0" dependencies = [ "bytes", "itoa", @@ -2408,9 +2409,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.9.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" +checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498" dependencies = [ "atomic-waker", "bytes", @@ -2753,9 +2754,9 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jiff" -version = "0.2.24" +version = "0.2.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f00b5dbd620d61dfdcb6007c9c1f6054ebd75319f163d886a9055cec1155073d" +checksum = "4603d3033e49e2b0e31229fcab20a5d40089c607d975cd9c80551dc69eed9102" dependencies = [ "jiff-static", "log", @@ -2766,9 +2767,9 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.24" +version = "0.2.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e000de030ff8022ea1da3f466fbb0f3a809f5e51ed31f6dd931c35181ad8e6d7" +checksum = "782d32378dddf207193ac91cefb848ad41abb58195c95168e1291227a0832b47" dependencies = [ "proc-macro2", "quote", @@ -2845,9 +2846,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.98" +version = "0.3.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67df7112613f8bfd9150013a0314e196f4800d3201ae742489d999db2f979f08" +checksum = "142bc4740e452c1e57ade0cbc129f139c9093e354346f0872ef985f4f5cf5f11" dependencies = [ "cfg-if", "futures-util", @@ -2917,9 +2918,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libbz2-rs-sys" -version = "0.2.3" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3a6a8c165077efc8f3a971534c50ea6a1a18b329ef4a66e897a7e3a1494565f" +checksum = "34b357333733e8260735ba5894eb928c02ecc69c78715f01a8019e7fa7f2db4c" [[package]] name = "libc" @@ -2955,9 +2956,9 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" +checksum = "f02ab6bace2054fb888a3c16f990117b579d14a3088e472d63c6011fa185c9d3" dependencies = [ "libc", ] @@ -3020,9 +3021,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.29" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +checksum = "616ec5685824bcc94416c6d4a7a446eea774a31efd7062c8480ba6fd06d7a6e5" [[package]] name = "logos" @@ -3100,9 +3101,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.8.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" +checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8" [[package]] name = "memfd" @@ -3137,9 +3138,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" +checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" dependencies = [ "libc", "wasi", @@ -3390,9 +3391,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" [[package]] name = "num-integer" @@ -3641,9 +3642,9 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pastey" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5a797f0e07bdf071d15742978fc3128ec6c22891c31a3a931513263904c982a" +checksum = "2ee67f1008b1ba2321834326597b8e186293b049a023cdef258527550b9935b4" [[package]] name = "pbr" @@ -3750,7 +3751,7 @@ dependencies = [ "pecos-random", "rand 0.10.1", "rand_core 0.10.1", - "rand_xoshiro 0.8.0", + "rand_xoshiro 0.8.1", "serde", "serde_json", "smallvec", @@ -4227,7 +4228,7 @@ version = "0.2.0-dev.0" dependencies = [ "rand 0.10.1", "rand_core 0.10.1", - "rand_xoshiro 0.8.0", + "rand_xoshiro 0.8.1", "random_tester", "rapidhash", "wide", @@ -5188,9 +5189,9 @@ dependencies = [ [[package]] name = "rand_xoshiro" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f0b2cc7bfeef8f0320ca45f88b00157a03c67137022d59393614352d6bf4312" +checksum = "662effc7698e08ea324d3acccf8d9d7f7bf79b9785e270a174ea36e56900c91d" dependencies = [ "rand_core 0.10.1", ] @@ -5386,9 +5387,9 @@ checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" [[package]] name = "relay-bp" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6c034c28950af24584860eb93e72398e49de4ce06ac0ba7a43c65c619568ea" +checksum = "1aad515fe7adde3d2c5508efb582dac0e34f1eb7a30631560d38846d2657b8d4" dependencies = [ "dyn-clone", "env_logger", @@ -5415,7 +5416,7 @@ dependencies = [ "derive_more 0.99.20", "fxhash", "itertools 0.13.0", - "petgraph 0.6.5", + "petgraph 0.8.3", "serde", "slotmap_fork_lmondada", "thiserror 1.0.69", @@ -5429,9 +5430,9 @@ checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" [[package]] name = "reqwest" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62e0021ea2c22aed41653bc7e1419abb2c97e038ff2c33d0e1309e49a97deec0" +checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" dependencies = [ "base64", "bytes", @@ -5686,7 +5687,7 @@ checksum = "aaeee6f84153fd6f62507fc22bfe9499c8485075b44186dcbb918166ef75116f" dependencies = [ "fixedbitset 0.5.7", "foldhash 0.1.5", - "hashbrown 0.14.5", + "hashbrown 0.15.5", "indexmap 2.14.0", "ndarray 0.16.1", "num-traits", @@ -5924,9 +5925,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.149" +version = "1.0.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" dependencies = [ "itoa", "memchr", @@ -6030,6 +6031,12 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + [[package]] name = "simba" version = "0.10.0" @@ -6136,9 +6143,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" +checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" dependencies = [ "libc", "windows-sys 0.61.2", @@ -6337,9 +6344,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tar" -version = "0.4.45" +version = "0.4.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22692a6476a21fa75fdfc11d452fda482af402c008cdbaf3476414e122040973" +checksum = "3f6221d9a6003c78398e3b239969f352578258df48c8eb051caadae0015bc840" dependencies = [ "filetime", "libc", @@ -6531,9 +6538,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tket" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "640b38c8fcfc7a6232b0f3afa9a9685a26e35c08d80faa2a264c69c219359181" +checksum = "a56460bb4f82313dd11c188979a4c3f2eb74b98fb6ba2d60fef0d44e0eff8b4b" dependencies = [ "anyhow", "ascent", @@ -6585,9 +6592,9 @@ dependencies = [ [[package]] name = "tket-qsystem" -version = "0.24.0" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04aecdc44b24c95bba3ba49cb9a022d199fa0aa22dc015519a1abbb77e5e037e" +checksum = "d9b3899fb263ffd2b0990a1afc7c97fe06fc3045fcc1cb61d39bf19bd69378ad" dependencies = [ "anyhow", "delegate", @@ -6655,9 +6662,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.25.11+spec-1.1.0" +version = "0.25.12+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" +checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7" dependencies = [ "indexmap 2.14.0", "toml_datetime", @@ -6698,9 +6705,9 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.10" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68d6fdd9f81c2819c9a8b0e0cd91660e7746a8e6ea2ba7c6b2b057985f6bcb51" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" dependencies = [ "bitflags 2.11.1", "bytes", @@ -6783,15 +6790,15 @@ checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" [[package]] name = "typenum" -version = "1.20.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" [[package]] name = "typetag" -version = "0.2.21" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be2212c8a9b9bcfca32024de14998494cf9a5dfa59ea1b829de98bac374b86bf" +checksum = "c5a897b12c6c1151ad0b138b8db50252dc301f93bc3b027db05eec82aeed298c" dependencies = [ "erased-serde", "inventory", @@ -6802,9 +6809,9 @@ dependencies = [ [[package]] name = "typetag-impl" -version = "0.2.21" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27a7a9b72ba121f6f1f6c3632b85604cac41aedb5ddc70accbebb6cac83de846" +checksum = "cf808357c6ed7e13ba0f3277ec8d8f21b2d501274895104263985330c726c1c5" dependencies = [ "proc-macro2", "quote", @@ -6903,9 +6910,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.23.1" +version = "1.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" +checksum = "d258b83ceec21034727ecee8c382cfa6c3e133699b0742c64571814fb420c9f7" dependencies = [ "getrandom 0.4.2", "js-sys", @@ -6985,9 +6992,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.121" +version = "0.2.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49ace1d07c165b0864824eee619580c4689389afa9dc9ed3a4c75040d82e6790" +checksum = "3ed04576f974d2b2fba0f38c51dbc5518011e38c36bf1143164be765528fd409" dependencies = [ "cfg-if", "once_cell", @@ -6998,9 +7005,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.71" +version = "0.4.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96492d0d3ffba25305a7dc88720d250b1401d7edca02cc3bcd50633b424673b8" +checksum = "9473dbd2991ae90b6291c3c32c30c6187ac49aa32f9905d1cce280ec1e110b0f" dependencies = [ "js-sys", "wasm-bindgen", @@ -7008,9 +7015,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.121" +version = "0.2.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e68e6f4afd367a562002c05637acb8578ff2dea1943df76afb9e83d177c8578" +checksum = "916151b09da36bd82f6615cbf3a419e2f0ba23a03c6160e8e92eb6bd4aa1dec6" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -7018,9 +7025,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.121" +version = "0.2.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95a9ec35c64b2a7cb35d3fead40c4238d0940c86d107136999567a4703259f2" +checksum = "299047362ccbfce148b67ab7e73349f77748e00c8296f9542adfad2ad82c5c5e" dependencies = [ "bumpalo", "proc-macro2", @@ -7031,9 +7038,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.121" +version = "0.2.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4e0100b01e9f0d03189a92b96772a1fb998639d981193d7dbab487302513441" +checksum = "9a929b2c61f11ba3e9bc35b50c1f25cb38e0e892c0c231ae2b8cf78d5dad4437" dependencies = [ "unicode-ident", ] @@ -7058,6 +7065,16 @@ dependencies = [ "wasmparser 0.248.0", ] +[[package]] +name = "wasm-encoder" +version = "0.251.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a879a421bd17c528b74721b2abf4c62e8f1d1889c2ba8c3c50d02deaf2ce395" +dependencies = [ + "leb128fmt", + "wasmparser 0.251.0", +] + [[package]] name = "wasm-metadata" version = "0.244.0" @@ -7095,6 +7112,17 @@ dependencies = [ "serde", ] +[[package]] +name = "wasmparser" +version = "0.251.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "437970b35b1a85cfde9c74b2398352d8d653f3bd8e3a3db0c063ea8f5b4b36ff" +dependencies = [ + "bitflags 2.11.1", + "indexmap 2.14.0", + "semver", +] + [[package]] name = "wasmprinter" version = "0.248.0" @@ -7274,22 +7302,22 @@ dependencies = [ [[package]] name = "wast" -version = "248.0.0" +version = "251.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acc54622ed5a5cddafcdf152043f9d4aed54d4a653d686b7dfe874809fca99d7" +checksum = "5cc7467dda0a96142eb2c980329dfb62480b1e1d3622fdeb1a44e2bca6ceed74" dependencies = [ "bumpalo", "leb128fmt", "memchr", "unicode-width 0.2.2", - "wasm-encoder 0.248.0", + "wasm-encoder 0.251.0", ] [[package]] name = "wat" -version = "1.248.0" +version = "1.251.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75cd9e510603909748e6ebab89f27cd04472c1d9d85a3c88a7a6fc51a1a7934" +checksum = "81b1086c9e85b95bd6a229a928bc6c6d0662e42af0250c88d067b418831ea4d4" dependencies = [ "wast", ] @@ -7314,9 +7342,9 @@ checksum = "323f4da9523e9a669e1eaf9c6e763892769b1d38c623913647bfdc1532fe4549" [[package]] name = "web-sys" -version = "0.3.98" +version = "0.3.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b572dff8bcf38bad0fa19729c89bb5748b2b9b1d8be70cf90df697e3a8f32aa" +checksum = "6d621441cfc37b84979402712047321980c178f299193a3589d05b99e8763436" dependencies = [ "js-sys", "wasm-bindgen", @@ -7818,9 +7846,9 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0" +checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" dependencies = [ "memchr", ] @@ -7990,18 +8018,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.48" +version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" +checksum = "3b065d4f0e55f82fae73202e189638116a87c55ab6b8e6c2721e13dd9d854ad1" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.48" +version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" +checksum = "0b631b19d36a892ab55420c92dbc83ccd79274f25be714855d3074aa71cab639" dependencies = [ "proc-macro2", "quote", @@ -8010,9 +8038,9 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" dependencies = [ "zerofrom-derive", ] diff --git a/Cargo.toml b/Cargo.toml index 9be85f048..40c106469 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -68,8 +68,8 @@ libloading = "0.9" inkwell = { version = "0.9", features = ["llvm21-1-prefer-dynamic"] } # --- HUGR / tket --- -tket = { version = "0.18", default-features = false } -tket-qsystem = { version = "0.24", default-features = false } +tket = { version = "0.19", default-features = false } +tket-qsystem = { version = "0.25", default-features = false } # --- WebAssembly --- wasmtime = { version = "45", default-features = false, features = [ diff --git a/crates/pecos-hugr-qis/src/compiler.rs b/crates/pecos-hugr-qis/src/compiler.rs index e1348c085..7d1ddda66 100644 --- a/crates/pecos-hugr-qis/src/compiler.rs +++ b/crates/pecos-hugr-qis/src/compiler.rs @@ -54,19 +54,22 @@ use tket::hugr::ops::DataflowParent; use tket::hugr::{Hugr, HugrView, Node}; use tket::llvm::rotation::RotationCodegenExtension; use tket::passes::ComposablePass; -use tket_qsystem::QSystemPass; use tket_qsystem::llvm::array_utils::ArrayLowering; use tket_qsystem::llvm::futures::FuturesCodegenExtension; use tket_qsystem::llvm::{ debug::DebugCodegenExtension, prelude::QISPreludeCodegen, qsystem::QSystemCodegenExtension, random::RandomCodegenExtension, result::ResultsCodegenExtension, utils::UtilsCodegenExtension, }; +use tket_qsystem::{QSystemPass, QSystemPlatform}; // Import read_hugr_envelope from utils module use crate::utils::read_hugr_envelope; const LLVM_MAIN: &str = "qmain"; const METADATA: &[(&str, &[&str])] = &[("name", &["mainlib"])]; +// PECOS targets the Selene Helios QIS runtime; keep the qsystem lowering +// platform explicit so new tket-qsystem platforms do not silently change codegen. +const QSYSTEM_PLATFORM: QSystemPlatform = QSystemPlatform::Helios; // Extension registry is defined in the parent module @@ -102,7 +105,7 @@ impl Default for CompileArgs { /// Note: `QSystemPass` internally calls `inline_constant_functions` when the /// `llvm` feature is enabled, so we don't need to call it separately. fn process_hugr(hugr: &mut Hugr) -> Result<()> { - QSystemPass::default().run(hugr)?; + QSystemPass::defaults(QSYSTEM_PLATFORM).run(hugr)?; Ok(()) } @@ -121,7 +124,7 @@ fn codegen_extensions() -> CodegenExtsMap<'static, Hugr> { .add_default_static_array_extensions() .add_default_borrow_array_extensions(pcg.clone()) .add_extension(FuturesCodegenExtension) - .add_extension(QSystemCodegenExtension::from(pcg.clone())) + .add_extension(QSystemCodegenExtension::new(QSYSTEM_PLATFORM, pcg.clone())) .add_extension(RandomCodegenExtension) .add_extension(ResultsCodegenExtension::new( SeleneHeapArrayCodegen::LOWERING, diff --git a/python/quantum-pecos/tests/slr_tests/ast_guppy/test_tier2_semantic.py b/python/quantum-pecos/tests/slr_tests/ast_guppy/test_tier2_semantic.py index f24209932..bad58eb12 100644 --- a/python/quantum-pecos/tests/slr_tests/ast_guppy/test_tier2_semantic.py +++ b/python/quantum-pecos/tests/slr_tests/ast_guppy/test_tier2_semantic.py @@ -124,6 +124,15 @@ def _case(label: str) -> Main: raise KeyError(msg) +def _creg_storage_operand(size: int, name: str) -> str: + """Match LLVM 21 opaque `ptr %c` and legacy typed `[N x i1]* %c` IR.""" + return rf"(?:ptr|\[{size} x i1\]\*) %{re.escape(name)}" + + +def _creg_gep_pattern(size: int, name: str, index: int) -> str: + return rf"getelementptr \[{size} x i1\], {_creg_storage_operand(size, name)}, i64 0, i64 {index}" + + # --- extra programs not in the corpus (plan amendment 8 coverage) --- @@ -188,8 +197,9 @@ def _layer_b_structural(prog: Main, label: str, *, creg_sizes: dict[str, int]) - for name, size in creg_sizes.items(): assert f"%{name} = alloca [{size} x i1]" in ir, f"{label}: missing entry-block alloca for CReg {name!r}" - assert ( - f"store [{size} x i1] zeroinitializer, [{size} x i1]* %{name}" in ir + assert re.search( + rf"store \[{size} x i1\] zeroinitializer, {_creg_storage_operand(size, name)}", + ir, ), f"{label}: missing zeroinitializer for CReg {name!r} (unset bits must read 0, not undef)" _assert_mz_rr_pairing(label, ir) @@ -210,10 +220,7 @@ def _assert_set_int_unpack(label: str, ir: str, *, name: str, size: int, value: """ for i in range(size): bit = (value >> i) & 1 - pat = ( - rf"getelementptr \[{size} x i1\], \[{size} x i1\]\* %{name}, " - rf"i64 0, i64 {i}\n\s*store i1 {bit}, i1\* %[.\w]+" - ) + pat = rf"{_creg_gep_pattern(size, name, i)}\n\s*store i1 {bit}, (?:ptr|i1\*) %[.\w]+" assert re.search( pat, ir, @@ -230,11 +237,12 @@ def _assert_zero_init_predicate(label: str, ir: str, *, name: str) -> None: """`If(c[i])` before any write must branch on a `load` of the zero-initialised buffer (so the predicate is deterministically 0, never `undef`).""" - assert ( - f"store [1 x i1] zeroinitializer, [1 x i1]* %{name}" in ir + assert re.search( + rf"store \[1 x i1\] zeroinitializer, {_creg_storage_operand(1, name)}", + ir, ), f"{label}: missing zeroinitializer for the pre-read CReg {name!r}" assert re.search( - rf"getelementptr \[1 x i1\], \[1 x i1\]\* %{name}, i64 0, i64 0\n\s*%[.\w]+ = load i1", + rf"{_creg_gep_pattern(1, name, 0)}\n\s*%[.\w]+ = load i1", ir, ), f"{label}: If(c[0]) predicate is not a load of the zero-inited buffer" diff --git a/python/quantum-pecos/tests/slr_tests/pecos/unit/slr/test_basic_permutation.py b/python/quantum-pecos/tests/slr_tests/pecos/unit/slr/test_basic_permutation.py index 0c046dfb9..519875acd 100644 --- a/python/quantum-pecos/tests/slr_tests/pecos/unit/slr/test_basic_permutation.py +++ b/python/quantum-pecos/tests/slr_tests/pecos/unit/slr/test_basic_permutation.py @@ -166,7 +166,10 @@ def test_basic_permutation_qir(basic_permutation_program: tuple) -> None: assert "; Permutation: a[0] -> b[1], b[1] -> a[0]" in qir, qir # a[0].set(1) after the swap writes b[1]'s slot, not a[0]'s. - m = re.search(r"%(\.\d+) = getelementptr \[2 x i1\], \[2 x i1\]\* %b, i64 0, i64 1\n\s*store i1 1, i1\* %\1", qir) + m = re.search( + r"%(\.\d+) = getelementptr \[2 x i1\], (?:ptr|\[2 x i1\]\*) %b, i64 0, i64 1\n\s*store i1 1, (?:ptr|i1\*) %\1", + qir, + ) assert m, f"Expected a[0].set(1) to store into b[1] (relabelled):\n{qir}" assert qir == SlrConverter(prog).qir(), "QIR generation is not deterministic" @@ -185,8 +188,8 @@ def test_same_register_permutation_qir( # a[0].set(1)->a[2], a[1].set(0)->a[0], a[2].set(1)->a[1]. def _stored(slot: int, val: int) -> bool: pat = ( - rf"%(\.\d+) = getelementptr \[3 x i1\], \[3 x i1\]\* %a, i64 0, i64 {slot}\n" - rf"\s*store i1 {val}, i1\* %\1" + rf"%(\.\d+) = getelementptr \[3 x i1\], (?:ptr|\[3 x i1\]\*) %a, i64 0, i64 {slot}\n" + rf"\s*store i1 {val}, (?:ptr|i1\*) %\1" ) return bool( re.search( diff --git a/python/quantum-pecos/tests/slr_tests/pecos/unit/slr/test_complex_permutation.py b/python/quantum-pecos/tests/slr_tests/pecos/unit/slr/test_complex_permutation.py index 1744823d7..7dab7693a 100644 --- a/python/quantum-pecos/tests/slr_tests/pecos/unit/slr/test_complex_permutation.py +++ b/python/quantum-pecos/tests/slr_tests/pecos/unit/slr/test_complex_permutation.py @@ -179,7 +179,7 @@ def test_permutation_with_conditional_qir() -> None: assert "; Permutation: a[0] -> a[1], a[1] -> a[0], b[0] -> b[1], b[1] -> b[0]" in qir, qir # b[0].set(1) is BEFORE the permute -> b[0] slot (index 0). assert re.search( - r"%(\.\d+) = getelementptr \[2 x i1\], \[2 x i1\]\* %b, i64 0, i64 0\n\s*store i1 1, i1\* %\1", + r"%(\.\d+) = getelementptr \[2 x i1\], (?:ptr|\[2 x i1\]\*) %b, i64 0, i64 0\n\s*store i1 1, (?:ptr|i1\*) %\1", qir, ), qir # X(a[0]) after the permute -> a[1] = q1. diff --git a/python/quantum-pecos/tests/slr_tests/pecos/unit/slr/test_creg_permutation.py b/python/quantum-pecos/tests/slr_tests/pecos/unit/slr/test_creg_permutation.py index 53cd8fef8..0b0e46714 100644 --- a/python/quantum-pecos/tests/slr_tests/pecos/unit/slr/test_creg_permutation.py +++ b/python/quantum-pecos/tests/slr_tests/pecos/unit/slr/test_creg_permutation.py @@ -71,8 +71,8 @@ def test_creg_permutation_qir() -> None: # a[0].set(1) after Permute(a, b) -> stores into register b's # `[1 x i1]` buffer (a[0] now resolves to b[0]); register a's # buffer is never the store target for that set. - assert re.search(r"store i1 1, i1\* %\.\d+", qir), qir - b_slot = re.search(r"%(\.\d+) = getelementptr \[1 x i1\], \[1 x i1\]\* %b, i64 0, i64 0", qir) + assert re.search(r"store i1 1, (?:ptr|i1\*) %\.\d+", qir), qir + b_slot = re.search(r"%(\.\d+) = getelementptr \[1 x i1\], (?:ptr|\[1 x i1\]\*) %b, i64 0, i64 0", qir) assert b_slot, f"Expected a[0].set(1) to target register b's buffer (relabelled):\n{qir}" assert qir == SlrConverter(prog).qir(), "QIR generation is not deterministic" diff --git a/python/quantum-pecos/tests/slr_tests/pecos/unit/slr/test_measurement_permutation.py b/python/quantum-pecos/tests/slr_tests/pecos/unit/slr/test_measurement_permutation.py index a88609b93..1b3fe97c9 100644 --- a/python/quantum-pecos/tests/slr_tests/pecos/unit/slr/test_measurement_permutation.py +++ b/python/quantum-pecos/tests/slr_tests/pecos/unit/slr/test_measurement_permutation.py @@ -80,7 +80,7 @@ def _mz_then_store(qir: str) -> list[tuple[str, str, str]]: r"call void @__quantum__qis__mz__body\(%Qubit\* inttoptr \(i64 (\d+) to %Qubit\*\), " r"%Result\* inttoptr \(i64 (\d+) to %Result\*\)\)\n" r"\s*%(?:\.\d+) = call i1 @__quantum__rt__read_result\(%Result\* inttoptr \(i64 \2 to %Result\*\)\)\n" - r"\s*%(\.\d+) = getelementptr \[\d+ x i1\], \[\d+ x i1\]\* %(\w+), i64 0, i64 (\d+)" + r"\s*%(\.\d+) = getelementptr \[\d+ x i1\], (?:ptr|\[\d+ x i1\]\*) %(\w+), i64 0, i64 (\d+)" ) # groups: 1=qubit, 2=result idx, 3=gep var, 4=creg name, 5=creg idx return [(m[0], m[3], m[4]) for m in re.findall(pat, qir)] diff --git a/python/quantum-pecos/tests/slr_tests/pecos/unit/slr/test_register_permutation.py b/python/quantum-pecos/tests/slr_tests/pecos/unit/slr/test_register_permutation.py index 8e49e8eb0..721a0806a 100644 --- a/python/quantum-pecos/tests/slr_tests/pecos/unit/slr/test_register_permutation.py +++ b/python/quantum-pecos/tests/slr_tests/pecos/unit/slr/test_register_permutation.py @@ -135,11 +135,11 @@ def test_whole_register_permutation_qir() -> None: # Permute(a, b); b[2].set(1); a[3].set(0). After the swap, b[2] # resolves to a[2] and a[3] resolves to b[3]. assert re.search( - r"%(\.\d+) = getelementptr \[5 x i1\], \[5 x i1\]\* %a, i64 0, i64 2\n\s*store i1 1, i1\* %\1", + r"%(\.\d+) = getelementptr \[5 x i1\], (?:ptr|\[5 x i1\]\*) %a, i64 0, i64 2\n\s*store i1 1, (?:ptr|i1\*) %\1", qir, ), f"b[2].set(1) should target a[2] after swap:\n{qir}" assert re.search( - r"%(\.\d+) = getelementptr \[5 x i1\], \[5 x i1\]\* %b, i64 0, i64 3\n\s*store i1 0, i1\* %\1", + r"%(\.\d+) = getelementptr \[5 x i1\], (?:ptr|\[5 x i1\]\*) %b, i64 0, i64 3\n\s*store i1 0, (?:ptr|i1\*) %\1", qir, ), f"a[3].set(0) should target b[3] after swap:\n{qir}" diff --git a/uv.lock b/uv.lock index e5f7faa75..99d65a64a 100644 --- a/uv.lock +++ b/uv.lock @@ -185,7 +185,7 @@ wheels = [ [[package]] name = "black" -version = "26.3.1" +version = "26.5.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -197,34 +197,34 @@ dependencies = [ { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e1/c5/61175d618685d42b005847464b8fb4743a67b1b8fdb75e50e5a96c31a27a/black-26.3.1.tar.gz", hash = "sha256:2c50f5063a9641c7eed7795014ba37b0f5fa227f3d408b968936e24bc0566b07", size = 666155, upload-time = "2026-03-12T03:36:03.593Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/32/a8/11170031095655d36ebc6664fe0897866f6023892396900eec0e8fdc4299/black-26.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:86a8b5035fce64f5dcd1b794cf8ec4d31fe458cf6ce3986a30deb434df82a1d2", size = 1866562, upload-time = "2026-03-12T03:39:58.639Z" }, - { url = "https://files.pythonhosted.org/packages/69/ce/9e7548d719c3248c6c2abfd555d11169457cbd584d98d179111338423790/black-26.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5602bdb96d52d2d0672f24f6ffe5218795736dd34807fd0fd55ccd6bf206168b", size = 1703623, upload-time = "2026-03-12T03:40:00.347Z" }, - { url = "https://files.pythonhosted.org/packages/7f/0a/8d17d1a9c06f88d3d030d0b1d4373c1551146e252afe4547ed601c0e697f/black-26.3.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c54a4a82e291a1fee5137371ab488866b7c86a3305af4026bdd4dc78642e1ac", size = 1768388, upload-time = "2026-03-12T03:40:01.765Z" }, - { url = "https://files.pythonhosted.org/packages/52/79/c1ee726e221c863cde5164f925bacf183dfdf0397d4e3f94889439b947b4/black-26.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:6e131579c243c98f35bce64a7e08e87fb2d610544754675d4a0e73a070a5aa3a", size = 1412969, upload-time = "2026-03-12T03:40:03.252Z" }, - { url = "https://files.pythonhosted.org/packages/73/a5/15c01d613f5756f68ed8f6d4ec0a1e24b82b18889fa71affd3d1f7fad058/black-26.3.1-cp310-cp310-win_arm64.whl", hash = "sha256:5ed0ca58586c8d9a487352a96b15272b7fa55d139fc8496b519e78023a8dab0a", size = 1220345, upload-time = "2026-03-12T03:40:04.892Z" }, - { url = "https://files.pythonhosted.org/packages/17/57/5f11c92861f9c92eb9dddf515530bc2d06db843e44bdcf1c83c1427824bc/black-26.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:28ef38aee69e4b12fda8dba75e21f9b4f979b490c8ac0baa7cb505369ac9e1ff", size = 1851987, upload-time = "2026-03-12T03:40:06.248Z" }, - { url = "https://files.pythonhosted.org/packages/54/aa/340a1463660bf6831f9e39646bf774086dbd8ca7fc3cded9d59bbdf4ad0a/black-26.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf9bf162ed91a26f1adba8efda0b573bc6924ec1408a52cc6f82cb73ec2b142c", size = 1689499, upload-time = "2026-03-12T03:40:07.642Z" }, - { url = "https://files.pythonhosted.org/packages/f3/01/b726c93d717d72733da031d2de10b92c9fa4c8d0c67e8a8a372076579279/black-26.3.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:474c27574d6d7037c1bc875a81d9be0a9a4f9ee95e62800dab3cfaadbf75acd5", size = 1754369, upload-time = "2026-03-12T03:40:09.279Z" }, - { url = "https://files.pythonhosted.org/packages/e3/09/61e91881ca291f150cfc9eb7ba19473c2e59df28859a11a88248b5cbbc4d/black-26.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:5e9d0d86df21f2e1677cc4bd090cd0e446278bcbbe49bf3659c308c3e402843e", size = 1413613, upload-time = "2026-03-12T03:40:10.943Z" }, - { url = "https://files.pythonhosted.org/packages/16/73/544f23891b22e7efe4d8f812371ab85b57f6a01b2fc45e3ba2e52ba985b8/black-26.3.1-cp311-cp311-win_arm64.whl", hash = "sha256:9a5e9f45e5d5e1c5b5c29b3bd4265dcc90e8b92cf4534520896ed77f791f4da5", size = 1219719, upload-time = "2026-03-12T03:40:12.597Z" }, - { url = "https://files.pythonhosted.org/packages/dc/f8/da5eae4fc75e78e6dceb60624e1b9662ab00d6b452996046dfa9b8a6025b/black-26.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5e6f89631eb88a7302d416594a32faeee9fb8fb848290da9d0a5f2903519fc1", size = 1895920, upload-time = "2026-03-12T03:40:13.921Z" }, - { url = "https://files.pythonhosted.org/packages/2c/9f/04e6f26534da2e1629b2b48255c264cabf5eedc5141d04516d9d68a24111/black-26.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41cd2012d35b47d589cb8a16faf8a32ef7a336f56356babd9fcf70939ad1897f", size = 1718499, upload-time = "2026-03-12T03:40:15.239Z" }, - { url = "https://files.pythonhosted.org/packages/04/91/a5935b2a63e31b331060c4a9fdb5a6c725840858c599032a6f3aac94055f/black-26.3.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f76ff19ec5297dd8e66eb64deda23631e642c9393ab592826fd4bdc97a4bce7", size = 1794994, upload-time = "2026-03-12T03:40:17.124Z" }, - { url = "https://files.pythonhosted.org/packages/e7/0a/86e462cdd311a3c2a8ece708d22aba17d0b2a0d5348ca34b40cdcbea512e/black-26.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:ddb113db38838eb9f043623ba274cfaf7d51d5b0c22ecb30afe58b1bb8322983", size = 1420867, upload-time = "2026-03-12T03:40:18.83Z" }, - { url = "https://files.pythonhosted.org/packages/5b/e5/22515a19cb7eaee3440325a6b0d95d2c0e88dd180cb011b12ae488e031d1/black-26.3.1-cp312-cp312-win_arm64.whl", hash = "sha256:dfdd51fc3e64ea4f35873d1b3fb25326773d55d2329ff8449139ebaad7357efb", size = 1230124, upload-time = "2026-03-12T03:40:20.425Z" }, - { url = "https://files.pythonhosted.org/packages/f5/77/5728052a3c0450c53d9bb3945c4c46b91baa62b2cafab6801411b6271e45/black-26.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:855822d90f884905362f602880ed8b5df1b7e3ee7d0db2502d4388a954cc8c54", size = 1895034, upload-time = "2026-03-12T03:40:21.813Z" }, - { url = "https://files.pythonhosted.org/packages/52/73/7cae55fdfdfbe9d19e9a8d25d145018965fe2079fa908101c3733b0c55a0/black-26.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8a33d657f3276328ce00e4d37fe70361e1ec7614da5d7b6e78de5426cb56332f", size = 1718503, upload-time = "2026-03-12T03:40:23.666Z" }, - { url = "https://files.pythonhosted.org/packages/e1/87/af89ad449e8254fdbc74654e6467e3c9381b61472cc532ee350d28cfdafb/black-26.3.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f1cd08e99d2f9317292a311dfe578fd2a24b15dbce97792f9c4d752275c1fa56", size = 1793557, upload-time = "2026-03-12T03:40:25.497Z" }, - { url = "https://files.pythonhosted.org/packages/43/10/d6c06a791d8124b843bf325ab4ac7d2f5b98731dff84d6064eafd687ded1/black-26.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:c7e72339f841b5a237ff14f7d3880ddd0fc7f98a1199e8c4327f9a4f478c1839", size = 1422766, upload-time = "2026-03-12T03:40:27.14Z" }, - { url = "https://files.pythonhosted.org/packages/59/4f/40a582c015f2d841ac24fed6390bd68f0fc896069ff3a886317959c9daf8/black-26.3.1-cp313-cp313-win_arm64.whl", hash = "sha256:afc622538b430aa4c8c853f7f63bc582b3b8030fd8c80b70fb5fa5b834e575c2", size = 1232140, upload-time = "2026-03-12T03:40:28.882Z" }, - { url = "https://files.pythonhosted.org/packages/d5/da/e36e27c9cebc1311b7579210df6f1c86e50f2d7143ae4fcf8a5017dc8809/black-26.3.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2d6bfaf7fd0993b420bed691f20f9492d53ce9a2bcccea4b797d34e947318a78", size = 1889234, upload-time = "2026-03-12T03:40:30.964Z" }, - { url = "https://files.pythonhosted.org/packages/0e/7b/9871acf393f64a5fa33668c19350ca87177b181f44bb3d0c33b2d534f22c/black-26.3.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f89f2ab047c76a9c03f78d0d66ca519e389519902fa27e7a91117ef7611c0568", size = 1720522, upload-time = "2026-03-12T03:40:32.346Z" }, - { url = "https://files.pythonhosted.org/packages/03/87/e766c7f2e90c07fb7586cc787c9ae6462b1eedab390191f2b7fc7f6170a9/black-26.3.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b07fc0dab849d24a80a29cfab8d8a19187d1c4685d8a5e6385a5ce323c1f015f", size = 1787824, upload-time = "2026-03-12T03:40:33.636Z" }, - { url = "https://files.pythonhosted.org/packages/ac/94/2424338fb2d1875e9e83eed4c8e9c67f6905ec25afd826a911aea2b02535/black-26.3.1-cp314-cp314-win_amd64.whl", hash = "sha256:0126ae5b7c09957da2bdbd91a9ba1207453feada9e9fe51992848658c6c8e01c", size = 1445855, upload-time = "2026-03-12T03:40:35.442Z" }, - { url = "https://files.pythonhosted.org/packages/86/43/0c3338bd928afb8ee7471f1a4eec3bdbe2245ccb4a646092a222e8669840/black-26.3.1-cp314-cp314-win_arm64.whl", hash = "sha256:92c0ec1f2cc149551a2b7b47efc32c866406b6891b0ee4625e95967c8f4acfb1", size = 1258109, upload-time = "2026-03-12T03:40:36.832Z" }, - { url = "https://files.pythonhosted.org/packages/8e/0d/52d98722666d6fc6c3dd4c76df339501d6efd40e0ff95e6186a7b7f0befd/black-26.3.1-py3-none-any.whl", hash = "sha256:2bd5aa94fc267d38bb21a70d7410a89f1a1d318841855f698746f8e7f51acd1b", size = 207542, upload-time = "2026-03-12T03:36:01.668Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/c0/37/5628dd55bf2b34257fc7603f0fe97c40e3aaf24265f416a9c85c95ca1436/black-26.5.1.tar.gz", hash = "sha256:dd321f668053961824bcc1be1cc1df748b2d7e4fa28086b08331e577b0100a73", size = 679439, upload-time = "2026-05-18T16:53:36.107Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/84/b3f55026206a9e8820a91503308075ca48eadc515e436731ca01dbe043b3/black-26.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9942db8888e06943c5dde66ca0037dcff82a2a4ec1ad0ada9e0d2ee9d9823893", size = 1987719, upload-time = "2026-05-18T17:05:02.757Z" }, + { url = "https://files.pythonhosted.org/packages/c6/34/7db312c5e5783d6e76cffd9d5ac8972a32badae4c6e3288dac0eed8d3bed/black-26.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:89c93167a74d3a75dfaa38a5c7cca015537d5820dd7f17d63267d674a61cae90", size = 1810083, upload-time = "2026-05-18T17:05:04.302Z" }, + { url = "https://files.pythonhosted.org/packages/33/e2/e0101e73c2c8727634e2efcb35e2b34bd23ad70dfa673789f5773a591b21/black-26.5.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22f2cd76d069cc54c71f10360744ba8983fbb616903b4304a85b734915c8e1b4", size = 1860633, upload-time = "2026-05-18T17:05:06.391Z" }, + { url = "https://files.pythonhosted.org/packages/b0/4c/e15c0c5b23cf3651035fe5addcce90e283af3548a3f91bb03d81b83106ab/black-26.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:87ed5c6f450580a2f6790bc7cbfb016dfc73bc750249762268a3695361315eef", size = 1477886, upload-time = "2026-05-18T17:05:07.96Z" }, + { url = "https://files.pythonhosted.org/packages/9f/3f/59d43ade98d2ce5c8dc34a4e46cbecd177e6d55d7d4092969c6003ccc655/black-26.5.1-cp310-cp310-win_arm64.whl", hash = "sha256:58b4bd92cf88aacf83d88479c8f9caee044b1ec55f2451a337354a7ea2590a22", size = 1277111, upload-time = "2026-05-18T17:05:09.473Z" }, + { url = "https://files.pythonhosted.org/packages/4b/96/3c3e09f09f44a37aac36b178a279cd19aa7001bd796187a7b162a294c81f/black-26.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:96ae2c733b2aabdd9986e2c5df628ff3473676cd1c5faded1ff496cf6d74083c", size = 1970639, upload-time = "2026-05-18T17:05:11.461Z" }, + { url = "https://files.pythonhosted.org/packages/83/ea/5ad117b9ee3ecd933c712bcbae610006e5b7cc9f41c526cd7ed3b6c4124c/black-26.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0e48b87e03bf109288e55cfceadcfa15ff5470aca2851a851950ed2926f450d7", size = 1792130, upload-time = "2026-05-18T17:05:12.983Z" }, + { url = "https://files.pythonhosted.org/packages/06/3a/7c448bc623fcdfa96672531beb5a616ea5e64f6975955254d7731ffb0ad9/black-26.5.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5119fa92ae61f786e8c3662fd60aece1d0a2dd5cca5d0c79417a95e7a4272a59", size = 1846134, upload-time = "2026-05-18T17:05:14.506Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5b/0b39b3a5917f0657ac014ad2edb58c139553a478adfe7f817abf1622ff6e/black-26.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:30d3c14661f2792e9142cce3eeeb1cbc175b3eb5f733be0c8eeb99651e52b0c3", size = 1478883, upload-time = "2026-05-18T17:05:16.542Z" }, + { url = "https://files.pythonhosted.org/packages/4c/48/dc222692e0f95030db1bbfb6c857e76858bad09058221ea7aae815255327/black-26.5.1-cp311-cp311-win_arm64.whl", hash = "sha256:1ef92b76f7733f282fd096ea406200b5a286c42947412b0eaff3a74e3616cefe", size = 1277776, upload-time = "2026-05-18T17:05:18.029Z" }, + { url = "https://files.pythonhosted.org/packages/24/99/7744b906703228264ef73bdd534df88ec1ef3de45c4e78f6d31b9e32d0c9/black-26.5.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4ad6fa01f941920f54f2bbb35f3df7673428a0ef98a0b0840c2eaef3b110efa8", size = 2012518, upload-time = "2026-05-18T17:05:20.108Z" }, + { url = "https://files.pythonhosted.org/packages/b7/c0/c5a3b1636dfd09c42534f2b3cf33506814f6d3e066fb0879ffa16c1ae860/black-26.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3915f256e75a2d7cf88d8953d37f780455dc586cc72dee059c528fe77f581217", size = 1816016, upload-time = "2026-05-18T17:05:21.84Z" }, + { url = "https://files.pythonhosted.org/packages/1f/0e/36044316b65ca471d3bb6d3703fd06fb50c6b727c3562f6a5a3153634f88/black-26.5.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d98d4137277c75dfb898ec8d846c4fd68ba1e9cf77f95e2865c203dc18f4c3d", size = 1884150, upload-time = "2026-05-18T17:05:23.546Z" }, + { url = "https://files.pythonhosted.org/packages/b3/33/dafc5808c2af43672912111d7c3354af1615f7e2be3bed7a878461abbe4d/black-26.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:a1dca32d9f1784af512a13410ec204c6f7f0aa9797a111c42e1c03449821c264", size = 1486825, upload-time = "2026-05-18T17:05:25.004Z" }, + { url = "https://files.pythonhosted.org/packages/82/14/b965ee6ad2a311f28bdbf692def3ee9848d2ae289dab28b27657fcee3e78/black-26.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:1037d5ac7b7b310b2632ad867ec8d0e4c4819dcdb0b820f63135da746a24e418", size = 1288646, upload-time = "2026-05-18T17:05:26.477Z" }, + { url = "https://files.pythonhosted.org/packages/3f/5c/c384363980e11e25ca6b93205949bb331fbf35f4e0dbec376dfa6326cec8/black-26.5.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2b36cf2ddf5566e205f6535f782a62194a184d33e175b64ae8c40b1737522be3", size = 2009020, upload-time = "2026-05-18T17:05:28.132Z" }, + { url = "https://files.pythonhosted.org/packages/0b/df/9f31c5e0babbfed77d505fc5d120beb98b21b33feaeded3924ea941fe360/black-26.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f7ea64ebfa01b50f693508fc39f875e264446d3b097088f84f203b9d09618a0", size = 1813335, upload-time = "2026-05-18T17:05:31.266Z" }, + { url = "https://files.pythonhosted.org/packages/fb/24/8e7b9a2fa61b0afd82209efe937557d180a1fa055bd7f6161eb9defc3719/black-26.5.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecb3e624844c798144e9bd986954e0adc81d8911a1f30f375e1252fe26e8c294", size = 1881614, upload-time = "2026-05-18T17:05:32.718Z" }, + { url = "https://files.pythonhosted.org/packages/49/ad/b4e0d9365ba8ac34f6bbab62a4b1b2dd5d618fac3fa1b8db968c844201b5/black-26.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:e1a26503279b6b310669fb0b219c39e4820b77e8189fe80f522bb511f247db0a", size = 1488925, upload-time = "2026-05-18T17:05:34.259Z" }, + { url = "https://files.pythonhosted.org/packages/a1/4b/652b859bf5df88a751c30451b09338f7fd26a77d1271c666992f836b7711/black-26.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:5c34b25da232ead53a6f335b76dbea124f4d152ad568b9080d6f944bc2b34b52", size = 1289883, upload-time = "2026-05-18T17:05:36.019Z" }, + { url = "https://files.pythonhosted.org/packages/a6/16/a8da8eb208c51c7f4ce74609a45d0dcc6d8a2141e45e81ee5289d1bb0d59/black-26.5.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e88976690a64b0af98312ca958415849cb42423423c5f2ee74af4b49a97a2168", size = 2004800, upload-time = "2026-05-18T17:05:38.182Z" }, + { url = "https://files.pythonhosted.org/packages/11/8a/a479296a19e383b70a725882a6cf3d786540601ff03cabbaaf1cce864c5a/black-26.5.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32d5ea7f6c8bdfa6e648326ebca1f02b0764e2a029edc6f8dce2627e19d468c3", size = 1815576, upload-time = "2026-05-18T17:05:40.309Z" }, + { url = "https://files.pythonhosted.org/packages/81/6b/cfaf3d39f25132c156a068f6b805576c9103a84086019507c70e1911ee7d/black-26.5.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ea8d16dc41655aa113cd64665e7219446cd7e4ff2248d7178eaa905190c86b18", size = 1877927, upload-time = "2026-05-18T17:05:42.463Z" }, + { url = "https://files.pythonhosted.org/packages/66/76/302e313964bcff7e28df329d39f84f5270095730d85ff0acc260610a0d82/black-26.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:577f21094ea469ef92ec1adaf2c9441a226d2144d01a5be2fa823cecf6543e50", size = 1511860, upload-time = "2026-05-18T17:05:43.943Z" }, + { url = "https://files.pythonhosted.org/packages/27/4e/a3827e35e0e567f9f9ee59e2a0ab979267dca98718f25547ca8c6733afd4/black-26.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:ed1a20af114c301a0269bf01163d51dbef72737fd65f850001e7cbe7f3c7abae", size = 1316632, upload-time = "2026-05-18T17:05:45.521Z" }, + { url = "https://files.pythonhosted.org/packages/94/51/f975cae76d44274cc2868dc9040ac5d58d464784610234455b4e7b19c6ef/black-26.5.1-py3-none-any.whl", hash = "sha256:4ed7f7da04046d2e488437170797d3b4a4ad83906683bcb7dfc68b673bbce5e2", size = 213693, upload-time = "2026-05-18T16:53:33.964Z" }, ] [[package]] @@ -246,11 +246,11 @@ css = [ [[package]] name = "certifi" -version = "2026.4.22" +version = "2026.5.20" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/25/ee/6caf7a40c36a1220410afe15a1cc64993a1f864871f698c0f93acb72842a/certifi-2026.4.22.tar.gz", hash = "sha256:8d455352a37b71bf76a79caa83a3d6c25afee4a385d632127b6afb3963f1c580", size = 137077, upload-time = "2026-04-22T11:26:11.191Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/ce/ee2ecad540810a79593028e88299baeae54d346cc7a0d94b6199988b89b1/certifi-2026.5.20.tar.gz", hash = "sha256:69dea482ab64caa7b9f6aba1c6bf48bb6a5448d1c0f1b17ab42ad8c763a5344d", size = 135422, upload-time = "2026-05-20T11:46:50.073Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl", hash = "sha256:3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a", size = 135707, upload-time = "2026-04-22T11:26:09.372Z" }, + { url = "https://files.pythonhosted.org/packages/59/8c/57e832b7af6d7c5abe66eb3fbe3a3a32f4d11ea23a1aa7131371035be991/certifi-2026.5.20-py3-none-any.whl", hash = "sha256:3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897", size = 134134, upload-time = "2026-05-20T11:46:48.578Z" }, ] [[package]] @@ -451,14 +451,14 @@ wheels = [ [[package]] name = "click" -version = "8.3.3" +version = "8.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bb/63/f9e1ea081ce35720d8b92acde70daaedace594dc93b693c869e0d5910718/click-8.3.3.tar.gz", hash = "sha256:398329ad4837b2ff7cbe1dd166a4c0f8900c3ca3a218de04466f38f6497f18a2", size = 328061, upload-time = "2026-04-22T15:11:27.506Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9b/98/518d8e5081007684232226f475082b30087d0f585e8457db087298259f49/click-8.4.1.tar.gz", hash = "sha256:918b5633eddf6b41c32d4f454bf0de810065c74e3f7dbf8ee5452f8be88d3e96", size = 353007, upload-time = "2026-05-22T04:08:37.769Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl", hash = "sha256:a2bf429bb3033c89fa4936ffb35d5cb471e3719e1f3c8a7c3fff0b8314305613", size = 110502, upload-time = "2026-04-22T15:11:25.044Z" }, + { url = "https://files.pythonhosted.org/packages/c7/0d/67e5b4109ea4a837e80daa87c2c696711955e40449a97e8926672534def2/click-8.4.1-py3-none-any.whl", hash = "sha256:482be17c6991b8c19c5429a1e995d9b0efdbb63172824c41f99965dc0ade8ec2", size = 116639, upload-time = "2026-05-22T04:08:35.26Z" }, ] [[package]] @@ -561,7 +561,7 @@ resolution-markers = [ "(python_full_version >= '3.11' and python_full_version < '3.14' and platform_machine != 'x86_64') or (python_full_version >= '3.11' and python_full_version < '3.14' and sys_platform != 'darwin')", ] dependencies = [ - { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } wheels = [ @@ -640,115 +640,115 @@ wheels = [ [[package]] name = "coverage" -version = "7.14.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/23/7f/d0720730a397a999ffc0fd3f5bebef347338e3a47b727da66fbb228e2ff2/coverage-7.14.0.tar.gz", hash = "sha256:057a6af2f160a85384cde4ab36f0d2777bae1057bae255f95413cdd382aa5c74", size = 919489, upload-time = "2026-05-10T18:02:31.397Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/59/9d/7c83ef51c3eb495f10010094e661833588b7709946da634c8b66520b97c7/coverage-7.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:84c32d90bf4537f0e7b4dec9aaa9a938fb8205136b9d2ecf4d7629d5262dc075", size = 219668, upload-time = "2026-05-10T17:59:23.106Z" }, - { url = "https://files.pythonhosted.org/packages/24/34/898546aefbd28f0af131201d0dc852c9e976f817bd7d5bfb8dc4e02863bb/coverage-7.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7c843572c605ab51cfdb5c6b5f2586e2a8467c0d28eca4bdef4ec70c5fecbd82", size = 220192, upload-time = "2026-05-10T17:59:26.095Z" }, - { url = "https://files.pythonhosted.org/packages/df/4a/b457c88aca72b0df13a98167ebd5d947135ccd9881ea88ce6a570e13aa9b/coverage-7.14.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0c451757d3fa2603354fdc789b5e58a0e327a117c370a40e3476ba4eabab228c", size = 246932, upload-time = "2026-05-10T17:59:27.806Z" }, - { url = "https://files.pythonhosted.org/packages/b5/d9/92600e89486fd074c50f0117422b2c9592c3e144e2f25bd5ac0bc62bc7a0/coverage-7.14.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3fd43f0616e765ab78d069cf8358def7363957a45cee446d65c502dcfeea7893", size = 248762, upload-time = "2026-05-10T17:59:29.479Z" }, - { url = "https://files.pythonhosted.org/packages/0d/e1/9ea1eb9c311da7f15853559dc1d9d82bef88ecd3e59fbeb51f16bc2ffa91/coverage-7.14.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:731e535b1498b27d13594a0527a79b0510867b0ad891532be41cb883f2128e20", size = 250625, upload-time = "2026-05-10T17:59:31.33Z" }, - { url = "https://files.pythonhosted.org/packages/a5/03/57afca1b8106f8549a5329139315041fe166d6099bd9381346b9430dfbd1/coverage-7.14.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c7492f2d493b976941c7ca050f273cbda2f43c381124f7586a3e3c16d1804fec", size = 252539, upload-time = "2026-05-10T17:59:32.692Z" }, - { url = "https://files.pythonhosted.org/packages/57/5e/2e9fc63c9928119c1dbae02222be51407d3e7ebac5811ebbda4af3557795/coverage-7.14.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dc38367eaa2abb1b766ac333142bce7655335a73537f5c8b75aaa89c2b987757", size = 247636, upload-time = "2026-05-10T17:59:34.599Z" }, - { url = "https://files.pythonhosted.org/packages/f0/e2/0b7898cda21041cc67546e19b80ba66cbbb47cbece52a76a5904de6a3aaf/coverage-7.14.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0a951308cde22cf77f953955a754d04dccb57fe3bb8e345d685778ed9fc1632a", size = 248666, upload-time = "2026-05-10T17:59:36.232Z" }, - { url = "https://files.pythonhosted.org/packages/d6/e3/d33662a2fdaef23229c15921f39c84ec38441f3069ba26e134ed402c833b/coverage-7.14.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fab3877e4ebb06bd9d4d4d00ee53309ee5478e66873c66a382272e3ee33eb7ea", size = 246670, upload-time = "2026-05-10T17:59:38.029Z" }, - { url = "https://files.pythonhosted.org/packages/99/b2/533942c3bfbf6770b5c32d7f2ff029fe013dba31f3fe8b45cabbb250365e/coverage-7.14.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:b812eb847b19876ebf33fb6c4f11819af05ab6050b0bfa1bc53412ae81779adb", size = 250484, upload-time = "2026-05-10T17:59:39.974Z" }, - { url = "https://files.pythonhosted.org/packages/d8/00/15acbad83a96de13c73831486c7627bfed73dfaec53b04e4a6315edf3fd8/coverage-7.14.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d9c8ef6ed820c433de075657d72dda1f89a2984955e58b8a75feb3f184250218", size = 246942, upload-time = "2026-05-10T17:59:41.659Z" }, - { url = "https://files.pythonhosted.org/packages/70/db/cef0228de493f2c740c760a9057a61d00c6849480073b70a75b87c7d4bab/coverage-7.14.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d128b1bba9361fbaaf6a19e179e6cfd6a9103ce0c0555876f72780acc93efd85", size = 247544, upload-time = "2026-05-10T17:59:43.471Z" }, - { url = "https://files.pythonhosted.org/packages/77/a0/d9ef8e148f3025c2ae8401d77cda1502b6d2a4d8102603a8af31460aedb6/coverage-7.14.0-cp310-cp310-win32.whl", hash = "sha256:65f267ca1370726ec2c1aa38bbe4df9a71a740f22878d2d4bf59d71a4cd8d323", size = 222285, upload-time = "2026-05-10T17:59:44.908Z" }, - { url = "https://files.pythonhosted.org/packages/85/c0/30c454c7d3cf47b2805d4e06f12443f5eece8a5d030d3b0350e7b74ecb49/coverage-7.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:b34ece8065914f938ed7f2c5872bb865336977a52919149846eac3744327267a", size = 223215, upload-time = "2026-05-10T17:59:46.779Z" }, - { url = "https://files.pythonhosted.org/packages/fc/e4/649c8d4f7f1709b6dbfc474358aa1bba02f67bcd52e2fec291a5014006cd/coverage-7.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a78e2a9d9c5e3b8d4ab9b9d28c985ea66fced0a7d7c2aec1f216e03a2011480", size = 219795, upload-time = "2026-05-10T17:59:48.198Z" }, - { url = "https://files.pythonhosted.org/packages/7f/8d/46692d24b3f395d4cbf17bfcc57136b4f2f9c0c0df864b0bddfc1d71a014/coverage-7.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a1816c505187592dcd1c5a5f226601a549f70365fbd00930ac88b0c225b76bb4", size = 220299, upload-time = "2026-05-10T17:59:49.683Z" }, - { url = "https://files.pythonhosted.org/packages/12/c2/a40f5cb295bbcbb697a76947a56081c494c61950366294ee426ffe261099/coverage-7.14.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d8e1762f0e9cbc26ec315471e7b47855218e833cd5a032d706fbf43845d878c7", size = 250721, upload-time = "2026-05-10T17:59:51.494Z" }, - { url = "https://files.pythonhosted.org/packages/fd/35/202235eb5c3c14c212462cd91d61b7386bf8fc44bc7a77f4742d2a69174b/coverage-7.14.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9336e23e8bb3a3925398261385e2a1533957d3e760e91070dcb0e98bfa514eed", size = 252633, upload-time = "2026-05-10T17:59:53.244Z" }, - { url = "https://files.pythonhosted.org/packages/bb/80/5f596e8995785124ee191c42535664c5e62c65995b66f4ca21e28ae04c81/coverage-7.14.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cd1169b2230f9cbe9c638ba38022ed7a2b1e641cc07f7cea0365e4be2a74980", size = 254743, upload-time = "2026-05-10T17:59:55.021Z" }, - { url = "https://files.pythonhosted.org/packages/1e/6d/0d178825be2350f0adb27984d0aa7cf84bbdab201f6fb926b535d23a8f5f/coverage-7.14.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d1bb3543b58fea74d2cd1abc4054cc927e4724687cb4560cd2ed88d2c7d820c0", size = 256700, upload-time = "2026-05-10T17:59:56.511Z" }, - { url = "https://files.pythonhosted.org/packages/19/5b/9e549c2f6e9dfea472adadba06c294e64735dabc2dd19015fac082095013/coverage-7.14.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a93bac2cb577ef60074999ed56d8a1535894398e2ed920d4185c3ec0c8864742", size = 250854, upload-time = "2026-05-10T17:59:57.94Z" }, - { url = "https://files.pythonhosted.org/packages/3d/1c/b94f9f5f36396021ee2f62c5834b12e6a3d31f0bed5d6fc6d1c3caec087c/coverage-7.14.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5904abf7e18cddc463219b17552229650c6b79e061d31a1059283051169cf7d5", size = 252433, upload-time = "2026-05-10T17:59:59.688Z" }, - { url = "https://files.pythonhosted.org/packages/b5/cb/d192cd8e1345eccabc32016f2d39072ecd10cb4f4b983ed8d0ebdeaf00dc/coverage-7.14.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:741f57cddc9004a8c81b084660215f33a6b597dbe62c31386b983ee26310e327", size = 250494, upload-time = "2026-05-10T18:00:01.953Z" }, - { url = "https://files.pythonhosted.org/packages/53/c5/aac9f460a41d835dbddef1d377f105f6ac2311d0f3c1588e9f51046d8813/coverage-7.14.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:664123feb0929d7affc135717dbd70d61d98688a08ab1e5ba464739620c6252d", size = 254261, upload-time = "2026-05-10T18:00:03.779Z" }, - { url = "https://files.pythonhosted.org/packages/23/aa/7af7c0081980a9cb3d289c5a435a4b7657dcecbd128e25c580e6a50389b5/coverage-7.14.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:c83d2399a51bbec8429266905d33616f04bc5726b1138c35844d5fcd896b2e20", size = 250216, upload-time = "2026-05-10T18:00:05.262Z" }, - { url = "https://files.pythonhosted.org/packages/35/60/a4257538ce2f6b978aeb51870d6c4208c510928a03db7e0339bb625dccb7/coverage-7.14.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb2e855b87321259a037429288ae85216d191c74de3e79bf57cd2bc0761992c", size = 251125, upload-time = "2026-05-10T18:00:06.858Z" }, - { url = "https://files.pythonhosted.org/packages/a1/ab/f91af47642ec1aa53490e835a95847168d9c77fc39aa58527604c051e145/coverage-7.14.0-cp311-cp311-win32.whl", hash = "sha256:731dc15b385ac52289743d476245b61e1a2927e803bef655b52bc3b2a75a21f3", size = 222300, upload-time = "2026-05-10T18:00:08.608Z" }, - { url = "https://files.pythonhosted.org/packages/f0/f0/a71ddbd874431e7a7cd96071f0c331cfbbad07704833c765d24ffbab8a67/coverage-7.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:bfb0ed8ec5d25e93face268115d7964db9df8b9aae8edcde9ec6b16c726a7cc1", size = 223241, upload-time = "2026-05-10T18:00:10.746Z" }, - { url = "https://files.pythonhosted.org/packages/d8/6e/d9d312a5151a96cd110efee32efc3fc97b01ebd86203fe618ccb29cf4c92/coverage-7.14.0-cp311-cp311-win_arm64.whl", hash = "sha256:7ebb1c6df9f78046a1b1e0a89674cd4bf73b7c648914eebcf976a57fd99a5627", size = 221908, upload-time = "2026-05-10T18:00:12.242Z" }, - { url = "https://files.pythonhosted.org/packages/09/1e/2f996b2c8415cbb6f54b0f5ec1ee850c96d7911961afb4fc05f4a89d8c58/coverage-7.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7ffd19fc8aed057fd686a17a4935eef5f9859d69208f96310e893e64b9b6ccf5", size = 219967, upload-time = "2026-05-10T18:00:13.756Z" }, - { url = "https://files.pythonhosted.org/packages/34/23/35c7aea1274aef7525bdd2dc92f710bdde6d11652239d71d1ec450067939/coverage-7.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:829994cfe1aeb773ca27bf246d4badc1e764893e3bfb98fff820fcecd1ca4662", size = 220329, upload-time = "2026-05-10T18:00:15.264Z" }, - { url = "https://files.pythonhosted.org/packages/75/cf/a8f4b43a16e194b0261257ad28ded5853ec052570afef4a84e1d81189f3b/coverage-7.14.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b4f07cf7edcb7ec39431a5074d7ea83b29a9f71fcfc494f0f40af4e65180420f", size = 251839, upload-time = "2026-05-10T18:00:17.16Z" }, - { url = "https://files.pythonhosted.org/packages/69/ff/6699e7b71e60d3049eb2bdcbc95ee3f35707b2b0e48f32e9e63d3ce30c08/coverage-7.14.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ca3d9cf2c32b521bd9518385608787fa86f38daf993695307531822c3430ed67", size = 254576, upload-time = "2026-05-10T18:00:18.829Z" }, - { url = "https://files.pythonhosted.org/packages/22/ec/c936d495fcd67f48f03a9c4ad3297ff80d1f222a5df3980f15b34c186c21/coverage-7.14.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92af52828e7f29d827346b0294e5a0853fa206db77db0395b282918d41e28db9", size = 255690, upload-time = "2026-05-10T18:00:20.648Z" }, - { url = "https://files.pythonhosted.org/packages/5c/42/5af63f636cc62a4a2b1b3ba9146f6ee6f53a35a50d5cefc54d5670f60999/coverage-7.14.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7b2bb6c9d7e769360d0f20a0f219603fd64f0c8f97de17ab25853261602be0fb", size = 257949, upload-time = "2026-05-10T18:00:22.28Z" }, - { url = "https://files.pythonhosted.org/packages/26/d3/a225317bd2012132a27e1176d51660b826f99bb975876463c44ea0d7ee5a/coverage-7.14.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1c9ed6ef99f88fb8c14aa8e2bf8eb0fe55fa2edfea68f8675d78741df1a5ac0e", size = 252242, upload-time = "2026-05-10T18:00:24.076Z" }, - { url = "https://files.pythonhosted.org/packages/f1/7f/9e65495298c3ea414742998539c37d048b5e81cc818fb1828cc6b51d10bf/coverage-7.14.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8231ade007f37959fbf58acc677f26b922c02eda6f0428ea307da0fd39681bf3", size = 253608, upload-time = "2026-05-10T18:00:25.588Z" }, - { url = "https://files.pythonhosted.org/packages/94/46/1522b524a35bdad22b2b8c4f9d32d0a104b524726ec380b2db68db1746f5/coverage-7.14.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d8b013632cc1ce1d09dbe4f32667b4d320ec2f54fc326ebeffcd0b0bcc2bb6c4", size = 251753, upload-time = "2026-05-10T18:00:27.104Z" }, - { url = "https://files.pythonhosted.org/packages/f3/e9/cdf00d38817742c541ade405e115a3f7bf36e6f2a8b99d4f209861b85a2d/coverage-7.14.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1733198802d71ec4c524f322e2867ee05c62e9e75df86bdca545407a221827d1", size = 255823, upload-time = "2026-05-10T18:00:29.038Z" }, - { url = "https://files.pythonhosted.org/packages/38/fc/5e7877cf5f902d08a17ff1c532511476d87e1bea355bd5028cb97f902e79/coverage-7.14.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:72a305291fa8ee01332f1aaf38b348ca34097f6aa0b0ef627eef2837e57bbba5", size = 251323, upload-time = "2026-05-10T18:00:30.647Z" }, - { url = "https://files.pythonhosted.org/packages/18/9d/50f05a72dff8487464fdd4178dda5daed642a060e60afb644e3d45123559/coverage-7.14.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fcaba850dd317c65423a9d63d88f9573c53b00354d6dd95724576cc98a131595", size = 253197, upload-time = "2026-05-10T18:00:32.211Z" }, - { url = "https://files.pythonhosted.org/packages/00/3f/6f61ffe6439df266c3cf60f5c99cfaa21103d0210d706a42fc6c30683ff8/coverage-7.14.0-cp312-cp312-win32.whl", hash = "sha256:5ac83957a80d0701310e96d8bec68cdcf4f90a7674b7d13f15a344315b41ab27", size = 222515, upload-time = "2026-05-10T18:00:33.717Z" }, - { url = "https://files.pythonhosted.org/packages/85/19/93853133df2cb371083285ef6a93982a0173e7a233b0f61373ba9fd30eb2/coverage-7.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:70390b0da32cb90b501953716302906e8bcce087cb283e70d8c97729f22e92b2", size = 223324, upload-time = "2026-05-10T18:00:35.172Z" }, - { url = "https://files.pythonhosted.org/packages/74/18/9f7fe62f659f24b7a82a0be56bf94c1bd0a89e0ae7ab4c668f6e82404294/coverage-7.14.0-cp312-cp312-win_arm64.whl", hash = "sha256:91b993743d959b8be85b4abf9d5478216a69329c321efe5be0433c1a841d691d", size = 221944, upload-time = "2026-05-10T18:00:37.014Z" }, - { url = "https://files.pythonhosted.org/packages/6b/76/b7c66ee3c66e1b0f9d894c8125983aa0c03fb2336f2fd16559f9c966157f/coverage-7.14.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f2bbb8254370eb4c628ff3d6fa8a7f74ddc40565394d4f7ab791d1fe568e37ef", size = 219990, upload-time = "2026-05-10T18:00:38.887Z" }, - { url = "https://files.pythonhosted.org/packages/b3/af/e567cbad5ba69c013a50146dfa886dc7193361fda77521f51274ff620e1b/coverage-7.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:23b81107f46d3f21d0cbce30664fcec0f5d9f585638a67081750f99738f6bf66", size = 220365, upload-time = "2026-05-10T18:00:40.864Z" }, - { url = "https://files.pythonhosted.org/packages/44/6f/9ad575d505b4d805b254febc8a5b338a2efe278f8786e56ff1cb8413f9c3/coverage-7.14.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:22a7e06a5f11a757cdfe79018e9095f9f69ae283c5cd8123774c788deec8717b", size = 251363, upload-time = "2026-05-10T18:00:42.489Z" }, - { url = "https://files.pythonhosted.org/packages/6f/5f/b5370068b2f57787454592ed7dcd1002f0f1703b7db1fa30f6a325a4ca6e/coverage-7.14.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9d1aa57a1dc8e05bdc42e81c5d671d849577aeedf279f4c449d6d286f9ed88ca", size = 253961, upload-time = "2026-05-10T18:00:44.079Z" }, - { url = "https://files.pythonhosted.org/packages/29/1e/51adf17738976e8f2b85ddef7b7aa12a0838b056c92f175941d8862767c1/coverage-7.14.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90c1a51bcfddf645b3bb7ec333d9e94393a8e94f55642380fa8a9a5a9e636cb7", size = 255193, upload-time = "2026-05-10T18:00:45.623Z" }, - { url = "https://files.pythonhosted.org/packages/9e/7b/5bfd7ac1df3b881c2ac7a5cbc99c7609e6296c402f5ef587cd81c6f355b3/coverage-7.14.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a841fae2fadcae4f438d43b6ccc4aac2ad609f47cdb6cfdce60cbb3fe5ca7bc2", size = 257326, upload-time = "2026-05-10T18:00:47.173Z" }, - { url = "https://files.pythonhosted.org/packages/7d/38/1d37d316b174fad3843a1d76dbdfe4398771c9ecd0515935dd9ece9cd627/coverage-7.14.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c79d2319cabef1fe8e86df73371126931550804738f78ad7d31e3aad85a67367", size = 251582, upload-time = "2026-05-10T18:00:49.152Z" }, - { url = "https://files.pythonhosted.org/packages/34/46/746704f95980ba220214e1a41e18cec5aea80a898eaa53c51bf2d645ff36/coverage-7.14.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1b23b0c6f0b1db6ad769b7050c8b641c0bf215ded26c1816955b17b7f26edfa9", size = 253325, upload-time = "2026-05-10T18:00:51.252Z" }, - { url = "https://files.pythonhosted.org/packages/e1/b9/bbe87206d9687b192352f893797825b5f5b15ecd3aa9c68fbff0c074d77b/coverage-7.14.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:55d3089079ce181a4566b1065ab28d2575eb76d8ac8f81f4fcda2bf037fee087", size = 251291, upload-time = "2026-05-10T18:00:52.816Z" }, - { url = "https://files.pythonhosted.org/packages/46/57/b8cdb12ac0d73ef0243218bd5e22c9df8f92edab8018213a86aec67c5324/coverage-7.14.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:49c005cba1e2f9677fb2845dcdf9a2e72a52a17d63e8231aaaae35d9f50215ef", size = 255448, upload-time = "2026-05-10T18:00:54.548Z" }, - { url = "https://files.pythonhosted.org/packages/1f/d4/5002019538b2036ce3c84340f54d2fd5100d55b0a6b0894eee56128d03c7/coverage-7.14.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:9117377b823daa28aa8635fbb08cda1cd6be3d7143257345459559aeef852d52", size = 251110, upload-time = "2026-05-10T18:00:56.122Z" }, - { url = "https://files.pythonhosted.org/packages/37/53/20c5009477660f084e6ed60bc02a91894b8e234e617e86ecfd9aaf78e27b/coverage-7.14.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7b79d646cf46d5cf9a9f40281d4441df5849e445726e369006d2b117710b33fe", size = 252885, upload-time = "2026-05-10T18:00:57.967Z" }, - { url = "https://files.pythonhosted.org/packages/ae/ab/3cf6427ac9c1f1db747dbb1ce71dde47984876d4c2cfd018a3fef0a78d4d/coverage-7.14.0-cp313-cp313-win32.whl", hash = "sha256:fb609b3658479e33f9516d46f1a89dbb9b6c261366e3a11844a96ec487533dae", size = 222539, upload-time = "2026-05-10T18:00:59.581Z" }, - { url = "https://files.pythonhosted.org/packages/8f/b8/9228523e80321c2cb4880d1f589bc0171f2f71432c35118ad04dc01decce/coverage-7.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:0773d8329cf32b6fd222e4b52622c61fe8d503eb966cfc8d3c3c10c96266d50e", size = 223344, upload-time = "2026-05-10T18:01:01.531Z" }, - { url = "https://files.pythonhosted.org/packages/a3/99/118daa192f95e3a6cb2740100fbf8797cda1734b4134ef0b5d501a7fa8f3/coverage-7.14.0-cp313-cp313-win_arm64.whl", hash = "sha256:b4e26a0f1b696faf283bffe5b8569e44e336c582439df5d53281ab89ee0cba96", size = 221966, upload-time = "2026-05-10T18:01:03.16Z" }, - { url = "https://files.pythonhosted.org/packages/e6/f1/a46cc0c013be170216253184a32366d7cbdb9252feaec866b05c2d12a894/coverage-7.14.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:953f521ca9445300397e65fda3dca58b2dbd68fee983777420b57ac3c77e9f90", size = 220679, upload-time = "2026-05-10T18:01:05.058Z" }, - { url = "https://files.pythonhosted.org/packages/64/8c/9c30a3d311a34177fa432995be7fbfc64477d8bac5630bd38055b1c9b424/coverage-7.14.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:98af83fd65ae24b1fdd03aaead967a9f523bcd2f1aab2d4f3ffda65bb568a6f1", size = 221033, upload-time = "2026-05-10T18:01:07.002Z" }, - { url = "https://files.pythonhosted.org/packages/9a/cd/3fb5e06c3badefd0c1b47e2044fdca67f8220a4ec2e7fcfb476aa0a67c6c/coverage-7.14.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:668b92e6958c4db7cf92e81caac328dfbbdbb215db2850ad28f0cbe1eea0bfbd", size = 262333, upload-time = "2026-05-10T18:01:08.903Z" }, - { url = "https://files.pythonhosted.org/packages/a8/e6/fbc322325c7294d3e22c1ad6b79e45d0806b25228c8e5842aed6d8169aa7/coverage-7.14.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9fbd898551762dea00d3fef2b1c4f99afd2c6a3ff952ea07d60a9bd5ed4f34bc", size = 264410, upload-time = "2026-05-10T18:01:10.531Z" }, - { url = "https://files.pythonhosted.org/packages/08/92/c497b264bec1673c47cc77e26f760fcda4654cabf1f39546d1a23a3b8c35/coverage-7.14.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:68af363c07ecd8d4b7d4043d85cb376d7d227eceb54e5323ee45da73dbd3e426", size = 266836, upload-time = "2026-05-10T18:01:12.19Z" }, - { url = "https://files.pythonhosted.org/packages/78/fc/045da320987f401af5d2815d351e8aa799aec859f60e29f445e3089eeedb/coverage-7.14.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6e57054a583da8ac55edf24117ea4c9133032cfc4cf72aa2d48c1e5d4b52f899", size = 267974, upload-time = "2026-05-10T18:01:13.926Z" }, - { url = "https://files.pythonhosted.org/packages/1b/ae/227b1e379497fb7a4fc3286e620f80c8a1e7cec66d45695a01639eb1af65/coverage-7.14.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cc3499459bbcdd51a65b64c35ab7ed2764eaf3cba826e0df3f1d7fe2e102b70b", size = 261578, upload-time = "2026-05-10T18:01:15.564Z" }, - { url = "https://files.pythonhosted.org/packages/a0/f5/3570342900f2acea31d33ff1590c5d8bac1a8e1a2e1c6d34a5d5e61de681/coverage-7.14.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:45899ec2138a4346ed34d601dedf5076fb74edf2d1dd9dc76a78e82397edee90", size = 264394, upload-time = "2026-05-10T18:01:17.607Z" }, - { url = "https://files.pythonhosted.org/packages/16/29/de1bbc01c935b28f89b1dc3db85b011c055e843a8e5e3b83141c3f80af7f/coverage-7.14.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8767486808c436f05b23ab98eb963fb29185e32a9357a166971685cb3459900f", size = 262022, upload-time = "2026-05-10T18:01:19.304Z" }, - { url = "https://files.pythonhosted.org/packages/35/95/f53890b0bf2fc10ab168e05d38869215e73ca24c4cb521c3bb0eb62fe16b/coverage-7.14.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:a3b5ddfd6aa7ddad53ee3edb231e88a2151507a43229b7d71b953916deca127d", size = 265732, upload-time = "2026-05-10T18:01:21.494Z" }, - { url = "https://files.pythonhosted.org/packages/ed/ea/c919e259081dd2bdf0e43b87209709ba7ec2e4117c2a7f5185379c43463c/coverage-7.14.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:63df0fe568e698e1045792399f8ab6da3a6c2dce3182813fb92afa2641087b47", size = 260921, upload-time = "2026-05-10T18:01:23.533Z" }, - { url = "https://files.pythonhosted.org/packages/1a/2c/c2831889705a81dc5d1c6ca12e4d8e9b95dfc146d153488a6c0ea685d28e/coverage-7.14.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:827d6397dbd95144939b18f89edf31f63e1f99633e8d5f32f22ba8bdda567477", size = 263109, upload-time = "2026-05-10T18:01:25.165Z" }, - { url = "https://files.pythonhosted.org/packages/5a/a9/2fcae5003cac3d63fe344d2166243c2756935f48420863c5272b240d550b/coverage-7.14.0-cp313-cp313t-win32.whl", hash = "sha256:7bf43e000d24012599b879791cff41589af90674722421ef11b11a5431920bab", size = 223212, upload-time = "2026-05-10T18:01:27.157Z" }, - { url = "https://files.pythonhosted.org/packages/3f/bb/18e94d7b14b9b398164197114a587a04ab7c9fdbe1d237eef57311c5e883/coverage-7.14.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3f5549365af25d770e06b1f8f5682d9a5637d06eb494db91c6fa75d3950cc917", size = 224272, upload-time = "2026-05-10T18:01:29.107Z" }, - { url = "https://files.pythonhosted.org/packages/db/56/4f14fad782b035c81c4ffd09159e7103d42bb1d93ac8496d04b90a11b7da/coverage-7.14.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6d160217ec6fe890f16ad3a9531761589443749e448f91986c972714fad361c8", size = 222530, upload-time = "2026-05-10T18:01:31.151Z" }, - { url = "https://files.pythonhosted.org/packages/1c/18/b9a6586d73992807c26f9a5f274131be3d76b56b18a82b9392e2a25d2e45/coverage-7.14.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:9aed9fa983514ca032790f3fe0d1c0e42ca7e16b42432af1706b50a9a46bef5d", size = 220036, upload-time = "2026-05-10T18:01:33.057Z" }, - { url = "https://files.pythonhosted.org/packages/f3/9b/4165a1d56ddc302a0e2d518fd9d412a4fd0b57562618c78c5f21c57194f5/coverage-7.14.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ba3b8390db29296dbbf49e91b6fe08f990743a90c8f447ba4c2ffc29670dfa63", size = 220368, upload-time = "2026-05-10T18:01:34.705Z" }, - { url = "https://files.pythonhosted.org/packages/69/aa/c12e52a5ba148d9995229d557e3be6e554fe469addc0e9241b2f0956d8ea/coverage-7.14.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3a5d8e876dfa2f102e970b183863d6dedd023d3c0eeca1fe7a9787bc5f28b212", size = 251417, upload-time = "2026-05-10T18:01:36.949Z" }, - { url = "https://files.pythonhosted.org/packages/d7/51/ec641c26e6dca1b25a7d2035ba6ecb7c884ef1a100a9e42fbe4ce4405139/coverage-7.14.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5ebb8f4614a3787d567e610bbfdf96a4798dd69a1afb1bd8ad228d4111fe6ff3", size = 253924, upload-time = "2026-05-10T18:01:38.985Z" }, - { url = "https://files.pythonhosted.org/packages/33/c4/59c3de0bd1b538824173fd518fed51c1ce740ca5ed68e74545983f4053a9/coverage-7.14.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b9bf47223dd8db3d4c4b2e443b02bace480d428f0822c3f991600448a176c97", size = 255269, upload-time = "2026-05-10T18:01:40.957Z" }, - { url = "https://files.pythonhosted.org/packages/7b/a9/36dfa153a62040296f6e7febfdb20a5720622f6ef5a81a41e8237b9a5344/coverage-7.14.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3485a836550b303d006d57cc06e3d5afaabc642c77050b7c985a97b13e3776b8", size = 257583, upload-time = "2026-05-10T18:01:42.607Z" }, - { url = "https://files.pythonhosted.org/packages/26/7b/cc2c048d4114d9ab1c2409e9ee365e5ae10736df6dffcfc9444effa6c708/coverage-7.14.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3e7e88110bae996d199d1693ca8ec3fd52441d426401ae963437598667b4c5eb", size = 251434, upload-time = "2026-05-10T18:01:44.537Z" }, - { url = "https://files.pythonhosted.org/packages/ee/df/6770eaa576e604575e9a78055313250faef5faa84bd6f71a39fece519c43/coverage-7.14.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:15228a6800ce7bdf1b74800595e56db7138cecb338fdbf044806e10dcf182dfe", size = 253280, upload-time = "2026-05-10T18:01:46.175Z" }, - { url = "https://files.pythonhosted.org/packages/ad/9e/1c0264514a3f98259a6d64765a397b2c8373e3ba59ee722a4802d3ec0c61/coverage-7.14.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:9d26ac7f5398bafc5b57421ad994e8a4749e8a7a0e62d05ec7d53014d5963bfa", size = 251241, upload-time = "2026-05-10T18:01:48.732Z" }, - { url = "https://files.pythonhosted.org/packages/64/16/4efdf3e3c4079cdbf0ece56a2fea872df9e8a3e15a13a0af4400e1075944/coverage-7.14.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2fb73254ff43c911c967a899e1359bc5049b4b115d6e8fbdde4937d0a2246cd5", size = 255516, upload-time = "2026-05-10T18:01:50.819Z" }, - { url = "https://files.pythonhosted.org/packages/93/69/b1de96346603881b3d1bc8d6447c83200e1c9700ffbaff926ba01ff5724c/coverage-7.14.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:454a380af72c6adada298ed270d38c7a391288198dbfb8467f786f588751a90c", size = 251059, upload-time = "2026-05-10T18:01:52.773Z" }, - { url = "https://files.pythonhosted.org/packages/a4/66/2881853e0363a5e0a724d1103e53650795367471b6afb234f8b49e713bc6/coverage-7.14.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:65c86fb646d2bd2972e96bd1a8b45817ed907cee68655d6295fe7ec031d04cca", size = 252716, upload-time = "2026-05-10T18:01:54.506Z" }, - { url = "https://files.pythonhosted.org/packages/55/5c/0d3305d002c41dcde873dbe456491e663dc55152ca526b630b5c47efd62f/coverage-7.14.0-cp314-cp314-win32.whl", hash = "sha256:6a6516b02a6101398e19a3f44820f69bab2590697f7def4331f668b14adaf828", size = 222788, upload-time = "2026-05-10T18:01:56.487Z" }, - { url = "https://files.pythonhosted.org/packages/f9/58/6e1b8f52fdc3184b47dc5037f5070d83a3d11042db1594b02d2a44d786c8/coverage-7.14.0-cp314-cp314-win_amd64.whl", hash = "sha256:45e0f79d8351fa76e256716df91eab12890d32678b9590df7ae1042e4bd4cf5d", size = 223600, upload-time = "2026-05-10T18:01:58.497Z" }, - { url = "https://files.pythonhosted.org/packages/00/70/a18c408e674bc26281cadaedc7351f929bd2094e191e4b15271c30b084cc/coverage-7.14.0-cp314-cp314-win_arm64.whl", hash = "sha256:4b899594a8b2d81e5cc064a0d7f9cac2081fed91049456cae7676787e41549c9", size = 222168, upload-time = "2026-05-10T18:02:00.411Z" }, - { url = "https://files.pythonhosted.org/packages/3d/89/2681f071d238b62aff8dfc2ab44fc24cfdb38d1c01f391a80522ff5d3a16/coverage-7.14.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:f580f8c80acd94ac72e863efe2cab791d8c38d153e0b463b92dfa000d5c84cd1", size = 220766, upload-time = "2026-05-10T18:02:02.313Z" }, - { url = "https://files.pythonhosted.org/packages/bd/c7/c987babafd9207ffa1995e1ef1f9b26762cf4963aa768a66b6f0501e4616/coverage-7.14.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a2bd259c442cd43c49b30fbafc51776eb19ea396faf159d26a83e6a0a5f13b0c", size = 221035, upload-time = "2026-05-10T18:02:04.017Z" }, - { url = "https://files.pythonhosted.org/packages/5a/e9/d6a5ac3b333088143d6fc877d398a9a674dc03124a2f776e131f03864823/coverage-7.14.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a706b908dfa85538863504c624b237a3cc34232bf403c057414ebfdb3b4d9f84", size = 262405, upload-time = "2026-05-10T18:02:05.915Z" }, - { url = "https://files.pythonhosted.org/packages/38/b1/e70838d29a7c08e22d44398a46db90815bbcbf28de06992bd9210d1a8d8e/coverage-7.14.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7333cd944ee4393b9b3d3c1b598c936d4fc8d70573a4c7dacfec5590dd50e436", size = 264530, upload-time = "2026-05-10T18:02:07.582Z" }, - { url = "https://files.pythonhosted.org/packages/6b/73/5c31ef97763288d03d9995152b96d5475b527c63d91c84b01caea894b83a/coverage-7.14.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f162bc9a15b82d947b02651b0c7e1609d6f7a8735ca330cfadec8481dd97d5a", size = 266932, upload-time = "2026-05-10T18:02:09.401Z" }, - { url = "https://files.pythonhosted.org/packages/e1/76/dd56d80f29c5f05b4d76f7e7c6d47cafacae017189c75c5759d24f9ff0cc/coverage-7.14.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:362cb78e01a5dc82009d88004cf60f2e6b6d6fcbfdec05b05af73b0abf40118f", size = 268062, upload-time = "2026-05-10T18:02:11.399Z" }, - { url = "https://files.pythonhosted.org/packages/6e/c7/27ba85cd5b95614f159ff93ebff1901584a8d192e2e5e24c4943a7453f59/coverage-7.14.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:acebd068fca5512c3a6fde9c045f901613478781a73f0e82b307b214daef23fb", size = 261504, upload-time = "2026-05-10T18:02:13.257Z" }, - { url = "https://files.pythonhosted.org/packages/13/2e/e8149f60ab5d5684c6eee881bdf34b127115cddbb958b196768dd9d63473/coverage-7.14.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:29fe3da551dface75deb2ccbf87b6b66e2e7ef38f6d89050b428be94afff3490", size = 264398, upload-time = "2026-05-10T18:02:15.063Z" }, - { url = "https://files.pythonhosted.org/packages/d9/7f/1261b025285323225f4b4abffa5a643649dfd67e25ddca7ebcbdea3b7cb3/coverage-7.14.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:b4cc4fce8672fffcb09b0eafc167b396b3ba53c4a7230f54b7aaffbf6c835fa9", size = 262000, upload-time = "2026-05-10T18:02:16.756Z" }, - { url = "https://files.pythonhosted.org/packages/d3/dc/829c54f60b9d08389439c00f813c752781c496fc5788c78d8006db4b4f2b/coverage-7.14.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:5d4a51aad8ba8bdcd2b8bd8f03d4aca19693fa2327a3470e4718a25b03481020", size = 265732, upload-time = "2026-05-10T18:02:18.817Z" }, - { url = "https://files.pythonhosted.org/packages/ed/b0/70bd1419941652fa062689cba9c3eeafb8f5e6fbb890bce41c3bdda5dbd6/coverage-7.14.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:9f323af3e1e4f68b60b7b247e37b8515563a61375518fa59de1af48ba28a3db6", size = 260847, upload-time = "2026-05-10T18:02:20.528Z" }, - { url = "https://files.pythonhosted.org/packages/f2/73/be40b2390656c654d35ea0015ea7ba3d945769cf80790ad5e0bb2d56d2ba/coverage-7.14.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:1a0abc7342ea9711c469dd8b821c6c311e6bc6aac1442e5fbd6b27fae0a8f3db", size = 263166, upload-time = "2026-05-10T18:02:22.337Z" }, - { url = "https://files.pythonhosted.org/packages/29/55/4a643f712fcf7cf2881f8ec1e0ccb7b164aff3108f69b51801246c8799f2/coverage-7.14.0-cp314-cp314t-win32.whl", hash = "sha256:a9f864ef57b7172e2db87a096642dd51e179e085ab6b2c371c29e885f65c8fb2", size = 223573, upload-time = "2026-05-10T18:02:24.11Z" }, - { url = "https://files.pythonhosted.org/packages/27/96/3acae5da0953be042c0b4dea6d6789d2f080701c77b88e44d5bd41b9219b/coverage-7.14.0-cp314-cp314t-win_amd64.whl", hash = "sha256:29943e552fdc08e082eb51400fb2f58e118a83b5542bd06531214e084399b644", size = 224680, upload-time = "2026-05-10T18:02:25.896Z" }, - { url = "https://files.pythonhosted.org/packages/93/3d/6ab5d2dd8325d838737c6f8d83d62eb6230e0d70b87b51b57bbfd08fa767/coverage-7.14.0-cp314-cp314t-win_arm64.whl", hash = "sha256:742a73ea621953b012f2c4c2219b512180dd84489acf5b1596b0aafc55b9100b", size = 222703, upload-time = "2026-05-10T18:02:27.822Z" }, - { url = "https://files.pythonhosted.org/packages/61/e8/cb8e80d6f9f55b99588625062822bf946cf03ed06315df4bd8397f5632a1/coverage-7.14.0-py3-none-any.whl", hash = "sha256:8de5b61163aee3d05c8a2beab6f47913df7981dad1baf82c414d99158c286ab1", size = 211764, upload-time = "2026-05-10T18:02:29.538Z" }, +version = "7.14.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/fd/0ab2772530e946e1be1abd0bc09e647ec9b02e88f0867857601fefca8953/coverage-7.14.1.tar.gz", hash = "sha256:30c08f7d90415aa98b3c990385dea2939b0da55f38515e5b369b83655f8523be", size = 920132, upload-time = "2026-05-26T20:41:36.783Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/69/0d2ef01ff4b8fcecd4cba920d11e92fa4f96ae412441d3b56a90a258e69b/coverage-7.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3e3680291c4a1d0dadfa84a2c459576a4af5133abb617905714339a0c73138cf", size = 219722, upload-time = "2026-05-26T20:38:14.002Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ae/9afdeaa31b9d9ce98124b6abf8bb49119bf71aecae04f8567c189d91299f/coverage-7.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a5274669f37f2343635a347b91a60777621341ab3378e9c6ac9335eee704bddf", size = 220240, upload-time = "2026-05-26T20:38:17.424Z" }, + { url = "https://files.pythonhosted.org/packages/51/69/c998589871df7ea7dba865cc5ee32b5a3e1d47ba6c68ef91104c7c46fa5e/coverage-7.14.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cfe5a5fec635799ef33428f1e5e61bafa45a92a96190ba731561ba558ccc214d", size = 246981, upload-time = "2026-05-26T20:38:19.266Z" }, + { url = "https://files.pythonhosted.org/packages/fc/10/1c7d04c13040dac531d21b712bbe08f902e6dd9b58f5d77875c4d030f8f2/coverage-7.14.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:62a9f70b52e0b5a95cfef4a5c5641b06983cadc5e538a3feeb5c00211f523ac2", size = 248812, upload-time = "2026-05-26T20:38:20.75Z" }, + { url = "https://files.pythonhosted.org/packages/c1/65/2a38a4607ef27cadcfbcee034dba5830ae2569f90144a0f4c7dbf47d30b0/coverage-7.14.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c18ebc343e15be53049b3a2dce38fe82d58f37e20ab9094b3a39c0aa4f6bb47", size = 250675, upload-time = "2026-05-26T20:38:22.159Z" }, + { url = "https://files.pythonhosted.org/packages/c9/a2/a446ed9752a4a59b79e0fb6cbb319f6facb2183045c0725462625e66f87e/coverage-7.14.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b84ffdf877644e7096aa936991efeed873f7f3df57b9cd001312b7668ab08550", size = 252590, upload-time = "2026-05-26T20:38:23.63Z" }, + { url = "https://files.pythonhosted.org/packages/9e/fd/e81fbd7ba752365546e9842b1cbdaad3d6919d2a522c590aef16a281ec5e/coverage-7.14.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e854312c4103f2ad4c0dc023b69b77ebfd2c89db5f86c4c94dc2353f9a92167e", size = 247691, upload-time = "2026-05-26T20:38:25.057Z" }, + { url = "https://files.pythonhosted.org/packages/53/35/f3c26fdaae9ea937d154ca4d372e5ea0a4167ff70d36c6074ac2eacb2f83/coverage-7.14.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c643734307300234fafa36bf2a040a7235f8f177ea1fd6ec1423aea6fb7b929f", size = 248716, upload-time = "2026-05-26T20:38:26.406Z" }, + { url = "https://files.pythonhosted.org/packages/2e/14/940b6c49551fd343e8507ee2b0ba7af5d0aa04ed5bf768285cb7c72a9884/coverage-7.14.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:84ac9499e48700399a5dd0ea7085b5091961fec52c68d66b4ec0d3cf7f4441b1", size = 246721, upload-time = "2026-05-26T20:38:28.282Z" }, + { url = "https://files.pythonhosted.org/packages/aa/2c/40fc0634186c28292a662dff578866b3913983d6c375a3c2a74020938719/coverage-7.14.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:7f02d09f70776579b926d889a4c9c235070a1f47c40458aeaca563fae5acfdb5", size = 250533, upload-time = "2026-05-26T20:38:29.753Z" }, + { url = "https://files.pythonhosted.org/packages/de/e3/2c26bf1e811f9df991ff2a9bdddebdd13ee0665d564df7d05979f9146297/coverage-7.14.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:ce66d8e46da2bb5ee313a745cbd2e391d319176c1f7a9451bfcd3a2fb920859b", size = 246990, upload-time = "2026-05-26T20:38:31.516Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b0/060260ef56bd92363ebdce0c7095ce422b06e69aae71828efeca473ab1ca/coverage-7.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c912c259304cfb5ee584481cfb7ce1ff932b4d61e6c9140b8f19cb7b5ed82332", size = 247593, upload-time = "2026-05-26T20:38:33.065Z" }, + { url = "https://files.pythonhosted.org/packages/63/f3/501502046efeb0d6d94b5ca54941d95f1184183dd6bdb7f283985783bb4a/coverage-7.14.1-cp310-cp310-win32.whl", hash = "sha256:1238cb94638e610e972c60dac68e813f868dc7d6e982535270558443058d9d59", size = 222330, upload-time = "2026-05-26T20:38:35.36Z" }, + { url = "https://files.pythonhosted.org/packages/a0/5d/1bf99f2c558f128faf7906817ccbdb576ba815d3b41ce2ac1719b70a3663/coverage-7.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:fc459e5d73be2d6332fcfe8dbf3d8994671fe33c700f4565988ecfa511547253", size = 223261, upload-time = "2026-05-26T20:38:37.196Z" }, + { url = "https://files.pythonhosted.org/packages/7d/d7/477ad149490e6cb849f28abea1dabb9c823cea72e7500c81b4240ce619c0/coverage-7.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:478b5bcd63c2e1357c5c7e16c070690df7b07f676b1c114d7b93e533c664309f", size = 219848, upload-time = "2026-05-26T20:38:38.715Z" }, + { url = "https://files.pythonhosted.org/packages/91/82/a5eb47257c50601bb7b9a9d2857c67b7a3a85ad74180eb2c98bb1fbe0ce5/coverage-7.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a24a81f9715ee42ef59a316cc11611c98fe23920f7c81861315c9f3ff4a230f4", size = 220354, upload-time = "2026-05-26T20:38:40.232Z" }, + { url = "https://files.pythonhosted.org/packages/43/8b/78419b5391a5cb706b6544390507e469d83ffc9a8248b02c4011aceb9365/coverage-7.14.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:196a13319ad88d6d8ef5ab489ec4f44ddde2143c0c7d5b27786f6c3ffd56a7e1", size = 250771, upload-time = "2026-05-26T20:38:41.782Z" }, + { url = "https://files.pythonhosted.org/packages/77/63/e77aaacd491182210d639636b7a8bba23ffffa9b82aa3762da9431855fa9/coverage-7.14.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3d452fd08b5c72c5167c93e6867b5c08500bd40f2a21e1e854a500550b6cc36f", size = 252683, upload-time = "2026-05-26T20:38:43.305Z" }, + { url = "https://files.pythonhosted.org/packages/65/1c/a022e3cfbec2ac241640003cb3a817e161d9c7f5aa9b49173756cdc03204/coverage-7.14.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23bf7fa51ac02e07fc7c96849b82946da47ae862dc8f86d183b2a4864fc38129", size = 254791, upload-time = "2026-05-26T20:38:45.361Z" }, + { url = "https://files.pythonhosted.org/packages/61/d6/967e408aca4c1ceb88cb0cc677169110ae7f5995fb5eaf5fb1f5a1bb8f5d/coverage-7.14.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bcaa50684dcaadfa599ac48f81103c756d791cfd85c97203d2217c593d48b860", size = 256748, upload-time = "2026-05-26T20:38:46.91Z" }, + { url = "https://files.pythonhosted.org/packages/b8/be/869188f7fe28638078ec479331ace6dc5f7b40b7153eb616f47ab79404d8/coverage-7.14.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4ea1c034f95c9b056e856b794630b17f9fa3d57e4800ff1e503d3be0f9c9078c", size = 250907, upload-time = "2026-05-26T20:38:48.493Z" }, + { url = "https://files.pythonhosted.org/packages/07/aa/adb7d3b4278d690e68703abcd76ab1b948242e3668d921711551b78f9ddb/coverage-7.14.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c7e057326434e441306226fbeb5d1aaf14a2637efe97ba668306635835f32ad7", size = 252483, upload-time = "2026-05-26T20:38:50.074Z" }, + { url = "https://files.pythonhosted.org/packages/43/61/331c74103c62dcb0c4b9b3a0de9a61aca016208b0a90f109592a9f9ecc28/coverage-7.14.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:59baf88468dbc8d63b1887afd92bda52e40bb1561696e5819670601403810cec", size = 250545, upload-time = "2026-05-26T20:38:51.613Z" }, + { url = "https://files.pythonhosted.org/packages/f6/b6/c5dae3c104d89be04828f61810e6b3473825482e4c288cc4ed04553e08ae/coverage-7.14.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d34d75f892b3ab73ba11cab5442cce7b3e168fd64162b16f0e1e0d09c508edef", size = 254310, upload-time = "2026-05-26T20:38:53.503Z" }, + { url = "https://files.pythonhosted.org/packages/ad/a1/2b9d5863e3b83c01ad8199e3c597802fbb3a9dc90b058885804c20296d31/coverage-7.14.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:3a56abc20a472baf0304c455721bc601477440d28ecfde8a03dde79ede07e0df", size = 250266, upload-time = "2026-05-26T20:38:55.414Z" }, + { url = "https://files.pythonhosted.org/packages/7f/5e/0e511fbdb269359be26fe678a1c3fa1f2aa2a01573cc3f54268c8d6d4797/coverage-7.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6a3cb83d1552c0cd1b4906655b6a33fd4a8473229633a901c6b73bf86914dee9", size = 251174, upload-time = "2026-05-26T20:38:57.141Z" }, + { url = "https://files.pythonhosted.org/packages/85/10/e55307b622b3dd9671cb321824502dc10f93e72f2802b9946159a8edadeb/coverage-7.14.1-cp311-cp311-win32.whl", hash = "sha256:10274a1fbeb8ec5d72966e17bb198a3104257aca4ac09d98667c5f8aca8c8548", size = 222354, upload-time = "2026-05-26T20:38:58.727Z" }, + { url = "https://files.pythonhosted.org/packages/71/cf/107421693cfb71e4f1ca5bf70443f64d4161878068d07a3e51c7ad21d17b/coverage-7.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:87ebdf787d4888e3f3f2d523eadc6e18c6d18c6d0eb173801a189641627fb37e", size = 223290, upload-time = "2026-05-26T20:39:00.413Z" }, + { url = "https://files.pythonhosted.org/packages/b8/1d/3e3644585eb29e9dafefb19555078529a4d7cce12bd21929664eea989277/coverage-7.14.1-cp311-cp311-win_arm64.whl", hash = "sha256:dd34767fa19848d35659ffc0a75314f58c7af3f1cd87ec521e8292a1238398a3", size = 221953, upload-time = "2026-05-26T20:39:02.159Z" }, + { url = "https://files.pythonhosted.org/packages/3d/b7/bdbb725ba02c5b42825b200c940f38b7a54fcad24627b7192f78f8110d76/coverage-7.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a06c76364a9360e33d6d23769aefdf7f66f38e2ffb60ceb1baaa4989d83b695c", size = 220022, upload-time = "2026-05-26T20:39:03.702Z" }, + { url = "https://files.pythonhosted.org/packages/72/81/fdc0898a55c6219223291ec1a1fe89966ef212ce82276aa0899df84b5de0/coverage-7.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fad54e871165f6ec2f536063ac74c3104508a12963e64072ba44bd822de52b0c", size = 220379, upload-time = "2026-05-26T20:39:05.381Z" }, + { url = "https://files.pythonhosted.org/packages/de/72/de048c4a25e13bce59ac6a339351c10bdf2515e07459afcdaf04dc3143a2/coverage-7.14.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:84b535f00655ecafe1d929d1fb00ed5d6fa3051ea643ab2c161a3887b86f294b", size = 251888, upload-time = "2026-05-26T20:39:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/28/30/300c343f68beb9d4cbb64ec81e58c5b6b80b56927f72d2b38654ac26e013/coverage-7.14.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6b6b0853b895fe0e98cbfc580d1ec3393d9302b4b1e96a77b3f5c91fdab899e6", size = 254624, upload-time = "2026-05-26T20:39:09.037Z" }, + { url = "https://files.pythonhosted.org/packages/b1/ed/7b25642496e8170b6bac14adce00537c6e5fa2d586159401a4de3e8b49e6/coverage-7.14.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:442cc9c952b2df400cda54bb04ab87330cf2cd08a8692cbbea36773531eb6f37", size = 255739, upload-time = "2026-05-26T20:39:10.889Z" }, + { url = "https://files.pythonhosted.org/packages/7f/a2/abd210b8c4e29c24e4624916db97bb519097a91034aaeb767f937e7da794/coverage-7.14.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8270544c361ed405a27a060dbc9ed2c124b084d96dfdc2d9a2510482aef981ad", size = 257998, upload-time = "2026-05-26T20:39:12.722Z" }, + { url = "https://files.pythonhosted.org/packages/7f/24/7c50beed3792fe62f6ce0545c6686ce83379719e2c0276179333d97eae92/coverage-7.14.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:48b283b1dd6372e8de2a7a9a4c4d5dc06f4d4fd209b876f3c88a7a205a0c8f84", size = 252296, upload-time = "2026-05-26T20:39:14.259Z" }, + { url = "https://files.pythonhosted.org/packages/15/05/0f874628ebcbfc77ead559ff210281ef06a97db08481832e7dd39274a135/coverage-7.14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5b0c99ba93a07d56f6df340bb79be53202a082b2fdb81bfe6190b741a3470d54", size = 253658, upload-time = "2026-05-26T20:39:15.923Z" }, + { url = "https://files.pythonhosted.org/packages/99/6f/ca6ad067364b337ef997802115e7ecad2abd2248b05471464b0dea02b4d4/coverage-7.14.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e471bc5769ff073b058cfadb0d736b56ce067c8560eabeb0da88462df98c23e7", size = 251803, upload-time = "2026-05-26T20:39:17.537Z" }, + { url = "https://files.pythonhosted.org/packages/c0/30/b9b4d377cd9f40baf228068f5a81faf8450c6228503011bd499708483a50/coverage-7.14.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f497a1ea81d4cd7c10ddcaa685135b9aabd291af3d55775a9ddf3cb7a364cdd9", size = 255873, upload-time = "2026-05-26T20:39:19.414Z" }, + { url = "https://files.pythonhosted.org/packages/3c/21/7c721a9e5e6bb88547d30a787aefb97512d3f54c1324c7488d9b3743f7f9/coverage-7.14.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2222be86d0b54f5dd5a38f45f17f315f737245e857bf0bdedc70734f84a13c02", size = 251372, upload-time = "2026-05-26T20:39:21.169Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f8ae5a2200130e1503cd7661a6cd3b2b7bacef98277fbf3571fb13f8b766/coverage-7.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:85e85586565842f6932abebd4c18bcb1074223dc0b3576e7d173ca710622813a", size = 253245, upload-time = "2026-05-26T20:39:23.097Z" }, + { url = "https://files.pythonhosted.org/packages/34/62/70a9024672a5f6910517d9628c52c9afbdd3cf8f46426af52bb148a56fff/coverage-7.14.1-cp312-cp312-win32.whl", hash = "sha256:4a28fd227808366b196a75476dced2eb35b351d6766ba9c858dc93319e87f4f1", size = 222567, upload-time = "2026-05-26T20:39:24.868Z" }, + { url = "https://files.pythonhosted.org/packages/f6/81/8b7cd386839b039ebe1855733b9f9449a8dec5d79564018234f185a7fa70/coverage-7.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:54acdb6674a4661768d7bf7db32dfb9f46ab1d764f8aba6df75ce1a6a088724e", size = 223372, upload-time = "2026-05-26T20:39:26.603Z" }, + { url = "https://files.pythonhosted.org/packages/ae/ba/b44d472022f620d289d95fa830143235c0c36461c6f2437ea8d51e5481ed/coverage-7.14.1-cp312-cp312-win_arm64.whl", hash = "sha256:99cd41ff91afd94896fea3bc002706b6ae4ce95727d06e4a0f39c0a8d8bd8b1a", size = 221989, upload-time = "2026-05-26T20:39:28.242Z" }, + { url = "https://files.pythonhosted.org/packages/8a/9e/5f6d56327c62b185225d145191c607e07515294a0aa6338e58805cd4a5ac/coverage-7.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:be9f2c802dcfce3f71298303aa5dad0dce440a76c52f2f60dacd8656dab78793", size = 220044, upload-time = "2026-05-26T20:39:29.902Z" }, + { url = "https://files.pythonhosted.org/packages/75/92/e82aca356744cbbc0f77a0b623e38918c1872361963413a3bab5d0340393/coverage-7.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6223a72fd0e4c7156353ec0f08a5f93623e1d3034d0e2683b9bb8ea674131b1d", size = 220412, upload-time = "2026-05-26T20:39:31.561Z" }, + { url = "https://files.pythonhosted.org/packages/27/c9/385bde0bf7ed0f4bf3a7ee5367060a86b5d218718cfd6fb943c0f836b34f/coverage-7.14.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7279d2110a28cebc738b6459ecda2771735a4c18465fbbd36b3288fe5ed92247", size = 251412, upload-time = "2026-05-26T20:39:33.337Z" }, + { url = "https://files.pythonhosted.org/packages/51/8c/23faf6a2343a0d17f960a4bd56c43bc7eb4cf312f774dd6ceebd82c7d8fc/coverage-7.14.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9eeb3fcbc13ba40dfbdb22d01d196a28e9cef9ed4c29b60061a1e0e823a9929d", size = 254008, upload-time = "2026-05-26T20:39:35.009Z" }, + { url = "https://files.pythonhosted.org/packages/42/06/36f4aa9ca8a815e6036156e80706a67828bb97bd826948244f6996dda957/coverage-7.14.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f0cfc27c539f07cf5c0a4cfe211d0b6cae039f8f40526dbaa71944e64b50a7b", size = 255241, upload-time = "2026-05-26T20:39:36.71Z" }, + { url = "https://files.pythonhosted.org/packages/ca/79/95266316352f90f6b1c6736bb413302edfde2453fb32422d3911642691b3/coverage-7.14.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:221c70f316241a78e77e607c227cefc8808d4e08f28d99c04f35694690e940be", size = 257373, upload-time = "2026-05-26T20:39:38.412Z" }, + { url = "https://files.pythonhosted.org/packages/e3/9c/58316d1f66c488b5fca8a0eb3e98348807813efa8a0d0833b9021be27488/coverage-7.14.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:da028256b04ec30e5e0114b6f76172938c313991f0a2d3d894271315cf5d5e43", size = 251635, upload-time = "2026-05-26T20:39:40.268Z" }, + { url = "https://files.pythonhosted.org/packages/ef/5a/ca2398a568e16fed7bb713e84ba3603a7164fb65779abe645c565ec890d5/coverage-7.14.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:76a085d7005236a767e3426148b2c407e53ad61695c562f8a81da2d373324901", size = 253373, upload-time = "2026-05-26T20:39:42.145Z" }, + { url = "https://files.pythonhosted.org/packages/6e/2c/0396562c32deaebe7be51d865b3a41e9a87d7561acafe1a28f53b07e019a/coverage-7.14.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b553d04b5e778a8e56d57eb134aff42a92718ecba45e79c4764ecfa40efd92ff", size = 251341, upload-time = "2026-05-26T20:39:43.907Z" }, + { url = "https://files.pythonhosted.org/packages/fd/8f/a94f9221184c9cae1ee115820e3798e48b6b17777a9f19e46fb9a0c8dc74/coverage-7.14.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:46f714d2fb8ae2f4f29f23ada7f1e79b759fff5a70f94a1dac23af204c3ec9e4", size = 255497, upload-time = "2026-05-26T20:39:46.166Z" }, + { url = "https://files.pythonhosted.org/packages/71/69/505d70e47db1eaebcd002c39759707621ef184cd6b1ae084d9f41293f323/coverage-7.14.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:1896f5e19ff3f0431c7ce2172adc54890fd97f86b59ced8ca1649145d9ffe35d", size = 251159, upload-time = "2026-05-26T20:39:48.03Z" }, + { url = "https://files.pythonhosted.org/packages/e0/aa/58681c383aa33a9d2ed40a02d7a22fbf780d1fa4d575396365777828198c/coverage-7.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:62fd185ef9df3c33d1c8178c5af105f762afbad96038de9a4ae100aa6297ca33", size = 252934, upload-time = "2026-05-26T20:39:49.872Z" }, + { url = "https://files.pythonhosted.org/packages/eb/fd/11c928cd6bdffc7074bb5965c173d9ebf517fb00205e1da524b98d29ef92/coverage-7.14.1-cp313-cp313-win32.whl", hash = "sha256:ab4af6352741a604c431c6072fce5bee33bf0f20dc7a56618d6bf6bb89e9810c", size = 222584, upload-time = "2026-05-26T20:39:51.68Z" }, + { url = "https://files.pythonhosted.org/packages/6f/92/fb416fc26d340dcba19518c418d6048e913186e17243982c5e435e41fa7a/coverage-7.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:7af486dabe8954d03b087f0021540897afe084f04e16ff5579e08cc46f871416", size = 223394, upload-time = "2026-05-26T20:39:53.472Z" }, + { url = "https://files.pythonhosted.org/packages/73/c6/02d56e3867972f77d5036de924643f26c056e848f00452cafb4dbc3c29b4/coverage-7.14.1-cp313-cp313-win_arm64.whl", hash = "sha256:2224f89ffd0c5605ccce1ed7a584da162bc7c55f601ab1c946bc9de31a486b42", size = 222015, upload-time = "2026-05-26T20:39:55.374Z" }, + { url = "https://files.pythonhosted.org/packages/4d/9e/fcc77914050df73f7662fa1f00902774c79c075a8388ab334074574bf77e/coverage-7.14.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:de286598cc65d2b489411174b1faec2f5a7775fb3201fd925db2a76b4030f37d", size = 220733, upload-time = "2026-05-26T20:39:57.189Z" }, + { url = "https://files.pythonhosted.org/packages/f7/67/2963cbdaf5cbadec44efa3a1e39eaa1f02df4079585f05387607a221e126/coverage-7.14.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:042c46ded7c288aeb07cf14a28b6c1e10b78fcba40171c3fa1e939377eeef0b5", size = 221086, upload-time = "2026-05-26T20:39:59.019Z" }, + { url = "https://files.pythonhosted.org/packages/c8/c5/8701645574e11881f2f47d8930f98bc48b5d43b25eb5b4430dfc4a2f9f48/coverage-7.14.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f4ddbe407477f04c45115d1a4e5bc480f753553b534d338d4c3358b1cdd0ea52", size = 262381, upload-time = "2026-05-26T20:40:00.822Z" }, + { url = "https://files.pythonhosted.org/packages/7c/28/7a64d73598263e0c5abd5084211a8474488d31b3c552ff531c719dfcff62/coverage-7.14.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d13e6725992e2d2fd7d81d4f5241952d13740121dfd501da09201be39b2c003a", size = 264458, upload-time = "2026-05-26T20:40:02.506Z" }, + { url = "https://files.pythonhosted.org/packages/fa/d8/4969179db9f7eb4df218e69540adf829d1c835f59452513d065d15446802/coverage-7.14.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f747dc8edcfe740130f28f32f3995e955494285717e86ee25af51db2219df08a", size = 266884, upload-time = "2026-05-26T20:40:04.421Z" }, + { url = "https://files.pythonhosted.org/packages/a6/78/a45d5794dbc9bafd97afc96a4377c86c7820d78b6cf51b89bc1d4e919275/coverage-7.14.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ced2f09ef276fd58611a1ef502164ad266d2b75174e5a40cabbdb4033f9f6cf2", size = 268022, upload-time = "2026-05-26T20:40:06.298Z" }, + { url = "https://files.pythonhosted.org/packages/21/cb/4f5e354e9e3e67af96bd4e57113e6db6b22298c7168b13eec408a549903d/coverage-7.14.1-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b84800013769a78ccb9ef4659402e26d06867e337b61ec365f77ad008adea80e", size = 261631, upload-time = "2026-05-26T20:40:08.226Z" }, + { url = "https://files.pythonhosted.org/packages/ec/49/eced49af4cb996d5d8b7e94e736175c513e4facd3398507b89892b4326d8/coverage-7.14.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:ea8cd6ca0ee9f616aaef3afc6882e32c2cbf18b00d96313ffd76af650574034d", size = 264443, upload-time = "2026-05-26T20:40:10.137Z" }, + { url = "https://files.pythonhosted.org/packages/f1/d8/5603a88a7c5913a6b54f6cb1a8c46f7b39cbb30f27cd3f492908da09b2d7/coverage-7.14.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:aa5e304a873fabddc11e484e9b6b738bd38bd7bed17b09aa84eecf5332e8b8bb", size = 262069, upload-time = "2026-05-26T20:40:11.999Z" }, + { url = "https://files.pythonhosted.org/packages/f0/59/2ae3cb79da554a06c8619d6c88ea19dd1e4aed4b834b6a83bb1fa243bdc5/coverage-7.14.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:5a1c5215be81035e629d5bc756650634d0bf31991038db7a0eccb90f025ce16d", size = 265780, upload-time = "2026-05-26T20:40:13.858Z" }, + { url = "https://files.pythonhosted.org/packages/af/5f/b130c1dc999031f2648bd25317fbce505ad8d5562079b4ed81e736a84967/coverage-7.14.1-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:79058c47dae6788504b5effb319961bcd72d7240551464b91d474bc0ed186d69", size = 260970, upload-time = "2026-05-26T20:40:16.142Z" }, + { url = "https://files.pythonhosted.org/packages/87/d1/ec13ccddeb48ec963bdfa72a11224bac2584bd045ba13beca82f8113e9c7/coverage-7.14.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:370c5afae3fa0658e11694a32b24c2778f6bc2d17718121f94ee185e69f26b54", size = 263157, upload-time = "2026-05-26T20:40:18.382Z" }, + { url = "https://files.pythonhosted.org/packages/cf/c2/cd91ead503045161092d3845f7bb95ea2f25131ce96d3e314dd835d91b9c/coverage-7.14.1-cp313-cp313t-win32.whl", hash = "sha256:3758dd0a7f1fa57365ef2e781df0f0731d38b6e3772259d13dae4bd8a958d4b1", size = 223259, upload-time = "2026-05-26T20:40:20.381Z" }, + { url = "https://files.pythonhosted.org/packages/71/9f/1e28d97e6bd2c76b07f38b7c02870f1371255ff6717f54eca578fcbbdd0e/coverage-7.14.1-cp313-cp313t-win_amd64.whl", hash = "sha256:6ff665fb023a77386fe11685190cee1f60a7d635994a30d9b0a061533d470fce", size = 224320, upload-time = "2026-05-26T20:40:22.316Z" }, + { url = "https://files.pythonhosted.org/packages/a9/e0/d936e908f0e1efa55e52b91e01b52f1055cef5e1ab2718493390ed8e2fb8/coverage-7.14.1-cp313-cp313t-win_arm64.whl", hash = "sha256:17a5a241e5997621a956a7f402a7433ef4221e5152809b785bec79e2323799f1", size = 222577, upload-time = "2026-05-26T20:40:24.894Z" }, + { url = "https://files.pythonhosted.org/packages/d6/34/fc2f101b151af3799a101f0550b0454aa008afdc0add677394ec4aa8ea10/coverage-7.14.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d5ed429d0b8edaac649e889b4ffcedb6c80b06629a3f93050e3dddfb99235bee", size = 220091, upload-time = "2026-05-26T20:40:27.249Z" }, + { url = "https://files.pythonhosted.org/packages/3d/a7/1ebae2ab5b961b5c79bb09fe7b3ac99edb190d8be4a8c510b2cf66f46468/coverage-7.14.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8011224a62280e50dab346960c03cf47aca1a1e09e608c0fb33fd6e0cc8e9500", size = 220421, upload-time = "2026-05-26T20:40:30.084Z" }, + { url = "https://files.pythonhosted.org/packages/5e/90/92aca9cf0acc95123c96cd1eb1f08917897a7f5dee01e15738922971ec31/coverage-7.14.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:12c42ec1e14f553c4f817e989365982e646e27211f10a0f717855b94a79c8906", size = 251466, upload-time = "2026-05-26T20:40:32.542Z" }, + { url = "https://files.pythonhosted.org/packages/26/2b/78048cbe3b999f6cbf9cc0d90abba6a88a3e0863a8c1c6cbc762f3f8802f/coverage-7.14.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:06144cd511cf2624873a035c5069cf297144f6e77a73ee3d7a55b605ec5efb42", size = 253973, upload-time = "2026-05-26T20:40:34.473Z" }, + { url = "https://files.pythonhosted.org/packages/8e/21/c2e33b29d1cfde484a19d437afc343c6cd30b08d78cbbf9f5aff14e57b2b/coverage-7.14.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a311d8e1da24be5c1ccf85cbfb06315dbaa1703d5a1eab3f6432c72b837917c8", size = 255318, upload-time = "2026-05-26T20:40:38.154Z" }, + { url = "https://files.pythonhosted.org/packages/8e/ee/aad2f108d63b769121005302f16bf66db8625c88ceaba466942e09a2607e/coverage-7.14.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c79cead5b5bc584d9c71451cb984d0e3a84e0c0937379c8efcbf27c8d661b851", size = 257633, upload-time = "2026-05-26T20:40:40.164Z" }, + { url = "https://files.pythonhosted.org/packages/c2/f8/11a2c29b4fd76d9849f81d0bb812ec0017a9396df3217214e38934a8c837/coverage-7.14.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dcbf65f1f66a26cdd88c35cf68fb4729c5d1cd2e88added72420541dfb212034", size = 251488, upload-time = "2026-05-26T20:40:42.631Z" }, + { url = "https://files.pythonhosted.org/packages/c9/b8/9a5820de4b8ac2b71d85e3b5fb49108d7469c665f0e2ad0dd7569023e305/coverage-7.14.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fd86572566fb40189a8260446158235159bc7a82dfbc87a3b39cf4fb57fcec1c", size = 253329, upload-time = "2026-05-26T20:40:45.208Z" }, + { url = "https://files.pythonhosted.org/packages/6b/ff/f33e4823667e27548e8fd8df44217515303f9808d0ff29817db56f87d990/coverage-7.14.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:7771b601718fdde84832c3a434ca9bbf4ae9adbc49d84198b4110700c3c77c36", size = 251291, upload-time = "2026-05-26T20:40:47.502Z" }, + { url = "https://files.pythonhosted.org/packages/68/9b/489db0ebb209054766b90a9014a45f6d26eb724c02ec21311c3733b5a644/coverage-7.14.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:39b21e212c55af06fa375e3dbf90a8a8e38792f3a910c580066d23563830ddd5", size = 255564, upload-time = "2026-05-26T20:40:49.372Z" }, + { url = "https://files.pythonhosted.org/packages/27/b5/16bc2d4c2409b23c7737edb68c83bc89e345f378050549fe1d75ac7d34d5/coverage-7.14.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:f2302660e32562a532b442480121aef8aa61a5bdb20b30bf0adab29f10a5a4b4", size = 251107, upload-time = "2026-05-26T20:40:51.677Z" }, + { url = "https://files.pythonhosted.org/packages/7d/0c/2629997469a00cd069d588a41c9dc887610f2775ae89d250c4791e65272a/coverage-7.14.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:03a6f93c1ec3b7f2e77b5dbcc5573a2c21f12529a5c6bbe0f16f72303cc2fa4d", size = 252764, upload-time = "2026-05-26T20:40:54.267Z" }, + { url = "https://files.pythonhosted.org/packages/d2/ee/f78d63c8f079e0d7211c7e2401fa17e311514534ba61bae03e4b287ce4ab/coverage-7.14.1-cp314-cp314-win32.whl", hash = "sha256:8a3ce026d73290f42f08dafecbd82c193a74df280461fbf97300fec51fd133ee", size = 222837, upload-time = "2026-05-26T20:40:56.496Z" }, + { url = "https://files.pythonhosted.org/packages/dc/b9/be539854f93a70dfbeec69117f33ec70dc42ff0b65b5b07ab8d40d04228e/coverage-7.14.1-cp314-cp314-win_amd64.whl", hash = "sha256:114c95ef29302423b87d159075805f4ab973254a2638a5d7d046c94887cc87d7", size = 223650, upload-time = "2026-05-26T20:40:58.351Z" }, + { url = "https://files.pythonhosted.org/packages/fe/9e/24e2842fef40f35ac82ba3a7719c8023d011bf3bf652d0675316a9d088a1/coverage-7.14.1-cp314-cp314-win_arm64.whl", hash = "sha256:a07891c3f4805442b31b71e84ba3cf29ed1aa9a428284e06deeb4b23e5b46343", size = 222218, upload-time = "2026-05-26T20:41:00.321Z" }, + { url = "https://files.pythonhosted.org/packages/0a/1d/ac0a9df5fe31c1e8bdd658074905fc12844a05c1a7e3fdb8417e97c31e23/coverage-7.14.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1101a5ebb083aecb625ebb6209d4105b58f647b093cb2dc8122d7b33f743cfe1", size = 220822, upload-time = "2026-05-26T20:41:02.281Z" }, + { url = "https://files.pythonhosted.org/packages/32/cf/f964fd9aff20323f9f1a726c97135f8a76bcd87b92dad141a456a43f3c64/coverage-7.14.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:851b9e1e4e8a4608e77c79714b2e77c0970d2ed7202a05e92ae407817481887b", size = 221084, upload-time = "2026-05-26T20:41:04.593Z" }, + { url = "https://files.pythonhosted.org/packages/d8/5e/7e5ef2aba844de2b80d678619fcf0841b42e3f37f16411226f3fe4c1016f/coverage-7.14.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d5b89cdfb2ee051b71e8c3c70bd81a9eff81100f736a269136fe1a68efe00474", size = 262454, upload-time = "2026-05-26T20:41:06.641Z" }, + { url = "https://files.pythonhosted.org/packages/64/62/75809bded87015cc4935524218a2a8ed8dd1a8498bfed30a2f4f7a4b4d34/coverage-7.14.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0177614a0370f227888b4e436a7c55686d6a9f90eb1ade2b624ba685a1686e86", size = 264578, upload-time = "2026-05-26T20:41:08.556Z" }, + { url = "https://files.pythonhosted.org/packages/f3/42/d33392dc14633525012d2d504fa1a33b05538bf535f5c1d64675e5754b78/coverage-7.14.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2d69af5dea2de76fc485a83032a630523f985198b7e25be901ec60181587b01e", size = 266981, upload-time = "2026-05-26T20:41:10.824Z" }, + { url = "https://files.pythonhosted.org/packages/2a/49/0157c4428c2aca7f1e09d5565930586fd5ae36f1655f08b0daa7cf1fcae1/coverage-7.14.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:35ab22d91de736e8966b980dc355cbcdd2c6dbbcfe275f9a2991bc8a91b3df65", size = 268112, upload-time = "2026-05-26T20:41:12.966Z" }, + { url = "https://files.pythonhosted.org/packages/96/26/86b9ce71f4092b1ed325ce1421698081df1286b833400b6836912834d6e0/coverage-7.14.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:357d4e32935c36588aaba057d734fa32428c360c9fc2e4442afbf1b646beee6e", size = 261558, upload-time = "2026-05-26T20:41:15Z" }, + { url = "https://files.pythonhosted.org/packages/20/4c/c311210c5472cf5401d8422b0d7812cdd520f24417673afabda6c323faca/coverage-7.14.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:51bd64741cc6fa065abd300ede1afe5a5291ece9c31da8b24884deda48bcc3f8", size = 264447, upload-time = "2026-05-26T20:41:17.369Z" }, + { url = "https://files.pythonhosted.org/packages/fb/71/59513f8710ed3e6b0ac0a050a5b7e977bb9c9e880354863b5d00d8809256/coverage-7.14.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:9132cd363a68a4c3daa7c8704a654b1e39d3360f6f5b8ddd470608a945236c07", size = 262048, upload-time = "2026-05-26T20:41:19.309Z" }, + { url = "https://files.pythonhosted.org/packages/84/8d/bceed32dc494f5bbf50f775cd2e78ca814953942b5ea28d3c1c3ac316f14/coverage-7.14.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:07c6290b1697b862c0478eab545eec949a0d0e4d6d03497f446d706da3b4f2de", size = 265781, upload-time = "2026-05-26T20:41:21.559Z" }, + { url = "https://files.pythonhosted.org/packages/e7/c5/9348fe40dbfd4991aaf78df2c6c3098bfb2cc834d1fd362a64b4efef855a/coverage-7.14.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:5ea0c297e27133853b4d8a3eb799bff5a2dbd9f2f41537a240d337ac9b4df890", size = 260896, upload-time = "2026-05-26T20:41:23.428Z" }, + { url = "https://files.pythonhosted.org/packages/ca/92/1ea0f03929da7cf87206b1fa24f4c8e9c158be0455481af29ec0a1f3503f/coverage-7.14.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:01b7733daad0237daa01ef80fe2dfceffc911e6a17fa7b55d14aa8214eaaaecd", size = 263214, upload-time = "2026-05-26T20:41:25.419Z" }, + { url = "https://files.pythonhosted.org/packages/f6/a9/b2493c054c0e01a643266742ab45e15744e60743f9260cd930c7142b1124/coverage-7.14.1-cp314-cp314t-win32.whl", hash = "sha256:6adc5a36984624a70bf11d7184e20fa0a49aa7c47ffab43804106a1a695ea22e", size = 223624, upload-time = "2026-05-26T20:41:27.795Z" }, + { url = "https://files.pythonhosted.org/packages/fc/bd/3e1e6a57fccd2d7c83fcdf338e93ba98eb85c6e877dd34731ac585375490/coverage-7.14.1-cp314-cp314t-win_amd64.whl", hash = "sha256:ddf799247318f34dbcd2efa8c95a8d0642674e926bb1774cf9b63dfd2a389d1c", size = 224728, upload-time = "2026-05-26T20:41:30.098Z" }, + { url = "https://files.pythonhosted.org/packages/bb/d7/31066cf1d2f0c6c797fce911bcfa01dd35642dc6da992a950256097c5860/coverage-7.14.1-cp314-cp314t-win_arm64.whl", hash = "sha256:145986fe66647eb489f18d9a997567a3fd358584c4b5a808769113abc07466af", size = 222752, upload-time = "2026-05-26T20:41:32.123Z" }, + { url = "https://files.pythonhosted.org/packages/8a/3c/1a983b9a745d7f83d53f057bcc5bf79ba6a2bbc08266b3f0c7d6fe630c9b/coverage-7.14.1-py3-none-any.whl", hash = "sha256:a252f21c27e38347e60111a3266b03827422a7d5525951aceee313aa68bab1d2", size = 211815, upload-time = "2026-05-26T20:41:34.078Z" }, ] [package.optional-dependencies] @@ -758,30 +758,30 @@ toml = [ [[package]] name = "cuda-bindings" -version = "13.2.0" +version = "13.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cuda-pathfinder", marker = "python_full_version >= '3.11'" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/1a/fe/7351d7e586a8b4c9f89731bfe4cf0148223e8f9903ff09571f78b3fb0682/cuda_bindings-13.2.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08b395f79cb89ce0cd8effff07c4a1e20101b873c256a1aeb286e8fd7bd0f556", size = 5744254, upload-time = "2026-03-11T00:12:29.798Z" }, - { url = "https://files.pythonhosted.org/packages/aa/ef/184aa775e970fc089942cd9ec6302e6e44679d4c14549c6a7ea45bf7f798/cuda_bindings-13.2.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6f3682ec3c4769326aafc67c2ba669d97d688d0b7e63e659d36d2f8b72f32d6", size = 6329075, upload-time = "2026-03-11T00:12:32.319Z" }, - { url = "https://files.pythonhosted.org/packages/ec/ea/81999d01375645f34596c76eb046b4b36d58cc6fe2bddb2410f8a7b7a827/cuda_bindings-13.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:845025438a1b9e20718b9fb42add3e0eb72e85458bcab3eeb80bfd8f0a9dab33", size = 5600047, upload-time = "2026-03-11T00:12:34.848Z" }, - { url = "https://files.pythonhosted.org/packages/e0/a9/3a8241c6e19483ac1f1dcf5c10238205dcb8a6e9d0d4d4709240dff28ff4/cuda_bindings-13.2.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:721104c603f059780d287969be3d194a18d0cc3b713ed9049065a1107706759d", size = 5730273, upload-time = "2026-03-11T00:12:37.18Z" }, - { url = "https://files.pythonhosted.org/packages/e9/94/2748597f47bb1600cd466b20cab4159f1530a3a33fe7f70fee199b3abb9e/cuda_bindings-13.2.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1eba9504ac70667dd48313395fe05157518fd6371b532790e96fbb31bbb5a5e1", size = 6313924, upload-time = "2026-03-11T00:12:39.462Z" }, - { url = "https://files.pythonhosted.org/packages/29/5a/0ce1731c48bcd9f40996a4ef1abbf634f1a7fe4a15c5050b1e75ce3a7acf/cuda_bindings-13.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:debb51b211d246f8326f6b6e982506a5d0d9906672c91bc478b66addc7ecc60a", size = 5631363, upload-time = "2026-03-11T00:12:41.58Z" }, - { url = "https://files.pythonhosted.org/packages/52/c8/b2589d68acf7e3d63e2be330b84bc25712e97ed799affbca7edd7eae25d6/cuda_bindings-13.2.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e865447abfb83d6a98ad5130ed3c70b1fc295ae3eeee39fd07b4ddb0671b6788", size = 5722404, upload-time = "2026-03-11T00:12:44.041Z" }, - { url = "https://files.pythonhosted.org/packages/1f/92/f899f7bbb5617bb65ec52a6eac1e9a1447a86b916c4194f8a5001b8cde0c/cuda_bindings-13.2.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:46d8776a55d6d5da9dd6e9858fba2efcda2abe6743871dee47dd06eb8cb6d955", size = 6320619, upload-time = "2026-03-11T00:12:45.939Z" }, - { url = "https://files.pythonhosted.org/packages/bb/a5/d7f01a415e134546248cef612adad8153c9f1eb10ec79505a7cd8294370b/cuda_bindings-13.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:45815daeb595bf3b405c52671a2542b1f8e9329f3b029494acbfcc74aeaa1f2d", size = 5840830, upload-time = "2026-03-11T00:12:48.43Z" }, - { url = "https://files.pythonhosted.org/packages/df/93/eef988860a3ca985f82c4f3174fc0cdd94e07331ba9a92e8e064c260337f/cuda_bindings-13.2.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6629ca2df6f795b784752409bcaedbd22a7a651b74b56a165ebc0c9dcbd504d0", size = 5614610, upload-time = "2026-03-11T00:12:50.337Z" }, - { url = "https://files.pythonhosted.org/packages/18/23/6db3aba46864aee357ab2415135b3fe3da7e9f1fa0221fa2a86a5968099c/cuda_bindings-13.2.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7dca0da053d3b4cc4869eff49c61c03f3c5dbaa0bcd712317a358d5b8f3f385d", size = 6149914, upload-time = "2026-03-11T00:12:52.374Z" }, - { url = "https://files.pythonhosted.org/packages/c4/84/d3b6220b51cbc02ca14db7387e97445126b4ff5125aaa6c5dd7dcb75e679/cuda_bindings-13.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:8cebe3ce4aeeca5af9c490e175f76c4b569bbf4a35a62294b777bc77bf7ac4d8", size = 5796512, upload-time = "2026-03-11T00:12:54.483Z" }, - { url = "https://files.pythonhosted.org/packages/c0/87/87a014f045b77c6de5c8527b0757fe644417b184e5367db977236a141602/cuda_bindings-13.2.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a6464b30f46692d6c7f65d4a0e0450d81dd29de3afc1bb515653973d01c2cd6e", size = 5685673, upload-time = "2026-03-11T00:12:56.371Z" }, - { url = "https://files.pythonhosted.org/packages/ee/5e/c0fe77a73aaefd3fff25ffaccaac69c5a63eafdf8b9a4c476626ef0ac703/cuda_bindings-13.2.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f4af9f3e1be603fa12d5ad6cfca7844c9d230befa9792b5abdf7dd79979c3626", size = 6191386, upload-time = "2026-03-11T00:12:58.965Z" }, - { url = "https://files.pythonhosted.org/packages/e3/73/98bcb069778fe420226db75aff54b5dd6c3ecfd0912edabab723326e80b7/cuda_bindings-13.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:bd658bb5c0e55b7b3e5dd0ed509c6addb298c665db26a9bfba35e1e626000ba2", size = 5938605, upload-time = "2026-03-11T00:13:01.639Z" }, - { url = "https://files.pythonhosted.org/packages/5f/58/ed2c3b39c8dd5f96aa7a4abef0d47a73932c7a988e30f5fa428f00ed0da1/cuda_bindings-13.2.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df850a1ff8ce1b3385257b08e47b70e959932f5f432d0a4e46a355962b4e4771", size = 5507469, upload-time = "2026-03-11T00:13:04.063Z" }, - { url = "https://files.pythonhosted.org/packages/1f/01/0c941b112ceeb21439b05895eace78ca1aa2eaaf695c8521a068fd9b4c00/cuda_bindings-13.2.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8a16384c6494e5485f39314b0b4afb04bee48d49edb16d5d8593fd35bbd231b", size = 6059693, upload-time = "2026-03-11T00:13:06.003Z" }, - { url = "https://files.pythonhosted.org/packages/52/49/4e01cc06447d39476e138d1b1adec8d35c0d04eccd2c8d69befc08cd66e8/cuda_bindings-13.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6ccf14e0c1def3b7200100aafff3a9f7e210ecb6e409329e92dcf6cd2c00d5c7", size = 6662637, upload-time = "2026-03-11T00:13:07.881Z" }, + { url = "https://files.pythonhosted.org/packages/a9/21/8464d133752951c154feafb3b65c297e7d80f301183d220bec4c830f1441/cuda_bindings-13.3.1-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:120fcc53d57903df529c3486962c56528cba5b7d6c57c99537320ed9922c8b86", size = 6073403, upload-time = "2026-05-29T23:11:36.22Z" }, + { url = "https://files.pythonhosted.org/packages/a8/1f/5ef51f5fbaa5d4d3201bb3d7555af028ec1aa4416275ccbf73c9e34e3d2d/cuda_bindings-13.3.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9851b0caa8bfd3bc6fa054eaf57bea7c8e9c3a62db2d2621224677f49f3c53d0", size = 6675244, upload-time = "2026-05-29T23:11:38.664Z" }, + { url = "https://files.pythonhosted.org/packages/fc/64/bb17e4d168569ef7be05c44474fe3dc19278d60a69ba228e45a431c86444/cuda_bindings-13.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:c0c4b1a995098c46695c24257a342dc97d6e6d3f3050b944c9f43bd26d734051", size = 5625597, upload-time = "2026-05-29T23:11:40.808Z" }, + { url = "https://files.pythonhosted.org/packages/51/6b/457ca12dad3ee9bfcc9a545cfd6b64b359ba49de40f776f6e028e678f262/cuda_bindings-13.3.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c5879712accf6e14bb01aa5e67440eb84998b8d104b509cc7a6dc0b8f656a474", size = 6053539, upload-time = "2026-05-29T23:11:43.19Z" }, + { url = "https://files.pythonhosted.org/packages/95/7a/c5e3c34a409b148f5c0f5a4ea374158f95d488862c1dffedf9aa5c639df9/cuda_bindings-13.3.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:04436a9364059c84b8f9636f359eccda1cf814341f5b670c71d80d2f79dbc708", size = 6674166, upload-time = "2026-05-29T23:11:45.478Z" }, + { url = "https://files.pythonhosted.org/packages/93/f7/0e35987a21914f84068061dcf4b61466ccbce1c62ddc9727596d5ed0c26f/cuda_bindings-13.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:507b0e19e7f934c5e30f30f0244ad70a75812619a7d3a0d742543caae1bd50f1", size = 5664286, upload-time = "2026-05-29T23:11:47.719Z" }, + { url = "https://files.pythonhosted.org/packages/ce/67/5e7dba1ba576dd73da5dee894ca076ca5e959450dfff66d6d510a255d1f7/cuda_bindings-13.3.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7855c4868aabc0cfae28abbe83d56734bdfbd08f08fc234ac1912a12858bf49", size = 6025351, upload-time = "2026-05-29T23:11:49.685Z" }, + { url = "https://files.pythonhosted.org/packages/39/2a/6d2e9047d1fb243dbaa364b01e0297534b9ed7fd27dba1c9f361519cf69b/cuda_bindings-13.3.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e32d08f71ebcdf00f0f41eab2eb37e8da94c8ed411cc9f7f7a019ce6b34abe3a", size = 6657965, upload-time = "2026-05-29T23:11:52.227Z" }, + { url = "https://files.pythonhosted.org/packages/7c/95/872a0392122f1fb43fcb06869790ef3171f37beee9f7db8f441739113570/cuda_bindings-13.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:b134dd8c5c66ae4c4ad814f7aee88fd215353c077010cbc47e3b55ed35ec9eff", size = 5875099, upload-time = "2026-05-29T23:11:54.635Z" }, + { url = "https://files.pythonhosted.org/packages/cc/6e/2394f8163360f8391f8f1b7e72d300a82724edb81a7b7084c799fbd4c91f/cuda_bindings-13.3.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9efb21c1ee64981e184b9e0ba5eb3179e5ba3d4b51665a6cb52b8ef3d01a7cbf", size = 5920504, upload-time = "2026-05-29T23:11:56.883Z" }, + { url = "https://files.pythonhosted.org/packages/34/c2/ef9b6a63f7dc432712a462c816662e662e00d38caa9b861c8c2588195d03/cuda_bindings-13.3.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2732904099e0a4d4db774a5fc6d91ee95fae065b4d2ecabb4968c5fe2406c9d7", size = 6476660, upload-time = "2026-05-29T23:11:59.188Z" }, + { url = "https://files.pythonhosted.org/packages/0c/2f/6a0dd496550c6fafbf6aeb1bf40242eeabb2fd138a43892aabb4be8224c2/cuda_bindings-13.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:18c8c167c8907b8f02531ca810534315c458dabef31f7965095619bf647b9202", size = 5830027, upload-time = "2026-05-29T23:12:01.205Z" }, + { url = "https://files.pythonhosted.org/packages/b1/81/bff68ce829999c1e4209c761bbf903b1c06ec570416ddb25020864ad5907/cuda_bindings-13.3.1-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ab2f74ed65bfef4163ba07a8db16f1085e0729291db12a2423aff84ee8278b8", size = 6013639, upload-time = "2026-05-29T23:12:03.509Z" }, + { url = "https://files.pythonhosted.org/packages/d4/e0/c8a1f0c8f9ffdea4f5fe6dbab89b326cef4d85caf489dad39e209da89416/cuda_bindings-13.3.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:efd4c814d311ec08c981f6dded1dbe7d4b371067ee4f6c14cccec4bde9590f80", size = 6534419, upload-time = "2026-05-29T23:12:05.633Z" }, + { url = "https://files.pythonhosted.org/packages/48/45/2734be44dbc80ac082ec23a86b41c8294992dcb90033645ed1bc50aafe4c/cuda_bindings-13.3.1-cp314-cp314-win_amd64.whl", hash = "sha256:8de12ef60bf40756852cb62bbb40460609269f6ece522903d1cc93d73a3ececb", size = 5961055, upload-time = "2026-05-29T23:12:07.971Z" }, + { url = "https://files.pythonhosted.org/packages/52/b8/83b1f563925b290f2d11a01a77a84013ba56052fe3653a5bef3ccfbb43d6/cuda_bindings-13.3.1-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3c772dfff49681541d59630c90f858e173ac926b9c593a2b7123f2a1043cc76", size = 5809771, upload-time = "2026-05-29T23:12:10.422Z" }, + { url = "https://files.pythonhosted.org/packages/12/20/e79b4bfe98f075195afb6343d41c498f9dbd2d161d7021d4d28bceb83581/cuda_bindings-13.3.1-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:36febb7c1079d68a981dbbd8d5a67235b399802b82075c9388624719607e52b9", size = 6358584, upload-time = "2026-05-29T23:12:12.767Z" }, + { url = "https://files.pythonhosted.org/packages/27/2a/b59bcac016ab9985d6b48a5d05b0d698461a159ca03ee11c4abd54da2ac4/cuda_bindings-13.3.1-cp314-cp314t-win_amd64.whl", hash = "sha256:61120b5e4f4a63f67efd7e7396914cb9ef871bb1f0021e990fb70277be240a4d", size = 6740329, upload-time = "2026-05-29T23:12:15.153Z" }, ] [[package]] @@ -790,7 +790,7 @@ version = "0.7.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cuda-pathfinder", marker = "python_full_version >= '3.11'" }, - { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/b3/b2/c9bb66a400baae14d5cd25cca9e7cf69f9328543edb37efa6e7ba1088cc7/cuda_core-0.7.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e8feaf99613cd1d025b26374b1c92ff72d9e8078a3236fc78aa550ff3b0028e3", size = 28962792, upload-time = "2026-04-08T17:03:00.541Z" }, @@ -815,10 +815,10 @@ wheels = [ [[package]] name = "cuda-pathfinder" -version = "1.5.4" +version = "1.5.5" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/11/d0/c177e29701cf1d3008d7d2b16b5fc626592ce13bd535f8795c5f57187e0e/cuda_pathfinder-1.5.4-py3-none-any.whl", hash = "sha256:9563d3175ce1828531acf4b94e1c1c7d67208c347ca002493e2654878b26f4b7", size = 51657, upload-time = "2026-04-27T22:42:07.712Z" }, + { url = "https://files.pythonhosted.org/packages/11/c8/26f2e4aae92f11522a96043892ba39a90eac610d5242523aa863212bc1c7/cuda_pathfinder-1.5.5-py3-none-any.whl", hash = "sha256:0228c023f95d1480f143ef5c8922d27a2ab052087a942e81dc289c9eb8f91689", size = 51671, upload-time = "2026-05-27T01:21:25.413Z" }, ] [[package]] @@ -845,28 +845,30 @@ wheels = [ [[package]] name = "cupy-cuda13x" -version = "14.0.1" +version = "14.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cuda-pathfinder", marker = "python_full_version >= '3.11'" }, - { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/9d/5f271070c17aac8e30b140b5ec9c129983f57b49899a8fc34c3f114d09f7/cupy_cuda13x-14.0.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:4d6d5ae87eb1a6eb55f5a3d54c606f5263c54319c3d85afe4627cb7fff403050", size = 72993295, upload-time = "2026-02-20T10:23:48.346Z" }, - { url = "https://files.pythonhosted.org/packages/6b/49/bd6867acfa356c822971d90792e814fce1fcfc54baaa20b1cadb8eec5c52/cupy_cuda13x-14.0.1-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:3d292c204eb7a2cfe04698b26de44b4173a1c576f603d6da9f0b0b6444225a63", size = 68923997, upload-time = "2026-02-20T10:23:53.046Z" }, - { url = "https://files.pythonhosted.org/packages/c5/62/25a256acdc0127c70153799a3b094adbeee11630e3be118f8a840415cafc/cupy_cuda13x-14.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:a3e34e0b29e09a4f80c9c1fef963cd75540fb003cbbb6183ac3f784a8a02aef3", size = 35450515, upload-time = "2026-02-20T10:23:56.602Z" }, - { url = "https://files.pythonhosted.org/packages/37/a2/84f2a9739e914cb119807b8b91d48b2c7628794e4eee66daa3402a2d7442/cupy_cuda13x-14.0.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:5c368d7b9fa9eef8a5d209d6335f468f84893cf875defdd1d195b6b27da941c9", size = 74276076, upload-time = "2026-02-20T10:24:00.841Z" }, - { url = "https://files.pythonhosted.org/packages/5b/fe/064f73bab30460eb9024e1a52319b8b69ef0c1cd853301189d1b4579e686/cupy_cuda13x-14.0.1-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:97fe8f0ff683ed5f39b82d0e56ad90368fc001c1b191a3bc662d31a0ac8cb482", size = 70267352, upload-time = "2026-02-20T10:24:05.105Z" }, - { url = "https://files.pythonhosted.org/packages/df/3c/a0de0513ad575f3a9f9543efd9ae408303101205c206d9cfe5a37b59bddc/cupy_cuda13x-14.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:9dda18b7100a19a54536b4325e63a29c1fb58891a0973623c6c8c80642b3f933", size = 35450158, upload-time = "2026-02-20T10:24:09.205Z" }, - { url = "https://files.pythonhosted.org/packages/7d/9b/7983b4e24749937dd4ab34565561a8c015e88df4ff9fd4678337b710b3ee/cupy_cuda13x-14.0.1-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:763f33f5641a28db5ac91788301271930e910813f1b1279119b504babeb1b863", size = 73616635, upload-time = "2026-02-20T10:24:14.115Z" }, - { url = "https://files.pythonhosted.org/packages/5c/d4/42f79f6baea881c604982df18d158456e40071925bfdd53c1b6eb82f6e75/cupy_cuda13x-14.0.1-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:a06cdc0d6a0054663fca4770e32df6a39cbeb7396a08b23f97965e5e1c0edb7d", size = 69793920, upload-time = "2026-02-20T10:24:20.287Z" }, - { url = "https://files.pythonhosted.org/packages/ac/0c/83c6be011fa00a270c0d08985844fd992d59c34a6bb91755dad4f31942e8/cupy_cuda13x-14.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:e91052340bab0860bdf1fd4e5a4fc85846800df6cc9a1de02a5afa1dd8655550", size = 35353554, upload-time = "2026-02-20T10:24:24.337Z" }, - { url = "https://files.pythonhosted.org/packages/6e/de/679a7a571dcd1b654378cc4f9c5cd6f6d4af09ec8973eb4b2dce276adce4/cupy_cuda13x-14.0.1-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:a8488a6a9c934c417f98078ac7dd2a47059c39195199b7e557c84d01b3071c75", size = 73167833, upload-time = "2026-02-20T10:24:30.645Z" }, - { url = "https://files.pythonhosted.org/packages/e4/05/f60525718e83c0ea10efc4ae3183ea9c5309935b76c200b6d9c2569185de/cupy_cuda13x-14.0.1-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:1c206483aaea40cd38bfbd1a29f4df0c19d555d306ffe43ef16f39db0e7e7a7f", size = 69416450, upload-time = "2026-02-20T10:24:35.982Z" }, - { url = "https://files.pythonhosted.org/packages/73/4e/8b4b996690d91745e34ce6103fbf8a9fb51f2e46b4e47c45ea8b3fff9d2b/cupy_cuda13x-14.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:cd01307b4f67e3bf242537f02ac8e5db729a557510728f70ee41a32490ce1e1a", size = 35336403, upload-time = "2026-02-20T10:24:40.355Z" }, - { url = "https://files.pythonhosted.org/packages/e0/f9/e5480aefcc86cfa45abe12c323e8e65b8a04727c227f67dff1cae99ead1b/cupy_cuda13x-14.0.1-cp314-cp314-manylinux2014_aarch64.whl", hash = "sha256:70a5b3d4b20367abf978e2c75bd0235f0768b5901a6102398877aef044628151", size = 73012147, upload-time = "2026-02-20T10:24:45.12Z" }, - { url = "https://files.pythonhosted.org/packages/61/9e/cd8ddc220283272a7891a8277fb911a584a9224bd1c8f56d75ca6f62d976/cupy_cuda13x-14.0.1-cp314-cp314-manylinux2014_x86_64.whl", hash = "sha256:2e6fbfb24bc336ba91507e9e6488589665a4c7366453bb80c717d874fce3c373", size = 68714185, upload-time = "2026-02-20T10:24:49.984Z" }, - { url = "https://files.pythonhosted.org/packages/c1/f5/273193563cdc37cdb22de3b73e7db12819b39fafb73de6bcf7d48f20945e/cupy_cuda13x-14.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:22b50139e05c4612fac905dd6c3390f8687e0e390f0e200d5be14be1726e3d04", size = 35474838, upload-time = "2026-02-20T10:24:54.198Z" }, + { url = "https://files.pythonhosted.org/packages/18/e9/19185f325905eada94ed96f649a2b92336dcb6caa62a5adac514bb2f0de5/cupy_cuda13x-14.1.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:80f169592f5bbf7cb411ce4eeda315d06addb1a3cb14ed668e9d2ba287e3e4d4", size = 72670820, upload-time = "2026-05-23T01:11:17.547Z" }, + { url = "https://files.pythonhosted.org/packages/25/0a/0796a2465c86b7656e7b4e0aaa2b5e17f1ae2d088db1a43a1ffd83e9a468/cupy_cuda13x-14.1.0-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:de745ef499998d44e96dfa9be1f442047299bbc5d9c7a0738e378375a18ed7c5", size = 68695023, upload-time = "2026-05-23T01:11:21.78Z" }, + { url = "https://files.pythonhosted.org/packages/1c/55/ac9107d7b0d58fcf671b0b32a7905709b7c767abd6d91256648498fb2831/cupy_cuda13x-14.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:49f026a1526f00adbf7b56ee28e986725e5ce1e1cd455f2a1a56ff74e5049e28", size = 35289284, upload-time = "2026-05-23T01:11:24.926Z" }, + { url = "https://files.pythonhosted.org/packages/20/a0/b7dc0aff6097b2fb19535715fe1b98a113bdddf3eea56ac1acd878c77f43/cupy_cuda13x-14.1.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:dfc24cceaa8234272159419f2b0763c78968909e1c31120ba83c22fdca91872f", size = 73971015, upload-time = "2026-05-23T01:11:28.359Z" }, + { url = "https://files.pythonhosted.org/packages/4a/31/e6a8e5786d5038417963d50041c6dbb1b0376091f6c170e036a8997120c2/cupy_cuda13x-14.1.0-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:079d99f6c492f24692f7904c013fc164c2b3ce605b2036293d0f2f6ae31dc3a8", size = 70032754, upload-time = "2026-05-23T01:11:32.001Z" }, + { url = "https://files.pythonhosted.org/packages/64/6b/3d4a6d766a055e1dfb36d66655c818ae5b999ba12d6723966ee6c4eb4ba4/cupy_cuda13x-14.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:1ee0839c5bfa801cd6f5181fced40d38ca90538f4723e17614fccd47292c4450", size = 35290568, upload-time = "2026-05-23T01:11:36.073Z" }, + { url = "https://files.pythonhosted.org/packages/23/7e/21afe0ab60bd88acbfa0daa6e1d7beff31fc9ec72702173520f58236daec/cupy_cuda13x-14.1.0-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:9b83ce4965466bf2bf99aaa6ce594c0547ca696f451676cd1d46124443476fb0", size = 73277053, upload-time = "2026-05-23T01:11:40.406Z" }, + { url = "https://files.pythonhosted.org/packages/2c/2e/d3780ce0a8d951e632349bb989d8536e77e03e8ff1c419922ed933f3ba55/cupy_cuda13x-14.1.0-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:3d3a64a850f5560239b942a833a6498e2d9a5fff4efbb6e93cddfa8c4f53b9cf", size = 69532518, upload-time = "2026-05-23T01:11:44.38Z" }, + { url = "https://files.pythonhosted.org/packages/99/2d/5faee3a1626deac5feef290fd52460ad57460009e9738ec4f0e62d40af5b/cupy_cuda13x-14.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:9e42ff785aec56e76ffc05fc0d92f7eab2a970dc7c377ad61288a98aa10e7db8", size = 35192581, upload-time = "2026-05-23T01:11:47.759Z" }, + { url = "https://files.pythonhosted.org/packages/04/8a/31c58ffa8e1780c8f15492018997d5fb3548427f5fa0e6327becf26f00c6/cupy_cuda13x-14.1.0-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:42f85f692a589b92a86627113e1072c534cc9d9047433b4291b8bd7b49fb238a", size = 72812202, upload-time = "2026-05-23T01:11:51.015Z" }, + { url = "https://files.pythonhosted.org/packages/98/41/be34e911811a0369e3e66b1b618dfccdea1f84ad6a2cc17f146ce9095e99/cupy_cuda13x-14.1.0-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:eef76f0647af5a9bfe3d0bac641f201deb5f15a644f4b13a2e68c0c62e6808fe", size = 69094718, upload-time = "2026-05-23T01:11:57.103Z" }, + { url = "https://files.pythonhosted.org/packages/0a/c1/c92b4c9c2c561c1298dfad2e3dbb75e527ac1a15d567d8fb868fc277c80e/cupy_cuda13x-14.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:18338008d428bf04dcd73ab2489c6f90c39b7ff439ab2b609115b9bb0e16e0ec", size = 35171775, upload-time = "2026-05-23T01:12:00.57Z" }, + { url = "https://files.pythonhosted.org/packages/24/b4/8963aced61d836417ca681d7cd1b6b27916ed877a01f3adf7c902bd8f392/cupy_cuda13x-14.1.0-cp314-cp314-manylinux2014_aarch64.whl", hash = "sha256:fa77dc442a166e784e28e5c7dd4e1bb4b2ac54a2ec55c59c1af3c0ed27e14f69", size = 72680065, upload-time = "2026-05-23T01:12:03.979Z" }, + { url = "https://files.pythonhosted.org/packages/8b/a8/2ae8d8235a236564e65a73812ee0bf4c1afe96b7104f754f100832f015e9/cupy_cuda13x-14.1.0-cp314-cp314-manylinux2014_x86_64.whl", hash = "sha256:7824fc7757bac2d91d6c810c4f5376359c1eeaf5d37c2625c4a670705f3d9f36", size = 68432300, upload-time = "2026-05-23T01:12:07.777Z" }, + { url = "https://files.pythonhosted.org/packages/ee/12/8e1d2b9efda12e8ad5c648f1fc289454b7c6210c2f4d9e99d7663178d8e1/cupy_cuda13x-14.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:f3c9f5e61fefc7920bcd3da9818679ea8f9319cca080dd88118f463a2ca08e41", size = 35323531, upload-time = "2026-05-23T01:12:11.024Z" }, + { url = "https://files.pythonhosted.org/packages/f6/bc/6cceec523fd467fc6259c4c394d87a9e7e3b8f011685da028d9862bf8497/cupy_cuda13x-14.1.0-cp314-cp314t-manylinux2014_aarch64.whl", hash = "sha256:e5b2a0dcaa5fb27faf034f5e3d271eaa13c4a5351e2c6dec925a866c210f3605", size = 72984031, upload-time = "2026-05-23T01:12:14.388Z" }, + { url = "https://files.pythonhosted.org/packages/d3/43/180777ccc0f85ce4469f3e6e615c471968f482fed85827410090adf40523/cupy_cuda13x-14.1.0-cp314-cp314t-manylinux2014_x86_64.whl", hash = "sha256:69b314f0085d7ad46a671338e62b3f35270c144c31df8c443c0341b97a905980", size = 68662879, upload-time = "2026-05-23T01:12:18.04Z" }, ] [[package]] @@ -881,7 +883,7 @@ dependencies = [ { name = "custabilizer-cu13", marker = "python_full_version >= '3.11'" }, { name = "custatevec-cu13", marker = "python_full_version >= '3.11'" }, { name = "cutensornet-cu13", marker = "python_full_version >= '3.11'" }, - { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "nvmath-python", marker = "python_full_version >= '3.11'" }, ] wheels = [ @@ -973,11 +975,11 @@ wheels = [ [[package]] name = "decorator" -version = "5.2.1" +version = "5.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711, upload-time = "2025-02-24T04:41:34.073Z" } +sdist = { url = "https://files.pythonhosted.org/packages/60/8b/32f9823da46cde7df2087faa08cd98d01b908f8dcab982cdba9c84e85355/decorator-5.3.1.tar.gz", hash = "sha256:4cbcdd55a6efadb9dbea26b858f4fb3264567b52d69ca0d25b721b553f60ea82", size = 58084, upload-time = "2026-05-18T06:03:28.057Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, + { url = "https://files.pythonhosted.org/packages/05/7f/798705f5296a58ca505d600456748d1be48078eac8a7050d8a98bc9edb89/decorator-5.3.1-py3-none-any.whl", hash = "sha256:f47fe6fdbd2edd623ecfe36875d37aba411624e2670dd395dddae1358689bb3c", size = 10365, upload-time = "2026-05-18T06:03:26.517Z" }, ] [[package]] @@ -1039,59 +1041,59 @@ wheels = [ [[package]] name = "fonttools" -version = "4.62.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9a/08/7012b00a9a5874311b639c3920270c36ee0c445b69d9989a85e5c92ebcb0/fonttools-4.62.1.tar.gz", hash = "sha256:e54c75fd6041f1122476776880f7c3c3295ffa31962dc6ebe2543c00dca58b5d", size = 3580737, upload-time = "2026-03-13T13:54:25.52Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/ff/532ed43808b469c807e8cb6b21358da3fe6fd51486b3a8c93db0bb5d957f/fonttools-4.62.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ad5cca75776cd453b1b035b530e943334957ae152a36a88a320e779d61fc980c", size = 2873740, upload-time = "2026-03-13T13:52:11.822Z" }, - { url = "https://files.pythonhosted.org/packages/85/e4/2318d2b430562da7227010fb2bb029d2fa54d7b46443ae8942bab224e2a0/fonttools-4.62.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0b3ae47e8636156a9accff64c02c0924cbebad62854c4a6dbdc110cd5b4b341a", size = 2417649, upload-time = "2026-03-13T13:52:14.605Z" }, - { url = "https://files.pythonhosted.org/packages/4c/28/40f15523b5188598018e7956899fed94eb7debec89e2dd70cb4a8df90492/fonttools-4.62.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9b9e288b4da2f64fd6180644221749de651703e8d0c16bd4b719533a3a7d6e3", size = 4935213, upload-time = "2026-03-13T13:52:17.399Z" }, - { url = "https://files.pythonhosted.org/packages/42/09/7dbe3d7023f57d9b580cfa832109d521988112fd59dddfda3fddda8218f9/fonttools-4.62.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7bca7a1c1faf235ffe25d4f2e555246b4750220b38de8261d94ebc5ce8a23c23", size = 4892374, upload-time = "2026-03-13T13:52:20.175Z" }, - { url = "https://files.pythonhosted.org/packages/d1/2d/84509a2e32cb925371560ef5431365d8da2183c11d98e5b4b8b4e42426a5/fonttools-4.62.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b4e0fcf265ad26e487c56cb12a42dffe7162de708762db951e1b3f755319507d", size = 4911856, upload-time = "2026-03-13T13:52:22.777Z" }, - { url = "https://files.pythonhosted.org/packages/a5/80/df28131379eed93d9e6e6fccd3bf6e3d077bebbfe98cc83f21bbcd83ed02/fonttools-4.62.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2d850f66830a27b0d498ee05adb13a3781637b1826982cd7e2b3789ef0cc71ae", size = 5031712, upload-time = "2026-03-13T13:52:25.14Z" }, - { url = "https://files.pythonhosted.org/packages/3d/03/3c8f09aad64230cd6d921ae7a19f9603c36f70930b00459f112706f6769a/fonttools-4.62.1-cp310-cp310-win32.whl", hash = "sha256:486f32c8047ccd05652aba17e4a8819a3a9d78570eb8a0e3b4503142947880ed", size = 1507878, upload-time = "2026-03-13T13:52:28.149Z" }, - { url = "https://files.pythonhosted.org/packages/dd/ec/f53f626f8f3e89f4cadd8fc08f3452c8fd182c951ad5caa35efac22b29ab/fonttools-4.62.1-cp310-cp310-win_amd64.whl", hash = "sha256:5a648bde915fba9da05ae98856987ca91ba832949a9e2888b48c47ef8b96c5a9", size = 1556766, upload-time = "2026-03-13T13:52:30.814Z" }, - { url = "https://files.pythonhosted.org/packages/88/39/23ff32561ec8d45a4d48578b4d241369d9270dc50926c017570e60893701/fonttools-4.62.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:40975849bac44fb0b9253d77420c6d8b523ac4dcdcefeff6e4d706838a5b80f7", size = 2871039, upload-time = "2026-03-13T13:52:33.127Z" }, - { url = "https://files.pythonhosted.org/packages/24/7f/66d3f8a9338a9b67fe6e1739f47e1cd5cee78bd3bc1206ef9b0b982289a5/fonttools-4.62.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9dde91633f77fa576879a0c76b1d89de373cae751a98ddf0109d54e173b40f14", size = 2416346, upload-time = "2026-03-13T13:52:35.676Z" }, - { url = "https://files.pythonhosted.org/packages/aa/53/5276ceba7bff95da7793a07c5284e1da901cf00341ce5e2f3273056c0cca/fonttools-4.62.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6acb4109f8bee00fec985c8c7afb02299e35e9c94b57287f3ea542f28bd0b0a7", size = 5100897, upload-time = "2026-03-13T13:52:38.102Z" }, - { url = "https://files.pythonhosted.org/packages/cc/a1/40a5c4d8e28b0851d53a8eeeb46fbd73c325a2a9a165f290a5ed90e6c597/fonttools-4.62.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1c5c25671ce8805e0d080e2ffdeca7f1e86778c5cbfbeae86d7f866d8830517b", size = 5071078, upload-time = "2026-03-13T13:52:41.305Z" }, - { url = "https://files.pythonhosted.org/packages/e3/be/d378fca4c65ea1956fee6d90ace6e861776809cbbc5af22388a090c3c092/fonttools-4.62.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a5d8825e1140f04e6c99bb7d37a9e31c172f3bc208afbe02175339e699c710e1", size = 5076908, upload-time = "2026-03-13T13:52:44.122Z" }, - { url = "https://files.pythonhosted.org/packages/f8/d9/ae6a1d0693a4185a84605679c8a1f719a55df87b9c6e8e817bfdd9ef5936/fonttools-4.62.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:268abb1cb221e66c014acc234e872b7870d8b5d4657a83a8f4205094c32d2416", size = 5202275, upload-time = "2026-03-13T13:52:46.591Z" }, - { url = "https://files.pythonhosted.org/packages/54/6c/af95d9c4efb15cabff22642b608342f2bd67137eea6107202d91b5b03184/fonttools-4.62.1-cp311-cp311-win32.whl", hash = "sha256:942b03094d7edbb99bdf1ae7e9090898cad7bf9030b3d21f33d7072dbcb51a53", size = 2293075, upload-time = "2026-03-13T13:52:48.711Z" }, - { url = "https://files.pythonhosted.org/packages/d3/97/bf54c5b3f2be34e1f143e6db838dfdc54f2ffa3e68c738934c82f3b2a08d/fonttools-4.62.1-cp311-cp311-win_amd64.whl", hash = "sha256:e8514f4924375f77084e81467e63238b095abda5107620f49421c368a6017ed2", size = 2344593, upload-time = "2026-03-13T13:52:50.725Z" }, - { url = "https://files.pythonhosted.org/packages/47/d4/dbacced3953544b9a93088cc10ef2b596d348c983d5c67a404fa41ec51ba/fonttools-4.62.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:90365821debbd7db678809c7491ca4acd1e0779b9624cdc6ddaf1f31992bf974", size = 2870219, upload-time = "2026-03-13T13:52:53.664Z" }, - { url = "https://files.pythonhosted.org/packages/66/9e/a769c8e99b81e5a87ab7e5e7236684de4e96246aae17274e5347d11ebd78/fonttools-4.62.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12859ff0b47dd20f110804c3e0d0970f7b832f561630cd879969011541a464a9", size = 2414891, upload-time = "2026-03-13T13:52:56.493Z" }, - { url = "https://files.pythonhosted.org/packages/69/64/f19a9e3911968c37e1e620e14dfc5778299e1474f72f4e57c5ec771d9489/fonttools-4.62.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c125ffa00c3d9003cdaaf7f2c79e6e535628093e14b5de1dccb08859b680936", size = 5033197, upload-time = "2026-03-13T13:52:59.179Z" }, - { url = "https://files.pythonhosted.org/packages/9b/8a/99c8b3c3888c5c474c08dbfd7c8899786de9604b727fcefb055b42c84bba/fonttools-4.62.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:149f7d84afca659d1a97e39a4778794a2f83bf344c5ee5134e09995086cc2392", size = 4988768, upload-time = "2026-03-13T13:53:02.761Z" }, - { url = "https://files.pythonhosted.org/packages/d1/c6/0f904540d3e6ab463c1243a0d803504826a11604c72dd58c2949796a1762/fonttools-4.62.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0aa72c43a601cfa9273bb1ae0518f1acadc01ee181a6fc60cd758d7fdadffc04", size = 4971512, upload-time = "2026-03-13T13:53:05.678Z" }, - { url = "https://files.pythonhosted.org/packages/29/0b/5cbef6588dc9bd6b5c9ad6a4d5a8ca384d0cea089da31711bbeb4f9654a6/fonttools-4.62.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:19177c8d96c7c36359266e571c5173bcee9157b59cfc8cb0153c5673dc5a3a7d", size = 5122723, upload-time = "2026-03-13T13:53:08.662Z" }, - { url = "https://files.pythonhosted.org/packages/4a/47/b3a5342d381595ef439adec67848bed561ab7fdb1019fa522e82101b7d9c/fonttools-4.62.1-cp312-cp312-win32.whl", hash = "sha256:a24decd24d60744ee8b4679d38e88b8303d86772053afc29b19d23bb8207803c", size = 2281278, upload-time = "2026-03-13T13:53:10.998Z" }, - { url = "https://files.pythonhosted.org/packages/28/b1/0c2ab56a16f409c6c8a68816e6af707827ad5d629634691ff60a52879792/fonttools-4.62.1-cp312-cp312-win_amd64.whl", hash = "sha256:9e7863e10b3de72376280b515d35b14f5eeed639d1aa7824f4cf06779ec65e42", size = 2331414, upload-time = "2026-03-13T13:53:13.992Z" }, - { url = "https://files.pythonhosted.org/packages/3b/56/6f389de21c49555553d6a5aeed5ac9767631497ac836c4f076273d15bd72/fonttools-4.62.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c22b1014017111c401469e3acc5433e6acf6ebcc6aa9efb538a533c800971c79", size = 2865155, upload-time = "2026-03-13T13:53:16.132Z" }, - { url = "https://files.pythonhosted.org/packages/03/c5/0e3966edd5ec668d41dfe418787726752bc07e2f5fd8c8f208615e61fa89/fonttools-4.62.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:68959f5fc58ed4599b44aad161c2837477d7f35f5f79402d97439974faebfebe", size = 2412802, upload-time = "2026-03-13T13:53:18.878Z" }, - { url = "https://files.pythonhosted.org/packages/52/94/e6ac4b44026de7786fe46e3bfa0c87e51d5d70a841054065d49cd62bb909/fonttools-4.62.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef46db46c9447103b8f3ff91e8ba009d5fe181b1920a83757a5762551e32bb68", size = 5013926, upload-time = "2026-03-13T13:53:21.379Z" }, - { url = "https://files.pythonhosted.org/packages/e2/98/8b1e801939839d405f1f122e7d175cebe9aeb4e114f95bfc45e3152af9a7/fonttools-4.62.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6706d1cb1d5e6251a97ad3c1b9347505c5615c112e66047abbef0f8545fa30d1", size = 4964575, upload-time = "2026-03-13T13:53:23.857Z" }, - { url = "https://files.pythonhosted.org/packages/46/76/7d051671e938b1881670528fec69cc4044315edd71a229c7fd712eaa5119/fonttools-4.62.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2e7abd2b1e11736f58c1de27819e1955a53267c21732e78243fa2fa2e5c1e069", size = 4953693, upload-time = "2026-03-13T13:53:26.569Z" }, - { url = "https://files.pythonhosted.org/packages/1f/ae/b41f8628ec0be3c1b934fc12b84f4576a5c646119db4d3bdd76a217c90b5/fonttools-4.62.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:403d28ce06ebfc547fbcb0cb8b7f7cc2f7a2d3e1a67ba9a34b14632df9e080f9", size = 5094920, upload-time = "2026-03-13T13:53:29.329Z" }, - { url = "https://files.pythonhosted.org/packages/f2/f6/53a1e9469331a23dcc400970a27a4caa3d9f6edbf5baab0260285238b884/fonttools-4.62.1-cp313-cp313-win32.whl", hash = "sha256:93c316e0f5301b2adbe6a5f658634307c096fd5aae60a5b3412e4f3e1728ab24", size = 2279928, upload-time = "2026-03-13T13:53:32.352Z" }, - { url = "https://files.pythonhosted.org/packages/38/60/35186529de1db3c01f5ad625bde07c1f576305eab6d86bbda4c58445f721/fonttools-4.62.1-cp313-cp313-win_amd64.whl", hash = "sha256:7aa21ff53e28a9c2157acbc44e5b401149d3c9178107130e82d74ceb500e5056", size = 2330514, upload-time = "2026-03-13T13:53:34.991Z" }, - { url = "https://files.pythonhosted.org/packages/36/f0/2888cdac391807d68d90dcb16ef858ddc1b5309bfc6966195a459dd326e2/fonttools-4.62.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fa1d16210b6b10a826d71bed68dd9ec24a9e218d5a5e2797f37c573e7ec215ca", size = 2864442, upload-time = "2026-03-13T13:53:37.509Z" }, - { url = "https://files.pythonhosted.org/packages/4b/b2/e521803081f8dc35990816b82da6360fa668a21b44da4b53fc9e77efcd62/fonttools-4.62.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:aa69d10ed420d8121118e628ad47d86e4caa79ba37f968597b958f6cceab7eca", size = 2410901, upload-time = "2026-03-13T13:53:40.55Z" }, - { url = "https://files.pythonhosted.org/packages/00/a4/8c3511ff06e53110039358dbbdc1a65d72157a054638387aa2ada300a8b8/fonttools-4.62.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd13b7999d59c5eb1c2b442eb2d0c427cb517a0b7a1f5798fc5c9e003f5ff782", size = 4999608, upload-time = "2026-03-13T13:53:42.798Z" }, - { url = "https://files.pythonhosted.org/packages/28/63/cd0c3b26afe60995a5295f37c246a93d454023726c3261cfbb3559969bb9/fonttools-4.62.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8d337fdd49a79b0d51c4da87bc38169d21c3abbf0c1aa9367eff5c6656fb6dae", size = 4912726, upload-time = "2026-03-13T13:53:45.405Z" }, - { url = "https://files.pythonhosted.org/packages/70/b9/ac677cb07c24c685cf34f64e140617d58789d67a3dd524164b63648c6114/fonttools-4.62.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d241cdc4a67b5431c6d7f115fdf63335222414995e3a1df1a41e1182acd4bcc7", size = 4951422, upload-time = "2026-03-13T13:53:48.326Z" }, - { url = "https://files.pythonhosted.org/packages/e6/10/11c08419a14b85b7ca9a9faca321accccc8842dd9e0b1c8a72908de05945/fonttools-4.62.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c05557a78f8fa514da0f869556eeda40887a8abc77c76ee3f74cf241778afd5a", size = 5060979, upload-time = "2026-03-13T13:53:51.366Z" }, - { url = "https://files.pythonhosted.org/packages/4e/3c/12eea4a4cf054e7ab058ed5ceada43b46809fce2bf319017c4d63ae55bb4/fonttools-4.62.1-cp314-cp314-win32.whl", hash = "sha256:49a445d2f544ce4a69338694cad575ba97b9a75fff02720da0882d1a73f12800", size = 2283733, upload-time = "2026-03-13T13:53:53.606Z" }, - { url = "https://files.pythonhosted.org/packages/6b/67/74b070029043186b5dd13462c958cb7c7f811be0d2e634309d9a1ffb1505/fonttools-4.62.1-cp314-cp314-win_amd64.whl", hash = "sha256:1eecc128c86c552fb963fe846ca4e011b1be053728f798185a1687502f6d398e", size = 2335663, upload-time = "2026-03-13T13:53:56.23Z" }, - { url = "https://files.pythonhosted.org/packages/42/c5/4d2ed3ca6e33617fc5624467da353337f06e7f637707478903c785bd8e20/fonttools-4.62.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:1596aeaddf7f78e21e68293c011316a25267b3effdaccaf4d59bc9159d681b82", size = 2947288, upload-time = "2026-03-13T13:53:59.397Z" }, - { url = "https://files.pythonhosted.org/packages/1f/e9/7ab11ddfda48ed0f89b13380e5595ba572619c27077be0b2c447a63ff351/fonttools-4.62.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:8f8fca95d3bb3208f59626a4b0ea6e526ee51f5a8ad5d91821c165903e8d9260", size = 2449023, upload-time = "2026-03-13T13:54:01.642Z" }, - { url = "https://files.pythonhosted.org/packages/b2/10/a800fa090b5e8819942e54e19b55fc7c21fe14a08757c3aa3ca8db358939/fonttools-4.62.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee91628c08e76f77b533d65feb3fbe6d9dad699f95be51cf0d022db94089cdc4", size = 5137599, upload-time = "2026-03-13T13:54:04.495Z" }, - { url = "https://files.pythonhosted.org/packages/37/dc/8ccd45033fffd74deb6912fa1ca524643f584b94c87a16036855b498a1ed/fonttools-4.62.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5f37df1cac61d906e7b836abe356bc2f34c99d4477467755c216b72aa3dc748b", size = 4920933, upload-time = "2026-03-13T13:54:07.557Z" }, - { url = "https://files.pythonhosted.org/packages/99/eb/e618adefb839598d25ac8136cd577925d6c513dc0d931d93b8af956210f0/fonttools-4.62.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:92bb00a947e666169c99b43753c4305fc95a890a60ef3aeb2a6963e07902cc87", size = 5016232, upload-time = "2026-03-13T13:54:10.611Z" }, - { url = "https://files.pythonhosted.org/packages/d9/5f/9b5c9bfaa8ec82def8d8168c4f13615990d6ce5996fe52bd49bfb5e05134/fonttools-4.62.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:bdfe592802ef939a0e33106ea4a318eeb17822c7ee168c290273cbd5fabd746c", size = 5042987, upload-time = "2026-03-13T13:54:13.569Z" }, - { url = "https://files.pythonhosted.org/packages/90/aa/dfbbe24c6a6afc5c203d90cc0343e24bcbb09e76d67c4d6eef8c2558d7ba/fonttools-4.62.1-cp314-cp314t-win32.whl", hash = "sha256:b820fcb92d4655513d8402d5b219f94481c4443d825b4372c75a2072aa4b357a", size = 2348021, upload-time = "2026-03-13T13:54:16.98Z" }, - { url = "https://files.pythonhosted.org/packages/13/6f/ae9c4e4dd417948407b680855c2c7790efb52add6009aaecff1e3bc50e8e/fonttools-4.62.1-cp314-cp314t-win_amd64.whl", hash = "sha256:59b372b4f0e113d3746b88985f1c796e7bf830dd54b28374cd85c2b8acd7583e", size = 2414147, upload-time = "2026-03-13T13:54:19.416Z" }, - { url = "https://files.pythonhosted.org/packages/fd/ba/56147c165442cc5ba7e82ecf301c9a68353cede498185869e6e02b4c264f/fonttools-4.62.1-py3-none-any.whl", hash = "sha256:7487782e2113861f4ddcc07c3436450659e3caa5e470b27dc2177cade2d8e7fd", size = 1152647, upload-time = "2026-03-13T13:54:22.735Z" }, +version = "4.63.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/84/69/c97f2c18e0db87d2c7b15da1974dace76ae938f1cfa22e2727a648b7ed43/fonttools-4.63.0.tar.gz", hash = "sha256:caeb583deeb5168e694b65cda8b4ee62abedfa66cf88488734466f2366b9c4e0", size = 3597189, upload-time = "2026-05-14T12:04:30.958Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/c9/4141c90a90db20f807c7e10bfd689fe53eb8f7f4caff58ee4d4dfe46919f/fonttools-4.63.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e3297a6a4059b4acc3a1e9a8b04741f240a80044eef08ebd32e8b5bcdddce75b", size = 2884632, upload-time = "2026-05-14T12:02:38.56Z" }, + { url = "https://files.pythonhosted.org/packages/b8/46/ad12b5c10eae602d7ef814b02afa08aacbf89da917fed5b071282b7eadc2/fonttools-4.63.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b1cd75a03ad8cb5bc40c90bfde68c0c47de423aa19e5c0f362b43520645eea94", size = 2429441, upload-time = "2026-05-14T12:02:41.162Z" }, + { url = "https://files.pythonhosted.org/packages/90/8f/bdca24a84c81d56fffed052229cdcff368f6e05882e526f4558891481f65/fonttools-4.63.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0425b277a59cff3d80ca42162a8de360f318438a2ac83570842a678d826d579", size = 4946346, upload-time = "2026-05-14T12:02:43.41Z" }, + { url = "https://files.pythonhosted.org/packages/04/59/a639c0e136441ee91a65b56fdf89e5d075927e7a09c559d1b0f5276577db/fonttools-4.63.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d7e5c9973aa04c95650c96e5f5ad865fbf42d62079163ecfab1e01cbc2504c22", size = 4903184, upload-time = "2026-05-14T12:02:45.742Z" }, + { url = "https://files.pythonhosted.org/packages/e6/53/91b7e0cb45b536f3da1b29ba8cbab89f27e8b986809e0b1982303a3f4eca/fonttools-4.63.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cb014d58140a38135f16064c74c652ed57aa0b75cbf8bb59cac821f7edb5334e", size = 4922967, upload-time = "2026-05-14T12:02:48.386Z" }, + { url = "https://files.pythonhosted.org/packages/c7/b7/87439bf44e6b97c5538cd29d0b7e366a5b8ce2cc132a4134fb67fa3f2fa2/fonttools-4.63.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:032038247a96c1690f9f31e377c389383c902531b085aa4e4dabd6f57f870e69", size = 5042799, upload-time = "2026-05-14T12:02:50.424Z" }, + { url = "https://files.pythonhosted.org/packages/ad/7c/8b96c3263b89ef99cded544c0f0636686f85dbd3c211c4dceef0231fca23/fonttools-4.63.0-cp310-cp310-win32.whl", hash = "sha256:a8b33a82979e0a6a34ff435cc81317be1f95ec1ebb7a3a2d1c8a6a54f02ae44e", size = 1519704, upload-time = "2026-05-14T12:02:52.523Z" }, + { url = "https://files.pythonhosted.org/packages/e5/4d/2c2f0069970b6907de8fb5b05c5c0193cc22f717df151d1c7aef1c738f58/fonttools-4.63.0-cp310-cp310-win_amd64.whl", hash = "sha256:0c18358a155d75034911c5ee397a5b44cd19dd325dbb8b35fb60bf421d6a72ac", size = 1568666, upload-time = "2026-05-14T12:02:54.917Z" }, + { url = "https://files.pythonhosted.org/packages/75/2b/a7f1545bdf5da69c4bda0cea2a5781f0ad2a6623e0277267672db43c5fe6/fonttools-4.63.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b8ae05d9eacf6081414d759c0a352769ac28ce31280d6bb8e77b03f9e3c449f", size = 2881793, upload-time = "2026-05-14T12:02:56.645Z" }, + { url = "https://files.pythonhosted.org/packages/49/50/965308c703f085f225db2886813b27e015b8b3438c350b22dd65b52c2a2c/fonttools-4.63.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79cdc9f567aec74a72918fd060283911406750cbc9fd28c1316023deb6ce31a9", size = 2428130, upload-time = "2026-05-14T12:02:58.891Z" }, + { url = "https://files.pythonhosted.org/packages/d8/38/6937fbd7f2dc3a6b48725851bc2c15ec949b9af14d9bbcb5fe83cdf9bdf9/fonttools-4.63.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c14b4fd138c4bafcca294765c547914e1aa431ae1ca94ab99d8db08c958bd3b", size = 5111952, upload-time = "2026-05-14T12:03:01.263Z" }, + { url = "https://files.pythonhosted.org/packages/0b/43/a81f20050a3115b57d62c8e781446949512eac36690dc384ccea65ff4cc1/fonttools-4.63.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d76ac49f929aecaf82d83250b8347e099d7aecba0f4726c1d9b6df3b8bb5fe18", size = 5082308, upload-time = "2026-05-14T12:03:03.211Z" }, + { url = "https://files.pythonhosted.org/packages/67/00/cdd9d4944ca6ae280d01e69cc37bde3bf663630b837a6fc6d2cd65d80e0e/fonttools-4.63.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dcf076a4474fe0d7367e5bbf5b052c7284fa1feca729c04176ce513521afd8a0", size = 5087932, upload-time = "2026-05-14T12:03:05.147Z" }, + { url = "https://files.pythonhosted.org/packages/f5/f1/0aa0dbea778c75adbef223c42019fd47d22262b905974d62d829545d485f/fonttools-4.63.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7dd683fef0663e9f0f45cf541d788d24caa3ec9db50796b588e1757d8b3bc007", size = 5213271, upload-time = "2026-05-14T12:03:07.238Z" }, + { url = "https://files.pythonhosted.org/packages/a8/99/253e4056e1f0e67b9390125a154b73b5eb73ad521bece95c004858fdeec2/fonttools-4.63.0-cp311-cp311-win32.whl", hash = "sha256:afefc1ed0a59785a7fb06ea7e1678e849c193e1e387db783579bc7b3056fcfcb", size = 2304473, upload-time = "2026-05-14T12:03:09.271Z" }, + { url = "https://files.pythonhosted.org/packages/08/60/defa5e69641db890a63be281f41345f4c33b157824eaf0b9fad3e08b0dcb/fonttools-4.63.0-cp311-cp311-win_amd64.whl", hash = "sha256:063e08bd17bd5a90127a14123de0d6a952dbc847695fd98b63c043d58057f90c", size = 2356389, upload-time = "2026-05-14T12:03:11.53Z" }, + { url = "https://files.pythonhosted.org/packages/08/ef/b3c6b9b5be2f82416d73fe2ed2e96e2793cd80e7510bd6a17ca79cdd88ec/fonttools-4.63.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:37dd23e621e3b0aef1baa70a303b80aaf38449632cfc8fd2a55fb285bbccfc02", size = 2881131, upload-time = "2026-05-14T12:03:13.386Z" }, + { url = "https://files.pythonhosted.org/packages/44/a0/c815bea63117fa63e4e1c01f8a1110d2112fa003f838e6467094ec2432ce/fonttools-4.63.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a9faff9e0c1f76f9fd55899d2ce785832efebab37eb8ae13995853aef178bef0", size = 2426704, upload-time = "2026-05-14T12:03:15.801Z" }, + { url = "https://files.pythonhosted.org/packages/44/04/0b91d8e916e92ad1fac9e4624760baf0fd5ff2ead614c2f68fb21373f03f/fonttools-4.63.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef3048ef05dbb552b89817713d9cac912e00d0fde4a3105c00d29e52e10c89af", size = 5044298, upload-time = "2026-05-14T12:03:18.085Z" }, + { url = "https://files.pythonhosted.org/packages/77/c7/2342da9830e3e9d4870305ca5d2091d2a83284f2953079b7bdd3b5e029d8/fonttools-4.63.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:58dc6bb86a78d782f00f9190ca02c119cf5bbe2807536e361e18d42019f877d8", size = 4999800, upload-time = "2026-05-14T12:03:20.161Z" }, + { url = "https://files.pythonhosted.org/packages/e6/6d/67fe16c48d7ce050979b33f47e0d28a318f02da030602e944c34f7a16ef3/fonttools-4.63.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ee08ebfa58f6e1aeff5697ab9582105bb620008c1caafb681e4c557e7483027b", size = 4982666, upload-time = "2026-05-14T12:03:22.87Z" }, + { url = "https://files.pythonhosted.org/packages/f2/00/3bbab338c07c71fa56269953845e92c951a61457bbbb0f1022551ea266d9/fonttools-4.63.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:27fdc65af8da6f88b9c6121c47a464cbe359fcfff7ff6fc2d37a1f395d755b78", size = 5133598, upload-time = "2026-05-14T12:03:25.168Z" }, + { url = "https://files.pythonhosted.org/packages/62/f2/aa27c7f98db5b064883dadcc5283947e81e034de42e22a33675878d98b54/fonttools-4.63.0-cp312-cp312-win32.whl", hash = "sha256:af2fd1664d00a397d75f806985ddb36282091c2131a73a6485c23b4a34722263", size = 2292575, upload-time = "2026-05-14T12:03:27.496Z" }, + { url = "https://files.pythonhosted.org/packages/87/36/cccb9bc2a6ab63d1b2980374f0dca72ce95ae267c9b4cfe77455bb70d0d4/fonttools-4.63.0-cp312-cp312-win_amd64.whl", hash = "sha256:59ac449f8cca9b4ffa08d2e7bbadad87ce710d69d1eda5c3c1ce579baa987272", size = 2343211, upload-time = "2026-05-14T12:03:30.057Z" }, + { url = "https://files.pythonhosted.org/packages/0f/8d/d8fec3dcde2963f8c908fb315e5ff2cd0ac34f82394bbbf73a2aa5145ce3/fonttools-4.63.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:cd7e9857e5e63738b9d9fd707bc1f59c8b09e5177726d23664db393c59bb08bd", size = 2876062, upload-time = "2026-05-14T12:03:32.554Z" }, + { url = "https://files.pythonhosted.org/packages/ef/71/d935dc54e4ff121bfdd11e08702db63a7e6f25af21d8a3d7b7212df53641/fonttools-4.63.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c2a2a42198b696a6f48fad91709afb55176e66a5e566131219dba372fb7f8c59", size = 2424594, upload-time = "2026-05-14T12:03:34.86Z" }, + { url = "https://files.pythonhosted.org/packages/8e/40/e76320afa1df918e146155ef239b1719ee266092e96f5423bfd075affba1/fonttools-4.63.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e874792a8212b44583ea02189d9e693906b2f78b261f372f95d6c563210ac1d", size = 5024840, upload-time = "2026-05-14T12:03:36.745Z" }, + { url = "https://files.pythonhosted.org/packages/ce/36/0b805d8c485f872f65a509cbe3b58a5d0d17bee855333b54a150c79d3061/fonttools-4.63.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:22135da48a348785c5e2d5d2d9d6bec5ed44adacbaeb9db12d9493bf6c6bfa68", size = 4975801, upload-time = "2026-05-14T12:03:38.833Z" }, + { url = "https://files.pythonhosted.org/packages/c8/26/2cee03d0aa083ab022da5c07aff9ed3f689da1defb81ad6917c9627896da/fonttools-4.63.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ccf41f2efdf56994d22d73bef4ced1052161958169428d06ba9724ea9e9a64be", size = 4965009, upload-time = "2026-05-14T12:03:41.494Z" }, + { url = "https://files.pythonhosted.org/packages/7e/48/cc4b66d9058c0d0982c833fad10127c4b0e9324606aafa41382295ca4102/fonttools-4.63.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9ced0bd02ac751dd6319b0da88aaef24414e3b0dbc32bb4f24944821a3741a27", size = 5105892, upload-time = "2026-05-14T12:03:43.525Z" }, + { url = "https://files.pythonhosted.org/packages/d8/1f/a98a30a814b9ddef3a2e706025f90b9e0bc94890e6cb15254bc86547d11a/fonttools-4.63.0-cp313-cp313-win32.whl", hash = "sha256:85be818f5506e8a7753153def2c9550178f0ecae6a47b5e0e8dbb23f7cc90380", size = 2291313, upload-time = "2026-05-14T12:03:45.594Z" }, + { url = "https://files.pythonhosted.org/packages/92/46/5177b01f3b4abfdd4409f31cca4ab279c9343a26efbe9ec78c97fc612e02/fonttools-4.63.0-cp313-cp313-win_amd64.whl", hash = "sha256:ba04cb5891d4c0c21b6da95eda8d7b090021508a294fff33464fc7d241e0856b", size = 2342299, upload-time = "2026-05-14T12:03:47.414Z" }, + { url = "https://files.pythonhosted.org/packages/27/d2/23d25e3f247b328be58d04a4c9f894178a0d1eda7d42867cfb388adaf416/fonttools-4.63.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fd1e3094f42d806d3d7c79162fc59e5910fcbe3a7360c385b8da969bc4493745", size = 2875338, upload-time = "2026-05-14T12:03:50.052Z" }, + { url = "https://files.pythonhosted.org/packages/cd/58/7dfa0c761cb3b2964e2a84c4dc986c926a87de0cb9fb60d5b28ded3f2914/fonttools-4.63.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:6e528da43bc3791085f8cb6141b1d13e459226790240340fcbb4625649238b03", size = 2422661, upload-time = "2026-05-14T12:03:52.154Z" }, + { url = "https://files.pythonhosted.org/packages/dd/87/64cfa18a7a1621d17b7f4502b2b0ed8a135a90c3db51ea590ee99043e76b/fonttools-4.63.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b2248c5decb223562f7902ff6325077a073f608ee8e33e88ad88db734eb9f49", size = 5010526, upload-time = "2026-05-14T12:03:54.647Z" }, + { url = "https://files.pythonhosted.org/packages/36/e1/a8933a72c45a87177fbde2696e0d0755c8c9062f8c077a961c6215fa27b1/fonttools-4.63.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:308f957cdeaf8abe4e5f2f124902ef405448af92c90f80e302a3b771c2e6116b", size = 4923946, upload-time = "2026-05-14T12:03:56.984Z" }, + { url = "https://files.pythonhosted.org/packages/27/60/872e6e233b8c5e8b41413796ff18b7fe479661bd40147e071b450dfad7a1/fonttools-4.63.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bf00f21eb5fb721dbaf73d1e9da6d02a1af7768f2ebcf9798be98beab8ba90f6", size = 4962489, upload-time = "2026-05-14T12:03:59.443Z" }, + { url = "https://files.pythonhosted.org/packages/30/c4/83c24f2ec38b90cfda84bf4b1a1f49df80e84a1db4e7ac6e0d41bf23bc39/fonttools-4.63.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c1aaa4b9c75798400ac043ce04d74e7830376c85095a5a6ed7cba2f17a266bf4", size = 5071870, upload-time = "2026-05-14T12:04:02.122Z" }, + { url = "https://files.pythonhosted.org/packages/de/40/3ae22b60ff1d41ce0bd044b31238cdc72cef99f28b976f1e128ebd618c9b/fonttools-4.63.0-cp314-cp314-win32.whl", hash = "sha256:22693918177bd9ceabec4736d338045f357769416fc6b0b2508eefef75b08616", size = 2295026, upload-time = "2026-05-14T12:04:04.47Z" }, + { url = "https://files.pythonhosted.org/packages/c3/d4/98078064ccc76b45cb0f6c002452011e93c4bd26f6850344f0951cc1fe89/fonttools-4.63.0-cp314-cp314-win_amd64.whl", hash = "sha256:7d782fac32985914c351556f68ac0855391572bcd87de50e05970d3cd4c96fc5", size = 2347454, upload-time = "2026-05-14T12:04:06.752Z" }, + { url = "https://files.pythonhosted.org/packages/49/4e/652d1580c5f4e39f7d103b0c793e4773129ad633dce4addd0cf4dfebde02/fonttools-4.63.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:6db5140a60a5d731d21ec076745b40a310607731b0a565b50776393188649001", size = 2958152, upload-time = "2026-05-14T12:04:08.706Z" }, + { url = "https://files.pythonhosted.org/packages/0e/55/ad864c9a9b219f552eb46b32cd7906c466e5a578ba0c3abfcc0fe7413eb6/fonttools-4.63.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7d76edbff9014094dbf03bd2d074709dfa6ec7aba13d838c937a2b33d2d6a86e", size = 2460809, upload-time = "2026-05-14T12:04:10.783Z" }, + { url = "https://files.pythonhosted.org/packages/ea/2b/0aa8db70f18cf52e49b4ed5ecec68547f981160bf5ded3b5aed6faa0a6f9/fonttools-4.63.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0eac00b9118c3c2f87d272e45341871c5b3066baa3c86897fa634a7c3fb59096", size = 5148649, upload-time = "2026-05-14T12:04:12.747Z" }, + { url = "https://files.pythonhosted.org/packages/7f/63/18e4369c25043096f1048e0c9915951adc4f842bd81c6b18155824d6fa99/fonttools-4.63.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51394295f1a51de8b5f30bdb1e1b9a4231536c7064ef5c6e211eec19fa36036f", size = 4932147, upload-time = "2026-05-14T12:04:14.806Z" }, + { url = "https://files.pythonhosted.org/packages/a1/3f/67f3eac2ffd8a98446c5022f8ed3864eac878a5ff7af8df4c8286dba16cc/fonttools-4.63.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9e12f105d2b6342c559c298afb674006bb2893afc7102dcf8a1b55b0486b4e40", size = 5027237, upload-time = "2026-05-14T12:04:17.675Z" }, + { url = "https://files.pythonhosted.org/packages/1a/ba/4e6214cb38a7b04779e97bb7636de9a5c7f20af7018d03dee0b64c08510a/fonttools-4.63.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:796f27556dbe094c4824f75ca85267e4df776c79036c8441469a4df37038c196", size = 5053933, upload-time = "2026-05-14T12:04:20.818Z" }, + { url = "https://files.pythonhosted.org/packages/34/3b/214dcc19ee31d3d38fb5ad2755c11ef0514e5dc300bbaf41c0b69f393799/fonttools-4.63.0-cp314-cp314t-win32.whl", hash = "sha256:948428a275741f0b64b113c955425a953314f4b9ab9997f73a72c83e68e569c8", size = 2359326, upload-time = "2026-05-14T12:04:24.22Z" }, + { url = "https://files.pythonhosted.org/packages/dd/1e/3ff1a9b523058c2eeb6a9d50f5574e2a738200d0d94107d5bc4105e8da3f/fonttools-4.63.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6d4741eb179121cab9eea4cb2393d24492373a260d7945006358c08cfbf45419", size = 2425829, upload-time = "2026-05-14T12:04:26.829Z" }, + { url = "https://files.pythonhosted.org/packages/2c/47/c99d5268f354002ce80f8d029cd9d7d872969da1de8b93d32de4dc56d6f4/fonttools-4.63.0-py3-none-any.whl", hash = "sha256:445af2eab030a16b9171ea8bdda7ebf7d96bda2df88ee182a464252f6e05e20d", size = 1164562, upload-time = "2026-05-14T12:04:29.092Z" }, ] [[package]] @@ -1135,34 +1137,38 @@ wheels = [ [[package]] name = "guppylang" -version = "0.21.6" +version = "0.21.11" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "guppylang-internals" }, { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "pytket" }, { name = "selene-hugr-qis-compiler" }, { name = "selene-sim" }, { name = "tqdm" }, { name = "types-tqdm" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0d/45/0c4cb644d10682fdf9de492911ef55ddc571469270487058655fe9e233b4/guppylang-0.21.6.tar.gz", hash = "sha256:57cdfa0c2fe7ffd80c193c830505285e0a8c779a6f817016cb8e295eaa1cae19", size = 60477, upload-time = "2025-10-30T17:37:21.435Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/6d/dcfebfca39fc8fce2f5b27fc2f411ebfcd18e4509959215ac6d6a38afb5f/guppylang-0.21.11.tar.gz", hash = "sha256:5ff823484c9e8cc2a9c13279be0aec2dc68f3aa725bd9f125d912a393983747e", size = 68353, upload-time = "2026-04-01T13:23:19.721Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f3/81/3c0fffa0c28bd2bcaf37dd053d50017f8afc3794de13d9e60b7f5b9a5dab/guppylang-0.21.6-py3-none-any.whl", hash = "sha256:ecc03bf0c1f2d1146a3fdcc2e75a9a775eb11fd37b128a1febf319ab6b709619", size = 58427, upload-time = "2025-10-30T17:37:20.212Z" }, + { url = "https://files.pythonhosted.org/packages/48/73/7e6e9567d600cdb181273216ba82ab9b8b279da92c969685506b83181af9/guppylang-0.21.11-py3-none-any.whl", hash = "sha256:b00e8f1be52c846c349c576c4d264771fca01fe5f2f0a6a01434f92d4b7350c4", size = 65701, upload-time = "2026-04-01T13:23:18.265Z" }, ] [[package]] name = "guppylang-internals" -version = "0.25.0" +version = "0.32.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "hugr" }, + { name = "pytket" }, + { name = "tket" }, { name = "tket-exts" }, { name = "typing-extensions" }, + { name = "wasmtime" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/56/d1/1d71187602922cc70a4880137d65ea742a3f3a37be9519e23c4c5f28bc14/guppylang_internals-0.25.0.tar.gz", hash = "sha256:abbcbccb44f3404adff52046907c8c1ee993b8d779fcbef259b7bd8840c450d1", size = 180215, upload-time = "2025-10-29T15:13:20.78Z" } +sdist = { url = "https://files.pythonhosted.org/packages/58/99/ee9e0475e0597c06bd8a6a05ceb5b0a3dfb52c1830a84fd322d541db5ada/guppylang_internals-0.32.0.tar.gz", hash = "sha256:ecd074ba42903558c381d0e62891e7e749932a62003d56bda5678c06959f818e", size = 207836, upload-time = "2026-04-01T12:45:18.605Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2e/d1/48129590b4eb5e99deff8e3ddf3a039a66d96523dfb68592a6267b779b30/guppylang_internals-0.25.0-py3-none-any.whl", hash = "sha256:95473e5ef93329fc6a764fce82e0ef3931b691407a10a21520c522080405565b", size = 233971, upload-time = "2025-10-29T15:13:19.214Z" }, + { url = "https://files.pythonhosted.org/packages/19/52/3196a4b254d58d66c56235ff4194e519e603927753ac6a6d13179cadf59e/guppylang_internals-0.32.0-py3-none-any.whl", hash = "sha256:8d711e4a60c28b726b92ffbb383ef7f836ac2a8135838b5ad9f49f6e4e840962", size = 260494, upload-time = "2026-04-01T12:45:16.369Z" }, ] [[package]] @@ -1204,48 +1210,45 @@ wheels = [ [[package]] name = "hugr" -version = "0.14.4" +version = "0.15.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "graphviz" }, { name = "pydantic" }, { name = "pydantic-extra-types" }, - { name = "pyzstd" }, { name = "semver" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/20/12/6e653fb7ea01567a220f4fe0b3ae9e435f1e4d8d052d7fc6089195b1322e/hugr-0.14.4.tar.gz", hash = "sha256:0f39810cde20aa22741ceec236ce8936a50cf16b72b259e561fd205a8c02ea08", size = 1076949, upload-time = "2025-11-26T16:15:07.355Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cd/f9/3af5afddee55a5c42fc2b3ccd85a7c23b284f6570822a0171a1157622866/hugr-0.14.4-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:93c9c56ddc0b5e66e4a6a19f95e94f95c2ce764c2763a8abf3329fb1c12c7cdd", size = 3831727, upload-time = "2025-11-26T16:14:50.634Z" }, - { url = "https://files.pythonhosted.org/packages/04/18/b854c36821819a0f96fdcbf6849f0b29a057e52bda101c2081f705dfeb64/hugr-0.14.4-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:196d1c4eafa4b86502267809b316fcc9d9f5bd30a9052991ee4cd9140a99a969", size = 3406301, upload-time = "2025-11-26T16:14:46.918Z" }, - { url = "https://files.pythonhosted.org/packages/00/2b/335abcb77657074c7bd1d32fe78acf4bfb86243b84ca4537006aa2ed88ad/hugr-0.14.4-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8affb8819f864dcbc7b9a32bb9efbc66d45b6656d5446afb2078cf1c1c15b63", size = 3719565, upload-time = "2025-11-26T16:14:13.276Z" }, - { url = "https://files.pythonhosted.org/packages/b7/92/e048e852e58d948c9a3d84daf8b5f124642050a7a200e22e0923025d6dd9/hugr-0.14.4-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1bc1960987198c024300b8baf5415bda825a786329fe7d9c4b5bf4c798809d8c", size = 3774829, upload-time = "2025-11-26T16:14:20.189Z" }, - { url = "https://files.pythonhosted.org/packages/df/3d/a537e46cf2777538b33664150a36de5688ad9b79285765d3f47c1e208319/hugr-0.14.4-cp310-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d39ea3725047505458d63a5f3f9e1b7ea248fa62f8fab3a94c3ee5fefde36197", size = 4032332, upload-time = "2025-11-26T16:14:40.093Z" }, - { url = "https://files.pythonhosted.org/packages/92/01/108efd9b71dcf3c80863c1d12bcb39eaff1052472b62b0ff06cf73607f76/hugr-0.14.4-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dfcd7656edbf746c49a28391ffadd995eabdeeb47c79b4b6d286996d175a67f6", size = 4187215, upload-time = "2025-11-26T16:14:26.906Z" }, - { url = "https://files.pythonhosted.org/packages/16/23/b4699cbf9e50d7657ce7e179d873980e25416ca2a56c7d97234cc9528bc2/hugr-0.14.4-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbe48b812fe2f2c0eeb8ffc38bca08d34d88449f58eb139e77b5fc0c5a3e73c0", size = 4383840, upload-time = "2025-11-26T16:14:34.108Z" }, - { url = "https://files.pythonhosted.org/packages/37/c9/081bb993bdf097a67b7ec9292cd5027f940666972d8631580ab346ed547a/hugr-0.14.4-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdb23f2b40e56875752ed739bf1c8bc3ae14bbdacde298e1c7ed0641b27ff853", size = 4068208, upload-time = "2025-11-26T16:14:43.755Z" }, - { url = "https://files.pythonhosted.org/packages/5b/8b/4f6ae5ca60115afc3a925b197c3504143a454cbfb84615abe7e6a4c666f4/hugr-0.14.4-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:772d631a6ad5099021f2d95d45ade7c543889d49b36d1b03fc072d3da3caa9a2", size = 3942511, upload-time = "2025-11-26T16:14:53.466Z" }, - { url = "https://files.pythonhosted.org/packages/11/5e/851c84aa0b15779318f57c25d19aaca46e103efb982238c7ad6771a0d49e/hugr-0.14.4-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:c7fc26b710141d521951be5b5d85ec4fa0d583ca09b4c6a7e4d1e0d18864072d", size = 4053248, upload-time = "2025-11-26T16:14:56.593Z" }, - { url = "https://files.pythonhosted.org/packages/c6/fc/38ca1caec06bb019fc3ed8a9f86f96ce0a26db7d0ca1496cf13d96ab51c0/hugr-0.14.4-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:b0f0455ec23fbc60dc9a5770c7c996baa544d96547622de0ba3e9ae4f27ab667", size = 4078485, upload-time = "2025-11-26T16:15:00.721Z" }, - { url = "https://files.pythonhosted.org/packages/bb/eb/6c851799c7cf5899253178928e6579322c50793b23abf152c093a4d9952f/hugr-0.14.4-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a40bda1a592a02560d8735cc1f0514e04dfc4d6fdd95ece8a63819708b3e6b12", size = 4265564, upload-time = "2025-11-26T16:15:04.257Z" }, - { url = "https://files.pythonhosted.org/packages/9f/17/cecf6b74c6896ae85ed98962a69c651f988bd7208c437c68a75ff5846114/hugr-0.14.4-cp310-abi3-win32.whl", hash = "sha256:8b930de9755cf8fa649775484a3ab360271fdd29a1aa0ec5570204e80824a71a", size = 3378991, upload-time = "2025-11-26T16:15:10.638Z" }, - { url = "https://files.pythonhosted.org/packages/0d/2a/9a56a0da944ce7daf754cac339270acb47a15d68c7bc84f3df366be64eb5/hugr-0.14.4-cp310-abi3-win_amd64.whl", hash = "sha256:1987f8b5078dc40b674203acb5952d02f1b72728997123652a01f5fface882a0", size = 3606113, upload-time = "2025-11-26T16:15:08.762Z" }, - { url = "https://files.pythonhosted.org/packages/28/56/caac43ee7fcc69edbc3d32ec5796ab072d973b5b21c0ce389c18e202dca6/hugr-0.14.4-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:a1cdef74e8b5bd3831f5f635dbde78debb5bd3f9c997b78747542f1256d499fb", size = 3849266, upload-time = "2025-11-26T16:14:52.047Z" }, - { url = "https://files.pythonhosted.org/packages/a7/b0/d5e3187560aa0d84044863e24a3df8cb1706ae86315510d79905c53b29da/hugr-0.14.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e9880f01550807a3fcb9acbb062c1ae9601328bfe4684580ca04d543d3131eb0", size = 3408154, upload-time = "2025-11-26T16:14:49.019Z" }, - { url = "https://files.pythonhosted.org/packages/05/ff/817a4595b68c2ef56ddfea82ec20c0247ebbcad1e721b2767ff513ece73b/hugr-0.14.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6b0a67e1740fb78d66ab31561be4d6374f480cab115f6314d6bbc8d26704a73", size = 3715760, upload-time = "2025-11-26T16:14:15.307Z" }, - { url = "https://files.pythonhosted.org/packages/54/19/53574f3dbcf6b5c3602c71d017fda201196f5ea13c365012c12e3de8d87f/hugr-0.14.4-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a3aedae6e89aaebadfbbd201e35b07be2a683bb23307b2bbdcac410a170c0d11", size = 3771058, upload-time = "2025-11-26T16:14:21.889Z" }, - { url = "https://files.pythonhosted.org/packages/3b/45/3094b9254030a6443b83ff70114edf90dfbaf1356d387677335107509186/hugr-0.14.4-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d32813dafd772ac067d68d5bd2ed3f1a98d8912a2908db68a137ad75d4a88e7", size = 4038863, upload-time = "2025-11-26T16:14:42.014Z" }, - { url = "https://files.pythonhosted.org/packages/b6/7b/4065d535076a61a9ae004b664aa8379a3c493dd768336deb927bc26f4701/hugr-0.14.4-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:983f26f1cf0bf196c3aca3d0f97d7ddf27ec7cc8753bea8d358b4afbe904029c", size = 4185665, upload-time = "2025-11-26T16:14:28.733Z" }, - { url = "https://files.pythonhosted.org/packages/aa/a5/d5c5c7ad832c0b817743df9a4db58c72025c155d7e78ae12262975d2e527/hugr-0.14.4-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b453bc489b5c4e4746c980c935a79ada189988c10a2f77a6c2a10e04bae0b89", size = 4379657, upload-time = "2025-11-26T16:14:35.633Z" }, - { url = "https://files.pythonhosted.org/packages/0a/7b/5083c0cc249e53082443323fe493ac6d18388f181b82d6bfa479b523b7d9/hugr-0.14.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:328eb29099b3cc1ddbc5479a6bb7e1a437f170f4e85ee27b3d35357ef2caf369", size = 4066330, upload-time = "2025-11-26T16:14:45.255Z" }, - { url = "https://files.pythonhosted.org/packages/87/e2/46cc78aff8da4544993c49638ff801a6a9a44149bf20f7e5917b18dd9fef/hugr-0.14.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1fd38be47ac27ccb9edb124a18c3b14e545708b8bbed89c8c20d1b2e14a4e9b2", size = 3939452, upload-time = "2025-11-26T16:14:54.9Z" }, - { url = "https://files.pythonhosted.org/packages/e3/ba/f027273d8d3a6ebcfa9e6954502615050293e695dc8e38824164ef9abea1/hugr-0.14.4-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:b59dc1972a07a2cee4d8e53d24020634d70d7d923fe0592c977e0c3de8d538ed", size = 4048708, upload-time = "2025-11-26T16:14:58.135Z" }, - { url = "https://files.pythonhosted.org/packages/aa/27/bdb89dc5ac0f1dce5e8f79a47eaa30a90aed671329107f6f305330e4e043/hugr-0.14.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:19392043a13c53bb49cfb9ffabc6a084f6a1b563a51be3bef6d4e7f78b96aee6", size = 4088139, upload-time = "2025-11-26T16:15:02.8Z" }, - { url = "https://files.pythonhosted.org/packages/8d/e1/d1571d13f49d54cb4b84dbcc5d81e3548761b15abe019b97abdf7606c8a2/hugr-0.14.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c88b23a70ccd780f30148784eaad7cfd7384c459f5e221870d901922a6300492", size = 4259853, upload-time = "2025-11-26T16:15:05.828Z" }, - { url = "https://files.pythonhosted.org/packages/eb/75/e49bd706b9be6005da9a838e94d2a15cd96373839ddcc88fb38b7798fd29/hugr-0.14.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c29d997d8d210ebde9d07305833cd80b2425c1419b6554042d150c314ccd1c4", size = 3719146, upload-time = "2025-11-26T16:14:16.785Z" }, - { url = "https://files.pythonhosted.org/packages/68/73/f8ec89ff697b20e244844f2bdf4aaa07b3ee063d845861659479582b0aa2/hugr-0.14.4-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:57b0487a13382005d0ee0e908ae349272bdc03c3537202a0a46e9a07c4fc112c", size = 3773374, upload-time = "2025-11-26T16:14:23.602Z" }, - { url = "https://files.pythonhosted.org/packages/16/81/a82554d06dcee43b8580156c9e5ca1bafbb2eef6cb54d674b2c49bc0a21f/hugr-0.14.4-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bd82eddfcd20d26c96aa8bc8be8ab867f1c231902ae4200b570f405f0eb7ca9", size = 4185152, upload-time = "2025-11-26T16:14:30.574Z" }, - { url = "https://files.pythonhosted.org/packages/3b/a8/ae3b32d52c682545b66a3e73481565050e15d47ecf374da7658e5d8f60a5/hugr-0.14.4-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea4264d9d93b9684b1b5d47a8f5d7a23e73631e4d9cbd7d34008da37f2402913", size = 4376569, upload-time = "2025-11-26T16:14:37.123Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/ff/32/01b0e17e2aade67a18180af4bc2b74942c3f526851ab13e3072ee0655550/hugr-0.15.5.tar.gz", hash = "sha256:538b50c0070fc2e45f3e1394fa862ec131b22390e9acfd89f48e5c1ad122d635", size = 1115293, upload-time = "2026-03-30T12:59:53.771Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2b/1e/e412e18a0bfd606be5e51b4bb3aba98c24d11c871e89a9a7aa59d84595e3/hugr-0.15.5-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b0959494e29cd9f48ce1e6fd11deb24b009569abb3a2c7216fd90602adf1a850", size = 3287674, upload-time = "2026-03-30T12:59:50.234Z" }, + { url = "https://files.pythonhosted.org/packages/03/d1/7a02ea4508d4fe36a028c52efaedf8141976a98ea194b3ae1fefdfae92a9/hugr-0.15.5-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:3d968983df1b1fa89f4523b45438d3bcba4cddfa0e7365ecffc0116613a8aba7", size = 2937104, upload-time = "2026-03-30T12:59:46.14Z" }, + { url = "https://files.pythonhosted.org/packages/4e/28/1c15cd8c33d0dbd2bf0f63a451951c9f0eec06d2fd4b61678253197b8026/hugr-0.15.5-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5a84c326d5a16bf6cb83db3872e73fbe2a3a0134a998aa4d00364a8cb5f1e2e", size = 3259115, upload-time = "2026-03-30T12:59:04.481Z" }, + { url = "https://files.pythonhosted.org/packages/ec/66/e2c335fb57e5f1d2ea09782a7dbd82de8e49e3290653d3f3e79e32754af5/hugr-0.15.5-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7a106cd91076aa7a8392ca7266aec9785b92cb7bedbe3a2d06569ca5783dcc19", size = 3243950, upload-time = "2026-03-30T12:59:08.566Z" }, + { url = "https://files.pythonhosted.org/packages/48/28/54219692e40e38cb3fac6afa336f898db033e1bf434fd452a867a40a2be1/hugr-0.15.5-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86ae8263cc5b576fb2d1403e3b1326db9f8f01e316f4588842b53f6b2fa3868b", size = 3666466, upload-time = "2026-03-30T12:59:12.096Z" }, + { url = "https://files.pythonhosted.org/packages/b2/0e/0e14fc7e7eb402256d906bcd6aa40cd06d3394d41680a960805c22757520/hugr-0.15.5-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:92e10d5be181a49c381b11082a2a2c5973cb5f139b5eb077bb0b3aabe217be84", size = 3739167, upload-time = "2026-03-30T12:59:16.236Z" }, + { url = "https://files.pythonhosted.org/packages/f6/1d/7d0f934e24e8a8ad0477d941529774cf09a2f13cf1e6cace5f9bd040be56/hugr-0.15.5-cp310-abi3-manylinux_2_28_i686.whl", hash = "sha256:00d700296911b0d6dd7a9854899bd3cca7d77ebc24a999a4117d0120fead88d0", size = 3513669, upload-time = "2026-04-01T17:50:20.969Z" }, + { url = "https://files.pythonhosted.org/packages/b0/62/df3c0cf828757965da82abea5f3fe03e3eeb77452fdc88e31b2c35581675/hugr-0.15.5-cp310-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a0a536c5eb547b64f4d820229397ef20f0fffcb929559ec00bf4ba8a66927143", size = 3541999, upload-time = "2026-04-01T17:50:24.524Z" }, + { url = "https://files.pythonhosted.org/packages/1d/ca/531363852d9fe16e14453e52b1e2420deda99a84fdcfb56f622c52357d0c/hugr-0.15.5-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d1b1cc6671da1f75f04205fceaf6d2096b3c2e3a584e9bc78ad4fa6694d6cb75", size = 3467535, upload-time = "2026-03-30T12:59:26.551Z" }, + { url = "https://files.pythonhosted.org/packages/8e/e5/a82d0007c3136319ae8280a9b752fe224a0b6700aeafdb6b641924e2dd60/hugr-0.15.5-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:b3cbeb904291afc99ec9cd617fbf0b87e4e1813db2d5b4c7a880c5c68f380ee9", size = 3523569, upload-time = "2026-03-30T12:59:30.427Z" }, + { url = "https://files.pythonhosted.org/packages/19/04/257cdcead28cf9279bc8864338a3d4c33dec454a6217c3ebd207f648c943/hugr-0.15.5-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:7b7fed0cf9ab91d238d42003a1eb33bf673a2005e9f838f6424fa857784f10ba", size = 3607051, upload-time = "2026-03-30T12:59:34.322Z" }, + { url = "https://files.pythonhosted.org/packages/9a/9a/468df655f5e44bdb56c1cfa2e2489d0cf20862a03f878403bad9cf4c9e2b/hugr-0.15.5-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2ac6c9cfc2e2c3540108723e8f9f0bfd08b767d94195a7b5e02143345336988f", size = 3763498, upload-time = "2026-03-30T12:59:38.997Z" }, + { url = "https://files.pythonhosted.org/packages/29/63/8b01ae8d59f8220fd03504eb0ff771f40dd803fcf75160e3c8b65bacac05/hugr-0.15.5-cp310-abi3-win32.whl", hash = "sha256:5996a0d93d23ab3b192ce99c03215e456fc0754566d04694e1bb8404d7931c36", size = 2897922, upload-time = "2026-03-30T12:59:44.406Z" }, + { url = "https://files.pythonhosted.org/packages/c1/4d/ba3a51e3dbacaf23a0d7c4bead0b8e52e7744754d942875102b6f7d91e3f/hugr-0.15.5-cp310-abi3-win_amd64.whl", hash = "sha256:4ca15068cd32199c52cd93225686f7a1416b478f534905026593ecf8ae82d38f", size = 3120930, upload-time = "2026-03-30T12:59:42.705Z" }, + { url = "https://files.pythonhosted.org/packages/10/aa/8791aee20794f282653b0d3d775265cdf72438c23d27e624172db92fb813/hugr-0.15.5-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:2a101e02e6288556029b269faf9338acafd30635b9832971fc8b2f9f465e9fc5", size = 3286019, upload-time = "2026-03-30T12:59:52.202Z" }, + { url = "https://files.pythonhosted.org/packages/1a/c3/592b85d664fc52a4ac5312c44b42e6421a02f8de1aec5f865603ec1b48b9/hugr-0.15.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e7efbd8a56ef70690ae161b292d96eb8ac766e8fa1dc466ceb8686803fb81d72", size = 2936026, upload-time = "2026-03-30T12:59:48.254Z" }, + { url = "https://files.pythonhosted.org/packages/ad/16/169de9863b41c6bec0493fd3cdc7c35d20d7cbf93079f234ff24bb7a9ba3/hugr-0.15.5-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c11e28b43569cdb049cbb21b99f8bee15be516157d0c336421b9fc5c270642a", size = 3256239, upload-time = "2026-03-30T12:59:06.557Z" }, + { url = "https://files.pythonhosted.org/packages/69/54/83d94589c289c2a1df7d871af548e23f23a658be1f455f68f4abb744a2a9/hugr-0.15.5-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:55f9fb9863733f347374afba74ce91f3cd8a1b39e7db2c2474def16004688e62", size = 3243114, upload-time = "2026-03-30T12:59:10.41Z" }, + { url = "https://files.pythonhosted.org/packages/d7/07/a13d1f373a6dcc6ee8fc079b936cc450c510333dbcf4a000112343e91c15/hugr-0.15.5-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6dacc70fc00fbc69cb24145027609c136d0380cb7de27e6f60755c990c8d64e1", size = 3511629, upload-time = "2026-03-30T12:59:19.719Z" }, + { url = "https://files.pythonhosted.org/packages/ba/ac/173ea1a8b6c7768f3a496302a5e61581bfc1d636c1356d01b227d86ed8a1/hugr-0.15.5-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fe5b8ce5e17982adc6427ff590e9e4a535b2e449b009706ec760c2e9213f3f6", size = 3662265, upload-time = "2026-03-30T12:59:14.247Z" }, + { url = "https://files.pythonhosted.org/packages/29/44/60e22b8d61dcc35009aa06ad63f300061ba8e24aeb9ea16193350eee1f38/hugr-0.15.5-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0b9c4ad0d637edeb8a45610e1d9a71c4137e064d4a2dc1334e2099e9ffdeeaac", size = 3737613, upload-time = "2026-03-30T12:59:18.06Z" }, + { url = "https://files.pythonhosted.org/packages/67/49/4c648af0c5f9521fd089a8803f9f6c2dd1c31e636c21f0e701bfa2da9030/hugr-0.15.5-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ea20c8ab98aa0d865577a0af1b11598b782ae5e6e076b55e8421f318288f16c", size = 3534945, upload-time = "2026-03-30T12:59:23.222Z" }, + { url = "https://files.pythonhosted.org/packages/10/b0/4f2b061e78bcc871865e698a5120bd2504a45bb0aaa0007ae6f9fa2c2b06/hugr-0.15.5-cp313-cp313t-manylinux_2_28_i686.whl", hash = "sha256:68511a127b73c10c8cab08ca6e92b2f96fd111d7e2a3bc86eda64ecc7cb8e6ad", size = 3514687, upload-time = "2026-04-01T17:50:35.44Z" }, + { url = "https://files.pythonhosted.org/packages/cc/36/f11007c43ea13c5b5c7f50ce3b40dad1bb4551e53dd12e3ca908c071b483/hugr-0.15.5-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:f50260b4e330d3bb06c1e7acf87194dfbf090b3f608536e77fe9562f2ed8d57c", size = 3543491, upload-time = "2026-04-01T17:50:39.132Z" }, + { url = "https://files.pythonhosted.org/packages/d5/be/1d61f890ed50a5ad3b826dadb127fa297a1022d43573a122a619d09a3b2c/hugr-0.15.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:0376cda72bb3075a94cdfab2d0dc4e1aec79284f21855178057bdf143b4c0ddd", size = 3465437, upload-time = "2026-03-30T12:59:28.4Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e2/3a13a9b44842baaef1efac6d470bb974d956eaa7f7ab602a34f557b2df8a/hugr-0.15.5-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:2fd3dcc9731bc357a4efd71c667e7d33ddaac78c1a6bb3de987583a4429651b6", size = 3522732, upload-time = "2026-03-30T12:59:32.328Z" }, + { url = "https://files.pythonhosted.org/packages/52/62/a396c7c8a40acd2c8c394f25f32165cbbfbe8db989cc218b3d509844010f/hugr-0.15.5-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:37efbdd3cfd96a692a026bd4bd8bae2795ae3374786c57f053819c335a98f24a", size = 3607041, upload-time = "2026-03-30T12:59:36.787Z" }, + { url = "https://files.pythonhosted.org/packages/f0/2a/735cba4a2fd45aac30e678d196c91b9e6d8707a6a8f1a8a2157c73b11f22/hugr-0.15.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:291f48270b27e183cfca356602d63925ff1a9f51847d35de16366d04fbbfc5ca", size = 3763612, upload-time = "2026-03-30T12:59:40.945Z" }, ] [[package]] @@ -1272,11 +1275,11 @@ wheels = [ [[package]] name = "idna" -version = "3.15" +version = "3.17" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/82/77/7b3966d0b9d1d31a36ddf1746926a11dface89a83409bf1483f0237aa758/idna-3.15.tar.gz", hash = "sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc", size = 199245, upload-time = "2026-05-12T22:45:57.011Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/28/99c51f664567218d824af024c0251650fb27e4ca066df188dab0769c5b91/idna-3.17.tar.gz", hash = "sha256:5eb0cb53bc467c12eadcf6de83163ad8527cec9416f44b9b61b19caedad2b87f", size = 196048, upload-time = "2026-05-28T14:32:38.55Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl", hash = "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8", size = 72340, upload-time = "2026-05-12T22:45:55.733Z" }, + { url = "https://files.pythonhosted.org/packages/de/a7/f76514cc40ad6234098ecdebda08732d75964776c51a42845b7da10649e2/idna-3.17-py3-none-any.whl", hash = "sha256:466e48829084efe2548012b855df21540b96f2e20e51bd124c851536556a592c", size = 65316, upload-time = "2026-05-28T14:32:37.035Z" }, ] [[package]] @@ -1297,7 +1300,7 @@ dependencies = [ { name = "comm" }, { name = "debugpy" }, { name = "ipython", version = "8.39.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "ipython", version = "9.13.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "ipython", version = "9.14.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "jupyter-client" }, { name = "jupyter-core" }, { name = "matplotlib-inline" }, @@ -1341,7 +1344,7 @@ wheels = [ [[package]] name = "ipython" -version = "9.13.0" +version = "9.14.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.14' and platform_machine == 'x86_64' and sys_platform == 'darwin'", @@ -1357,15 +1360,15 @@ dependencies = [ { name = "matplotlib-inline", marker = "python_full_version >= '3.11'" }, { name = "pexpect", marker = "python_full_version >= '3.11' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, { name = "prompt-toolkit", marker = "python_full_version >= '3.11'" }, - { name = "psutil", marker = "python_full_version >= '3.11'" }, + { name = "psutil", marker = "python_full_version >= '3.11' and sys_platform != 'emscripten'" }, { name = "pygments", marker = "python_full_version >= '3.11'" }, { name = "stack-data", marker = "python_full_version >= '3.11'" }, { name = "traitlets", marker = "python_full_version >= '3.11'" }, { name = "typing-extensions", marker = "python_full_version == '3.11.*'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cd/c4/87cda5842cf5c31837c06ddb588e11c3c35d8ece89b7a0108c06b8c9b00a/ipython-9.13.0.tar.gz", hash = "sha256:7e834b6afc99f020e3f05966ced34792f40267d64cb1ea9043886dab0dde5967", size = 4430549, upload-time = "2026-04-24T12:24:55.221Z" } +sdist = { url = "https://files.pythonhosted.org/packages/21/c2/c0064cf15d026501a1ef70e42efd9c3f818663089399aacc5e37a82901c1/ipython-9.14.0.tar.gz", hash = "sha256:6f27ff0f1d9ea050e0551f71568bc4b34d8aba579e8f111c5b4175f44ac6b4aa", size = 4432601, upload-time = "2026-05-29T15:13:24.611Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl", hash = "sha256:57f9d4639e20818d328d287c7b549af3d05f12486ea8f2e7f73e52a36ec4d201", size = 627274, upload-time = "2026-04-24T12:24:53.038Z" }, + { url = "https://files.pythonhosted.org/packages/14/a3/9e59340f02c1dc8f8c0a05b09244712b8609eb5439f9996e887e2b82f452/ipython-9.14.0-py3-none-any.whl", hash = "sha256:8fd984a3372c14b12790b084ba6b5cff5678c0cb063244a0034f06a51f20d6c2", size = 627457, upload-time = "2026-05-29T15:13:22.942Z" }, ] [[package]] @@ -1387,7 +1390,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "comm" }, { name = "ipython", version = "8.39.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "ipython", version = "9.13.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "ipython", version = "9.14.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "jupyterlab-widgets" }, { name = "traitlets" }, { name = "widgetsnbextension" }, @@ -1459,7 +1462,8 @@ dependencies = [ { name = "attrs" }, { name = "jsonschema-specifications" }, { name = "referencing" }, - { name = "rpds-py" }, + { name = "rpds-py", version = "0.30.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "rpds-py", version = "2026.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } wheels = [ @@ -1531,7 +1535,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ipykernel" }, { name = "ipython", version = "8.39.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "ipython", version = "9.13.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "ipython", version = "9.14.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "jupyter-client" }, { name = "jupyter-core" }, { name = "prompt-toolkit" }, @@ -1590,7 +1594,7 @@ wheels = [ [[package]] name = "jupyter-server" -version = "2.18.2" +version = "2.19.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -1613,9 +1617,9 @@ dependencies = [ { name = "traitlets" }, { name = "websocket-client" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ca/15/1eacb0fcb79ef86e8a0a79a708e6ad7435f6f223097dd29a4ce861fabc44/jupyter_server-2.18.2.tar.gz", hash = "sha256:06b4f40d8a7a00bb39d5216859c81374a0e7cfefe6d8a5a7facc5a5c37c679a7", size = 753177, upload-time = "2026-05-06T07:04:36.274Z" } +sdist = { url = "https://files.pythonhosted.org/packages/76/a0/eb3c511f54df7b54ca5fc7bff3f4d2277d69052d6a7f521643dfed5279d6/jupyter_server-2.19.0.tar.gz", hash = "sha256:1731236bc32b680223e1ceb9d68209a845203475012ef68773a81434b46a31a7", size = 754561, upload-time = "2026-05-29T11:21:26.057Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/50/ecf4f70d65bdb7519b28a33d1b2fee8a4b4ba1ae1a92f15d97e877c5de21/jupyter_server-2.18.2-py3-none-any.whl", hash = "sha256:fa5e46539ded65791838035a2b6001f13e54d5f64b8b3752eb1e91fdd641a5b8", size = 391907, upload-time = "2026-05-06T07:04:34.014Z" }, + { url = "https://files.pythonhosted.org/packages/c1/78/d2881e68894cecdcd05912a9c585cfb776ef1fb38b62c8dba98f12ab3adc/jupyter_server-2.19.0-py3-none-any.whl", hash = "sha256:cb76591b76d7093584c2ad2ae72ac3d58614a4b597507a1bb04e1f9f683cf9ea", size = 392244, upload-time = "2026-05-29T11:21:23.871Z" }, ] [[package]] @@ -2075,7 +2079,7 @@ dependencies = [ { name = "fonttools" }, { name = "kiwisolver" }, { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "packaging" }, { name = "pillow" }, { name = "pyparsing" }, @@ -2540,7 +2544,7 @@ wheels = [ [[package]] name = "numpy" -version = "2.4.4" +version = "2.4.6" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.14' and platform_machine == 'x86_64' and sys_platform == 'darwin'", @@ -2548,79 +2552,79 @@ resolution-markers = [ "(python_full_version >= '3.14' and platform_machine != 'x86_64') or (python_full_version >= '3.14' and sys_platform != 'darwin')", "(python_full_version >= '3.11' and python_full_version < '3.14' and platform_machine != 'x86_64') or (python_full_version >= '3.11' and python_full_version < '3.14' and sys_platform != 'darwin')", ] -sdist = { url = "https://files.pythonhosted.org/packages/d7/9f/b8cef5bffa569759033adda9481211426f12f53299629b410340795c2514/numpy-2.4.4.tar.gz", hash = "sha256:2d390634c5182175533585cc89f3608a4682ccb173cc9bb940b2881c8d6f8fa0", size = 20731587, upload-time = "2026-03-29T13:22:01.298Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/c6/4218570d8c8ecc9704b5157a3348e486e84ef4be0ed3e38218ab473c83d2/numpy-2.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f983334aea213c99992053ede6168500e5f086ce74fbc4acc3f2b00f5762e9db", size = 16976799, upload-time = "2026-03-29T13:18:15.438Z" }, - { url = "https://files.pythonhosted.org/packages/dd/92/b4d922c4a5f5dab9ed44e6153908a5c665b71acf183a83b93b690996e39b/numpy-2.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72944b19f2324114e9dc86a159787333b77874143efcf89a5167ef83cfee8af0", size = 14971552, upload-time = "2026-03-29T13:18:18.606Z" }, - { url = "https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:86b6f55f5a352b48d7fbfd2dbc3d5b780b2d79f4d3c121f33eb6efb22e9a2015", size = 5476566, upload-time = "2026-03-29T13:18:21.532Z" }, - { url = "https://files.pythonhosted.org/packages/28/34/b3fdcec6e725409223dd27356bdf5a3c2cc2282e428218ecc9cb7acc9763/numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:ba1f4fc670ed79f876f70082eff4f9583c15fb9a4b89d6188412de4d18ae2f40", size = 6806482, upload-time = "2026-03-29T13:18:23.634Z" }, - { url = "https://files.pythonhosted.org/packages/68/62/63417c13aa35d57bee1337c67446761dc25ea6543130cf868eace6e8157b/numpy-2.4.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a87ec22c87be071b6bdbd27920b129b94f2fc964358ce38f3822635a3e2e03d", size = 15973376, upload-time = "2026-03-29T13:18:26.677Z" }, - { url = "https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df3775294accfdd75f32c74ae39fcba920c9a378a2fc18a12b6820aa8c1fb502", size = 16925137, upload-time = "2026-03-29T13:18:30.14Z" }, - { url = "https://files.pythonhosted.org/packages/7e/43/80020edacb3f84b9efdd1591120a4296462c23fd8db0dde1666f6ef66f13/numpy-2.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0d4e437e295f18ec29bc79daf55e8a47a9113df44d66f702f02a293d93a2d6dd", size = 17329414, upload-time = "2026-03-29T13:18:33.733Z" }, - { url = "https://files.pythonhosted.org/packages/fd/06/af0658593b18a5f73532d377188b964f239eb0894e664a6c12f484472f97/numpy-2.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6aa3236c78803afbcb255045fbef97a9e25a1f6c9888357d205ddc42f4d6eba5", size = 18658397, upload-time = "2026-03-29T13:18:37.511Z" }, - { url = "https://files.pythonhosted.org/packages/e6/ce/13a09ed65f5d0ce5c7dd0669250374c6e379910f97af2c08c57b0608eee4/numpy-2.4.4-cp311-cp311-win32.whl", hash = "sha256:30caa73029a225b2d40d9fae193e008e24b2026b7ee1a867b7ee8d96ca1a448e", size = 6239499, upload-time = "2026-03-29T13:18:40.372Z" }, - { url = "https://files.pythonhosted.org/packages/bd/63/05d193dbb4b5eec1eca73822d80da98b511f8328ad4ae3ca4caf0f4db91d/numpy-2.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:6bbe4eb67390b0a0265a2c25458f6b90a409d5d069f1041e6aff1e27e3d9a79e", size = 12614257, upload-time = "2026-03-29T13:18:42.95Z" }, - { url = "https://files.pythonhosted.org/packages/87/c5/8168052f080c26fa984c413305012be54741c9d0d74abd7fbeeccae3889f/numpy-2.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:fcfe2045fd2e8f3cb0ce9d4ba6dba6333b8fa05bb8a4939c908cd43322d14c7e", size = 10486775, upload-time = "2026-03-29T13:18:45.835Z" }, - { url = "https://files.pythonhosted.org/packages/28/05/32396bec30fb2263770ee910142f49c1476d08e8ad41abf8403806b520ce/numpy-2.4.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:15716cfef24d3a9762e3acdf87e27f58dc823d1348f765bbea6bef8c639bfa1b", size = 16689272, upload-time = "2026-03-29T13:18:49.223Z" }, - { url = "https://files.pythonhosted.org/packages/c5/f3/a983d28637bfcd763a9c7aafdb6d5c0ebf3d487d1e1459ffdb57e2f01117/numpy-2.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23cbfd4c17357c81021f21540da84ee282b9c8fba38a03b7b9d09ba6b951421e", size = 14699573, upload-time = "2026-03-29T13:18:52.629Z" }, - { url = "https://files.pythonhosted.org/packages/9b/fd/e5ecca1e78c05106d98028114f5c00d3eddb41207686b2b7de3e477b0e22/numpy-2.4.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:8b3b60bb7cba2c8c81837661c488637eee696f59a877788a396d33150c35d842", size = 5204782, upload-time = "2026-03-29T13:18:55.579Z" }, - { url = "https://files.pythonhosted.org/packages/de/2f/702a4594413c1a8632092beae8aba00f1d67947389369b3777aed783fdca/numpy-2.4.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e4a010c27ff6f210ff4c6ef34394cd61470d01014439b192ec22552ee867f2a8", size = 6552038, upload-time = "2026-03-29T13:18:57.769Z" }, - { url = "https://files.pythonhosted.org/packages/7f/37/eed308a8f56cba4d1fdf467a4fc67ef4ff4bf1c888f5fc980481890104b1/numpy-2.4.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f9e75681b59ddaa5e659898085ae0eaea229d054f2ac0c7e563a62205a700121", size = 15670666, upload-time = "2026-03-29T13:19:00.341Z" }, - { url = "https://files.pythonhosted.org/packages/0a/0d/0e3ecece05b7a7e87ab9fb587855548da437a061326fff64a223b6dcb78a/numpy-2.4.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:81f4a14bee47aec54f883e0cad2d73986640c1590eb9bfaaba7ad17394481e6e", size = 16645480, upload-time = "2026-03-29T13:19:03.63Z" }, - { url = "https://files.pythonhosted.org/packages/34/49/f2312c154b82a286758ee2f1743336d50651f8b5195db18cdb63675ff649/numpy-2.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:62d6b0f03b694173f9fcb1fb317f7222fd0b0b103e784c6549f5e53a27718c44", size = 17020036, upload-time = "2026-03-29T13:19:07.428Z" }, - { url = "https://files.pythonhosted.org/packages/7b/e9/736d17bd77f1b0ec4f9901aaec129c00d59f5d84d5e79bba540ef12c2330/numpy-2.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fbc356aae7adf9e6336d336b9c8111d390a05df88f1805573ebb0807bd06fd1d", size = 18368643, upload-time = "2026-03-29T13:19:10.775Z" }, - { url = "https://files.pythonhosted.org/packages/63/f6/d417977c5f519b17c8a5c3bc9e8304b0908b0e21136fe43bf628a1343914/numpy-2.4.4-cp312-cp312-win32.whl", hash = "sha256:0d35aea54ad1d420c812bfa0385c71cd7cc5bcf7c65fed95fc2cd02fe8c79827", size = 5961117, upload-time = "2026-03-29T13:19:13.464Z" }, - { url = "https://files.pythonhosted.org/packages/2d/5b/e1deebf88ff431b01b7406ca3583ab2bbb90972bbe1c568732e49c844f7e/numpy-2.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:b5f0362dc928a6ecd9db58868fca5e48485205e3855957bdedea308f8672ea4a", size = 12320584, upload-time = "2026-03-29T13:19:16.155Z" }, - { url = "https://files.pythonhosted.org/packages/58/89/e4e856ac82a68c3ed64486a544977d0e7bdd18b8da75b78a577ca31c4395/numpy-2.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:846300f379b5b12cc769334464656bc882e0735d27d9726568bc932fdc49d5ec", size = 10221450, upload-time = "2026-03-29T13:19:18.994Z" }, - { url = "https://files.pythonhosted.org/packages/14/1d/d0a583ce4fefcc3308806a749a536c201ed6b5ad6e1322e227ee4848979d/numpy-2.4.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:08f2e31ed5e6f04b118e49821397f12767934cfdd12a1ce86a058f91e004ee50", size = 16684933, upload-time = "2026-03-29T13:19:22.47Z" }, - { url = "https://files.pythonhosted.org/packages/c1/62/2b7a48fbb745d344742c0277f01286dead15f3f68e4f359fbfcf7b48f70f/numpy-2.4.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e823b8b6edc81e747526f70f71a9c0a07ac4e7ad13020aa736bb7c9d67196115", size = 14694532, upload-time = "2026-03-29T13:19:25.581Z" }, - { url = "https://files.pythonhosted.org/packages/e5/87/499737bfba066b4a3bebff24a8f1c5b2dee410b209bc6668c9be692580f0/numpy-2.4.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4a19d9dba1a76618dd86b164d608566f393f8ec6ac7c44f0cc879011c45e65af", size = 5199661, upload-time = "2026-03-29T13:19:28.31Z" }, - { url = "https://files.pythonhosted.org/packages/cd/da/464d551604320d1491bc345efed99b4b7034143a85787aab78d5691d5a0e/numpy-2.4.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:d2a8490669bfe99a233298348acc2d824d496dee0e66e31b66a6022c2ad74a5c", size = 6547539, upload-time = "2026-03-29T13:19:30.97Z" }, - { url = "https://files.pythonhosted.org/packages/7d/90/8d23e3b0dafd024bf31bdec225b3bb5c2dbfa6912f8a53b8659f21216cbf/numpy-2.4.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:45dbed2ab436a9e826e302fcdcbe9133f9b0006e5af7168afb8963a6520da103", size = 15668806, upload-time = "2026-03-29T13:19:33.887Z" }, - { url = "https://files.pythonhosted.org/packages/d1/73/a9d864e42a01896bb5974475438f16086be9ba1f0d19d0bb7a07427c4a8b/numpy-2.4.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c901b15172510173f5cb310eae652908340f8dede90fff9e3bf6c0d8dfd92f83", size = 16632682, upload-time = "2026-03-29T13:19:37.336Z" }, - { url = "https://files.pythonhosted.org/packages/34/fb/14570d65c3bde4e202a031210475ae9cde9b7686a2e7dc97ee67d2833b35/numpy-2.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:99d838547ace2c4aace6c4f76e879ddfe02bb58a80c1549928477862b7a6d6ed", size = 17019810, upload-time = "2026-03-29T13:19:40.963Z" }, - { url = "https://files.pythonhosted.org/packages/8a/77/2ba9d87081fd41f6d640c83f26fb7351e536b7ce6dd9061b6af5904e8e46/numpy-2.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0aec54fd785890ecca25a6003fd9a5aed47ad607bbac5cd64f836ad8666f4959", size = 18357394, upload-time = "2026-03-29T13:19:44.859Z" }, - { url = "https://files.pythonhosted.org/packages/a2/23/52666c9a41708b0853fa3b1a12c90da38c507a3074883823126d4e9d5b30/numpy-2.4.4-cp313-cp313-win32.whl", hash = "sha256:07077278157d02f65c43b1b26a3886bce886f95d20aabd11f87932750dfb14ed", size = 5959556, upload-time = "2026-03-29T13:19:47.661Z" }, - { url = "https://files.pythonhosted.org/packages/57/fb/48649b4971cde70d817cf97a2a2fdc0b4d8308569f1dd2f2611959d2e0cf/numpy-2.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:5c70f1cc1c4efbe316a572e2d8b9b9cc44e89b95f79ca3331553fbb63716e2bf", size = 12317311, upload-time = "2026-03-29T13:19:50.67Z" }, - { url = "https://files.pythonhosted.org/packages/ba/d8/11490cddd564eb4de97b4579ef6bfe6a736cc07e94c1598590ae25415e01/numpy-2.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:ef4059d6e5152fa1a39f888e344c73fdc926e1b2dd58c771d67b0acfbf2aa67d", size = 10222060, upload-time = "2026-03-29T13:19:54.229Z" }, - { url = "https://files.pythonhosted.org/packages/99/5d/dab4339177a905aad3e2221c915b35202f1ec30d750dd2e5e9d9a72b804b/numpy-2.4.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4bbc7f303d125971f60ec0aaad5e12c62d0d2c925f0ab1273debd0e4ba37aba5", size = 14822302, upload-time = "2026-03-29T13:19:57.585Z" }, - { url = "https://files.pythonhosted.org/packages/eb/e4/0564a65e7d3d97562ed6f9b0fd0fb0a6f559ee444092f105938b50043876/numpy-2.4.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:4d6d57903571f86180eb98f8f0c839fa9ebbfb031356d87f1361be91e433f5b7", size = 5327407, upload-time = "2026-03-29T13:20:00.601Z" }, - { url = "https://files.pythonhosted.org/packages/29/8d/35a3a6ce5ad371afa58b4700f1c820f8f279948cca32524e0a695b0ded83/numpy-2.4.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:4636de7fd195197b7535f231b5de9e4b36d2c440b6e566d2e4e4746e6af0ca93", size = 6647631, upload-time = "2026-03-29T13:20:02.855Z" }, - { url = "https://files.pythonhosted.org/packages/f4/da/477731acbd5a58a946c736edfdabb2ac5b34c3d08d1ba1a7b437fa0884df/numpy-2.4.4-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ad2e2ef14e0b04e544ea2fa0a36463f847f113d314aa02e5b402fdf910ef309e", size = 15727691, upload-time = "2026-03-29T13:20:06.004Z" }, - { url = "https://files.pythonhosted.org/packages/e6/db/338535d9b152beabeb511579598418ba0212ce77cf9718edd70262cc4370/numpy-2.4.4-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a285b3b96f951841799528cd1f4f01cd70e7e0204b4abebac9463eecfcf2a40", size = 16681241, upload-time = "2026-03-29T13:20:09.417Z" }, - { url = "https://files.pythonhosted.org/packages/e2/a9/ad248e8f58beb7a0219b413c9c7d8151c5d285f7f946c3e26695bdbbe2df/numpy-2.4.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f8474c4241bc18b750be2abea9d7a9ec84f46ef861dbacf86a4f6e043401f79e", size = 17085767, upload-time = "2026-03-29T13:20:13.126Z" }, - { url = "https://files.pythonhosted.org/packages/b5/1a/3b88ccd3694681356f70da841630e4725a7264d6a885c8d442a697e1146b/numpy-2.4.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4e874c976154687c1f71715b034739b45c7711bec81db01914770373d125e392", size = 18403169, upload-time = "2026-03-29T13:20:17.096Z" }, - { url = "https://files.pythonhosted.org/packages/c2/c9/fcfd5d0639222c6eac7f304829b04892ef51c96a75d479214d77e3ce6e33/numpy-2.4.4-cp313-cp313t-win32.whl", hash = "sha256:9c585a1790d5436a5374bac930dad6ed244c046ed91b2b2a3634eb2971d21008", size = 6083477, upload-time = "2026-03-29T13:20:20.195Z" }, - { url = "https://files.pythonhosted.org/packages/d5/e3/3938a61d1c538aaec8ed6fd6323f57b0c2d2d2219512434c5c878db76553/numpy-2.4.4-cp313-cp313t-win_amd64.whl", hash = "sha256:93e15038125dc1e5345d9b5b68aa7f996ec33b98118d18c6ca0d0b7d6198b7e8", size = 12457487, upload-time = "2026-03-29T13:20:22.946Z" }, - { url = "https://files.pythonhosted.org/packages/97/6a/7e345032cc60501721ef94e0e30b60f6b0bd601f9174ebd36389a2b86d40/numpy-2.4.4-cp313-cp313t-win_arm64.whl", hash = "sha256:0dfd3f9d3adbe2920b68b5cd3d51444e13a10792ec7154cd0a2f6e74d4ab3233", size = 10292002, upload-time = "2026-03-29T13:20:25.909Z" }, - { url = "https://files.pythonhosted.org/packages/6e/06/c54062f85f673dd5c04cbe2f14c3acb8c8b95e3384869bb8cc9bff8cb9df/numpy-2.4.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:f169b9a863d34f5d11b8698ead99febeaa17a13ca044961aa8e2662a6c7766a0", size = 16684353, upload-time = "2026-03-29T13:20:29.504Z" }, - { url = "https://files.pythonhosted.org/packages/4c/39/8a320264a84404c74cc7e79715de85d6130fa07a0898f67fb5cd5bd79908/numpy-2.4.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2483e4584a1cb3092da4470b38866634bafb223cbcd551ee047633fd2584599a", size = 14704914, upload-time = "2026-03-29T13:20:33.547Z" }, - { url = "https://files.pythonhosted.org/packages/91/fb/287076b2614e1d1044235f50f03748f31fa287e3dbe6abeb35cdfa351eca/numpy-2.4.4-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:2d19e6e2095506d1736b7d80595e0f252d76b89f5e715c35e06e937679ea7d7a", size = 5210005, upload-time = "2026-03-29T13:20:36.45Z" }, - { url = "https://files.pythonhosted.org/packages/63/eb/fcc338595309910de6ecabfcef2419a9ce24399680bfb149421fa2df1280/numpy-2.4.4-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:6a246d5914aa1c820c9443ddcee9c02bec3e203b0c080349533fae17727dfd1b", size = 6544974, upload-time = "2026-03-29T13:20:39.014Z" }, - { url = "https://files.pythonhosted.org/packages/44/5d/e7e9044032a716cdfaa3fba27a8e874bf1c5f1912a1ddd4ed071bf8a14a6/numpy-2.4.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:989824e9faf85f96ec9c7761cd8d29c531ad857bfa1daa930cba85baaecf1a9a", size = 15684591, upload-time = "2026-03-29T13:20:42.146Z" }, - { url = "https://files.pythonhosted.org/packages/98/7c/21252050676612625449b4807d6b695b9ce8a7c9e1c197ee6216c8a65c7c/numpy-2.4.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:27a8d92cd10f1382a67d7cf4db7ce18341b66438bdd9f691d7b0e48d104c2a9d", size = 16637700, upload-time = "2026-03-29T13:20:46.204Z" }, - { url = "https://files.pythonhosted.org/packages/b1/29/56d2bbef9465db24ef25393383d761a1af4f446a1df9b8cded4fe3a5a5d7/numpy-2.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e44319a2953c738205bf3354537979eaa3998ed673395b964c1176083dd46252", size = 17035781, upload-time = "2026-03-29T13:20:50.242Z" }, - { url = "https://files.pythonhosted.org/packages/e3/2b/a35a6d7589d21f44cea7d0a98de5ddcbb3d421b2622a5c96b1edf18707c3/numpy-2.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e892aff75639bbef0d2a2cfd55535510df26ff92f63c92cd84ef8d4ba5a5557f", size = 18362959, upload-time = "2026-03-29T13:20:54.019Z" }, - { url = "https://files.pythonhosted.org/packages/64/c9/d52ec581f2390e0f5f85cbfd80fb83d965fc15e9f0e1aec2195faa142cde/numpy-2.4.4-cp314-cp314-win32.whl", hash = "sha256:1378871da56ca8943c2ba674530924bb8ca40cd228358a3b5f302ad60cf875fc", size = 6008768, upload-time = "2026-03-29T13:20:56.912Z" }, - { url = "https://files.pythonhosted.org/packages/fa/22/4cc31a62a6c7b74a8730e31a4274c5dc80e005751e277a2ce38e675e4923/numpy-2.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:715d1c092715954784bc79e1174fc2a90093dc4dc84ea15eb14dad8abdcdeb74", size = 12449181, upload-time = "2026-03-29T13:20:59.548Z" }, - { url = "https://files.pythonhosted.org/packages/70/2e/14cda6f4d8e396c612d1bf97f22958e92148801d7e4f110cabebdc0eef4b/numpy-2.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:2c194dd721e54ecad9ad387c1d35e63dce5c4450c6dc7dd5611283dda239aabb", size = 10496035, upload-time = "2026-03-29T13:21:02.524Z" }, - { url = "https://files.pythonhosted.org/packages/b1/e8/8fed8c8d848d7ecea092dc3469643f9d10bc3a134a815a3b033da1d2039b/numpy-2.4.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2aa0613a5177c264ff5921051a5719d20095ea586ca88cc802c5c218d1c67d3e", size = 14824958, upload-time = "2026-03-29T13:21:05.671Z" }, - { url = "https://files.pythonhosted.org/packages/05/1a/d8007a5138c179c2bf33ef44503e83d70434d2642877ee8fbb230e7c0548/numpy-2.4.4-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:42c16925aa5a02362f986765f9ebabf20de75cdefdca827d14315c568dcab113", size = 5330020, upload-time = "2026-03-29T13:21:08.635Z" }, - { url = "https://files.pythonhosted.org/packages/99/64/ffb99ac6ae93faf117bcbd5c7ba48a7f45364a33e8e458545d3633615dda/numpy-2.4.4-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:874f200b2a981c647340f841730fc3a2b54c9d940566a3c4149099591e2c4c3d", size = 6650758, upload-time = "2026-03-29T13:21:10.949Z" }, - { url = "https://files.pythonhosted.org/packages/6e/6e/795cc078b78a384052e73b2f6281ff7a700e9bf53bcce2ee579d4f6dd879/numpy-2.4.4-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9b39d38a9bd2ae1becd7eac1303d031c5c110ad31f2b319c6e7d98b135c934d", size = 15729948, upload-time = "2026-03-29T13:21:14.047Z" }, - { url = "https://files.pythonhosted.org/packages/5f/86/2acbda8cc2af5f3d7bfc791192863b9e3e19674da7b5e533fded124d1299/numpy-2.4.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b268594bccac7d7cf5844c7732e3f20c50921d94e36d7ec9b79e9857694b1b2f", size = 16679325, upload-time = "2026-03-29T13:21:17.561Z" }, - { url = "https://files.pythonhosted.org/packages/bc/59/cafd83018f4aa55e0ac6fa92aa066c0a1877b77a615ceff1711c260ffae8/numpy-2.4.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ac6b31e35612a26483e20750126d30d0941f949426974cace8e6b5c58a3657b0", size = 17084883, upload-time = "2026-03-29T13:21:21.106Z" }, - { url = "https://files.pythonhosted.org/packages/f0/85/a42548db84e65ece46ab2caea3d3f78b416a47af387fcbb47ec28e660dc2/numpy-2.4.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8e3ed142f2728df44263aaf5fb1f5b0b99f4070c553a0d7f033be65338329150", size = 18403474, upload-time = "2026-03-29T13:21:24.828Z" }, - { url = "https://files.pythonhosted.org/packages/ed/ad/483d9e262f4b831000062e5d8a45e342166ec8aaa1195264982bca267e62/numpy-2.4.4-cp314-cp314t-win32.whl", hash = "sha256:dddbbd259598d7240b18c9d87c56a9d2fb3b02fe266f49a7c101532e78c1d871", size = 6155500, upload-time = "2026-03-29T13:21:28.205Z" }, - { url = "https://files.pythonhosted.org/packages/c7/03/2fc4e14c7bd4ff2964b74ba90ecb8552540b6315f201df70f137faa5c589/numpy-2.4.4-cp314-cp314t-win_amd64.whl", hash = "sha256:a7164afb23be6e37ad90b2f10426149fd75aee07ca55653d2aa41e66c4ef697e", size = 12637755, upload-time = "2026-03-29T13:21:31.107Z" }, - { url = "https://files.pythonhosted.org/packages/58/78/548fb8e07b1a341746bfbecb32f2c268470f45fa028aacdbd10d9bc73aab/numpy-2.4.4-cp314-cp314t-win_arm64.whl", hash = "sha256:ba203255017337d39f89bdd58417f03c4426f12beed0440cfd933cb15f8669c7", size = 10566643, upload-time = "2026-03-29T13:21:34.339Z" }, - { url = "https://files.pythonhosted.org/packages/6b/33/8fae8f964a4f63ed528264ddf25d2b683d0b663e3cba26961eb838a7c1bd/numpy-2.4.4-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:58c8b5929fcb8287cbd6f0a3fae19c6e03a5c48402ae792962ac465224a629a4", size = 16854491, upload-time = "2026-03-29T13:21:38.03Z" }, - { url = "https://files.pythonhosted.org/packages/bc/d0/1aabee441380b981cf8cdda3ae7a46aa827d1b5a8cce84d14598bc94d6d9/numpy-2.4.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:eea7ac5d2dce4189771cedb559c738a71512768210dc4e4753b107a2048b3d0e", size = 14895830, upload-time = "2026-03-29T13:21:41.509Z" }, - { url = "https://files.pythonhosted.org/packages/a5/b8/aafb0d1065416894fccf4df6b49ef22b8db045187949545bced89c034b8e/numpy-2.4.4-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:51fc224f7ca4d92656d5a5eb315f12eb5fe2c97a66249aa7b5f562528a3be38c", size = 5400927, upload-time = "2026-03-29T13:21:44.747Z" }, - { url = "https://files.pythonhosted.org/packages/d6/77/063baa20b08b431038c7f9ff5435540c7b7265c78cf56012a483019ca72d/numpy-2.4.4-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:28a650663f7314afc3e6ec620f44f333c386aad9f6fc472030865dc0ebb26ee3", size = 6715557, upload-time = "2026-03-29T13:21:47.406Z" }, - { url = "https://files.pythonhosted.org/packages/c7/a8/379542d45a14f149444c5c4c4e7714707239ce9cc1de8c2803958889da14/numpy-2.4.4-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:19710a9ca9992d7174e9c52f643d4272dcd1558c5f7af7f6f8190f633bd651a7", size = 15804253, upload-time = "2026-03-29T13:21:50.753Z" }, - { url = "https://files.pythonhosted.org/packages/a2/c8/f0a45426d6d21e7ea3310a15cf90c43a14d9232c31a837702dba437f3373/numpy-2.4.4-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9b2aec6af35c113b05695ebb5749a787acd63cafc83086a05771d1e1cd1e555f", size = 16753552, upload-time = "2026-03-29T13:21:54.344Z" }, - { url = "https://files.pythonhosted.org/packages/04/74/f4c001f4714c3ad9ce037e18cf2b9c64871a84951eaa0baf683a9ca9301c/numpy-2.4.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f2cf083b324a467e1ab358c105f6cad5ea950f50524668a80c486ff1db24e119", size = 12509075, upload-time = "2026-03-29T13:21:57.644Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/d0/ad/fed0499ce6a338d2a03ebae59cd15093910c8875328855781952abf6c2fe/numpy-2.4.6.tar.gz", hash = "sha256:f3a3570c4a2a16746ac2c31a7c7c7b0c186b95ce902e33db6f28094ed7387dda", size = 20735807, upload-time = "2026-05-18T23:37:14.07Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/49/ec46835a70be8fa6446c495126ac84fdb28cb2558e1620ffb87a10c8b64c/numpy-2.4.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0280e0356c0829a18d9de1cb7eee50ec22ca639878d7240307ca0943d73cd2c4", size = 16969194, upload-time = "2026-05-18T23:33:13.503Z" }, + { url = "https://files.pythonhosted.org/packages/0e/0d/f5957185c0ee2f3e12f78715aa9e3b353fd83633316c8532b38faa37e3f6/numpy-2.4.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:110f8b71aacb688ec69062bb7f6938a0f8acb01b7c1c4beb453c65b6d234584d", size = 14964111, upload-time = "2026-05-18T23:33:17.795Z" }, + { url = "https://files.pythonhosted.org/packages/ad/40/40a40ee0ddf7ceb782c49af278894b686e586d65d8c1889c8b5da01a3d7d/numpy-2.4.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:4cfe66903cc32a9921a6733d96b19bb6abf310397581bbad89c228f5abaf0ee8", size = 5469159, upload-time = "2026-05-18T23:33:20.654Z" }, + { url = "https://files.pythonhosted.org/packages/63/13/f9a8046535cb21deae82f8d03de9617e08882d274fad2539630761888228/numpy-2.4.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8155154c7c691289fe18f510b5d4657c68c67989f293f0535a91360392ff6538", size = 6798936, upload-time = "2026-05-18T23:33:22.987Z" }, + { url = "https://files.pythonhosted.org/packages/33/a8/6fa8c1a345a8c85dbb21932c447bee07c30a2c2a3f31e369c0a84b300147/numpy-2.4.6-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ab0a9c4ffb1a6d95ef519fe4247dba8eb6b18ad93999f76b7f657039acabd47", size = 15966692, upload-time = "2026-05-18T23:33:26.62Z" }, + { url = "https://files.pythonhosted.org/packages/02/03/74fe2a4cb3817d94d86402f2506554130a2f01414e299b5a843e5a8a957f/numpy-2.4.6-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:89cd468399cfd2504718f0ba50e410dca55a170b61a02ad92bb18c8a65186e93", size = 16918164, upload-time = "2026-05-18T23:33:29.955Z" }, + { url = "https://files.pythonhosted.org/packages/c5/80/3615be3313f7e7696609bc194b9f0101da809df79e859bdb84e0cd043f46/numpy-2.4.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2d37ab77531417474168eb79d6d80b14f821a966818505d03013d0833edb7a8", size = 17322877, upload-time = "2026-05-18T23:33:34.724Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ac/a691e0fe2675e370d0e08ff905adc49a1c8830e8cae03efe4477e92cd55d/numpy-2.4.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f407cb6b8e9d6d8c626bc73c945db1706035af8fd632295547bf1c9e46d092d6", size = 18651487, upload-time = "2026-05-18T23:33:38.217Z" }, + { url = "https://files.pythonhosted.org/packages/15/a7/9bc1cd626d7bf6869bfedf27b91b6ab5dd607758bf8e959d6fa80c6a59cb/numpy-2.4.6-cp311-cp311-win32.whl", hash = "sha256:ddea102b48f9e339f3948bf22040944184627a30fdf7f858667673b9c5f033c8", size = 6233945, upload-time = "2026-05-18T23:33:41.331Z" }, + { url = "https://files.pythonhosted.org/packages/c5/31/7fc6239c12bce7e931463251cca4426c465e1876ba3cc785402ef4dd8f4e/numpy-2.4.6-cp311-cp311-win_amd64.whl", hash = "sha256:1e254a00cdf42b1e4d5b3d68d33af63268d41340d8885df2ab6470f2e1500147", size = 12608406, upload-time = "2026-05-18T23:33:44.131Z" }, + { url = "https://files.pythonhosted.org/packages/27/83/140f85a466595a16382996a1bf06b2b54bcd597488921b0c9daaeeda72af/numpy-2.4.6-cp311-cp311-win_arm64.whl", hash = "sha256:ed9749eef4cbd126da3dc1d6bcb3a57f5eb7ac6a6484146bdbf743f552dfc577", size = 10479528, upload-time = "2026-05-18T23:33:50.725Z" }, + { url = "https://files.pythonhosted.org/packages/95/2a/3d7b5ac8aac24feaf9ad7ed58f45b0bbc06d37e4338ae84c9f2298b570f9/numpy-2.4.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:001fbb8e08d942dd57599e781f2472269ee7f2755fae407b4f67b2f0b17da3f1", size = 16689119, upload-time = "2026-05-18T23:33:54.065Z" }, + { url = "https://files.pythonhosted.org/packages/ea/12/92c4c131527599e8288d6918e888d88726f84d805d784b771f32408aeaef/numpy-2.4.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ebfb099f8dcf083deef3ac1ca4c1503f387cf76296fcb3816b66f5ecb5f54fdb", size = 14699246, upload-time = "2026-05-18T23:33:57.621Z" }, + { url = "https://files.pythonhosted.org/packages/ad/fe/c0a6b7b2ca128a8fb228575147073b660656734b8ebe4d76c8fd748dcc79/numpy-2.4.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3213d622a0283a39a93d188f3cf72b26862df52fbb4ca3697f51705016523d41", size = 5204410, upload-time = "2026-05-18T23:34:00.302Z" }, + { url = "https://files.pythonhosted.org/packages/f3/d4/9770d14ba719432bb90a421bfd443872ed0f70f7264b64bec12ea363d5fd/numpy-2.4.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:357cc07a6d7b0b182ff02249616a03742827ebb1277546b5c7cd7f7620a45698", size = 6551240, upload-time = "2026-05-18T23:34:02.852Z" }, + { url = "https://files.pythonhosted.org/packages/c9/c6/50a46a6205feba2343f1d6d17438107c5dc491ed1c736e6ea68689fd906b/numpy-2.4.6-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f9fb9157b4ce2971008323afe46053787b526ef624fea915b261468a8421a0f", size = 15671012, upload-time = "2026-05-18T23:34:05.485Z" }, + { url = "https://files.pythonhosted.org/packages/99/60/14115e6364fa676c5397c2ad3004e527e9aa487abf5d0706ec81bbd08529/numpy-2.4.6-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90f9849678c75fe7afa2d348ac842c168b0a4d3d61919687216dfc547976d853", size = 16645538, upload-time = "2026-05-18T23:34:09.265Z" }, + { url = "https://files.pythonhosted.org/packages/ae/c5/693cbe59e57db94d2231fa519ca3978dc9e19da5a8f088588f5c6e947ff2/numpy-2.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c1a2af6c6ef86344a6b0db6b97834208bf598db514f2b155042439b62605601a", size = 17020706, upload-time = "2026-05-18T23:34:13.053Z" }, + { url = "https://files.pythonhosted.org/packages/ef/fc/85b7c4eff9b4966ade25c2273cf7e7012e92366c032058653934b37de044/numpy-2.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e5805d5a22fd19c8ccff10a9561f9df94436b0545619ea579db2d3c35294bce2", size = 18368541, upload-time = "2026-05-18T23:34:17.024Z" }, + { url = "https://files.pythonhosted.org/packages/f6/81/e1b27545deedce7f4a0b348618c6b62d74e36a4dc9ccd42f3eb2f85eee32/numpy-2.4.6-cp312-cp312-win32.whl", hash = "sha256:e3eeb0aabd6bd5ce64faae67e9935203a6991b4bc2a485a767fbafb2c5125f45", size = 5962825, upload-time = "2026-05-18T23:34:20.3Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ca/feab00bd44aa5fe1ad2c18f08b4d3bb92e26484b0b1d1443897809ed528c/numpy-2.4.6-cp312-cp312-win_amd64.whl", hash = "sha256:d8e8286dd7cea7895157318d1b91cdacac64c479f3cbc8dce548331728484751", size = 12321687, upload-time = "2026-05-18T23:34:23.095Z" }, + { url = "https://files.pythonhosted.org/packages/63/cf/5a6d34850a39d1093558564f77ee8e8e0bee5061151b8f05a55711001ec7/numpy-2.4.6-cp312-cp312-win_arm64.whl", hash = "sha256:4081eb135ac24158bd51cdfbef16f1c64df7063b1143f24731387137c092bec8", size = 10221482, upload-time = "2026-05-18T23:34:25.876Z" }, + { url = "https://files.pythonhosted.org/packages/fb/82/bdab26d7438c6791ca31b7c024ca37c1eab8b726ba236129005cd4a06e45/numpy-2.4.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:511dbaf848decaaaf4b4ca48032619fb3138710c4bf7da7617765edad1ef96b0", size = 16684648, upload-time = "2026-05-18T23:34:29.41Z" }, + { url = "https://files.pythonhosted.org/packages/1b/30/a80189bcc7f5e4258b3fbc3968d909d1756f54d023299ecc39ad6fdb9ef8/numpy-2.4.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bf162abab1c1a736333192707cef898e735a5ca00f38f27eeedf44b39d9e85eb", size = 14693902, upload-time = "2026-05-18T23:34:33.013Z" }, + { url = "https://files.pythonhosted.org/packages/97/12/70b5d0d7c15e1ebb8a6a84a8caa1d19e181d84fb58bb6d70aca29099dec1/numpy-2.4.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:043191bfa8eab18c776647b62723ac9dddece59743b13f49b2016094129c2b3f", size = 5198992, upload-time = "2026-05-18T23:34:36.132Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8c/ebd2a8f8a83541f8d38cc5667e8c2b69cecfd30da6e45693e8158857d44b/numpy-2.4.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:6180d8b35af935aed8ece3a85e0a43f87393ae0ac87c8d2c8bd2c993f7270ef3", size = 6546944, upload-time = "2026-05-18T23:34:38.484Z" }, + { url = "https://files.pythonhosted.org/packages/bb/c5/7b863a97a91671a0338f4253bd3b5a3d3852f0692dae91711c9f4a10e787/numpy-2.4.6-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72fbe16c6fac95aedf5937fa873445cec2110be35d8a4e9433d7501fd98dae6b", size = 15669392, upload-time = "2026-05-18T23:34:41.257Z" }, + { url = "https://files.pythonhosted.org/packages/a5/9d/3584b9984ca4c047aea75214ce1a4c4c73d849bd71b604264b7f5653f8a8/numpy-2.4.6-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7830bab239b79cda9c08c2da014761cafb48da6150e1da17ac06283f43b6089", size = 16633220, upload-time = "2026-05-18T23:34:45.075Z" }, + { url = "https://files.pythonhosted.org/packages/05/ae/7c67fba23bd98caec7c99261f3a16072ade14813486b0282cb29846de832/numpy-2.4.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ef4aea96ce4d3b074422cb4f2f64e216bf9e213004bb58ecfdf50ea02ea8eb9a", size = 17020800, upload-time = "2026-05-18T23:34:49.065Z" }, + { url = "https://files.pythonhosted.org/packages/d9/5d/3b6725cb31d983c5e66916f5d36f6d7e5521129e4c4404d64f918292a5b6/numpy-2.4.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dfa20cc6ca228e6b155b11da03825975ce66aea520985dbbddf0f2a5a495c605", size = 18357600, upload-time = "2026-05-18T23:34:52.709Z" }, + { url = "https://files.pythonhosted.org/packages/f7/da/2ccc6c2fe8898dee01d90c75c5f5f914a23daf99e3e0f59516a08760c8b5/numpy-2.4.6-cp313-cp313-win32.whl", hash = "sha256:56b39e5e0622a09a25bf5baf62f4bcf0cb8a41ae6e2819cf49bbc5a74c083f91", size = 5961134, upload-time = "2026-05-18T23:34:55.618Z" }, + { url = "https://files.pythonhosted.org/packages/b5/cd/9cc4dc876fb065d5c220aae4d5e14826b2715331bb7618ce1fb07a679d99/numpy-2.4.6-cp313-cp313-win_amd64.whl", hash = "sha256:c4fc99836233ea196540b17ab0983aff60ed07941751930f5f4d05bc3b3b7359", size = 12318598, upload-time = "2026-05-18T23:34:58.928Z" }, + { url = "https://files.pythonhosted.org/packages/39/1e/c0bcba1f8694116485fe28fd1be698c278fcda4141c5b0e53a2aed8b12a8/numpy-2.4.6-cp313-cp313-win_arm64.whl", hash = "sha256:a7c711e21628b52034bb5ab8d1bce291f752fcc5e92accc615778acee1ff4778", size = 10222272, upload-time = "2026-05-18T23:35:02.167Z" }, + { url = "https://files.pythonhosted.org/packages/63/6d/cc5619247c8f4204e507f5883528372e4ac4bb189e579fb859a12e480b1f/numpy-2.4.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:112b06a867b235ef466ed3508ddf0238050df9c727cafb5301ac385b899189a1", size = 14821197, upload-time = "2026-05-18T23:35:05.468Z" }, + { url = "https://files.pythonhosted.org/packages/00/58/f1c39161c87d9e9bed660f1ed4bafc0e403d5ec9650b6dd77aead07d489b/numpy-2.4.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:eaf7fa2de5c0be8ae6ff8e9bea2ccd725e980541244521d8d4b5f3354a27babe", size = 5326287, upload-time = "2026-05-18T23:35:08.693Z" }, + { url = "https://files.pythonhosted.org/packages/af/57/3917ab0fd97f271a8694513581b8a36c655f111c446852c302f04ccdb6fc/numpy-2.4.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7265a2f3d436e54ef9f2b52b5c937e6be778781bd97a590319d7348f1c1ca997", size = 6646763, upload-time = "2026-05-18T23:35:11.459Z" }, + { url = "https://files.pythonhosted.org/packages/eb/0f/037e64c494b67581ae18193d770adef354c41f3f2c8ebf865602d949bf8f/numpy-2.4.6-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f74a575920ab21fe304421a3fc28793d82e299cae9eccb37084e9fc7f3617c20", size = 15728070, upload-time = "2026-05-18T23:35:14.79Z" }, + { url = "https://files.pythonhosted.org/packages/21/a6/5d2bae9c9542eb4df16dc9c46dc79c186e9bad53805dfa5399a6023c6db0/numpy-2.4.6-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ede83e07a75dd06bc501566c1eca2afc0d61677c1472ac9ad93fdee6e638a48d", size = 16681752, upload-time = "2026-05-18T23:35:18.836Z" }, + { url = "https://files.pythonhosted.org/packages/92/14/23d1dfb410ae362cd59ce53e936b1513d545eb40db3949ced632e19a459e/numpy-2.4.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:68bb27509ac1b9a3443094260f6326150663b06abe40b73a2f81160623da5b67", size = 17086024, upload-time = "2026-05-18T23:35:22.52Z" }, + { url = "https://files.pythonhosted.org/packages/4b/6e/23595a2c642cdf3bc567877064bdd7f91c8b0038a4453cf2daf7248eafe9/numpy-2.4.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a0df0043bdb289bde1f62da130d20df23d58b45429f752bc7a8fc5325a225ecd", size = 18403398, upload-time = "2026-05-18T23:35:26.398Z" }, + { url = "https://files.pythonhosted.org/packages/8a/90/0ac3bc947217e66dec77e7cbc6a1979d1af70b6461b82f620d3bccd5e4c8/numpy-2.4.6-cp313-cp313t-win32.whl", hash = "sha256:29a287e0cf63ff528da061de6b9f64a4618da591ca1046aafc54062e40ca7eab", size = 6084971, upload-time = "2026-05-18T23:35:29.387Z" }, + { url = "https://files.pythonhosted.org/packages/77/71/5673e351671a1d2bd6063b91b44f70c0affea7d1516fa7a6572941ba4aa1/numpy-2.4.6-cp313-cp313t-win_amd64.whl", hash = "sha256:25c692919ac5a01f170a3bfcd62d745b24fd095c353d50812637d6fcab442e75", size = 12458532, upload-time = "2026-05-18T23:35:32.175Z" }, + { url = "https://files.pythonhosted.org/packages/3f/88/19d3503c5046e688f049274b27a3ef3d771152fa80d3ba3d01a3dff61abe/numpy-2.4.6-cp313-cp313t-win_arm64.whl", hash = "sha256:1e978ec1e8bd0e0e4de6bb75de9d30cbb74db6b6a2bb727618613703ca0167dd", size = 10291881, upload-time = "2026-05-18T23:35:35.465Z" }, + { url = "https://files.pythonhosted.org/packages/f8/91/3ab2044d05fd16d343c5ac2e69b127f1b2854040dd20b193257c78028bd3/numpy-2.4.6-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:06ca2f61ec4385a07a6977c55ba998a4466c123642b4a32694d3128fce18c079", size = 16683458, upload-time = "2026-05-18T23:35:38.353Z" }, + { url = "https://files.pythonhosted.org/packages/8e/62/764ce66fa4147ae6d73071a3abf804ffe606f174618697c571acdf26a7c9/numpy-2.4.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:38efbc8de75c7a0fc1ac190162d892787f3f47b57cc291231aafee36b80982b7", size = 14704559, upload-time = "2026-05-18T23:35:42.14Z" }, + { url = "https://files.pythonhosted.org/packages/60/61/23f27c172f022e04025b7dc2367f4d63c1a398120607ec896228649a6f48/numpy-2.4.6-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:d581b735e177fdcdce6fed8e7e8880a3fb6ee4e3653a3ac6af01c6f4c03effc5", size = 5209716, upload-time = "2026-05-18T23:35:45.377Z" }, + { url = "https://files.pythonhosted.org/packages/03/71/21cf70dc6ea3e3acb95fc53a265b2fc248b981f0194ceb5b475271b8809d/numpy-2.4.6-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:0a041d3d761dc3c35cc56ce0351506a02bcbc25f7b169f652435141a17db9096", size = 6543947, upload-time = "2026-05-18T23:35:47.926Z" }, + { url = "https://files.pythonhosted.org/packages/d5/91/64288395ee1799bd2e0b04a305dce9666da90c961e1f3fe982a05ee1c036/numpy-2.4.6-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40fdc1ae7125e518ea98e53e69a4ebc27e1fd50510c47b7ea130cf21e5e1d42b", size = 15685197, upload-time = "2026-05-18T23:35:50.863Z" }, + { url = "https://files.pythonhosted.org/packages/f3/eb/ebffaa97dc55502df69584a8f0dcf07f69a3e0b3e2323670a2722db9aa39/numpy-2.4.6-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a2c306dea656c12c68f51f4cea133cbe78ca7435eb28c735eac1d3ebe73be6e8", size = 16638245, upload-time = "2026-05-18T23:35:54.752Z" }, + { url = "https://files.pythonhosted.org/packages/b8/0b/54f9da33128d7e350fab89c7455902eeae70349ee52bddb448dc4a576f45/numpy-2.4.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:33111801a01c12a8a1e3721f0a9232f8cfc8ae2c6b7098167e6f623c6073f402", size = 17036587, upload-time = "2026-05-18T23:35:58.355Z" }, + { url = "https://files.pythonhosted.org/packages/b6/f0/fdebc1052db1cc37c64beb22072d67cd6d1c71adca1299f53dec2b5e20d3/numpy-2.4.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ae506e6902902557576a26ff33eda8695e7ecb3cb36c3b573a0765dee114ebdb", size = 18363226, upload-time = "2026-05-18T23:36:02.845Z" }, + { url = "https://files.pythonhosted.org/packages/aa/b4/298628d98c72b57e57f7165ae6a481a1deaf6f3c28262a6e4c739c275930/numpy-2.4.6-cp314-cp314-win32.whl", hash = "sha256:aaf159caa35993cb1f56fb9b8e4610d35758e7ca005412eb1daa856a78c9c4b1", size = 6010196, upload-time = "2026-05-18T23:36:05.92Z" }, + { url = "https://files.pythonhosted.org/packages/df/ac/46de6dda46478f7942f839e094970be2d4a861e005c4b3bf07c92e291a09/numpy-2.4.6-cp314-cp314-win_amd64.whl", hash = "sha256:b507f5c4c1d508876d1819b6bf9a49d365b96320b5d4993426b33a23ca4b8261", size = 12450334, upload-time = "2026-05-18T23:36:09.107Z" }, + { url = "https://files.pythonhosted.org/packages/78/92/b8b798ac784102c0da830d2257d59358e3d3d90d1e2b3f2575dad976c5cf/numpy-2.4.6-cp314-cp314-win_arm64.whl", hash = "sha256:6f41ae150c4e32db4f3310cdaf64b1593a03dbabe29eec77fc9b50fe64061df6", size = 10495678, upload-time = "2026-05-18T23:36:12.766Z" }, + { url = "https://files.pythonhosted.org/packages/30/34/ec28d1aa8115971537c01469ab2011ee96827930f0a124de1000cc2a7ed7/numpy-2.4.6-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ece3d2cfe132e7d51f44a832b303895e6f2d499c5e74dfbdb06ee246147a304a", size = 14823672, upload-time = "2026-05-18T23:36:16.473Z" }, + { url = "https://files.pythonhosted.org/packages/16/bd/f6d1fede4e54e8042a7ff97bb495510f3c220f94bcd9e8b228e87c92cc0d/numpy-2.4.6-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:e3e5193ef5a3dc73bceee50f7fdc2c90dbb76c42df8d8fae3d1067a583df579e", size = 5328731, upload-time = "2026-05-18T23:36:19.767Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f0/e105b9e2fd728a9910103884decd6951d9dd73896b914a98d9a231de02ee/numpy-2.4.6-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:17f9ade344e7d9b464a084d69bcf18fc691cb1db67c62ed80820bf4926d78f0e", size = 6649805, upload-time = "2026-05-18T23:36:22.266Z" }, + { url = "https://files.pythonhosted.org/packages/82/dd/1206a7ca6ab15e3f02069707ca96222e202af681bb73756da7527f3cb837/numpy-2.4.6-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cd5ffd25db4e7ba6a375693b3fc0fc1791ec636c17db3720da19bde7180ec43", size = 15730496, upload-time = "2026-05-18T23:36:25.713Z" }, + { url = "https://files.pythonhosted.org/packages/51/e7/38d3ea825dcab85a591734decb2f6c67caa7c8367d374df1a1c3842f9b07/numpy-2.4.6-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d92c3819208a60205a12a245c91ad70cb0a85336659b19b834205573ac8456e", size = 16679616, upload-time = "2026-05-18T23:36:29.652Z" }, + { url = "https://files.pythonhosted.org/packages/93/b7/caabfdf53edf663e0b4eb74d7d405d83baef09eb5e83bcd32d601d72b93e/numpy-2.4.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e85b752a1e912b70eaad4fafbd4d1238007ab221de2009b9a2f5ae7461239895", size = 17085145, upload-time = "2026-05-18T23:36:33.449Z" }, + { url = "https://files.pythonhosted.org/packages/f9/45/68d7c33a6bcf3e5aa3bdbd57a367e6f615286dfd6482f97e8ffeb734306e/numpy-2.4.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:29cb7f67d10b479ff07c17d33e39f78c07f71c40ef30d63c153d340e96cd3fb4", size = 18403813, upload-time = "2026-05-18T23:36:37.369Z" }, + { url = "https://files.pythonhosted.org/packages/9c/50/0753655aa844c99cd9e018aacf76f130f1bd81d881bb74bc0aef5d73a8ba/numpy-2.4.6-cp314-cp314t-win32.whl", hash = "sha256:260a5d70215b61ab4fadf5c7baacd64821842975eea312125ed3c39a6391b063", size = 6156982, upload-time = "2026-05-18T23:36:40.817Z" }, + { url = "https://files.pythonhosted.org/packages/b2/d4/7c67becf668f973cb490cec3e98dfd799d866f9c989a54d355672cfa0db6/numpy-2.4.6-cp314-cp314t-win_amd64.whl", hash = "sha256:81a1cca95ed5bb92aa8b10dd2cdc9a0d3853a50fad926c28b5d7e8ea54389627", size = 12638908, upload-time = "2026-05-18T23:36:43.996Z" }, + { url = "https://files.pythonhosted.org/packages/43/bb/e1c71a4295b1b1d1393d50dbb4f2a36283c6859d9d3892e84f00ec5a91d5/numpy-2.4.6-cp314-cp314t-win_arm64.whl", hash = "sha256:0c9136e14ed34a9e343a31c533d78a9813a69a3148332bce5e9821cb2f996e66", size = 10565867, upload-time = "2026-05-18T23:36:47.114Z" }, + { url = "https://files.pythonhosted.org/packages/de/12/b422cc84439adc0d00de605bf4a308890ae5c26f2c71fbd73e5d08fbb0dd/numpy-2.4.6-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:55cced7c52e981362f708ad635198e97a752dfba412cc03c23bbf3bd8d5cd662", size = 16847511, upload-time = "2026-05-18T23:36:50.673Z" }, + { url = "https://files.pythonhosted.org/packages/44/53/f481bef68011740f8849418d82db07230e825013f31f4eef5ba5b805316a/numpy-2.4.6-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d6da64deb6b8ed903e7560180a92f2d804ee1ba5eeb849ac2748b8c1aba1f6d7", size = 14889064, upload-time = "2026-05-18T23:36:53.879Z" }, + { url = "https://files.pythonhosted.org/packages/7f/57/42ed575c10ced8af951d426bc4e1f8aff16fd851db33f067036215a7f860/numpy-2.4.6-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:68a5124b13fa6cc2086764a20005d30bc0548146f7f5322f02fce212ca14317f", size = 5394157, upload-time = "2026-05-18T23:36:57.194Z" }, + { url = "https://files.pythonhosted.org/packages/6a/ef/f66cc724fcc36c1e364c67f51ae9146090b8b584f27d58b97fdae3edd737/numpy-2.4.6-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:948424b06129ce883307e8cff868c31396d8dc7630a59c61d70d98dbe70f222c", size = 6708728, upload-time = "2026-05-18T23:36:59.575Z" }, + { url = "https://files.pythonhosted.org/packages/1a/9c/c531f2293b91265d8b48e9b329f54fdd7ffae73cb4134ea10cca4237e9cc/numpy-2.4.6-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5dbbdb29840ca3d91ee0fece42fc29278886d908280bfec0a5846c6f901a3eb0", size = 15798374, upload-time = "2026-05-18T23:37:02.674Z" }, + { url = "https://files.pythonhosted.org/packages/1a/b0/413077f6b1153ed3cba361401c6783bbad6114804a000cc22eb71c13e190/numpy-2.4.6-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8ad03c0965fb3c692200e74d458ca28c1dbb4ce96f9a479a8aa041ad5fabca02", size = 16747286, upload-time = "2026-05-18T23:37:06.327Z" }, + { url = "https://files.pythonhosted.org/packages/15/ce/e5ec180bc41812edcd8daeb8639d205622c0e8c02259d8ab25a0201b3c2a/numpy-2.4.6-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:2803abfebfc990042cd494d8ce2d5f82e9d847af6d35ec486923aa19dbad5e73", size = 12504263, upload-time = "2026-05-18T23:37:09.715Z" }, ] [[package]] @@ -2631,7 +2635,7 @@ dependencies = [ { name = "cuda-bindings", marker = "python_full_version >= '3.11'" }, { name = "cuda-core", marker = "python_full_version >= '3.11'" }, { name = "cuda-pathfinder", marker = "python_full_version >= '3.11'" }, - { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "pywin32", marker = "python_full_version >= '3.11' and sys_platform == 'win32'" }, ] wheels = [ @@ -2733,7 +2737,7 @@ dev = [ ] numpy-compat = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] @@ -2941,7 +2945,7 @@ examples = [ ] numpy-compat = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] @@ -3117,11 +3121,11 @@ wheels = [ [[package]] name = "platformdirs" -version = "4.9.6" +version = "4.10.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9f/4a/0883b8e3802965322523f0b200ecf33d31f10991d0401162f4b23c698b42/platformdirs-4.9.6.tar.gz", hash = "sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a", size = 29400, upload-time = "2026-04-09T00:04:10.812Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/47/e4501f49c178ae1d9f4a75073fda4204f52647993f075a9db4d14930e0c5/platformdirs-4.10.0.tar.gz", hash = "sha256:31e761a6a0ca04faf7353ea759bdba55652be214725111e5aac52dfa29d4bef7", size = 31224, upload-time = "2026-05-28T03:32:53.587Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl", hash = "sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917", size = 21348, upload-time = "2026-04-09T00:04:09.463Z" }, + { url = "https://files.pythonhosted.org/packages/81/e6/cd9575ac904136b3cbf7aa7ee819ef86eedb7274e46f230e94ea4342e729/platformdirs-4.10.0-py3-none-any.whl", hash = "sha256:fb516cdb12eb0d857d0cd85a7c57cea4d060bee4578d6cf5a14dfdf8cbf8784a", size = 22743, upload-time = "2026-05-28T03:32:52.175Z" }, ] [[package]] @@ -3147,30 +3151,30 @@ wheels = [ [[package]] name = "polars" -version = "1.40.1" +version = "1.41.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "polars-runtime-32" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b3/8c/bc9bc948058348ed43117cecc3007cd608f395915dae8a00974579a5dab1/polars-1.40.1.tar.gz", hash = "sha256:ab2694134b137596b5a59bfd7b4c54ebbc9b59f9403127f18e32d363777552e8", size = 733574, upload-time = "2026-04-22T19:15:55.507Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/f9/aeda46259b0669247a160315d2d51269de9504b9dd2f70acadbcb22f46b7/polars-1.41.2.tar.gz", hash = "sha256:256d6731162371b77f3f29a55eacb8c0fc740ddb1a293a01d2ef5b5393c5c708", size = 737996, upload-time = "2026-05-29T17:39:15.604Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ea/91/74fc60d94488685a92ac9d49d7ec55f3e91fe9b77942a6235a5fa7f249c3/polars-1.40.1-py3-none-any.whl", hash = "sha256:c0f861219d1319cdea45c4ce4d30355a47176b8f98dcedf95ea8269f131b8abd", size = 828723, upload-time = "2026-04-22T19:14:25.452Z" }, + { url = "https://files.pythonhosted.org/packages/1f/22/28f62d24f7db56ac4343588f9362d49b7b4177e55ac47a466fe696b0099b/polars-1.41.2-py3-none-any.whl", hash = "sha256:23ce9a2910b6e3e8d4258770bf44aa17170958df7af6e85feedf4458a04d8d29", size = 833445, upload-time = "2026-05-29T17:37:05.576Z" }, ] [[package]] name = "polars-runtime-32" -version = "1.40.1" +version = "1.41.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/ba/26d40f039be9f552b5fd7365a621bdfc0f8e912ef77094ae4693491b0bae/polars_runtime_32-1.40.1.tar.gz", hash = "sha256:37f3065615d1bf90d03b5326222df4c5c1f8a5d33e50470aa588e3465e6eb814", size = 2935843, upload-time = "2026-04-22T19:15:57.26Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/56/54e3ea0e9b64f327179049e4742241cc6b1d3e8fa414b05a057dd26df367/polars_runtime_32-1.41.2.tar.gz", hash = "sha256:7af09ec1ab053da2c9669e8d15f809a4083a29be05db57111688b8051062af56", size = 2989474, upload-time = "2026-05-29T17:39:17.257Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7d/46/22c8af5eed68ac2eeb556e0fa3ca8a7b798e984ceff4450888f3b5ac61fd/polars_runtime_32-1.40.1-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b748ef652270cc49e9e69f99a035e0eb4d5f856d42bcd6ac4d9d80a40142aa1e", size = 52098755, upload-time = "2026-04-22T19:14:28.555Z" }, - { url = "https://files.pythonhosted.org/packages/c6/3e/48599a38009ca60ff82a6f38c8a621ce3c0286aa7397c7d79e741bd9060e/polars_runtime_32-1.40.1-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:d249b3743e05986060cec0a7aaa542d020df6c6b876e556023a310efd581f9be", size = 46367542, upload-time = "2026-04-22T19:14:32.433Z" }, - { url = "https://files.pythonhosted.org/packages/43/e9/384bc069367a1a36ee31c13782c178dbd039b2b873b772d4a0fc23a2373d/polars_runtime_32-1.40.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5987b30e7aa1059d069498496e8dda35afd592b0ac3d46ed87e3ff8df1ad652c", size = 50252104, upload-time = "2026-04-22T19:14:35.945Z" }, - { url = "https://files.pythonhosted.org/packages/15/ef/7d57ceb0651af74194e97ed6583e148d352f03d696090221b8059cdfc90b/polars_runtime_32-1.40.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d7f42a8b3f16fc66002cc0f6516f7dd7653396886ae0ed362ab95c0b3408b59", size = 56250788, upload-time = "2026-04-22T19:14:39.743Z" }, - { url = "https://files.pythonhosted.org/packages/10/0f/e4b3ffc748827a14a474ec9c42e45c066050e440fec57e914091d9adda75/polars_runtime_32-1.40.1-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e5f7becc237a7ec9d9a10878dc8e54b73bbf4e2d94a2991c37d7a0b38590d8f9", size = 50432590, upload-time = "2026-04-22T19:14:43.388Z" }, - { url = "https://files.pythonhosted.org/packages/d9/0b/b8d95fbed869fa4caabe9c400e4210374913b376e925e96fdcfa9be6416b/polars_runtime_32-1.40.1-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:992d14cf191dde043d36fbdbc98a65e43fbc7e9a5024cecd45f838ac4988c1ee", size = 54155564, upload-time = "2026-04-22T19:14:47.239Z" }, - { url = "https://files.pythonhosted.org/packages/06/d9/d091d8fb5cbed5e9536adfed955c4c89987a4cc3b8e73ae4532402b91c74/polars_runtime_32-1.40.1-cp310-abi3-win_amd64.whl", hash = "sha256:f78bb2abd00101cbb23cc0cb068f7e36e081057a15d2ec2dde3dda280709f030", size = 51829755, upload-time = "2026-04-22T19:14:50.85Z" }, - { url = "https://files.pythonhosted.org/packages/65/ad/b33c3022a394f3eb55c3310597cec615412a8a33880055eee191d154a628/polars_runtime_32-1.40.1-cp310-abi3-win_arm64.whl", hash = "sha256:b5cbfaf6b085b420b4bfcbe24e8f665076d1cccfdb80c0484c02a023ce205537", size = 45822104, upload-time = "2026-04-22T19:14:54.192Z" }, + { url = "https://files.pythonhosted.org/packages/d6/9b/fe72a3811c0357cdb06c67bdc7695fa1623ad47948fc523195f5ac31037f/polars_runtime_32-1.41.2-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:95a08346dac337357cdb825c8076df7d36da54c4caa59a5cb41d0a30691c5edd", size = 52265283, upload-time = "2026-05-29T17:37:09.407Z" }, + { url = "https://files.pythonhosted.org/packages/0a/93/fab9da803fd80d9e83ef88c20932f637a10bc611b20415fc322eec84bc44/polars_runtime_32-1.41.2-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:dedfaeec2c7f995298da7319dd9431d662e5dd1d0ec51b1459df4a0234ceff52", size = 46571222, upload-time = "2026-05-29T17:37:13.698Z" }, + { url = "https://files.pythonhosted.org/packages/c8/2a/8843f34a8ac57acd058a39b87b03b580dd352a490e9dae0415e02033bdd4/polars_runtime_32-1.41.2-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18eea22c5cc34e27f8a60950458ad81e6a9ea75e89363ca1367e14e7e7f781fc", size = 50409372, upload-time = "2026-05-29T17:37:17.875Z" }, + { url = "https://files.pythonhosted.org/packages/6c/c6/92b352fe88cf51bd0a19fb99e1c0cbe46aa26c14dcf7995b89869cd932ae/polars_runtime_32-1.41.2-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2630540dfdfb0f36f9b04a07c7c2e3f50bf2ad384113263c1c812007ee9141e0", size = 56405484, upload-time = "2026-05-29T17:37:22.684Z" }, + { url = "https://files.pythonhosted.org/packages/74/c4/bae3174c3b02f6b441d2e58594387abcd509f67a098f682a83b195f08966/polars_runtime_32-1.41.2-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:20e969e08f9b137e233c04cc04de73d9795f89eb77d34854e40a025965a43763", size = 50603512, upload-time = "2026-05-29T17:37:27.422Z" }, + { url = "https://files.pythonhosted.org/packages/f4/ed/f2d26ae02d92c2689056838ed59e2a626326ad23c2831d58637d25f6c82a/polars_runtime_32-1.41.2-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e7016a3deb641b64a31447abbbee0f34bd020a6a9ae34ee6b743837def15e2a4", size = 54328561, upload-time = "2026-05-29T17:37:32.587Z" }, + { url = "https://files.pythonhosted.org/packages/9b/c4/9c3831cc885dc7769e59abf8f583821a5fb4403fd0e4eba0ccc6d47a3d4b/polars_runtime_32-1.41.2-cp310-abi3-win_amd64.whl", hash = "sha256:1e5e5377c315e0dcafdfb2a31adc546abbaeb3f9cb1864e6536523d2af473265", size = 51978643, upload-time = "2026-05-29T17:37:37.443Z" }, + { url = "https://files.pythonhosted.org/packages/cd/c6/79e9f3f270270d7ed5575d92b7bfef49f01abd9275447161275b23b553a8/polars_runtime_32-1.41.2-cp310-abi3-win_arm64.whl", hash = "sha256:843d96f69d18eca53429c1198e58891db7f18111f83b9c419bb45ad9d73eaed5", size = 46006901, upload-time = "2026-05-29T17:37:42.522Z" }, ] [[package]] @@ -3522,15 +3526,15 @@ wheels = [ [[package]] name = "python-discovery" -version = "1.3.0" +version = "1.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "filelock" }, { name = "platformdirs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ae/e0/cc5a8653e9a24f6cf84768f05064aa8ed5a83dcefd5e2a043db14a1c5f44/python_discovery-1.3.0.tar.gz", hash = "sha256:d098f1e86be5d45fe4d14bf1029294aabbd332f4321179dec85e76cddce834b0", size = 63925, upload-time = "2026-05-05T14:38:39.769Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/12/38c1a0b1e64806780c9563e3fc9f6e472251839662587cfbe9bfaf2ae10a/python_discovery-1.4.0.tar.gz", hash = "sha256:eb8bc7daad3c226c147e45bb4e970a1feb1bf4048ee178e6db59e197b8010ce3", size = 68455, upload-time = "2026-05-28T01:15:37.639Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/30/d4/24d543ab8b8158b7f5a97113c831205f5c900c92c8762b1e7f44b7ea0405/python_discovery-1.3.0-py3-none-any.whl", hash = "sha256:441d9ced3dfce36e113beb35ca302c71c7ef06f3c0f9c227a0b9bb3bd49b9e9f", size = 33124, upload-time = "2026-05-05T14:38:38.539Z" }, + { url = "https://files.pythonhosted.org/packages/c8/8d/3d316429f65029532bb1e28ff77b797d86b5ac3915bb44ca4e19aa283d43/python_discovery-1.4.0-py3-none-any.whl", hash = "sha256:26ed78d703e234879a66244c7d4114563fb13ec5cd30a2d1357e5fb4850782da", size = 33217, upload-time = "2026-05-28T01:15:36.573Z" }, ] [[package]] @@ -3544,7 +3548,7 @@ wheels = [ [[package]] name = "pytket" -version = "2.16.0" +version = "2.18.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "graphviz" }, @@ -3553,7 +3557,7 @@ dependencies = [ { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "networkx", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "qwasm" }, { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, @@ -3561,21 +3565,21 @@ dependencies = [ { name = "typing-extensions" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/3c/ea309a72e0c1ca8e51f66ee6adb28887bc50af0864192fa1dfbb260a6aba/pytket-2.16.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:ea53862f3f8ee2b48b564048d0d6684285abe96aedffbc9f387ead78540648a8", size = 5548141, upload-time = "2026-03-25T14:52:37.446Z" }, - { url = "https://files.pythonhosted.org/packages/af/c6/66ebf277713d915e902b6de0a3e57105874af72e6dc869692229247cb8c9/pytket-2.16.0-cp310-cp310-macosx_15_0_x86_64.whl", hash = "sha256:859597eaf8c50b0dc4ed3c6f5bba01bfaa020995bd84bf9503650f3cb30e9be3", size = 6236954, upload-time = "2026-03-25T14:52:39.746Z" }, - { url = "https://files.pythonhosted.org/packages/02/51/daa28cff7c720cbed715f84c5ea843c571285af33e285afea2a776fedb52/pytket-2.16.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f25a60846202a1e9c5f165fb4112503b96638361f5a7d619f854676045dd7494", size = 7580705, upload-time = "2026-03-25T14:52:41.862Z" }, - { url = "https://files.pythonhosted.org/packages/f8/e4/f47935bbf44a5c68b4f3dee51b4d97ef6417b07b7c34f6401297beaed21e/pytket-2.16.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e6b87e9810e80ab57539619ddf6f9d4639cd2aea1a01fb58433e48677aadb00c", size = 8317981, upload-time = "2026-03-25T14:52:43.806Z" }, - { url = "https://files.pythonhosted.org/packages/17/df/291ac431bbe8f0249171e4014e7f1dc9c4b63d961a1b09404ea8d986bb85/pytket-2.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:1e548c94443a934ecd318609988535a3b2741443b12716955328263ee69811f8", size = 9790329, upload-time = "2026-03-25T14:52:45.85Z" }, - { url = "https://files.pythonhosted.org/packages/9b/74/5c28d78be92d9b464908793d950f00125d08ac1f36683803fbdabdd9a80e/pytket-2.16.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:e069de503b6fc86d3a46ff4c17ab60374215c3713b0659d0a07eb88b9aee6716", size = 5550081, upload-time = "2026-03-25T14:52:48.711Z" }, - { url = "https://files.pythonhosted.org/packages/22/d9/85e3754d84c90c3fc80a9aa728f2a1335de0c60c6f210449651b6dd80687/pytket-2.16.0-cp311-cp311-macosx_15_0_x86_64.whl", hash = "sha256:c005ca4b76b1c896110e6ab810a9c466140f66c11b74dcf36f8695b4a4a3c28e", size = 6239367, upload-time = "2026-03-25T14:52:50.648Z" }, - { url = "https://files.pythonhosted.org/packages/7c/84/a7dd8e96c8ebfa2b5a8fcfb31cb7619685cd4bb40363edaf301f20dda2fc/pytket-2.16.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:825c7b8f98f69e0a9e73008131ad53a0e7eb786e373d4f7d4b5b0865b7a4fd5a", size = 7581960, upload-time = "2026-03-25T14:52:53.139Z" }, - { url = "https://files.pythonhosted.org/packages/58/28/63e7429910065a107bc651fe7cf83581ea3c292560c7a2d5ea20591aa582/pytket-2.16.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e55a82f066a31015f4223bc556aefb06c38eedab01d91030af0b4e7c8fffebf2", size = 8318509, upload-time = "2026-03-25T14:52:55.603Z" }, - { url = "https://files.pythonhosted.org/packages/c2/ea/4b2561423c24212d96d63b1655fdcf86c5d9803455b42b5cfe1f96e4c705/pytket-2.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:5db78f3600c9626ea050c3a35267097950bfd4e0b002469c066d2a5ffbbca8ab", size = 9791412, upload-time = "2026-03-25T14:52:57.876Z" }, - { url = "https://files.pythonhosted.org/packages/7b/c0/e5fa70ba5d6fcc58ef009938c2037022830ab16d71eba2564abdeff5c40c/pytket-2.16.0-cp312-abi3-macosx_14_0_arm64.whl", hash = "sha256:30e918546c5c9a64157eb59fdbc64a436517ef23b52d0c4ccf04e1707709ae80", size = 5530999, upload-time = "2026-03-25T14:53:00.271Z" }, - { url = "https://files.pythonhosted.org/packages/12/00/387750d1fcf08fc2935b566c71bf7556b810072c28c3415cf495e9b3f625/pytket-2.16.0-cp312-abi3-macosx_15_0_x86_64.whl", hash = "sha256:581d3de487a6098c95b695947104e9ab1a934b5081fa5cf17d78a97ff8b8b701", size = 6220914, upload-time = "2026-03-25T14:53:02.614Z" }, - { url = "https://files.pythonhosted.org/packages/d1/7f/68d933790e9a9353a07147744336468e61df57dd28976665c071ec6ec9e1/pytket-2.16.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:58fce2fb058dace4c0335ce83a49dc8061f78c9c363fb5439706435cb9be1797", size = 7532010, upload-time = "2026-03-25T14:53:04.909Z" }, - { url = "https://files.pythonhosted.org/packages/29/e5/6891f73f189065a8616c44473748eb2c3e4feb8ce4ec85bfa50fb031bb7e/pytket-2.16.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc0a6be06dc03c38423775cdd5bd9e6df81518f9e78128d9deaca20663eff358", size = 8260551, upload-time = "2026-03-25T14:53:07.337Z" }, - { url = "https://files.pythonhosted.org/packages/c8/23/d856913e5c5501e82890791ec9934add317e6f344a7d495e5dac141cc9a0/pytket-2.16.0-cp312-abi3-win_amd64.whl", hash = "sha256:b00f7eb42a84bb77d1b33a460e78392f51026724a1ec7e090a1f018db51c566e", size = 9764004, upload-time = "2026-03-25T14:53:09.658Z" }, + { url = "https://files.pythonhosted.org/packages/c0/8d/7b860651db750067666a74400812b7610847ecd604636574b980a4400b9a/pytket-2.18.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:ab80518ee545bc44dff7f40fb68d46cfa946a0d86cbe47227e0c704c57819391", size = 5549168, upload-time = "2026-05-15T08:57:35.796Z" }, + { url = "https://files.pythonhosted.org/packages/d4/cb/5a2ca0e39fa3ffed7460ce446fd843824c82dc501966d067b8ab2e0e9988/pytket-2.18.0-cp310-cp310-macosx_15_0_x86_64.whl", hash = "sha256:392384e74f2df432428c12020eb358474cee201b0387eeddac51cace3b2bfd2f", size = 6238136, upload-time = "2026-05-15T08:57:38.089Z" }, + { url = "https://files.pythonhosted.org/packages/75/0f/ec940c12f8376686d24d0d7d51674a71e45d0441b50bdfada7260e65b6c3/pytket-2.18.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ada57f98fde63a43db5d49407cfda06b70c792c93c018bfee9fb1dd336e07eb6", size = 7583259, upload-time = "2026-05-15T08:57:39.899Z" }, + { url = "https://files.pythonhosted.org/packages/5c/80/0c66b92d7b14c990e90f9d226d69cc1a9d59816b515795ffe63f43045ca3/pytket-2.18.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e50c5368516649e42723256a0b610112f688824fef9535e9adb31d83c1ac359", size = 8319658, upload-time = "2026-05-15T08:57:42.072Z" }, + { url = "https://files.pythonhosted.org/packages/c4/41/87498ac87aa2b5e330b188f6b4614466b451ca64012c7586c5411adcc354/pytket-2.18.0-cp310-cp310-win_amd64.whl", hash = "sha256:6d29b2d1b5277e47ad149b28d5bf13706dd2d3d0502ec577ca21cac4353cc499", size = 9790910, upload-time = "2026-05-15T08:57:44.243Z" }, + { url = "https://files.pythonhosted.org/packages/47/cc/cfcc64549767dee84172ebb5904e1b69d6246099d6ae170b2c91e0e0002c/pytket-2.18.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:f700a97c4caf2ac98c47a2c8e37b71b28b9b35ca9218bbb0357bba499b23eeaa", size = 5550955, upload-time = "2026-05-15T08:57:47.038Z" }, + { url = "https://files.pythonhosted.org/packages/27/78/69295578749e0724647d3ba927f4d5466c48dc89218019e3298acb36842d/pytket-2.18.0-cp311-cp311-macosx_15_0_x86_64.whl", hash = "sha256:9349e1f6faddbe315fe32dd42da8609899b923b607034ff97ae40cb7f5a3d40c", size = 6240572, upload-time = "2026-05-15T08:57:49.046Z" }, + { url = "https://files.pythonhosted.org/packages/37/e1/6d75b33869b710699e939ab0b5193477d5e0f2d825613b07febf3c16c020/pytket-2.18.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7b3af39d4f3ae3297de8d75773b940800820192e12392071dab7eb3b4c761857", size = 7584459, upload-time = "2026-05-15T08:57:50.761Z" }, + { url = "https://files.pythonhosted.org/packages/6c/ef/9047f68f21a12f14ca0c1a4fde2e618935afc79f061e2288ded62c468dbb/pytket-2.18.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4817d27ff0ebb5481b64b86eb3ec759b619354c0dff5e4f1a4cfc6e4b888cf78", size = 8320126, upload-time = "2026-05-15T08:57:53.146Z" }, + { url = "https://files.pythonhosted.org/packages/fd/7b/7dbbd09d136084cb07f4aff4fc8cae03791e16c026713e6a72b9b170c601/pytket-2.18.0-cp311-cp311-win_amd64.whl", hash = "sha256:60d95245695257642853ff9b0dec31fd520c9c07cdba4d4fb429a861914b97fe", size = 9791813, upload-time = "2026-05-15T08:57:55.069Z" }, + { url = "https://files.pythonhosted.org/packages/15/39/28cd32ee7606b1b252b29464ba9afaa2c59cfa4a21fea715c9ed150dfe4e/pytket-2.18.0-cp312-abi3-macosx_14_0_arm64.whl", hash = "sha256:9673824105eb781ae05c4c80d3cd6786f4ab58c5a5def5b9ca7ae890dce9fd2d", size = 5531855, upload-time = "2026-05-15T08:57:57.559Z" }, + { url = "https://files.pythonhosted.org/packages/b7/33/03df743d1349f649a96e26eab7726288b03e9a84d2ecaf6eb9f6e25760e5/pytket-2.18.0-cp312-abi3-macosx_15_0_x86_64.whl", hash = "sha256:c819bae62bd96020053ad872a7e85150509781c2a83d7a66a69b9c6b5f6329cb", size = 6223192, upload-time = "2026-05-15T08:57:59.63Z" }, + { url = "https://files.pythonhosted.org/packages/a4/e5/9886826e5ccb5639e493567073e04dc2911972dd8ea095367305f546df13/pytket-2.18.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c805946d49d93d13bb3b4fe21f69e89be38f9b1d5739aea8f64cd1e70c85da4d", size = 7534626, upload-time = "2026-05-15T08:58:01.743Z" }, + { url = "https://files.pythonhosted.org/packages/01/00/b50f3b11b92d5c74713d37ddb57e310a0fcc63eb13549007167985801286/pytket-2.18.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ca100f33ca3b56f8fe9f1d72c904067789cfc58bc084439f9aa409ec6621fc3", size = 8262137, upload-time = "2026-05-15T08:58:03.839Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ce/87fe3c1d0cb981f076d0cccde68043734ec57587a3f8049a675aae0e29e8/pytket-2.18.0-cp312-abi3-win_amd64.whl", hash = "sha256:9557d36cfe4b4376c36c071b0ac792038314ebec396df8252143ac4a1972a7b3", size = 9764538, upload-time = "2026-05-15T08:58:05.654Z" }, ] [[package]] @@ -3822,92 +3826,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/01/1b/5dbe84eefc86f48473947e2f41711aded97eecef1231f4558f1f02713c12/pyzmq-27.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c9f7f6e13dff2e44a6afeaf2cf54cee5929ad64afaf4d40b50f93c58fc687355", size = 544862, upload-time = "2025-09-08T23:09:56.509Z" }, ] -[[package]] -name = "pyzstd" -version = "0.18.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/47/82/7bcafbf06ee83a66990ce5badbb8f4dc32184346bab20de7e468b1a2f6ec/pyzstd-0.18.0.tar.gz", hash = "sha256:81b6851ab1ca2e5f2c709e896a1362e3065a64f271f43db77fb7d5e4a78e9861", size = 806048, upload-time = "2025-10-05T08:19:47.994Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/18/92/a9f14aba213e39c5994e01343f4ec679fbecc303f60cd26a65b2687826ce/pyzstd-0.18.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:79bb84d866bf57ad2c4bc6b8247628b38e965c4f66288f887bf90f546a42ae04", size = 369087, upload-time = "2025-10-05T08:17:38.272Z" }, - { url = "https://files.pythonhosted.org/packages/63/87/99688133d11bb2fb9fdfb13e8391742c34750927b2091f3a93bc98ccaf99/pyzstd-0.18.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0576c48e2f7a2c457538414a6197397c343b1bf5bfe9332b049afd0366c0c92", size = 295161, upload-time = "2025-10-05T08:17:40.377Z" }, - { url = "https://files.pythonhosted.org/packages/04/d7/84e4ea7f2d429454ee1abc8bbccd6d7a288edbd014fd960f914af807fe06/pyzstd-0.18.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ea7702484795ee3c16c48a03d990123e833f1e1d6baabbe9a53256238eb04cbc", size = 408550, upload-time = "2025-10-05T08:17:41.565Z" }, - { url = "https://files.pythonhosted.org/packages/ba/2f/84dbb3fa0f87077450e795863cc408ee94fb24f85e76428f38a98902e25d/pyzstd-0.18.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9c412ac29a9ebb76c8c40f2df146327b460ce184bbbdaa5bc9257317dce4caa8", size = 514924, upload-time = "2025-10-05T08:17:43.195Z" }, - { url = "https://files.pythonhosted.org/packages/48/07/8a326a0a050bdba20ac75254f472fa0c305cd31518c8d05451ef4ad8c256/pyzstd-0.18.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:36baae4201196c2ec6567faf4a3f19c68211efc2fca30836c885b848ed057f66", size = 573393, upload-time = "2025-10-05T08:17:44.444Z" }, - { url = "https://files.pythonhosted.org/packages/e2/6c/bccc029d5c304d9315d8a11d606ee50c31b822e8bce1a7e2be300969e282/pyzstd-0.18.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f6d9c8a535af243c5a19f2d66c3733595ab633e00b97237d877e70e8389edc5", size = 428790, upload-time = "2025-10-05T08:17:45.666Z" }, - { url = "https://files.pythonhosted.org/packages/5c/a1/a21bb405bb405f516581529eccb1b057db391246af31f8755072ed08716a/pyzstd-0.18.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a533550740ce8c721aae27b377fb1160df68a9f457f16015ec8e47547a033dfc", size = 416564, upload-time = "2025-10-05T08:17:47.185Z" }, - { url = "https://files.pythonhosted.org/packages/38/58/9ca3eb20d047f23db0e1d99cd81e6889d9d7e7b3dde3ddae8894f7e0f75a/pyzstd-0.18.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fdd76049c8ccbb98276cfa78d807b4a497ec6bad2603361eceae993c6130e5bf", size = 519751, upload-time = "2025-10-05T08:17:48.745Z" }, - { url = "https://files.pythonhosted.org/packages/13/7c/156bcc5f499eb6ca0eafba3f716cda01d8d5119270fab7ac5ca0519b0c3a/pyzstd-0.18.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:09b73fe07a8d81898ef1575cb3063816168abb3305c1a9f30110383b61a4ee92", size = 563494, upload-time = "2025-10-05T08:17:50.298Z" }, - { url = "https://files.pythonhosted.org/packages/11/c3/511560f2043c88dee9a87a8db750d2b805e9be8054f35414e145acade401/pyzstd-0.18.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6baf9fd75d0af4f5d677b6e2d8dd3deb359c4ec2250c8536fe5ea48fd9305199", size = 433321, upload-time = "2025-10-05T08:17:51.46Z" }, - { url = "https://files.pythonhosted.org/packages/11/1e/6d676a5403acbc422e79637c997235d5fc1a2d1fa234a9b22dd4c240fe29/pyzstd-0.18.0-cp310-cp310-win32.whl", hash = "sha256:c0634ab42226d2ad96c94d57fd242df2ca9417350c2969eb97c8c61d9574ba69", size = 220852, upload-time = "2025-10-05T08:17:53.001Z" }, - { url = "https://files.pythonhosted.org/packages/f2/b5/b1389a474d04c59dc50b8546032e5eaac67718025db9efe8dabe04d5b6f9/pyzstd-0.18.0-cp310-cp310-win_amd64.whl", hash = "sha256:ec99569321a99b9868666c85a5846151f9a16b6a222b59b2570e2ddeefd4d80c", size = 249552, upload-time = "2025-10-05T08:17:54.463Z" }, - { url = "https://files.pythonhosted.org/packages/13/2d/6a6bcee3f94a44bda87a3fc8619496ab02736979e373f2dc74d0d9b083fb/pyzstd-0.18.0-cp310-cp310-win_arm64.whl", hash = "sha256:85371149cc1d8168461981084438b9f2f139c1699e989fef44562f7504ba0632", size = 222621, upload-time = "2025-10-05T08:17:55.573Z" }, - { url = "https://files.pythonhosted.org/packages/63/d5/c81a3b2b2ddfd534552649344f7f9dc48c05c48b0b3e4065eb12209d37b0/pyzstd-0.18.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:848914835a8a984d4c5fad2355dc66f0aca979b35ec22753c9e694be8e98403c", size = 369088, upload-time = "2025-10-05T08:17:57.063Z" }, - { url = "https://files.pythonhosted.org/packages/b3/00/9c9b0afba9a9bad95cd1bc16203058296a3c2b28040bb0decccd8d662c10/pyzstd-0.18.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3938fea87fe83113b5d8ec2925bb265b4c540e374bb0ec73e5528de58d68c393", size = 295160, upload-time = "2025-10-05T08:17:58.714Z" }, - { url = "https://files.pythonhosted.org/packages/c2/f4/d71aafa852232dec6ec0d34a45b12136958042079703e60314e4a48bab5d/pyzstd-0.18.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9af4bcde7dde46ca7e82a4c6f5fda1760bcbfd15525dbea36fe625263ef06b5e", size = 408553, upload-time = "2025-10-05T08:17:59.889Z" }, - { url = "https://files.pythonhosted.org/packages/27/5b/6af21645f1eb9e22416297dd1bc92615b89f91e5a657d37c528872a566ad/pyzstd-0.18.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:15d9419d173d26de25342235256aba363190e48e3fd8a8988420a26221b45320", size = 514931, upload-time = "2025-10-05T08:18:01.208Z" }, - { url = "https://files.pythonhosted.org/packages/7d/19/38c3440b82b227d3c99f1e4283584903633bba7e5a8bf757ffce3e913efb/pyzstd-0.18.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0b84f75f0494087afad31363e80a3463d1f32a0a6265f1a24660e6422b2b6fa6", size = 573396, upload-time = "2025-10-05T08:18:02.48Z" }, - { url = "https://files.pythonhosted.org/packages/36/b9/7ee22f141b0438c2082cde550ced698ee2490ce5c0acd461d7f8fc2db18a/pyzstd-0.18.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2cfcdf0e46020bda2e98814464ca3ae830da83937c4c61776bf8835c7094214e", size = 428794, upload-time = "2025-10-05T08:18:04.063Z" }, - { url = "https://files.pythonhosted.org/packages/ea/8f/b6a16829534fa3eac8ef40cc95dbf44a0c2b36a366829b49486a133e5d6b/pyzstd-0.18.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8551b6bc3690fb76e730967a628b6aab0d9331c38a41f5cddb546be994771191", size = 416581, upload-time = "2025-10-05T08:18:05.357Z" }, - { url = "https://files.pythonhosted.org/packages/6d/dc/601f56488064483358e90005169eecdec33fdb41d10fef825ca8cea6f1ea/pyzstd-0.18.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6883b47a4d5d5489890e24e74ef14c1f16dcd68bb326b86911ae0e254e33e4b7", size = 519760, upload-time = "2025-10-05T08:18:06.614Z" }, - { url = "https://files.pythonhosted.org/packages/70/d9/98328d76d9ce3bf5479af62dfe2f141250c60e210cd9f1a9ed9e14ebc978/pyzstd-0.18.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:929dec930296362ce03fee81877fa93a68ca4de3af75fdfa96ecbe0e366b2ee3", size = 563496, upload-time = "2025-10-05T08:18:08.344Z" }, - { url = "https://files.pythonhosted.org/packages/bb/80/ba2cb4769035014a4d272c06414404b9652bbfc14562ab59a9b8ffd9b1eb/pyzstd-0.18.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:278c80fdeaf857b620295cc815a31f6478fcb217d476ac889985a43b2b67e9bd", size = 433325, upload-time = "2025-10-05T08:18:10.11Z" }, - { url = "https://files.pythonhosted.org/packages/31/72/5303be53d439500067195c754ec31a8d9e8b2e95a6089ecd3f7354d9134e/pyzstd-0.18.0-cp311-cp311-win32.whl", hash = "sha256:0d1b678644894e49b5a448f02eebe0ac31bde6f51813168f5ff223d7212e1974", size = 220845, upload-time = "2025-10-05T08:18:11.706Z" }, - { url = "https://files.pythonhosted.org/packages/3f/4c/12f74c81d8e43e42338295347223bb37edf9d13a149690fd92e91a083664/pyzstd-0.18.0-cp311-cp311-win_amd64.whl", hash = "sha256:8285a464aed201b166bb0d2f4667485b61b607cf89f12943b1f21f7e84cb4550", size = 249578, upload-time = "2025-10-05T08:18:13.112Z" }, - { url = "https://files.pythonhosted.org/packages/e7/5f/64480ea0ead505f3d30dfa46de9e9f72d7eb0325612ace435f84fafca780/pyzstd-0.18.0-cp311-cp311-win_arm64.whl", hash = "sha256:942badf996589e5ab6cbdd0f7dd33f5dc2cd7ed0b65441c96b9a12ffa7700d51", size = 222617, upload-time = "2025-10-05T08:18:14.591Z" }, - { url = "https://files.pythonhosted.org/packages/8f/19/7c78cf4cedb812362bb77d0ad5c7e0fa843a344d5d5737a55dd1c1c2b987/pyzstd-0.18.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5eef13ee3e230e50c01b288d581664e8758f7b831271f6f32cfc29823a6ab365", size = 369768, upload-time = "2025-10-05T08:18:16.049Z" }, - { url = "https://files.pythonhosted.org/packages/24/97/b01f76d7a9d7237d9b1dee94469d638575268635ba22c1d07acc23ee3ead/pyzstd-0.18.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f78d6ef80d2f355b5bc1a897e9aa58659e85170b3fa268f3211c4979c768264c", size = 295766, upload-time = "2025-10-05T08:18:17.234Z" }, - { url = "https://files.pythonhosted.org/packages/cf/ac/2f629bb68c545d2f65e070b69a4aad39418b874ad61715d5f12014a06a74/pyzstd-0.18.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:394175aeeb4e2255ff5340b32f6db79375b3ffb25514fe4c1439015a7f335ec2", size = 409439, upload-time = "2025-10-05T08:18:18.397Z" }, - { url = "https://files.pythonhosted.org/packages/fa/cc/b9bab32be36cf4552940c5bda281e1480b01cbf12b5852b529f69a6f33e8/pyzstd-0.18.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3250c551f526d3b966cf4a2199a8d9538dc5c7083b7a26a45f305f8f2ab20a06", size = 516327, upload-time = "2025-10-05T08:18:19.597Z" }, - { url = "https://files.pythonhosted.org/packages/ea/f8/c208c74ba04fa5fcef421fd728e906cd1570f8bffb77285c8f9418892bd4/pyzstd-0.18.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a99ca80053ca37be21f05f6c4152c70777e0eface72b08277cb4b10b6d286e79", size = 574893, upload-time = "2025-10-05T08:18:20.824Z" }, - { url = "https://files.pythonhosted.org/packages/57/fa/b049d9688f46f8dd3509f5cb0a8ba629716bb9238161c119d8d06454412d/pyzstd-0.18.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5dc4488536e87ff0aac698b9cd65f2913ac87417b3952d80be32463c8e95cc35", size = 429851, upload-time = "2025-10-05T08:18:22.12Z" }, - { url = "https://files.pythonhosted.org/packages/9d/35/dff064fa704a0f335aab326318651af81aac611a8a24e7f1be3b9fb50d32/pyzstd-0.18.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c12da158f6ec1180be0a3d6f531050dfc1357a25e5d0fd8dd99d4506d2a3f448", size = 417437, upload-time = "2025-10-05T08:18:23.264Z" }, - { url = "https://files.pythonhosted.org/packages/c1/2d/d1731fd1213da3a41dcba84e297118c09ed6f05ff0f600c5b0a42edb0f62/pyzstd-0.18.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f9a7d6bff36dfbe87dce1730e4b70d6ab49058a6f8ea22e85b33642491a2d053", size = 521302, upload-time = "2025-10-05T08:18:24.446Z" }, - { url = "https://files.pythonhosted.org/packages/e4/89/0a50c7b3f71921a7df41a222283b56fbe236dc79dc142969705676a9eca1/pyzstd-0.18.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0f56086bf8019f7c809a406dcc182ce0fb0d3623a9edf351ed80dbb484514613", size = 564793, upload-time = "2025-10-05T08:18:26.122Z" }, - { url = "https://files.pythonhosted.org/packages/1f/8c/b1927786cd208a1271728969ba45881a823663b6621e2905c1029ad31a15/pyzstd-0.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1eb69217ad9b760537e93f2d578c7927b788a9cac0e2104e536855a2797b5b09", size = 434400, upload-time = "2025-10-05T08:18:27.668Z" }, - { url = "https://files.pythonhosted.org/packages/66/f2/9780dc79d4bc9b6f5c64fe91541bf4a15dda9a9bf5eaf4a641436a50b2d0/pyzstd-0.18.0-cp312-cp312-win32.whl", hash = "sha256:05ce49412c7aef970e0a6be8e9add4748bc474a7f13533a14555642022f871e9", size = 221172, upload-time = "2025-10-05T08:18:29.464Z" }, - { url = "https://files.pythonhosted.org/packages/a2/d0/1b5c6e7bbe8e300159edd47556233a7756f59ee6d78b83e95e258e1ceaf9/pyzstd-0.18.0-cp312-cp312-win_amd64.whl", hash = "sha256:e951c3013b9df479cff758d578b83837b2531d02fb6c3e59166a756795697e19", size = 249751, upload-time = "2025-10-05T08:18:30.642Z" }, - { url = "https://files.pythonhosted.org/packages/0e/c2/7b64e5c2afd752fa18bc5a5c6e260dad14402e6f94d810f8ce2ad64ad512/pyzstd-0.18.0-cp312-cp312-win_arm64.whl", hash = "sha256:33b54781c66a86e33c93c89ae426811d0aa35a216a23116fc5d5162449284305", size = 222551, upload-time = "2025-10-05T08:18:31.774Z" }, - { url = "https://files.pythonhosted.org/packages/f5/55/9e200f8ad193bb9d060cd724a8f876e40be918eece578c46c33cab336cf4/pyzstd-0.18.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:65117997d1e10e9b41336c90c2c4877c8d27533f753272805ff39df15fd5298a", size = 369781, upload-time = "2025-10-05T08:18:33.37Z" }, - { url = "https://files.pythonhosted.org/packages/64/73/28bc86e284ca5e5ea082641748f2a583c9db8744dbf2c28d54e85e101114/pyzstd-0.18.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8550efbfb5944343666d0e79d6a3687adcbeb4dbf17aa743146a25e72d12d47f", size = 295771, upload-time = "2025-10-05T08:18:34.665Z" }, - { url = "https://files.pythonhosted.org/packages/98/3d/bb6f1316a14bd4079aa3cad13cfd7cd3a1feef4a5756bdb7a9e8758a5ab1/pyzstd-0.18.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac61854c4a77df66695540549a89f4c67039e4181a9158b8646425f1d56d947a", size = 411244, upload-time = "2025-10-05T08:18:35.879Z" }, - { url = "https://files.pythonhosted.org/packages/be/ee/32fdd020003a3bc672b93ec1f9c2520a196bc57e6847a7ff38991dc7b4ea/pyzstd-0.18.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4c453369483f67480f86d67a7b63ef22827db65e7f0d4bec7992bb81751a94b9", size = 518289, upload-time = "2025-10-05T08:18:37.657Z" }, - { url = "https://files.pythonhosted.org/packages/a3/c2/0564465315ba5d3524f8bc625af2c125d4549a186bda6fa3b6eafa88d8f4/pyzstd-0.18.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4ef4b757b2df808ac15058fc2aa41e07d93843ee5a95629ff51eb6e8f1950951", size = 577193, upload-time = "2025-10-05T08:18:38.891Z" }, - { url = "https://files.pythonhosted.org/packages/de/16/8540b868a5b0fa9eaf743856f86088e3cac8477fbf2339e76c5c973622cc/pyzstd-0.18.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b42529770febd331e23c5e8a68e9899acb0cc0806ee4c970354806c0ceeec6c7", size = 429177, upload-time = "2025-10-05T08:18:40.11Z" }, - { url = "https://files.pythonhosted.org/packages/f1/b7/08ba7b145978b0b5c4d83e26dca8140d71516fed42f60b31a7f387c6c89f/pyzstd-0.18.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7f54d13c269cdc37d2f73c9b3e70c6d2bb168dec768a472d54c2ed830bb19fb9", size = 419281, upload-time = "2025-10-05T08:18:41.46Z" }, - { url = "https://files.pythonhosted.org/packages/cb/da/7f64baf48b060bdc071388c90fb6b32992a5827ab5810d6deced86219ec5/pyzstd-0.18.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e6686460ca4be536dca1b6f2f80055f383a78e92e68e03a14806428572c4fdba", size = 523202, upload-time = "2025-10-05T08:18:42.868Z" }, - { url = "https://files.pythonhosted.org/packages/0c/5b/f5227ebe3ba672ec1051d27546c1d1cb1fde4a84fe8c5fa8cd6bc1b35614/pyzstd-0.18.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:8da3978d7de9095cacc5089bd0c435ab84ebd127e0979cd31fa1b216111644af", size = 567497, upload-time = "2025-10-05T08:18:44.507Z" }, - { url = "https://files.pythonhosted.org/packages/ea/ca/d067850a8035efc68ccc0399f343e86c18111dcb9ddec2a4b8b2ebe421eb/pyzstd-0.18.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1ebc87e6e50547cff97e07c3fed9999d79b6327c9c4143c3049a7cfeacb2cdba", size = 433881, upload-time = "2025-10-05T08:18:45.761Z" }, - { url = "https://files.pythonhosted.org/packages/64/26/6c91c0815556ab8f7ddd67e891009a4ba6481b905b84a361697f208b053a/pyzstd-0.18.0-cp313-cp313-win32.whl", hash = "sha256:2dd203f2534b16dea2761394fda4e0f3c465a5109ae6450bdaada67e6ac14a45", size = 221170, upload-time = "2025-10-05T08:18:46.986Z" }, - { url = "https://files.pythonhosted.org/packages/a5/8e/3f6f445ee23864988ae3cfd6cebd3fe79dd42dbaa50538275928082e3df8/pyzstd-0.18.0-cp313-cp313-win_amd64.whl", hash = "sha256:98f43488f88b859291d6bdc51cc7793d1eab17aa9382b17d762944bbb8567c98", size = 249759, upload-time = "2025-10-05T08:18:48.526Z" }, - { url = "https://files.pythonhosted.org/packages/b3/43/1a96bd7bae073ae57c3927ece4cd72355ad46b7153961857d6a77a5bec9d/pyzstd-0.18.0-cp313-cp313-win_arm64.whl", hash = "sha256:cff8922e25e19d8fbd95b53f451e637bc80e826ab53c8777a885d4e99d1c0c2d", size = 222548, upload-time = "2025-10-05T08:18:50.163Z" }, - { url = "https://files.pythonhosted.org/packages/11/37/d82e2bf7aad6df47a0914b47460a242802d6107cb63e3b0f0b02fab911b0/pyzstd-0.18.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:67f795ec745cfd6930cdaf5118fcdd8d87ce02b07b254d37efe75afd33ce9917", size = 369755, upload-time = "2025-10-05T08:18:51.353Z" }, - { url = "https://files.pythonhosted.org/packages/90/1f/b01eb168e7dd689a0df6dcdd5e8171953927330e3b40e290c7a227714e50/pyzstd-0.18.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a8a589673b9b417a084e393f18d09a16b67b87a80f80da6d3b4f84dd983c9b3d", size = 295789, upload-time = "2025-10-05T08:18:53.065Z" }, - { url = "https://files.pythonhosted.org/packages/c0/70/581b01d765833eb12f8b04e048d4d5f803007e491c9ecb57bc1ca810317f/pyzstd-0.18.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fdaee8c33f96a6568225e821e6cc33045917628ae0bc7d8d3855332085c1aa7c", size = 411367, upload-time = "2025-10-05T08:18:54.295Z" }, - { url = "https://files.pythonhosted.org/packages/32/ff/9896a01d1eef51e352f6d9d8175f9ff13b394a8239f337c6e0ec930fe3ee/pyzstd-0.18.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:42bf45d8e835d7c9c0bef98ff703143a5129edf09ef6c3b757037cbf79eabcaa", size = 518386, upload-time = "2025-10-05T08:18:55.472Z" }, - { url = "https://files.pythonhosted.org/packages/26/24/60cebe2101a3915535a480f77c0acc1e2b9d690377ef72e0237594def37e/pyzstd-0.18.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2f4dff2a15e2047baea9359d3a547dee80f61887f17e0f23190b4b932fd617e4", size = 577251, upload-time = "2025-10-05T08:18:56.789Z" }, - { url = "https://files.pythonhosted.org/packages/7e/d0/86beb2bf4b112c46eb39c24389561f979672f262dcb76f3b500c7ab47fb1/pyzstd-0.18.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ed87932d6c534fc8921f7d44a4dadb32881e10ebc68935175a2cba254f5cc83", size = 429102, upload-time = "2025-10-05T08:18:57.973Z" }, - { url = "https://files.pythonhosted.org/packages/be/a4/1037092d5ff6fc11db687ae71413c51eef59b3fc6899a4777328eafcc7b3/pyzstd-0.18.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7d08a372b2b7fa1fd24217424e13d3d794e01299c43c8bd55f50934ef0785779", size = 419324, upload-time = "2025-10-05T08:18:59.297Z" }, - { url = "https://files.pythonhosted.org/packages/b3/97/13855620caa4f00262b819b0962dbf66e798f17523fd770edea5eb471e52/pyzstd-0.18.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:e8403108172e24622f51732a336a89fe32bf3842965e0dc677c65df3a562f3ad", size = 523380, upload-time = "2025-10-05T08:19:01.022Z" }, - { url = "https://files.pythonhosted.org/packages/a4/20/7f0b24d7da75637094191847df620e6a3de954742a2899c89c0f80fd9f71/pyzstd-0.18.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5604eeb7f00ec308b7e878dae92abfc4eee2e5d238765a62d4fadc0d57bbbff3", size = 567596, upload-time = "2025-10-05T08:19:02.408Z" }, - { url = "https://files.pythonhosted.org/packages/58/87/389186d0ba732ba4f53dbf3dc82ac08a783e7ea2ab06de21c98ae4ae5a65/pyzstd-0.18.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d6b300c5240409f1e7ab9972ab2a880a1949447d8414dbc11d89c10bfcb31aa5", size = 433862, upload-time = "2025-10-05T08:19:05.258Z" }, - { url = "https://files.pythonhosted.org/packages/fc/6f/bedcdbbfecae9f253eaeaa3776a2876cbd4af66ce710d1e2492546debc61/pyzstd-0.18.0-cp314-cp314-win32.whl", hash = "sha256:83f4fe1409a59c45a5e6fccb4d451e1e3dd03a5fabebd2dd6ba651468f54025e", size = 225481, upload-time = "2025-10-05T08:19:06.525Z" }, - { url = "https://files.pythonhosted.org/packages/df/04/85bc2d0d906762c84f6e2f2be7228c1f610b8d42dfbb0602b281ee14bd9d/pyzstd-0.18.0-cp314-cp314-win_amd64.whl", hash = "sha256:73c3dcd9a16f1669ed6eef0dad1d840b7dd6070ab7d48719171ca691101e7975", size = 255101, upload-time = "2025-10-05T08:19:07.807Z" }, - { url = "https://files.pythonhosted.org/packages/64/5c/19e973213762479698dd551b39e7841fcc16104f492fdf941daa42637633/pyzstd-0.18.0-cp314-cp314-win_arm64.whl", hash = "sha256:61333bbb337b9746284624ed14f6238838dfae1e395691ba49f227015374f760", size = 229465, upload-time = "2025-10-05T08:19:09.084Z" }, - { url = "https://files.pythonhosted.org/packages/59/79/10e69fe241968e1993b6ea4c09c4f4cb5783a7f639d680958a9835310ed4/pyzstd-0.18.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:35934369fcdfde6fb932f88fa441337c8ddaf4b08e7b0b12952010f0ba2082f7", size = 354239, upload-time = "2025-10-05T08:19:28.84Z" }, - { url = "https://files.pythonhosted.org/packages/73/a2/f0e6b6a816693d37840342d1e6a81fa1504c9c0c825f504f80c2ebc9dd91/pyzstd-0.18.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:55b8e12c9657359a697440e88a8535d1a771025e5d8f1c3087ad69ba11bee6d2", size = 283761, upload-time = "2025-10-05T08:19:30.494Z" }, - { url = "https://files.pythonhosted.org/packages/99/c3/3f22f0ded2cd19e506eee9ea270854919d4d2df5006fbb5faef3d561b0f6/pyzstd-0.18.0-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:134d33d3e56b5083c8f827b63254c2abf85d6ace2b323e69d28e3954b5b71883", size = 338432, upload-time = "2025-10-05T08:19:31.83Z" }, - { url = "https://files.pythonhosted.org/packages/22/62/ac46ca28d6dd56e22207a86e1315b5b2a2c1c1d23b08e1079c07ebbff1e7/pyzstd-0.18.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a6c4bffa0157ef9e5cfa32413a5a79448e5affadece4982df274f1b5aae3a680", size = 358420, upload-time = "2025-10-05T08:19:33.059Z" }, - { url = "https://files.pythonhosted.org/packages/38/ce/ec54eeca984a67d4785f0d1fad5179de1781a38adee80a7ecb51a1c5edf9/pyzstd-0.18.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:8c36824d94cf77997a899b60886cc2be3ac969083f1d74eb4dd4127234ba50a4", size = 244901, upload-time = "2025-10-05T08:19:34.321Z" }, - { url = "https://files.pythonhosted.org/packages/25/cd/2dafdf61d6d092cc331aa5310ba34a42fa528ae3f3ab0e505b6b5728a56a/pyzstd-0.18.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:788e0889db436cd6d16a3b490006ab80a913d8ce6f46db127f1888066ff4560b", size = 354192, upload-time = "2025-10-05T08:19:35.549Z" }, - { url = "https://files.pythonhosted.org/packages/af/ed/89a2c9144da69dcf8113fa2f3b6d234a17e19ab37f599cc2270bb1ee394e/pyzstd-0.18.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:5e70b7c36a40d7f946bf6391a206374b057299735d366fad6524d3b9f392441f", size = 283718, upload-time = "2025-10-05T08:19:36.819Z" }, - { url = "https://files.pythonhosted.org/packages/a1/b1/179601c6972cea615af936de9ba8225be9d53c2cfd0a2a7ceacf32a22857/pyzstd-0.18.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:571c5f71622943387370f76de8cc0de3d5c6217ab0f38386cb127665e4e09275", size = 338432, upload-time = "2025-10-05T08:19:38.073Z" }, - { url = "https://files.pythonhosted.org/packages/b8/57/067cf55f86a4baf8cd9e91f7e9596038cabc2b296ac3e0f9be14310c435f/pyzstd-0.18.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de0b730f374b583894d58b79cff76569540baf1e84bc493be191d3128b58e559", size = 358419, upload-time = "2025-10-05T08:19:39.34Z" }, - { url = "https://files.pythonhosted.org/packages/49/88/53d1ec8c639305fb96944b3a1e7f60b6e6af80781d970036c3cf2d6d2316/pyzstd-0.18.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:b32184013f33dba2fabcdda89f2a83289f5b717a0c2477cda764e53fdafec7ee", size = 244902, upload-time = "2025-10-05T08:19:40.607Z" }, -] - [[package]] name = "qir-qis" version = "0.1.8" @@ -3996,7 +3914,8 @@ version = "0.37.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, - { name = "rpds-py" }, + { name = "rpds-py", version = "0.30.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "rpds-py", version = "2026.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } @@ -4006,7 +3925,7 @@ wheels = [ [[package]] name = "requests" -version = "2.34.0" +version = "2.34.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -4014,9 +3933,9 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/43/b8/7a707d60fea4c49094e40262cc0e2ca6c768cca21587e34d3f705afec47e/requests-2.34.0.tar.gz", hash = "sha256:7d62fe92f50eb82c529b0916bb445afa1531a566fc8f35ffdc64446e771b856a", size = 142436, upload-time = "2026-05-11T19:29:51.717Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/e6/e300fce5fe83c30520607a015dabd985df3251e188d234bfe9492e17a389/requests-2.34.0-py3-none-any.whl", hash = "sha256:917520a21b767485ce7c588f4ebb917c436b24a31231b44228715eaeb5a52c60", size = 73021, upload-time = "2026-05-11T19:29:49.923Z" }, + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, ] [[package]] @@ -4069,6 +3988,10 @@ wheels = [ name = "rpds-py" version = "0.30.0" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "(python_full_version < '3.11' and platform_machine != 'x86_64') or (python_full_version < '3.11' and sys_platform != 'darwin')", +] sdist = { url = "https://files.pythonhosted.org/packages/20/af/3f2f423103f1113b36230496629986e0ef7e199d2aa8392452b484b38ced/rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84", size = 69469, upload-time = "2025-11-30T20:24:38.837Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/06/0c/0c411a0ec64ccb6d104dcabe0e713e05e153a9a2c3c2bd2b32ce412166fe/rpds_py-0.30.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:679ae98e00c0e8d68a7fda324e16b90fd5260945b45d3b824c892cec9eea3288", size = 370490, upload-time = "2025-11-30T20:21:33.256Z" }, @@ -4187,29 +4110,172 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/b7/b95708304cd49b7b6f82fdd039f1748b66ec2b21d6a45180910802f1abf1/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac37f9f516c51e5753f27dfdef11a88330f04de2d564be3991384b2f3535d02e", size = 562191, upload-time = "2025-11-30T20:24:36.853Z" }, ] +[[package]] +name = "rpds-py" +version = "2026.5.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "python_full_version >= '3.11' and python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "(python_full_version >= '3.14' and platform_machine != 'x86_64') or (python_full_version >= '3.14' and sys_platform != 'darwin')", + "(python_full_version >= '3.11' and python_full_version < '3.14' and platform_machine != 'x86_64') or (python_full_version >= '3.11' and python_full_version < '3.14' and sys_platform != 'darwin')", +] +sdist = { url = "https://files.pythonhosted.org/packages/2e/43/25a8dcd3feedd735039a8f0b5b7e3b118232b5eae288c4fd9ab200d41094/rpds_py-2026.5.1.tar.gz", hash = "sha256:07b24fea40541e28570e5b795a4a38fbdcd12550c06bd0748005ecc8116ca256", size = 64459, upload-time = "2026-05-28T12:02:13.232Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4f/a0/acf8b6fc20bfdcd3a45bd3f57680fb198e157b7e997b9123b10763798bd2/rpds_py-2026.5.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3397a5ed7174dc2786bb214030232fc36fe8e5584fec43a9952cc542b1a12036", size = 355609, upload-time = "2026-05-28T11:58:50.78Z" }, + { url = "https://files.pythonhosted.org/packages/b6/95/f8203fd997484b1690a6869cd0e503b6c3c6be55b0ecc36d1a491fe742f0/rpds_py-2026.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:99ab6ba7bfa2cb0f96a04e3652355bf04e3f51aceb1e943b8541dab7ba4828cc", size = 348460, upload-time = "2026-05-28T11:58:52.374Z" }, + { url = "https://files.pythonhosted.org/packages/33/8c/b47326ad2f0be545a5e5c1a55937a12afaea7d392ba2837bb9680f57e6c9/rpds_py-2026.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0efbe45632665e53e3db8fe1e5692db58fc5cb9bab4459d570b83efefe11164", size = 381031, upload-time = "2026-05-28T11:58:53.775Z" }, + { url = "https://files.pythonhosted.org/packages/22/0b/e83bbd97ffac6f6389b605cd4e1c8ac5761dc7e977769c9255d8c5adb7bd/rpds_py-2026.5.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:01d17b29c0c23d82b1f4751147ec49cf451f1fc2554eb9ef5f957e55d2656ead", size = 387121, upload-time = "2026-05-28T11:58:55.243Z" }, + { url = "https://files.pythonhosted.org/packages/fd/0e/d285d1bc8864245919c61e1ca82263e4a66d337759c3a4cef72766ff9afc/rpds_py-2026.5.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7559f72b94ae52659086c595dfa017cde03155f7832071d30959049052cb3ece", size = 501026, upload-time = "2026-05-28T11:58:56.788Z" }, + { url = "https://files.pythonhosted.org/packages/86/06/ccb2109a1e543437b5e43816f2b43b9554cc6783145528a4e3711e05c011/rpds_py-2026.5.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e25b7088f9ccbfc0dfcaa52bf969300ca229e10ecf758974ebcbb080a4b37bb", size = 391865, upload-time = "2026-05-28T11:58:58.298Z" }, + { url = "https://files.pythonhosted.org/packages/3d/33/237173db1cfef10105b3839a24de00eb8d2a523711add4632447cdf0aedd/rpds_py-2026.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:613fc4ee9eaef26dc5840666214dd6fbcebcf32f46e76f4abc473059f4e13dda", size = 378012, upload-time = "2026-05-28T11:58:59.589Z" }, + { url = "https://files.pythonhosted.org/packages/97/64/1eae54e34d5161f9969295e80bd6b62a55f2b6ac5f2a5b60d02c2140e758/rpds_py-2026.5.1-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:85264a90ff4c05c1568dd65f5921c837614b67c60358fb4c17df3b7f2e90690a", size = 391111, upload-time = "2026-05-28T11:59:01.104Z" }, + { url = "https://files.pythonhosted.org/packages/d8/34/5bb334a5a0f65d77869217c4654f34c78a7d11b93938a3c076a2edeafc52/rpds_py-2026.5.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe71bca7d547acb17027c7fd1624ff8aae623499c498d3e7011182c4de5c25e0", size = 409225, upload-time = "2026-05-28T11:59:02.433Z" }, + { url = "https://files.pythonhosted.org/packages/16/0f/007ec21283b5b040b4ec3bd95e0402591e22bfa7d5c93dfe01c465c2d2d7/rpds_py-2026.5.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05fa4f41f37ec97c9c260441a940450a192f78d774d2b097eee1379f1e1246a", size = 556487, upload-time = "2026-05-28T11:59:04.012Z" }, + { url = "https://files.pythonhosted.org/packages/ff/10/5437c94508169b6b22d8418fef7a66e9ffb5f3b9e9c94460f2eedafe06ff/rpds_py-2026.5.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df1d2a1996755b24b9ecee92cb4d36c28f86f464a6a173349c26bab41e94b8c2", size = 620798, upload-time = "2026-05-28T11:59:05.485Z" }, + { url = "https://files.pythonhosted.org/packages/e0/d5/9937dce4d6bda74157b954e7d1460db05a22f5929dccfeeba1ed27a93df0/rpds_py-2026.5.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8895840ac4809e5f60c88fd07617cd71326e73d6e5a8aa783c5c0f7c24985de2", size = 584053, upload-time = "2026-05-28T11:59:06.837Z" }, + { url = "https://files.pythonhosted.org/packages/6c/31/750617dd0ae1752471bf43f9e41d263398fae7cde7849d23b8574a70e617/rpds_py-2026.5.1-cp311-cp311-win32.whl", hash = "sha256:3684a59b158a7683aaeb8e25352e9a9dd2122cec78f2d8530266e4f91b4c7b3f", size = 214390, upload-time = "2026-05-28T11:59:08.402Z" }, + { url = "https://files.pythonhosted.org/packages/3c/bb/3dcab0e1d9516303f2eb672a5d6f62eca5a69e2886301e9c8c54b520c39b/rpds_py-2026.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:7bd530e6a530bb3ea892f194fafa455f3516ac25ecf7143fd33c09be62b0470a", size = 231097, upload-time = "2026-05-28T11:59:09.786Z" }, + { url = "https://files.pythonhosted.org/packages/49/d6/c6bbf5cb1cf12b9732df8074b57f6ef8341ba884c95d40632ae8bddb44e4/rpds_py-2026.5.1-cp311-cp311-win_arm64.whl", hash = "sha256:0a5ae4dbe43c1076983b72616496919872ae7bbe7a1e21cc48336bc3154d130b", size = 226361, upload-time = "2026-05-28T11:59:11.079Z" }, + { url = "https://files.pythonhosted.org/packages/d4/e7/a78582dc57caa592dcc7d4fb69b61390561e908eb3d2f5df5928a8e354c0/rpds_py-2026.5.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3abe24a66e57adcfa645d718063a5fa5103ecc71ddbf26d78af8f9368018ff1d", size = 353040, upload-time = "2026-05-28T11:59:12.531Z" }, + { url = "https://files.pythonhosted.org/packages/a3/43/35e3f136343aef451e545ce8c38d36c2f93c0ed88703db8b64ba2b205c68/rpds_py-2026.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58b1d94308ddf0b1982f61f2eb54bf92997c9ece8a8093ef014250f4a517906c", size = 345775, upload-time = "2026-05-28T11:59:13.827Z" }, + { url = "https://files.pythonhosted.org/packages/20/e1/0f2160c5982d3157734d5cb3ed63d8b2d583a73c9864f77b666449f32cf8/rpds_py-2026.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fa92420128dadce7f54bd73ba1825a273e9268fe9e35dbf7e6362890efa4e08", size = 376329, upload-time = "2026-05-28T11:59:15.271Z" }, + { url = "https://files.pythonhosted.org/packages/d0/11/ee0ba42aff83bf4effdbc576673c6be64c5e173978c3f6d537e94482f77d/rpds_py-2026.5.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ca653c6546386227cd9800d1bef6a348099acf8db4250341da6d90f663d6dfcb", size = 383539, upload-time = "2026-05-28T11:59:16.665Z" }, + { url = "https://files.pythonhosted.org/packages/11/df/d94aa6a499d4ac40afe2d7620f2c597fd3c0f182e854ad7cf3f596a81cb6/rpds_py-2026.5.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66c93681c4729e4e3ecba31b8179fae083ff3118841672835140338b4b9867c1", size = 494674, upload-time = "2026-05-28T11:59:17.991Z" }, + { url = "https://files.pythonhosted.org/packages/1f/75/33d30f43bb2f458de11979486a591b1bf6e5651765ed1704c6197c2dc773/rpds_py-2026.5.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40ff257542e04796880e011e15cd4dc21c2599975df2aaa8f2c8495ca574e1a5", size = 389268, upload-time = "2026-05-28T11:59:19.434Z" }, + { url = "https://files.pythonhosted.org/packages/f4/1e/2c9096fc19d5fd084b0184ca2b651e659aa0a37e6fdbecf6ece47f147fe1/rpds_py-2026.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6825cc329b290e93c5f6a9be2393118a763f6ccf6abd83704e0c102ca583644", size = 376280, upload-time = "2026-05-28T11:59:21Z" }, + { url = "https://files.pythonhosted.org/packages/b9/e5/61ec9f8be8211ea7f48448195549e4aaf02004083475493b0e137702ecb2/rpds_py-2026.5.1-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:de42116e69cb53b911cc34aee5ab98f36c597b822545045d49e938818b99e5e4", size = 387233, upload-time = "2026-05-28T11:59:22.454Z" }, + { url = "https://files.pythonhosted.org/packages/0d/ca/bcec1005c4f4a234f92a29078631fee49206c7265ccae966f18fd332e80e/rpds_py-2026.5.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0f920015df2a504bebaba6d4c31ccf3fcf942f92655c086da30b671aad19aa6", size = 405009, upload-time = "2026-05-28T11:59:23.845Z" }, + { url = "https://files.pythonhosted.org/packages/72/e6/4d5718c5cf26c522dc7c9999e238da1e77380b81d0c5d1df11e271ddfeb1/rpds_py-2026.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0408a24e44feb919423dc6d9da677cb5cddb894d2ca9e763967d156d9c60fab4", size = 553113, upload-time = "2026-05-28T11:59:25.184Z" }, + { url = "https://files.pythonhosted.org/packages/d4/25/2ee807bdb3e1f0b7eddf7782acd5665a8b5205a331a7d7244a52c4812fd9/rpds_py-2026.5.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:cea68bcd53467561ae2f96a6bdad1544299ba97b5b0ddcd5ac3d376e5c781c24", size = 618838, upload-time = "2026-05-28T11:59:26.749Z" }, + { url = "https://files.pythonhosted.org/packages/6a/c1/7d4c26f167f8c41501cc073d30ee22082b16ce358cf5b00ec97cbc7804ea/rpds_py-2026.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4be8b1d2a705cc37d08256004e1d07de143fa0075c8e85a3df020b776f62b732", size = 582436, upload-time = "2026-05-28T11:59:28.11Z" }, + { url = "https://files.pythonhosted.org/packages/04/1d/9d12b0a337bab46f4769f8857f4007e3b2d639e14f9a44a0efe157696e64/rpds_py-2026.5.1-cp312-cp312-win32.whl", hash = "sha256:6736718bd4fc49cbcb538ba30516fdbef161522acefb739657d48b97bd864fed", size = 212734, upload-time = "2026-05-28T11:59:29.689Z" }, + { url = "https://files.pythonhosted.org/packages/c5/93/e4116f2de7f56bc7406a76033dc501811ddeb22b7f056b92d632871ebb0c/rpds_py-2026.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:0a7d1eec967df0e9b22614a5e177622e0c89611d03727fa0cb48e45028907870", size = 229045, upload-time = "2026-05-28T11:59:31.033Z" }, + { url = "https://files.pythonhosted.org/packages/cb/53/6c3419d85eb2ec5938a37627c585b42d76a63bb731d6e42ed4b079ebf486/rpds_py-2026.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:1841d067089e117142d79b98aa0df2f08b52f2ecc1819dd2700636c0db74a473", size = 223967, upload-time = "2026-05-28T11:59:32.318Z" }, + { url = "https://files.pythonhosted.org/packages/6c/32/14c961ad295f490eb0849ada8b79683e93a59b9de3afdd983eaf55fa6867/rpds_py-2026.5.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:efef4ac29c6ff495531eb17ee705b62841ecaa291b7c7077e848ea03e237164d", size = 352787, upload-time = "2026-05-28T11:59:33.655Z" }, + { url = "https://files.pythonhosted.org/packages/ca/bb/d1b85117967c11191441a7274ae616c65d93901d082c588f89a50a8da5ae/rpds_py-2026.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c39f5b67a8a2e67179ada2a954227d670fe65fa9098457f698f56ddf248709b3", size = 345179, upload-time = "2026-05-28T11:59:35Z" }, + { url = "https://files.pythonhosted.org/packages/7c/46/d84105f062e626a1b233f863907288a4708c2d833b8b4c6fb2764bc080c0/rpds_py-2026.5.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5c30f3f04eef4fbd362226a6f31d7c8895ca4fbb6e0b790f6890a98d8da8559", size = 376173, upload-time = "2026-05-28T11:59:36.43Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ae/469d7959ce5b1201e1de135dc735b86db3b35dd0d1734f6a44246d5f061c/rpds_py-2026.5.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:277f6c82f0580848796c7ecc8a7173aa3bfb928e4ff831261c2f60a81dc270db", size = 383162, upload-time = "2026-05-28T11:59:37.995Z" }, + { url = "https://files.pythonhosted.org/packages/dc/a2/57853d31a1116a561aa072794602ad3f6341e18d70a8523f1bd5b9fc1e5a/rpds_py-2026.5.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:63c2c4c213f1a4e3f3de28ecab029dbdee976324e729c0d7a55211be72576b02", size = 495093, upload-time = "2026-05-28T11:59:39.453Z" }, + { url = "https://files.pythonhosted.org/packages/99/63/3a8eabcad9314b7daf5c65f451d2c33d989235cd8a5762186cf2c3f5a4f8/rpds_py-2026.5.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3350ec808fb538fe71a1f94dfaa0e29c598dfad805ce49f0caec5ae3183c652b", size = 389829, upload-time = "2026-05-28T11:59:40.896Z" }, + { url = "https://files.pythonhosted.org/packages/4b/25/05678d97fc25e2622df14dc530fb82023174ecfff6733991ed0d78f167bd/rpds_py-2026.5.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1b964e3ab599e718dc46c018d104b1ebc007cbc6567d827c94a687fca56d77e", size = 374786, upload-time = "2026-05-28T11:59:42.626Z" }, + { url = "https://files.pythonhosted.org/packages/88/d1/8c90b6431e80a3b91b284a5c7c8c0c4f9c006444d90477a740d6e0f9c694/rpds_py-2026.5.1-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:19cb09fab7b7fc96b2a6e28f2e34b72a3705ff27b37edb77455316e5d3f3dc9b", size = 386920, upload-time = "2026-05-28T11:59:44.124Z" }, + { url = "https://files.pythonhosted.org/packages/ff/99/4638f672ab356682d633ee0da9255f5b67ce6efd0b85eb94ad3e255e65a5/rpds_py-2026.5.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:abe76bcdba31e576cb83eeb8797aa0d882b738fef6dc65d0601fc753806a5b46", size = 405059, upload-time = "2026-05-28T11:59:47.177Z" }, + { url = "https://files.pythonhosted.org/packages/66/3f/3546524b6eb4cc2e1f363a3d638fa52f6c24faae3500c25fb488b02f1740/rpds_py-2026.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8bff7073db3899158fff55ebf57b113a67030af26f80a18978f9f0aa60250ddf", size = 553030, upload-time = "2026-05-28T11:59:48.603Z" }, + { url = "https://files.pythonhosted.org/packages/c6/c3/7b3388c796fcf471bd17194242d4dc1a7608567c0fa422bcc1c5e79f9c1e/rpds_py-2026.5.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8ba264fa49be666cd9cc56bf34ec7002fb3d27a4aee5bcb4d43d0d18feb1bb6f", size = 618975, upload-time = "2026-05-28T11:59:50.314Z" }, + { url = "https://files.pythonhosted.org/packages/61/1e/a3cb07f2795075d1d88efddae2f541359fde5f08c81ee114c29c2949c90a/rpds_py-2026.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4860b603ddda0475a8885499b3729e90229d480105b42651962a5397d995fa89", size = 581178, upload-time = "2026-05-28T11:59:51.673Z" }, + { url = "https://files.pythonhosted.org/packages/a1/74/e758c03a5ef46f04c37f2651a2893db846d569ba8a7bca469d4b58939bcd/rpds_py-2026.5.1-cp313-cp313-win32.whl", hash = "sha256:7944270ae71383f6e2657dd7d5ce4eeb4ac2d0059a6738f0510583d462ab4842", size = 212481, upload-time = "2026-05-28T11:59:53.148Z" }, + { url = "https://files.pythonhosted.org/packages/70/ec/a2aca432db9c7359b40fa393eeeaa0d166c2f70175be956e75fa24197c44/rpds_py-2026.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:88647f43a73c4e01be19b04ceef0c8d3a1958153604d13c773becd8016f2a0cf", size = 228519, upload-time = "2026-05-28T11:59:54.505Z" }, + { url = "https://files.pythonhosted.org/packages/29/60/a73bfdd45b096574556acf303bbd9fa9eed36ca8a818b514e2a5d5fe2b9d/rpds_py-2026.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:453895624ecf7db7063b1004e44037522bbaef9ff6a945e59bc71662d7a03abd", size = 223446, upload-time = "2026-05-28T11:59:56.081Z" }, + { url = "https://files.pythonhosted.org/packages/18/e2/408105fd611823f00882aea810f3989a30d26b1bab8b6beb20f98c724e0e/rpds_py-2026.5.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:b4e4bc98639ec915f512fde3aa7a95e0041d95d9c3cc86eea841fa63cb1e8600", size = 355287, upload-time = "2026-05-28T11:59:57.448Z" }, + { url = "https://files.pythonhosted.org/packages/8d/58/5c4a43436843c90d0f6d19f82c200c80e3843ca9fa07b237623327f6d384/rpds_py-2026.5.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cacedb7a6e167680acba45ad5716e89067d225dc80da0d7040cae8c81d4572fa", size = 347033, upload-time = "2026-05-28T11:59:58.881Z" }, + { url = "https://files.pythonhosted.org/packages/fb/c2/1a71acdacaf4e259b10278fb87b039ded3cf80041bcd89dd8a3ea702ded6/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68700371c5d7ae1412862ddfa719090925c93ecf351c566d66f09d04b136ea00", size = 376891, upload-time = "2026-05-28T12:00:00.516Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c8/535f3d9b65addd8e28aa87b83c6e526799c3717a88273db8ea795beeef7a/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:296c799becfa849c779c8725494fe9ed94959ed886787df4364b058465bad7f0", size = 385646, upload-time = "2026-05-28T12:00:02.394Z" }, + { url = "https://files.pythonhosted.org/packages/1c/91/dc033f313345c354ade914dbe73cdb90b615a4409ea02430d5356794f3d8/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d3858b908218ee108d0bbfb2095ccc237648053c9bf98affad7cb079acaf1d97", size = 498830, upload-time = "2026-05-28T12:00:04.189Z" }, + { url = "https://files.pythonhosted.org/packages/27/fc/90fcbea459dbb8ddc18a2e0fd1de9412b48bc84ffff2db771cf714bacfd6/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4fb8d2e7cb2f850b169806d61d1b991738acec96500a75c30f49caf064ce7cef", size = 392830, upload-time = "2026-05-28T12:00:05.797Z" }, + { url = "https://files.pythonhosted.org/packages/b2/1d/46cd11a228c9750684a798d98f878be6f614aa762438da7378f035e79e35/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27b74c10ed6a8f190f4287f53bcfea348b92a84a9c9f70d30183d1e6172d580d", size = 379613, upload-time = "2026-05-28T12:00:07.433Z" }, + { url = "https://files.pythonhosted.org/packages/24/4a/d9b0c6af3a1de03eb93741bbe8be2bdce84d8fda8224f3005451d86df389/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:b9a6528956191c48c52294a592dbd4a8386d7048bdb25c0efcb6b966466c6d83", size = 388183, upload-time = "2026-05-28T12:00:09.227Z" }, + { url = "https://files.pythonhosted.org/packages/c5/b4/db7aaabdda6d020afc87d981bcc2f57a434c7dec60ecfc2ab3dd50b20351/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:af03e34e860047bc7a352b842856fcf78798fbb81132cc98bd2f907ab4eb9cd2", size = 408578, upload-time = "2026-05-28T12:00:10.779Z" }, + { url = "https://files.pythonhosted.org/packages/08/d6/070f6a41cbb343e2ac4171859bf3f3623e0ab002f72619d6d505313ec2de/rpds_py-2026.5.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fea6e836d10abbe191d557d33bd58bd5987725fe63aa1eefe557d230209855bd", size = 553573, upload-time = "2026-05-28T12:00:12.443Z" }, + { url = "https://files.pythonhosted.org/packages/75/ab/1a71ea3589c4345dac0a0518f0e6a031cb42689277851b683c46d27463a5/rpds_py-2026.5.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:fc0c0f878ea770a0a8a462456c5ad36fc9fe6358e6b76fdadc7f17575e0b8bf1", size = 620861, upload-time = "2026-05-28T12:00:14.09Z" }, + { url = "https://files.pythonhosted.org/packages/8a/22/9bf80a56069c0c443fcfefac639a86a744550a2898817a6dfd3e26654924/rpds_py-2026.5.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e0b360f316d966b048b085857630b3cc51f3db2f07b06f440eac8f695374d1e3", size = 585633, upload-time = "2026-05-28T12:00:15.66Z" }, + { url = "https://files.pythonhosted.org/packages/da/68/3b2c0a75c9e04125696f84ebdbbf304acf5a40b58ba4481cdb98a922c3ba/rpds_py-2026.5.1-cp313-cp313t-win32.whl", hash = "sha256:a2999883eedf72fdfb7520b92c7d4ec2572a71ff40239377aa604cc529eecafc", size = 210074, upload-time = "2026-05-28T12:00:17.291Z" }, + { url = "https://files.pythonhosted.org/packages/e7/8b/609157d5a25d37d4f29f92840ba531f416907c34ae5c5739dd21fc2bef98/rpds_py-2026.5.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e07be2a9d7122bd6e82dea89814ef8dc893feb1aae97fec1630f3263bbb30e55", size = 228635, upload-time = "2026-05-28T12:00:18.73Z" }, + { url = "https://files.pythonhosted.org/packages/d4/6f/19c1918a4b590d8de87e712e4abe4b3875771eff60216fb6153cf6665c68/rpds_py-2026.5.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:1f2c391c3059798093b65df23aca2cac150460ae9c630d99dec83d703d9485b9", size = 349756, upload-time = "2026-05-28T12:00:20.217Z" }, + { url = "https://files.pythonhosted.org/packages/e5/60/a06fe7da34eca79dacbf958a2ba0c6eea85bc2b29de20080bf40f72f66fa/rpds_py-2026.5.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:413b424f7c4ee65ab5e5be91f5731be0f8b41a1ee2b12dfe810d716312e95a78", size = 343831, upload-time = "2026-05-28T12:00:21.711Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ec/b2333b97b90e2a6ef6ca8ad386ee284968e74bcfe113b3f1a8d9036429a9/rpds_py-2026.5.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c595a1d9255dce0599e13130d1440ab2506654f2b50294226ee06402f8fef63", size = 375127, upload-time = "2026-05-28T12:00:23.326Z" }, + { url = "https://files.pythonhosted.org/packages/14/7f/e00aae54067f2b488c4637961d5f58204d470795fc791085fa3f15060d2e/rpds_py-2026.5.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1c27c5f6102eac8c03e7595a00827a53b271ba40a53b59ff8709170e0855ea4a", size = 379034, upload-time = "2026-05-28T12:00:24.89Z" }, + { url = "https://files.pythonhosted.org/packages/be/cc/423999bbb8ae8dc93c77fc1d5e984ade5eb89d237d3bb884ccfa72ae2890/rpds_py-2026.5.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c7fcf61d44cacecaf3aea542b0e053db77972a4573e7ceda16fb2b399161195", size = 490823, upload-time = "2026-05-28T12:00:26.676Z" }, + { url = "https://files.pythonhosted.org/packages/0f/aa/c671bf660f12e68d3c52ff86c7066ed1372df5a0f4f2ff584e419b8207e7/rpds_py-2026.5.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c817a189d4ee14290420e5ff051e4dd6baa13f3edf84685071dee07a6d538ee", size = 388144, upload-time = "2026-05-28T12:00:28.577Z" }, + { url = "https://files.pythonhosted.org/packages/19/c8/d63bb75b68afe77b229e3021c6031bcaf01da5db5b0e69d0d10f9ba679a7/rpds_py-2026.5.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21846aac0ed2e0589f38c12dc44e77bb64e494b771eadbcf169cba00566ba7ba", size = 371959, upload-time = "2026-05-28T12:00:30.304Z" }, + { url = "https://files.pythonhosted.org/packages/82/35/c51122014d8274ff37dc606d60049c3db7d83da02b5b282511e5a906a9a6/rpds_py-2026.5.1-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b317c87a13f769a4e787819bd508aaa5d69aa09b0880de9af6d3a8a54571cdec", size = 383558, upload-time = "2026-05-28T12:00:31.764Z" }, + { url = "https://files.pythonhosted.org/packages/e3/f9/2790cb99c136a5363acdeacf5c27c56f3de0d4118a1f48fca83404c99c89/rpds_py-2026.5.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce87129d9f2c14fa6c4a8601fb80eb4488c80d38a20cd13758ef11123e14995d", size = 402789, upload-time = "2026-05-28T12:00:33.247Z" }, + { url = "https://files.pythonhosted.org/packages/e5/1b/e4fb584f8c75d35c38150ff6a332cda949e6f97acba1f4fd123b14ab56fe/rpds_py-2026.5.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9cdddb6c1207d284d94fd1530adf57fbd797fe7c4b8704ba85f49414f2557e7d", size = 551405, upload-time = "2026-05-28T12:00:34.819Z" }, + { url = "https://files.pythonhosted.org/packages/d8/f7/a6731b4216cb3793ea1af5391da240f5683dacc0d13e034fe5fc3503f240/rpds_py-2026.5.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:4e237e139f94d3c036fd28eb9f564c99055476ff4ff05cd42be55ce349b5aa02", size = 616975, upload-time = "2026-05-28T12:00:36.268Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ea/2e051a81d95d8e63f4b35a1c463a87e8766bc3d083c067c5dfb6bf220747/rpds_py-2026.5.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ed0954b524873214369184a9c82b0eaa45a3fbb9a798cd95b17e0d98499e7ea0", size = 578701, upload-time = "2026-05-28T12:00:37.82Z" }, + { url = "https://files.pythonhosted.org/packages/65/56/b5f6fdb2083e32bca8a8993d89e70db114b4756c9e2c38421328126689d2/rpds_py-2026.5.1-cp314-cp314-win32.whl", hash = "sha256:2d88621d6a7d4dfa633d21abe90f280bb205274e16b1d1e61c6ad4640b2453b7", size = 209806, upload-time = "2026-05-28T12:00:39.492Z" }, + { url = "https://files.pythonhosted.org/packages/fb/80/65a5aa96c155e611d1ed844e4e1f57f3e36b021f396d9f8585d756e6b90d/rpds_py-2026.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:cef8ac28d26f4dda3533060c20fbf80a325458fa9fd23ea72a73cdfa8e978838", size = 225985, upload-time = "2026-05-28T12:00:40.94Z" }, + { url = "https://files.pythonhosted.org/packages/27/7c/ad185212e87b05f196daef92bc5f3caf07298eb47c295b5585c3dd3093ac/rpds_py-2026.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:eaaea962c68cdc68d4a533ba985ab8e9484277910bbfaa2ab3ef7732667bfed8", size = 221219, upload-time = "2026-05-28T12:00:43.15Z" }, + { url = "https://files.pythonhosted.org/packages/23/58/e14ae18759020334646b031e708ab4158d653a938822bfb7b95ef2e93aa3/rpds_py-2026.5.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:21942f52dbbd5f8758bf021213d28bd45c39e873e65e2407faf5f1846f5761ad", size = 352148, upload-time = "2026-05-28T12:00:44.638Z" }, + { url = "https://files.pythonhosted.org/packages/31/9b/5f4a1e2f960bca3ac5d052b139dd31eed97b259f9d909173821760d542e8/rpds_py-2026.5.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f414556f6e3958300ff941e40c9f97e3dc9774ddd1b3434c475d73dd354bbed3", size = 345196, upload-time = "2026-05-28T12:00:46.14Z" }, + { url = "https://files.pythonhosted.org/packages/1a/71/1d9574d6a2fa20ab60eaa55c7467f5aa20cbc770f341a05f09c0876f59e2/rpds_py-2026.5.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef1013a8625c74043210190b246f5b1551e09757c1f356c6e4160ef96c5bc081", size = 374981, upload-time = "2026-05-28T12:00:47.531Z" }, + { url = "https://files.pythonhosted.org/packages/0c/9a/37e99f4915a80aa71670263c1267f7ae0af95f53a3f61e6c3bdc016d4515/rpds_py-2026.5.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cc68e231a77a5f0d774ae278a1f8e55c0456501820847c1e4efb3829f3441df6", size = 379961, upload-time = "2026-05-28T12:00:49.216Z" }, + { url = "https://files.pythonhosted.org/packages/a8/ff/6e73f74b89d2e0715e0fc86b7dde893f9a61ae2f9b256ff3bdfe41ac4e94/rpds_py-2026.5.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9baffb505aff33acc69b422a19f77806680f3c8632227d79f48de8a810d1c2c5", size = 495965, upload-time = "2026-05-28T12:00:51.111Z" }, + { url = "https://files.pythonhosted.org/packages/ea/e0/425faba25f59d74d4638b267f7c7a80e8649d2ef4db10a19b0c4a71e6e6f/rpds_py-2026.5.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8d2f912928d426e8cfa396f7f3f8d29a59e6689c86dcca3c420730c1096322b", size = 389526, upload-time = "2026-05-28T12:00:52.77Z" }, + { url = "https://files.pythonhosted.org/packages/c6/76/7a41960e3fddae47fab43a28684d5da981401dffd88253de0944148654cb/rpds_py-2026.5.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90f628283be835db980c941767d41c9a27b5239e54ba0a9c1335247e82406964", size = 376190, upload-time = "2026-05-28T12:00:54.215Z" }, + { url = "https://files.pythonhosted.org/packages/27/60/5f38dc70824fc6951b51d35377e577a3a3a4c81a6769cc5a2de25ebe0ad1/rpds_py-2026.5.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:1ebb2f0ab7e16132995a72de805170e0203df0c3dd22e1ef1cd1fdd90bd7a131", size = 383921, upload-time = "2026-05-28T12:00:55.673Z" }, + { url = "https://files.pythonhosted.org/packages/60/1a/d60a38caa1505f4b9483c3fbbde12c94e1079154f4f401a6da96f7e77621/rpds_py-2026.5.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f3df3d16ded76f1f8c9cdebd0e1ea55fdf4c23b812de189814da7cf229c22a81", size = 404766, upload-time = "2026-05-28T12:00:57.518Z" }, + { url = "https://files.pythonhosted.org/packages/87/ff/602fd3f174d6425f0bce05ad0dfbec0e96b38d0f7d08a79af5aa20083885/rpds_py-2026.5.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9af8905b8f854990e40d5206aa5ac58d9b0fe0b7f351ff2bb086c20f6c8c6a47", size = 551343, upload-time = "2026-05-28T12:00:58.978Z" }, + { url = "https://files.pythonhosted.org/packages/b8/c1/1be13327acdbead3eca1fde03b6a34dbb011f1e864e217f0d32cc1779a7f/rpds_py-2026.5.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:036a36a87fb1cd3b214d11c4b3c4f7d2ddad933625dca1c900b56a057c07740a", size = 618502, upload-time = "2026-05-28T12:01:00.656Z" }, + { url = "https://files.pythonhosted.org/packages/f3/d7/afb49b49d7f2be8b7ba1a9f0977fa5168003437b93086726f066544e8351/rpds_py-2026.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:62ae3853454fe9ef283a03c96c2d835d39e84b14643a9d62c82ef0fb87d702ca", size = 581916, upload-time = "2026-05-28T12:01:02.22Z" }, + { url = "https://files.pythonhosted.org/packages/25/d1/dbef8c1f8a10f07beb62b5f054e20099fd9924b3ec001b8f0b6ac7813a85/rpds_py-2026.5.1-cp314-cp314t-win32.whl", hash = "sha256:6c3d771a46ec18b12af06ce36243a9a80b07a5d0515236332d90863ca8bb326a", size = 207855, upload-time = "2026-05-28T12:01:03.821Z" }, + { url = "https://files.pythonhosted.org/packages/2a/72/bfa4e61ab8e7dc1c8adf397e05e6cbdd4239357bd72b248d3de662f23915/rpds_py-2026.5.1-cp314-cp314t-win_amd64.whl", hash = "sha256:c93c629be4636cf54337bd5f06c104d55e42ced54d681f6fe21ae510a65116f6", size = 225422, upload-time = "2026-05-28T12:01:05.194Z" }, + { url = "https://files.pythonhosted.org/packages/27/3a/7b5da92b640f67b6717ccafc83cdd06bfa7ff2395c3685c68922bb54d703/rpds_py-2026.5.1-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:3574b55c604b8f75dacb007136508bbc0db406e626301778096a133327e7f2fb", size = 349576, upload-time = "2026-05-28T12:01:06.722Z" }, + { url = "https://files.pythonhosted.org/packages/d7/8a/2aafd7ad355a1bd48ca76e2262b74b15e6432b5a1efe150efd4d779cd55d/rpds_py-2026.5.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:94068eb3ae6d43f5a786b7db96a406a34e6d5c24489feef32fd6e8946ea7b291", size = 343640, upload-time = "2026-05-28T12:01:08.441Z" }, + { url = "https://files.pythonhosted.org/packages/f7/7d/6c9523c1abbe840a1b7fba3c516d48e1d3487cc80fea4366c4071cf56784/rpds_py-2026.5.1-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3a5b10e8ce894825f380a8f1b6444cf73c294dfea62afbb2d13e3a9e630cec1", size = 375322, upload-time = "2026-05-28T12:01:09.934Z" }, + { url = "https://files.pythonhosted.org/packages/5a/5d/0b7b03fb1dc509321f01de3149784ab773e34c8573022029af8076afcb9c/rpds_py-2026.5.1-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fc09f82e63d4bcd58149572f857a431bae851dc747e313c3b5bdf7abb907fda8", size = 379066, upload-time = "2026-05-28T12:01:11.48Z" }, + { url = "https://files.pythonhosted.org/packages/d7/e2/8ef6012999ebf1cb1c22f876d9ce5e63d960fd4631d2af3202d3f480aa25/rpds_py-2026.5.1-cp315-cp315-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e10464d17df3b582745c25cec695cb9558bca2cb6ddb631aee1787fc72c767b2", size = 494586, upload-time = "2026-05-28T12:01:13.051Z" }, + { url = "https://files.pythonhosted.org/packages/80/af/1eeb029bec67582c226b7809172207cd005073af4ebd906e65ff494f4983/rpds_py-2026.5.1-cp315-cp315-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ba05adbf15d994c38ec0b7ab32e858e5110c21e9009a00a86545fd220f84e038", size = 388415, upload-time = "2026-05-28T12:01:14.631Z" }, + { url = "https://files.pythonhosted.org/packages/18/23/ffbe10711c4d766c1cab0557d6906c074f795814863c67b351355d29354a/rpds_py-2026.5.1-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77c004fdc7b891967106f78ddfd7b076bfe6813c6139c6fff6aed3bcaa960b26", size = 372427, upload-time = "2026-05-28T12:01:16.153Z" }, + { url = "https://files.pythonhosted.org/packages/bd/3a/30ba4a6ad457e5b070c18d742a33fb77d8d922b565cc881f8a5313d63bfe/rpds_py-2026.5.1-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:83bcf894486c9d78dd290d3c0124ff6dd8875d3025e2090a8ec49fcc37c55fdd", size = 383615, upload-time = "2026-05-28T12:01:17.809Z" }, + { url = "https://files.pythonhosted.org/packages/d3/69/62e242b53ce39c0814bd24e1a6e6eba6c92be716277745f317f9540a2e7b/rpds_py-2026.5.1-cp315-cp315-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c3df104083952a0e0c6f10de33e440eabe98fb6317d23e1a58c68f6df08d01b9", size = 402786, upload-time = "2026-05-28T12:01:19.419Z" }, + { url = "https://files.pythonhosted.org/packages/38/c1/a770b9c186928a1ed0f7e6d7ae50e7f3950ed23e3f9e366dbc8e38cb55de/rpds_py-2026.5.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:980450826cf22e133c57e0835070bdd0dd3f73b9b708c3ce223def2cb9469e14", size = 551583, upload-time = "2026-05-28T12:01:21.013Z" }, + { url = "https://files.pythonhosted.org/packages/21/7c/68e8579b95375b70d2a963103c42e705856cdb98569258bd807f4423891c/rpds_py-2026.5.1-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:205dde846f24332ab0c1188699a043b8d165b79bb84529ce272c45048ff6be01", size = 616941, upload-time = "2026-05-28T12:01:22.548Z" }, + { url = "https://files.pythonhosted.org/packages/70/a1/a6135aed5730ff03ab957182259987ac11e55fb392a28dc6f0592048a280/rpds_py-2026.5.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:3966b82dd563176396df030f3dd52a6e54cb69b718e95e78bd555ed3d1e0185d", size = 578349, upload-time = "2026-05-28T12:01:24.118Z" }, + { url = "https://files.pythonhosted.org/packages/09/6e/f24201a76a84e6c49d0bdfdfcb735210e21701e9b21c5bfc0ba497dd62f6/rpds_py-2026.5.1-cp315-cp315-win32.whl", hash = "sha256:7818f8d0a415be74d2be3590b0a1c1f463a642f4d0217e7d10602dceef5b79aa", size = 209922, upload-time = "2026-05-28T12:01:25.522Z" }, + { url = "https://files.pythonhosted.org/packages/9e/e4/966bc240bb0485fc265278f6de44d05834bf0b3618886e0b22e33d54c49a/rpds_py-2026.5.1-cp315-cp315-win_amd64.whl", hash = "sha256:b3cc20c0d800af78fd0fac68086e28c1856cec51ea528bb81ea851aa40d39325", size = 226003, upload-time = "2026-05-28T12:01:27.062Z" }, + { url = "https://files.pythonhosted.org/packages/5c/5c/a15a59269cd5e74472734516c73795c15eccfc841b3d4b0228c3f53f19d0/rpds_py-2026.5.1-cp315-cp315-win_arm64.whl", hash = "sha256:3609e9939a8a76cd904cf98a3f1f13b5dc7e150adeaee89e0ea09652ea213e16", size = 221245, upload-time = "2026-05-28T12:01:28.51Z" }, + { url = "https://files.pythonhosted.org/packages/e0/22/135ce03804e179a71ceb13be095deda4a279bc88f7a6b8fa161c5ad44e12/rpds_py-2026.5.1-cp315-cp315t-macosx_10_12_x86_64.whl", hash = "sha256:5d333a7127d4b307601ac37792bee01bb95c867cbfacf21b6375b804d6bbd723", size = 352015, upload-time = "2026-05-28T12:01:30.214Z" }, + { url = "https://files.pythonhosted.org/packages/3b/5f/f1f6d2652eb9d848f6eb369d8db83a2da6249bb49ad2c2a48f45d54538d3/rpds_py-2026.5.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:b5f077b44a4f7808520f66dae234988d867deb9aed9be5da057ce9ba831b2a41", size = 345016, upload-time = "2026-05-28T12:01:31.656Z" }, + { url = "https://files.pythonhosted.org/packages/88/66/b74182775691ea2290c99e52ac8d5db844e56fbec90ce421f107658c8314/rpds_py-2026.5.1-cp315-cp315t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d8f9b7b78c9538fc9e04e82ec0e888ff0c3cffcfad152c77e57cd09351a98a", size = 374775, upload-time = "2026-05-28T12:01:33.136Z" }, + { url = "https://files.pythonhosted.org/packages/ff/8f/15e5a61d9f0a43902d36561d4f07cae6ae9f4716be825159fd72717f33af/rpds_py-2026.5.1-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e3a8ae58895ac107ed934a6bf51e5846f95c53b9b940c2c6d310838fd5846358", size = 380270, upload-time = "2026-05-28T12:01:34.574Z" }, + { url = "https://files.pythonhosted.org/packages/02/c3/f859b12763a80540cdf2af0f15b19904cf756a71d7bdd3f82ff3e5b1bbf9/rpds_py-2026.5.1-cp315-cp315t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0957cf3c2b8632ec7aaebffebea8005b353cc2a237b6e2ae3c2cac0820704cfb", size = 495285, upload-time = "2026-05-28T12:01:36.127Z" }, + { url = "https://files.pythonhosted.org/packages/1c/c7/ff27c2ac8411d30b03b1829fd88cae8dad1a4d0da48dd25e57c4038042e6/rpds_py-2026.5.1-cp315-cp315t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c396c1304de421050b3681ea70f371874b54d41b0151e96109758144c231e30b", size = 389581, upload-time = "2026-05-28T12:01:37.635Z" }, + { url = "https://files.pythonhosted.org/packages/6e/67/fe92ee32a6cc05c77228a2f8b1762e7124f386ec20ff83d0757b762d58d0/rpds_py-2026.5.1-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad1bff7f666b9598e573815affd666aac6a13a585dde336f843e33350c7fadc", size = 376041, upload-time = "2026-05-28T12:01:39.307Z" }, + { url = "https://files.pythonhosted.org/packages/f8/91/b4d6685c27aba55bd82f25b278be8237038117d05f9659a6213ad3408130/rpds_py-2026.5.1-cp315-cp315t-manylinux_2_31_riscv64.whl", hash = "sha256:656a042550878f12d45752452d47094b7cfe5ad1e9d7b87b5a22ad3ae5ff8015", size = 383946, upload-time = "2026-05-28T12:01:41.043Z" }, + { url = "https://files.pythonhosted.org/packages/bd/79/2c1d832a53c8e0f8e98fc970ec257b950fecd4f62be2ab7182b500a0cbc8/rpds_py-2026.5.1-cp315-cp315t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:73c4bd4f70294737b5206a3e8e30ccadbf8a60301831c8ea23eec5dbeea1ecfa", size = 405526, upload-time = "2026-05-28T12:01:43.032Z" }, + { url = "https://files.pythonhosted.org/packages/78/c4/c98117b03c6a8581ab2c2dfccfe9a5ad82bd8128a3c28b46a6ad2d97c393/rpds_py-2026.5.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:43bca78665423cabae77146f2fe7ce55272b6c8d55d82cca83effd42c7e13972", size = 551165, upload-time = "2026-05-28T12:01:44.648Z" }, + { url = "https://files.pythonhosted.org/packages/3b/c1/bc479ca069200af730881b1bd525e3114b2b391a351509fcb1b772f28086/rpds_py-2026.5.1-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:42d0f20e85e549c870749d0e247f0c10d318a45b7e9676d575d2dcb04a1b2e66", size = 618778, upload-time = "2026-05-28T12:01:46.337Z" }, + { url = "https://files.pythonhosted.org/packages/77/65/38ab2f90df44c2febfb63cc10ced40763d9b4bc94d173e734528663fe7f5/rpds_py-2026.5.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:b1be5c35683684d5331b93600c210e8367c254683d8a6df6bd21bd2da3a334fb", size = 581839, upload-time = "2026-05-28T12:01:48.109Z" }, + { url = "https://files.pythonhosted.org/packages/15/2d/ce1f605fe036aadd460e5822e578c6c7ec3a860936cca37d6e0f299daa77/rpds_py-2026.5.1-cp315-cp315t-win32.whl", hash = "sha256:75808f6c38ce7749bb68cc2770161aae5045e6c6f6781a9782e74b93304399df", size = 207866, upload-time = "2026-05-28T12:01:49.648Z" }, + { url = "https://files.pythonhosted.org/packages/79/cb/966040123eb102371559746908ef2c9471f4d43e17ec9a645a2258dab64b/rpds_py-2026.5.1-cp315-cp315t-win_amd64.whl", hash = "sha256:90bd6630002a1c7f09e7843dd79f0d24f3d2897cc25a753480917865d14f15b3", size = 225441, upload-time = "2026-05-28T12:01:51.408Z" }, + { url = "https://files.pythonhosted.org/packages/42/56/3fe0fb34820ff667be791b3a3c22b85e8bcba54e9c832f47438c191fa7be/rpds_py-2026.5.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:edf2765d84e42447f112ad877af8fe1db0089aaec5b28e88d6eab45e7fe99cea", size = 357151, upload-time = "2026-05-28T12:01:53.43Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f2/3eb9ccdb9f143b8c9b003978898cb497f942a324c077401e6b8834238e63/rpds_py-2026.5.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ad3773236e95f7f33991eb125224b7da66f206504d032a253a02da7e134519fb", size = 350195, upload-time = "2026-05-28T12:01:54.901Z" }, + { url = "https://files.pythonhosted.org/packages/a7/24/dbda232bc4f3ed732120692ab0d2c8402cb020516556d8bee622dcef2413/rpds_py-2026.5.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a04df86b3f0fade39ec8fd0e0aab089b1da9fbd2b48df778a57ef96f5e7d38df", size = 381850, upload-time = "2026-05-28T12:01:56.601Z" }, + { url = "https://files.pythonhosted.org/packages/40/30/32e769839a358f78810c234f160f2cc21d1e4e47e1c0e0e0d535be5a0219/rpds_py-2026.5.1-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6142dbd80c4df62a5d899f0d616d417f84e0bc8d32526c8e5589019d75d028a7", size = 387899, upload-time = "2026-05-28T12:01:58.212Z" }, + { url = "https://files.pythonhosted.org/packages/ab/86/ec84d243aadb3b34b71dd26a010d0930b2d284ff5fc9a69fec53810ee6fd/rpds_py-2026.5.1-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b35217adefe87f2fe4db7e9766cabe84744bfe9616d9667be18988928c7f2dc", size = 501618, upload-time = "2026-05-28T12:01:59.888Z" }, + { url = "https://files.pythonhosted.org/packages/74/25/b60e52686bbff777a64f9e4f4d3dd57980dc846913777177a2c92e4937aa/rpds_py-2026.5.1-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b95d5e11fc712b752081183a55a244c03cd00570489edd7014d8899f8ceb8162", size = 394003, upload-time = "2026-05-28T12:02:01.482Z" }, + { url = "https://files.pythonhosted.org/packages/9b/c7/b3a6a588cc2219510ef3f42e207483a93950bedd1e3a0fd4015c95cff9e5/rpds_py-2026.5.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:141c9498daf2ace9eda35d2b0e376f9ea8b058d84f2aef4f96fccfd449a2f251", size = 379778, upload-time = "2026-05-28T12:02:03.197Z" }, + { url = "https://files.pythonhosted.org/packages/31/00/c7dba3fc8a3da8cb3f6db1eb3386be4d79c2e97c6890d20eb9ac66ae8c43/rpds_py-2026.5.1-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:6f249f8b860a200ad35193af961183ebe9132710484e6f6ce0cf89fd83c63a9a", size = 392359, upload-time = "2026-05-28T12:02:04.817Z" }, + { url = "https://files.pythonhosted.org/packages/93/dd/472ba494c70753f93745992c99855bee0636daf74e6984e5e003f150316f/rpds_py-2026.5.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e4abbf391a70be864920858bf360f4fb380577c9a0f732438a1996726e2c195b", size = 412820, upload-time = "2026-05-28T12:02:06.401Z" }, + { url = "https://files.pythonhosted.org/packages/1d/6f/93831a3bfe789542ed0c1d0d74b78b440f055d6dc3ea4640eba2d95e6e23/rpds_py-2026.5.1-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:c74005a7bb87752acf351c93897ec63ad77a07a0da7ecad9c050e32e7286ba34", size = 557243, upload-time = "2026-05-28T12:02:08.013Z" }, + { url = "https://files.pythonhosted.org/packages/1f/ff/0b3d604614ffc77522c6b288fdbce68957eb583da1002aa65ba38ac0ee40/rpds_py-2026.5.1-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:8213afbe8a3a906fb9acb2014423fe3359ee783d0bf90995f70623a3217bfa6c", size = 623541, upload-time = "2026-05-28T12:02:09.661Z" }, + { url = "https://files.pythonhosted.org/packages/ea/ea/e7b0251441da9adfeaebcf29601d10f2a1455fcf0772fae9e7e19032bd96/rpds_py-2026.5.1-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:8c43a8a973270fd173bf48cdf80bbe66312421cba68d40845034f174f2389049", size = 586326, upload-time = "2026-05-28T12:02:11.47Z" }, +] + [[package]] name = "ruff" -version = "0.15.12" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/99/43/3291f1cc9106f4c63bdce7a8d0df5047fe8422a75b091c16b5e9355e0b11/ruff-0.15.12.tar.gz", hash = "sha256:ecea26adb26b4232c0c2ca19ccbc0083a68344180bba2a600605538ce51a40a6", size = 4643852, upload-time = "2026-04-24T18:17:14.305Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/6e/e78ffb61d4686f3d96ba3df2c801161843746dcbcbb17a1e927d4829312b/ruff-0.15.12-py3-none-linux_armv6l.whl", hash = "sha256:f86f176e188e94d6bdbc09f09bfd9dc729059ad93d0e7390b5a73efe19f8861c", size = 10640713, upload-time = "2026-04-24T18:17:22.841Z" }, - { url = "https://files.pythonhosted.org/packages/ae/08/a317bc231fb9e7b93e4ef3089501e51922ff88d6936ce5cf870c4fe55419/ruff-0.15.12-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e3bcd123364c3770b8e1b7baaf343cc99a35f197c5c6e8af79015c666c423a6c", size = 11069267, upload-time = "2026-04-24T18:17:30.105Z" }, - { url = "https://files.pythonhosted.org/packages/aa/a4/f828e9718d3dce1f5f11c39c4f65afd32783c8b2aebb2e3d259e492c47bd/ruff-0.15.12-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fe87510d000220aa1ed530d4448a7c696a0cae1213e5ec30e5874287b66557b5", size = 10397182, upload-time = "2026-04-24T18:17:07.177Z" }, - { url = "https://files.pythonhosted.org/packages/71/e0/3310fc6d1b5e1fdea22bf3b1b807c7e187b581021b0d7d4514cccdb5fb71/ruff-0.15.12-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84a1630093121375a3e2a95b4a6dc7b59e2b4ee76216e32d81aae550a832d002", size = 10758012, upload-time = "2026-04-24T18:16:55.759Z" }, - { url = "https://files.pythonhosted.org/packages/11/c1/a606911aee04c324ddaa883ae418f3569792fd3c4a10c50e0dd0a2311e1e/ruff-0.15.12-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fb129f40f114f089ebe0ca56c0d251cf2061b17651d464bb6478dc01e69f11f5", size = 10447479, upload-time = "2026-04-24T18:16:51.677Z" }, - { url = "https://files.pythonhosted.org/packages/9d/68/4201e8444f0894f21ab4aeeaee68aa4f10b51613514a20d80bd628d57e88/ruff-0.15.12-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0c862b172d695db7598426b8af465e7e9ac00a3ea2a3630ee67eb82e366aaa6", size = 11234040, upload-time = "2026-04-24T18:17:16.529Z" }, - { url = "https://files.pythonhosted.org/packages/34/ff/8a6d6cf4ccc23fd67060874e832c18919d1557a0611ebef03fdb01fff11e/ruff-0.15.12-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2849ea9f3484c3aca43a82f484210370319e7170df4dfe4843395ddf6c57bc33", size = 12087377, upload-time = "2026-04-24T18:17:04.944Z" }, - { url = "https://files.pythonhosted.org/packages/85/f6/c669cf73f5152f623d34e69866a46d5e6185816b19fcd5b6dd8a2d299922/ruff-0.15.12-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e77c7e51c07fe396826d5969a5b846d9cd4c402535835fb6e21ce8b28fef847", size = 11367784, upload-time = "2026-04-24T18:17:25.409Z" }, - { url = "https://files.pythonhosted.org/packages/e8/39/c61d193b8a1daaa8977f7dea9e8d8ba866e02ea7b65d32f6861693aa4c12/ruff-0.15.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83b2f4f2f3b1026b5fb449b467d9264bf22067b600f7b6f41fc5958909f449d0", size = 11344088, upload-time = "2026-04-24T18:17:12.258Z" }, - { url = "https://files.pythonhosted.org/packages/c2/8d/49afab3645e31e12c590acb6d3b5b69d7aab5b81926dbaf7461f9441f37a/ruff-0.15.12-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:9ba3b8f1afd7e2e43d8943e55f249e13f9682fde09711644a6e7290eb4f3e339", size = 11271770, upload-time = "2026-04-24T18:17:02.457Z" }, - { url = "https://files.pythonhosted.org/packages/46/06/33f41fe94403e2b755481cdfb9b7ef3e4e0ed031c4581124658d935d52b4/ruff-0.15.12-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e852ba9fdc890655e1d78f2df1499efbe0e54126bd405362154a75e2bde159c5", size = 10719355, upload-time = "2026-04-24T18:17:27.648Z" }, - { url = "https://files.pythonhosted.org/packages/0d/59/18aa4e014debbf559670e4048e39260a85c7fcee84acfd761ac01e7b8d35/ruff-0.15.12-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:dd8aed930da53780d22fc70bdf84452c843cf64f8cb4eb38984319c24c5cd5fd", size = 10462758, upload-time = "2026-04-24T18:17:32.347Z" }, - { url = "https://files.pythonhosted.org/packages/25/e7/cc9f16fd0f3b5fddcbd7ec3d6ae30c8f3fde1047f32a4093a98d633c6570/ruff-0.15.12-py3-none-musllinux_1_2_i686.whl", hash = "sha256:01da3988d225628b709493d7dc67c3b9b12c0210016b08690ef9bd27970b262b", size = 10953498, upload-time = "2026-04-24T18:17:20.674Z" }, - { url = "https://files.pythonhosted.org/packages/72/7a/a9ba7f98c7a575978698f4230c5e8cc54bbc761af34f560818f933dafa0c/ruff-0.15.12-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:9cae0f92bd5700d1213188b31cd3bdd2b315361296d10b96b8e2337d3d11f53e", size = 11447765, upload-time = "2026-04-24T18:17:09.755Z" }, - { url = "https://files.pythonhosted.org/packages/ea/f9/0ae446942c846b8266059ad8a30702a35afae55f5cdc54c5adf8d7afdc27/ruff-0.15.12-py3-none-win32.whl", hash = "sha256:d0185894e038d7043ba8fd6aee7499ece6462dc0ea9f1e260c7451807c714c20", size = 10657277, upload-time = "2026-04-24T18:17:18.591Z" }, - { url = "https://files.pythonhosted.org/packages/33/f1/9614e03e1cdcbf9437570b5400ced8a720b5db22b28d8e0f1bda429f660d/ruff-0.15.12-py3-none-win_amd64.whl", hash = "sha256:c87a162d61ab3adca47c03f7f717c68672edec7d1b5499e652331780fe74950d", size = 11837758, upload-time = "2026-04-24T18:17:00.113Z" }, - { url = "https://files.pythonhosted.org/packages/c0/98/6beb4b351e472e5f4c4613f7c35a5290b8be2497e183825310c4c3a3984b/ruff-0.15.12-py3-none-win_arm64.whl", hash = "sha256:a538f7a82d061cee7be55542aca1d86d1393d55d81d4fcc314370f4340930d4f", size = 11120821, upload-time = "2026-04-24T18:16:57.979Z" }, +version = "0.15.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/84/6f/a76f7d96e5c962f5b69cee865e49c15c1116897c01990faa8a57edb62e7f/ruff-0.15.15.tar.gz", hash = "sha256:b8dff018130b46d8e5bf0f926ef6b60cf871d6d5ae45fc9334e09632daa741d6", size = 4706985, upload-time = "2026-05-28T14:16:57.784Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/9d/3a45c05b8ab04b4705989de70a79008e27c8003296a0feaee9edc18dd7e9/ruff-0.15.15-py3-none-linux_armv6l.whl", hash = "sha256:cf93e5388f412e1b108b1f8b34a6e036b70fe8aff89393befad96fe48670311b", size = 10710652, upload-time = "2026-05-28T14:16:06.701Z" }, + { url = "https://files.pythonhosted.org/packages/05/66/da974431624bf3b49f6ee1f9543c02d929ff1cba78b0d5a79c38cf21f744/ruff-0.15.15-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ac5a646d1f6a7dadd5d50842dae2c1f9862ac887ef5d1b1375e02def791fde6e", size = 11096615, upload-time = "2026-05-28T14:16:23.313Z" }, + { url = "https://files.pythonhosted.org/packages/8c/09/7443452e5d290230a712103f2fdceeef7184f3ec99a2bd01c8be78aaceb5/ruff-0.15.15-py3-none-macosx_11_0_arm64.whl", hash = "sha256:77d955a431430c66f72dd94e379ad38a16daea3d25094872ac4edf9e797be530", size = 10436683, upload-time = "2026-05-28T14:16:40.974Z" }, + { url = "https://files.pythonhosted.org/packages/53/01/d330c26a57fa4f3943a14424904027428315b700fe4d14a84bb123a649e5/ruff-0.15.15-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7614ee79c69788cf6cedd568069ade9cecc22a1ad20494efe8d0c9ebb4b622d4", size = 10769064, upload-time = "2026-05-28T14:16:28.905Z" }, + { url = "https://files.pythonhosted.org/packages/1d/85/cc8770f8bdff541b1da8392d1634141fe4a0e3f4ee596605959b7906c27f/ruff-0.15.15-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3cdb1679e06a1f6b47bc384714ae96f6e2fb65ca441eb78c43d2ca554176ce1f", size = 10511987, upload-time = "2026-05-28T14:16:43.732Z" }, + { url = "https://files.pythonhosted.org/packages/7c/29/8c190c1472b63013583ba391f3342036e02010544c1270455ed8e519bdf3/ruff-0.15.15-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2728b93d7b23a603ea2c0ac6eb73d760bd38ec9de35f35fb41e18f7a3fee7622", size = 11275100, upload-time = "2026-05-28T14:16:55.244Z" }, + { url = "https://files.pythonhosted.org/packages/9f/6b/7e145ce2cc8e63d6834eca03d83a0e18d121def5c69f91b4cf4011ed4879/ruff-0.15.15-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be582fcc0db438902c7792b08d6ddf6c9b9e21addaa10092c2c741cfb09e5a45", size = 12176903, upload-time = "2026-05-28T14:16:14.368Z" }, + { url = "https://files.pythonhosted.org/packages/80/a3/d5974637f68e451f7fadf015cf3101d1cd7d8ba5027cffe0b9e3826ebe6b/ruff-0.15.15-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7aa77465b8ecaf1a27bea098d696f7fed5e1eccbd10b321b682d6de586ae5627", size = 11404550, upload-time = "2026-05-28T14:16:20.138Z" }, + { url = "https://files.pythonhosted.org/packages/fe/1c/e6e5e568f22be4fb05d6244234aba384c06b451252453b821e1a529263cf/ruff-0.15.15-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48decfa11d740de4889de623be1463308346312f2409a56e24aa280c86162dc4", size = 11382027, upload-time = "2026-05-28T14:16:46.615Z" }, + { url = "https://files.pythonhosted.org/packages/1d/01/170921b49fcd2e8858825593f91cf7146c3e40a5c3e6df763e4bb0484dde/ruff-0.15.15-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:a5015088452ca0081387063649ec67f06d3d1d6b8b936a1f836b5e9657ecd48c", size = 11366041, upload-time = "2026-05-28T14:16:26.247Z" }, + { url = "https://files.pythonhosted.org/packages/87/54/a7bad711d7de93254e15e06a4c375b89a03d18de45d3e5dcc86a4472fb1a/ruff-0.15.15-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:f5294aab6356c81600fcdea3a62bb1b924dfd5e91767c12318d3f68f86af57cd", size = 10741795, upload-time = "2026-05-28T14:16:17.11Z" }, + { url = "https://files.pythonhosted.org/packages/c9/31/38c075963668f8b41c6914ee0f6f318727fbe30ab9145cb29e6df464c5fa/ruff-0.15.15-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:db5bd4d802415cca656dc1616070b725952d6ae95eb5d4831e49fbd94a38f75f", size = 10511117, upload-time = "2026-05-28T14:16:31.767Z" }, + { url = "https://files.pythonhosted.org/packages/9d/96/6ff689e1f7e375d1d97075eca022f74c2bab59554a432fe4d2e6f091986a/ruff-0.15.15-py3-none-musllinux_1_2_i686.whl", hash = "sha256:587a6278ed42059191c1a466e490bd7930fb50bd2e255398bc29616c895a61cb", size = 10994867, upload-time = "2026-05-28T14:16:35.149Z" }, + { url = "https://files.pythonhosted.org/packages/c3/c2/5dce0ab9f92a8d534fa62b9bf9caca3eddb8c1a81b616f5e195ada4f0d6e/ruff-0.15.15-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:df0c1c084f5f4be9812f61518a45c440d3c30d69ce4bf6c5270e66d38338f02a", size = 11482101, upload-time = "2026-05-28T14:16:49.598Z" }, + { url = "https://files.pythonhosted.org/packages/b1/c0/1003b60edd697c649faf61f1a34094b1abb38fb3d1181e3f895781250a08/ruff-0.15.15-py3-none-win32.whl", hash = "sha256:29428ea79694afbe756d45fd59b36f22b6b020dc0443cf7de0173046236964b9", size = 10716774, upload-time = "2026-05-28T14:16:52.337Z" }, + { url = "https://files.pythonhosted.org/packages/02/a8/1269eddd6945a06c23f055ef7848886e37cf9d6a8bebb386a3115f01470c/ruff-0.15.15-py3-none-win_amd64.whl", hash = "sha256:8df0323902e15e24bc4bf246da830573d3cf3352bd0b9a164eab335d111ff4a4", size = 11868463, upload-time = "2026-05-28T14:16:11.333Z" }, + { url = "https://files.pythonhosted.org/packages/4e/b2/920464c907b191e37469d477a1aa8bc048b8f36c4c1610dfa4ab87b39e18/ruff-0.15.15-py3-none-win_arm64.whl", hash = "sha256:3c8ceca6792f38196b8f589bc92eccd03eef286602da92e5dc05cc42ef6441b7", size = 11138498, upload-time = "2026-05-28T14:16:38.425Z" }, ] [[package]] @@ -4283,7 +4349,7 @@ resolution-markers = [ "(python_full_version >= '3.11' and python_full_version < '3.14' and platform_machine != 'x86_64') or (python_full_version >= '3.11' and python_full_version < '3.14' and sys_platform != 'darwin')", ] dependencies = [ - { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/7a/97/5a3609c4f8d58b039179648e62dd220f89864f56f7357f5d4f45c29eb2cc/scipy-1.17.1.tar.gz", hash = "sha256:95d8e012d8cb8816c226aef832200b1d45109ed4464303e997c5b13122b297c0", size = 30573822, upload-time = "2026-02-23T00:26:24.851Z" } wheels = [ @@ -4351,7 +4417,7 @@ wheels = [ [[package]] name = "selene-core" -version = "0.2.9" +version = "0.2.10" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "hugr" }, @@ -4367,7 +4433,7 @@ dependencies = [ { name = "ziglang" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/a9/a94ad38852346869a9c8da037a92cff867b2fe72e9f512bae561a6bc6d23/selene_core-0.2.9-py3-none-any.whl", hash = "sha256:847c78ea393de43e736adf20c3aa7006ae8f96765299a401abbbda6af9af3128", size = 33096, upload-time = "2026-04-28T12:47:34.292Z" }, + { url = "https://files.pythonhosted.org/packages/13/33/32906365f8359588d7d05301a2e645563321bf39a11f076ee16f7aa5178a/selene_core-0.2.10-py3-none-any.whl", hash = "sha256:c53857781c25ce95e170dcf83044ba152e68d799a3585f4874281b306a24899c", size = 33014, upload-time = "2026-05-22T10:07:21.106Z" }, ] [[package]] @@ -4384,22 +4450,22 @@ wheels = [ [[package]] name = "selene-sim" -version = "0.2.15" +version = "0.2.16" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "pyyaml" }, { name = "selene-core" }, { name = "selene-hugr-qis-compiler" }, { name = "tqdm" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/05/76931c2c757b9a4ac44a75c3b8b1e50209dd94716dad8bc91f8a0023c344/selene_sim-0.2.15-py3-none-macosx_11_0_arm64.whl", hash = "sha256:44f301aeb84de22ab4c0d4a2fc0bfa42a035ae66bc2ba3acbcd6f8c67b0a1284", size = 4055479, upload-time = "2026-04-28T13:13:59.353Z" }, - { url = "https://files.pythonhosted.org/packages/40/1c/90d029fe76a22fbd4462039b6dc35b6574d86775d4cf5fd27da760185d73/selene_sim-0.2.15-py3-none-macosx_11_0_x86_64.whl", hash = "sha256:7d5f67ac8c19b3422e653d697eace0c9599b28b82ea1bdc35cc1c3e09f14145b", size = 4212319, upload-time = "2026-04-28T13:14:00.688Z" }, - { url = "https://files.pythonhosted.org/packages/80/1e/87d3e225f32b05da5813bfe1ff8bf6c70f60c60919044ec48cae9c6ce625/selene_sim-0.2.15-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:2667b07b0d826b770e6381f7d78eda7559487f38e04abe37c5f343b7dbb2703b", size = 4498690, upload-time = "2026-04-28T13:14:02.208Z" }, - { url = "https://files.pythonhosted.org/packages/ec/08/25d10f9c2c410b2d17cb2eb1c63bfe5dc84282e71081cd8e9e2b69db969d/selene_sim-0.2.15-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:aaf5dbee4c988d02f42b18fe3208aaec020743c17faf103e3e749b5459e5d059", size = 4672594, upload-time = "2026-04-28T13:14:03.59Z" }, - { url = "https://files.pythonhosted.org/packages/a8/ed/db54b8a8a23533754d2b4fd7befa38097f82c38e532a6b2dc529db3a7cb6/selene_sim-0.2.15-py3-none-win_amd64.whl", hash = "sha256:564e2ab77eebe4e193fdc373c31f24c650302a00877f3735dc1f5d97718e88eb", size = 9602115, upload-time = "2026-04-28T13:14:05.331Z" }, + { url = "https://files.pythonhosted.org/packages/7d/6b/bf8f5775c0d0d56c712955ea591d61c467730a88c9de7694d011adf52dcd/selene_sim-0.2.16-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6f2dd9b201641236381ddc0e2b6a630a994d154026bd9db7da6bec8fc2caf428", size = 4838048, upload-time = "2026-05-22T10:29:55.79Z" }, + { url = "https://files.pythonhosted.org/packages/1d/0e/48a157a1c2f05e783be6725ae22c49b76b5b614e756a7b0016377f128172/selene_sim-0.2.16-py3-none-macosx_11_0_x86_64.whl", hash = "sha256:abed123cb9b38f402b5d90b4163089fbbdb082edbd7a0411937648700986d569", size = 5043163, upload-time = "2026-05-22T10:29:58.46Z" }, + { url = "https://files.pythonhosted.org/packages/6b/4e/ad52baec846567b0b106e1a0024eaff9fd625c4c7fa0695bd9f73b79d300/selene_sim-0.2.16-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:cfad4682d1dc9d468fb3d8d238ce1be28a3a65b0758a8bf21d40e15e9dc10e24", size = 4886685, upload-time = "2026-05-22T10:29:59.877Z" }, + { url = "https://files.pythonhosted.org/packages/a9/fd/f63cb665ea020aebe09e750ae24302285e25bfdba9e354c36064c7064489/selene_sim-0.2.16-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:27afd571454c478b6cfe4b80c4f4092e1047d61cab393e88700b2b5346ea0d93", size = 5065403, upload-time = "2026-05-22T10:30:01.61Z" }, + { url = "https://files.pythonhosted.org/packages/65/f0/b57d7191763ed941d9945d7c26457f7e0facf2791096965e1d5d80fce6b3/selene_sim-0.2.16-py3-none-win_amd64.whl", hash = "sha256:45c4bc668557e7d44e7cac10a4f852eec2471cd29c8dd8e9ad03f9cb7d1914d3", size = 10408993, upload-time = "2026-05-22T10:30:03.804Z" }, ] [[package]] @@ -4449,11 +4515,11 @@ wheels = [ [[package]] name = "soupsieve" -version = "2.8.3" +version = "2.8.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7b/ae/2d9c981590ed9999a0d91755b47fc74f74de286b0f5cee14c9269041e6c4/soupsieve-2.8.3.tar.gz", hash = "sha256:3267f1eeea4251fb42728b6dfb746edc9acaffc4a45b27e19450b676586e8349", size = 118627, upload-time = "2026-01-20T04:27:02.457Z" } +sdist = { url = "https://files.pythonhosted.org/packages/47/2c/0a5f6f8ee0d5589e48c7640213ed5175d52cf540a06725b628cc1a45d6ce/soupsieve-2.8.4.tar.gz", hash = "sha256:e121fd02e975c695e4e9e8774a5ee35d74714b59307868dcc5319ad2d9e3328e", size = 121110, upload-time = "2026-05-24T13:55:57.154Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95", size = 37016, upload-time = "2026-01-20T04:27:01.012Z" }, + { url = "https://files.pythonhosted.org/packages/5e/f5/0c41cb68dcae6b7de4fac4188a3a9589e21fb31df21ea3a2e888db95e6c9/soupsieve-2.8.4-py3-none-any.whl", hash = "sha256:e7e6b0769c8f51ed59acab6e994b00621096cfb1c640a7509295987388fbaf65", size = 37304, upload-time = "2026-05-24T13:55:55.406Z" }, ] [[package]] @@ -4476,7 +4542,7 @@ version = "1.15.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/77/15/0218eacd61cda992daf398bc36daf9830c8b430157a3ac0c06379598d24a/stim-1.15.0.tar.gz", hash = "sha256:95236006859d6754be99629d4fb44788e742e962ac8c59caad421ca088f7350e", size = 853226, upload-time = "2025-05-07T06:19:30.452Z" } wheels = [ @@ -4546,7 +4612,7 @@ wheels = [ [[package]] name = "tket" -version = "0.12.13" +version = "0.12.15" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "hugr" }, @@ -4554,13 +4620,13 @@ dependencies = [ { name = "tket-eccs" }, { name = "tket-exts" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/58/9f/b80e8f9f93e4f6f5af27170a9484f36de1171c939a55b132ad08b43317e7/tket-0.12.13.tar.gz", hash = "sha256:d6b394f3b27e2d9e67438a007592d1c980bee19b0544a7735972aa162543adeb", size = 460359, upload-time = "2025-12-10T18:07:02.743Z" } +sdist = { url = "https://files.pythonhosted.org/packages/43/5d/0d063d5b0f90fe197c68fcda5bee384606a368666abe961cd1227ae1afee/tket-0.12.15.tar.gz", hash = "sha256:1ce7c0877c510810ae91be9c0a7a1b638de8b7f5008f065939aa200ca7cde5a5", size = 464051, upload-time = "2026-01-16T16:40:41.838Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/09/30/a755e7b4365c4c89294f152e342734c3d4e9ad3e2ba5ba9b8bbd2f516b11/tket-0.12.13-cp310-abi3-macosx_13_0_arm64.whl", hash = "sha256:8a0ba6c6e7624ba66b908bba1ef88dc9f8165e147a12c69374c121a392e71acc", size = 10291588, upload-time = "2025-12-10T18:06:51.074Z" }, - { url = "https://files.pythonhosted.org/packages/de/09/22f00a9c639e61619980008f8f50cbc6966c55790f309160915e139f54a3/tket-0.12.13-cp310-abi3-macosx_15_0_x86_64.whl", hash = "sha256:c7ec567d8d13fff896f06540c6f5ba61ef0cd2da2850a21b444850dc9b677de5", size = 11275557, upload-time = "2025-12-10T18:06:53.498Z" }, - { url = "https://files.pythonhosted.org/packages/d0/ee/a25579314ec8058d0e96b3e26d7f6862383d0bcf1d150302bb2be543f416/tket-0.12.13-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f60f2a412da68e34328b101b135f807334cd830e97e9b3992b62e708b14c8b1", size = 13376604, upload-time = "2025-12-10T18:06:55.756Z" }, - { url = "https://files.pythonhosted.org/packages/4c/57/bef91d6aba87ad78778a211255bfd64d9a942ad991b17c64f4bc577fd07c/tket-0.12.13-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:cfff346a679334a8f21035abe8867ef36335ffe28e0edbab965a667310294fd5", size = 14891058, upload-time = "2025-12-10T18:06:58.363Z" }, - { url = "https://files.pythonhosted.org/packages/e3/ae/da9b17cedf6f8080a0edec5654b687ae967aca4d6bd0d5f1806b625fbea7/tket-0.12.13-cp310-abi3-win_amd64.whl", hash = "sha256:fb9b5592f58462aaf8769fda6355350a935c0061a344d2bae0a5ed4a16ea907e", size = 10183807, upload-time = "2025-12-10T18:07:00.726Z" }, + { url = "https://files.pythonhosted.org/packages/f9/6f/1ca616db59681f08db1577eb7592ea5b2f3bcdeab423bea61cff30676a3c/tket-0.12.15-cp310-abi3-macosx_13_0_arm64.whl", hash = "sha256:a802b785a09c58a468cb0d7c605837eed328ac441e1ef9fade0913b3082a1a49", size = 10082145, upload-time = "2026-01-16T16:40:29.858Z" }, + { url = "https://files.pythonhosted.org/packages/8c/37/ba7e9d2b15c7d89ce33930640ac9f7fb86f2c1ffd8d63ba62e5819463c22/tket-0.12.15-cp310-abi3-macosx_15_0_x86_64.whl", hash = "sha256:8cd363d59e5d7bad90baf458bfc231db4e0a36329275e4c5cafb8052f3490c23", size = 11022474, upload-time = "2026-01-16T16:40:33.042Z" }, + { url = "https://files.pythonhosted.org/packages/52/1a/ce41490837bb9e4177104ca6e4f7afa837fbb1a32468bc8b57a2b46361eb/tket-0.12.15-cp310-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:7fda0d91a4281a3a9825676f12c8b8ae466fa6e39fdf9a79b04b3305df34ccad", size = 13088827, upload-time = "2026-01-16T16:21:11.12Z" }, + { url = "https://files.pythonhosted.org/packages/69/39/43dddc3e0143d56af058af612c863b5c3bb09823ed35d915f64a33d4597f/tket-0.12.15-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:730cd5f8103db95ba3387caa2588f1925dfb4473cf3cc383d16b4bea69c6b47f", size = 14678972, upload-time = "2026-01-16T16:40:36.576Z" }, + { url = "https://files.pythonhosted.org/packages/2e/12/7f9fdff4543bc28228b20bb359f2518ec0067b4ab08ddff1fe6b10e5b9eb/tket-0.12.15-cp310-abi3-win_amd64.whl", hash = "sha256:eac19fade07aa07a2967b3775ac65506e197ae1b8723daba8666b1cc27f6abef", size = 9866960, upload-time = "2026-01-16T16:40:39.837Z" }, ] [[package]] @@ -4640,19 +4706,19 @@ wheels = [ [[package]] name = "tornado" -version = "6.5.5" +version = "6.5.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f8/f1/3173dfa4a18db4a9b03e5d55325559dab51ee653763bb8745a75af491286/tornado-6.5.5.tar.gz", hash = "sha256:192b8f3ea91bd7f1f50c06955416ed76c6b72f96779b962f07f911b91e8d30e9", size = 516006, upload-time = "2026-03-10T21:31:02.067Z" } +sdist = { url = "https://files.pythonhosted.org/packages/50/57/6d7303a77ae439d9189108f76c0c4fd89ee5e2cc8387bffb55232565c4ed/tornado-6.5.6.tar.gz", hash = "sha256:9a365179fe8ff6b8766f602c0f67c185d778193e9bdd828b19f0b6ed7764177d", size = 518139, upload-time = "2026-05-27T15:35:54.646Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/59/8c/77f5097695f4dd8255ecbd08b2a1ed8ba8b953d337804dd7080f199e12bf/tornado-6.5.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:487dc9cc380e29f58c7ab88f9e27cdeef04b2140862e5076a66fb6bb68bb1bfa", size = 445983, upload-time = "2026-03-10T21:30:44.28Z" }, - { url = "https://files.pythonhosted.org/packages/ab/5e/7625b76cd10f98f1516c36ce0346de62061156352353ef2da44e5c21523c/tornado-6.5.5-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:65a7f1d46d4bb41df1ac99f5fcb685fb25c7e61613742d5108b010975a9a6521", size = 444246, upload-time = "2026-03-10T21:30:46.571Z" }, - { url = "https://files.pythonhosted.org/packages/b2/04/7b5705d5b3c0fab088f434f9c83edac1573830ca49ccf29fb83bf7178eec/tornado-6.5.5-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e74c92e8e65086b338fd56333fb9a68b9f6f2fe7ad532645a290a464bcf46be5", size = 447229, upload-time = "2026-03-10T21:30:48.273Z" }, - { url = "https://files.pythonhosted.org/packages/34/01/74e034a30ef59afb4097ef8659515e96a39d910b712a89af76f5e4e1f93c/tornado-6.5.5-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:435319e9e340276428bbdb4e7fa732c2d399386d1de5686cb331ec8eee754f07", size = 448192, upload-time = "2026-03-10T21:30:51.22Z" }, - { url = "https://files.pythonhosted.org/packages/be/00/fe9e02c5a96429fce1a1d15a517f5d8444f9c412e0bb9eadfbe3b0fc55bf/tornado-6.5.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3f54aa540bdbfee7b9eb268ead60e7d199de5021facd276819c193c0fb28ea4e", size = 448039, upload-time = "2026-03-10T21:30:53.52Z" }, - { url = "https://files.pythonhosted.org/packages/82/9e/656ee4cec0398b1d18d0f1eb6372c41c6b889722641d84948351ae19556d/tornado-6.5.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:36abed1754faeb80fbd6e64db2758091e1320f6bba74a4cf8c09cd18ccce8aca", size = 447445, upload-time = "2026-03-10T21:30:55.541Z" }, - { url = "https://files.pythonhosted.org/packages/5a/76/4921c00511f88af86a33de770d64141170f1cfd9c00311aea689949e274e/tornado-6.5.5-cp39-abi3-win32.whl", hash = "sha256:dd3eafaaeec1c7f2f8fdcd5f964e8907ad788fe8a5a32c4426fbbdda621223b7", size = 448582, upload-time = "2026-03-10T21:30:57.142Z" }, - { url = "https://files.pythonhosted.org/packages/2c/23/f6c6112a04d28eed765e374435fb1a9198f73e1ec4b4024184f21faeb1ad/tornado-6.5.5-cp39-abi3-win_amd64.whl", hash = "sha256:6443a794ba961a9f619b1ae926a2e900ac20c34483eea67be4ed8f1e58d3ef7b", size = 448990, upload-time = "2026-03-10T21:30:58.857Z" }, - { url = "https://files.pythonhosted.org/packages/b7/c8/876602cbc96469911f0939f703453c1157b0c826ecb05bdd32e023397d4e/tornado-6.5.5-cp39-abi3-win_arm64.whl", hash = "sha256:2c9a876e094109333f888539ddb2de4361743e5d21eece20688e3e351e4990a6", size = 448016, upload-time = "2026-03-10T21:31:00.43Z" }, + { url = "https://files.pythonhosted.org/packages/1b/0d/b4f481e18c5a51864e6d12b9a05ecf72919696680b747c958c3fc1f4fbae/tornado-6.5.6-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:65fcfaafb079435c2c19dc9e07c0f1cf0fa9051759ed0a7d0a3ba7ea7f64919c", size = 447737, upload-time = "2026-05-27T15:35:38.122Z" }, + { url = "https://files.pythonhosted.org/packages/9e/9c/5430c39fcab1144d35860f457b15e9c08b4bc7ac86764354204e983d6183/tornado-6.5.6-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:38bc01b4acacded2de63ae78023548e41ebe6fbed3ec05a796d7ae3ad893887e", size = 445899, upload-time = "2026-05-27T15:35:40.519Z" }, + { url = "https://files.pythonhosted.org/packages/8b/79/fa7e14a2f939c807a8d30619b4eb604eab219601b78792516ebe22d40cf9/tornado-6.5.6-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b942e6a137fda31ff54bf8e6e2c8d1c37f1f50583f3ed53fb840b53b9601d104", size = 448964, upload-time = "2026-05-27T15:35:42.106Z" }, + { url = "https://files.pythonhosted.org/packages/a7/71/bd67d5f5199f937dafe03a49a37989f60f600ff6fef34c79412a829d97bd/tornado-6.5.6-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8666946e70171b8c3f1fc9b7876fac492e84822c4c7f3746f4e8f8bc9ac92a79", size = 449935, upload-time = "2026-05-27T15:35:43.906Z" }, + { url = "https://files.pythonhosted.org/packages/cc/a4/c24388c9cf5b3c3a513b56a158af9f23092c9a2810d789e294310797df21/tornado-6.5.6-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1c34cfab7ad6d104f052f55de06d39bbafc5885cfeb4da688803308dbcfa90b7", size = 449767, upload-time = "2026-05-27T15:35:45.793Z" }, + { url = "https://files.pythonhosted.org/packages/a5/eb/6a07ad550c3f7b37244bd0becdf293ec3d3e961783d8b720a97df50de1b2/tornado-6.5.6-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:385f35e4e22fb52551dfcda4cdc8c30c61c2c001aef5ddad99cdfe116952efd3", size = 449174, upload-time = "2026-05-27T15:35:47.485Z" }, + { url = "https://files.pythonhosted.org/packages/bb/84/3469e098dccdb6763130e06aacd786bb4363fca7b590a55c101ddf34ed30/tornado-6.5.6-cp39-abi3-win32.whl", hash = "sha256:db475f1b67b2809b10bb16264829087724ca8d24fe4ed47f7b8675cae453ef86", size = 450230, upload-time = "2026-05-27T15:35:49.322Z" }, + { url = "https://files.pythonhosted.org/packages/d2/3c/273a04e0b9dd9016f1685cca0c1c8795a71ac88a34a8c889a0b443483226/tornado-6.5.6-cp39-abi3-win_amd64.whl", hash = "sha256:6739bf1e8eb09230f1280ddbd3236f0309db70f2c551a8dbc40f62babdf82f79", size = 450667, upload-time = "2026-05-27T15:35:51.194Z" }, + { url = "https://files.pythonhosted.org/packages/02/98/0cffe22a224f60c5fb1e3aa0b76f9da2e1ca78b0e9545e3d077c68ce60a7/tornado-6.5.6-cp39-abi3-win_arm64.whl", hash = "sha256:2543597b24a695d72338a9a77818362d72387c03ae173f1f169eadc5c91466ac", size = 449690, upload-time = "2026-05-27T15:35:52.902Z" }, ] [[package]] @@ -4678,26 +4744,26 @@ wheels = [ [[package]] name = "types-requests" -version = "2.33.0.20260508" +version = "2.33.0.20260518" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c7/6b/eb226bdd61a982c9a03e02c657fb4ab001733506e6423906ac142331f2e3/types_requests-2.33.0.20260508.tar.gz", hash = "sha256:81b2ae5f0d20967714a6aa5ef9284c05570d7cb06b7de8f2a77b918b63ddd411", size = 23991, upload-time = "2026-05-08T04:50:56.818Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/01/c5a19253fe1ac159159ddf9a3a07cec8bb5e486ec4d9002ad2821da0e5d2/types_requests-2.33.0.20260518.tar.gz", hash = "sha256:df7bd3bfe0ca8402dfb841e7d9be714bb5578203283d66d7dc4ef69343449a5e", size = 24752, upload-time = "2026-05-18T06:07:37.966Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/96/080db0afdf2c5cc5fe512b41354e8d114fe8f65e9510c56ff8dfd40216ce/types_requests-2.33.0.20260508-py3-none-any.whl", hash = "sha256:fa01459cca184229713df03709db46a905325906d27e042cd4fd7ea3d15d3400", size = 20722, upload-time = "2026-05-08T04:50:55.548Z" }, + { url = "https://files.pythonhosted.org/packages/1c/bc/b139710a3b6018f7fb2b9508b35c8af564e61bf2bf4fa619d088f3e16f85/types_requests-2.33.0.20260518-py3-none-any.whl", hash = "sha256:626d697d1adaaff76e2044dc8c5c051d8f21abc157bdfe204a75558076fe0bf0", size = 21391, upload-time = "2026-05-18T06:07:37.044Z" }, ] [[package]] name = "types-tqdm" -version = "4.67.3.20260508" +version = "4.67.3.20260518" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "types-requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c9/d9/add71c78db72e934747f7467ffe7b8fa9f3e9fb38ffa5377d5dd390ac036/types_tqdm-4.67.3.20260508.tar.gz", hash = "sha256:9acfdd179bdf5cc81f7ce7353b5b85eb92b16667bba89ec6c187b5e7ce617986", size = 18141, upload-time = "2026-05-08T04:52:34.866Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/8c/8216f9030027dc96c776b0307cb06da9f3c3756ef00e98f1eb332e04a33c/types_tqdm-4.67.3.20260518.tar.gz", hash = "sha256:1f0cf61de56a76a454fbe2c6cc48d05e483470a38f8a9071893b923e7be47190", size = 18208, upload-time = "2026-05-18T06:08:04.417Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d4/64/e66c98e951deb5985fbff40a11ba0a1f0528505e0734fa6c39534fc0b113/types_tqdm-4.67.3.20260508-py3-none-any.whl", hash = "sha256:0440759cc861a90c1cc98870f2c15ac633c0b6b14651dcafb83f98ab83bad0f4", size = 24546, upload-time = "2026-05-08T04:52:33.995Z" }, + { url = "https://files.pythonhosted.org/packages/56/59/dbe84f71186645b821cf63f71fc746e1455fbce074594a86f486bee8dc89/types_tqdm-4.67.3.20260518-py3-none-any.whl", hash = "sha256:4969f5b97257c6d082c163d7a0715fffe7a83cb6863e108eac45c3fb82305a68", size = 24586, upload-time = "2026-05-18T06:08:03.568Z" }, ] [[package]] @@ -4750,7 +4816,7 @@ wheels = [ [[package]] name = "virtualenv" -version = "21.3.1" +version = "21.4.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "distlib" }, @@ -4759,9 +4825,28 @@ dependencies = [ { name = "python-discovery" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ec/0d/915c02c94d207b85580eb09bffab54438a709e7288524094fe781da526c2/virtualenv-21.3.1.tar.gz", hash = "sha256:c2305bc1fddeec40699b8370d13f8d431b0701f00ce895061ce493aeded4426b", size = 7613791, upload-time = "2026-05-05T01:34:31.402Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/0d/4e93c8e6d1001a75763f87d8f5ecda8ebc7f4aa2153dddfaf4ae8892821a/virtualenv-21.4.2.tar.gz", hash = "sha256:38e6ee0a555615c0ea9da2ac7e9998fe8dc3b911dd33ad8eaad2020957653b0c", size = 7613326, upload-time = "2026-05-31T17:01:22.827Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bf/c4/557dc082be035381b85fdb2b74e21d3d21b57750b74f2b47a32f3a639ff9/virtualenv-21.4.2-py3-none-any.whl", hash = "sha256:854210ca524a1a4d0d744734f4acbc721c3ffe163b85bbf5d56d14d5ae2f0fae", size = 7594079, upload-time = "2026-05-31T17:01:20.735Z" }, +] + +[[package]] +name = "wasmtime" +version = "42.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/cd/1f110419ed006f91624010f4df4da82490220bd5527650284c97fc758a6c/wasmtime-42.0.0.tar.gz", hash = "sha256:90485655d6e541b817a7baa1b3071b4525d03f76bcb6ad04661774f06a3b02d4", size = 117133, upload-time = "2026-02-24T19:12:53.321Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/4f/f71e641e504111a5a74e3a20bc52d01bd86788b22699dd3fee1c63253cf6/virtualenv-21.3.1-py3-none-any.whl", hash = "sha256:d1a71cf58f2f9228fff23a1f6ec15d39785c6b32e03658d104974247145edd35", size = 7594539, upload-time = "2026-05-05T01:34:28.98Z" }, + { url = "https://files.pythonhosted.org/packages/20/cb/f206f7a839d6843b01c041000056bf7aad23cf72fe2333a0c5dad144e0f2/wasmtime-42.0.0-py3-none-android_26_arm64_v8a.whl", hash = "sha256:214e7d294ce1b5adb94f09a870a2ab6759173dc0194bdde74ee4492b477d8392", size = 6829706, upload-time = "2026-02-24T19:12:36.637Z" }, + { url = "https://files.pythonhosted.org/packages/2d/97/d4f5f46eef74e013c3a0caa9b8625bb1c4162e2b9817258596ee6932c019/wasmtime-42.0.0-py3-none-android_26_x86_64.whl", hash = "sha256:cdd9710fad242dde7cb0eacbe48bf902bb1bac6ecbecd3e743c31af463a795c6", size = 7699640, upload-time = "2026-02-24T19:12:38.471Z" }, + { url = "https://files.pythonhosted.org/packages/c6/d2/5b2bf901b0a9b8050d966dff61e353de7cd86dd58679a79e48372ff8b3a6/wasmtime-42.0.0-py3-none-any.whl", hash = "sha256:7a166bd262608806f3295343fcd07ee3e037f931f6d3b0a24ab1cfc7ccc3e8eb", size = 6403639, upload-time = "2026-02-24T19:12:39.777Z" }, + { url = "https://files.pythonhosted.org/packages/3c/6f/a40322bdd55809441bab7e1ac707aa38ced3572904a700f1dfb4b2520dcd/wasmtime-42.0.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:21e3dafd74704de0e7ed7668ab76cc5a9df130b4306befbfcb08ddb29673c784", size = 7483525, upload-time = "2026-02-24T19:12:41.422Z" }, + { url = "https://files.pythonhosted.org/packages/47/04/ef61af9fe9e5c0a8d782c8662302535ee6e6dba1a6929191fa3ea371a491/wasmtime-42.0.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:411bf05df47c8a36c6b31b6012720ac1251b95fdd155e389b25eb6fbbd7e181c", size = 6493225, upload-time = "2026-02-24T19:12:42.9Z" }, + { url = "https://files.pythonhosted.org/packages/44/54/a774313c19c1c0ae2c1897af697c12178904d67911f42c4a9bdddba68640/wasmtime-42.0.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:ca12269ee88aac6b1f64b5f324abf3c6370ff853338d991292f10cb17b906667", size = 7740997, upload-time = "2026-02-24T19:12:44.453Z" }, + { url = "https://files.pythonhosted.org/packages/ed/5d/fae28526b1d42f0365e4fd6c2a212c7c000e47d7320632018fa45735a06e/wasmtime-42.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:78f9353b9fdc2f6e7ed13e28ce0394533f5a62710b75c00434ac82681f738924", size = 6785820, upload-time = "2026-02-24T19:12:45.777Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ae/5c5e96273a36c70753e8ba4db323dd9b1ccf6fcea4ccad99d458ad2ecf13/wasmtime-42.0.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ba317e879aab71c407e7012f4dc10b221c6daf737496c501005612e11d26e8ee", size = 6810021, upload-time = "2026-02-24T19:12:47.453Z" }, + { url = "https://files.pythonhosted.org/packages/46/68/5c129389f67219a90c3ba0dcf85555249bde9797760f2d715bec03bc198a/wasmtime-42.0.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e9ef6dbd1a2cff21694ba64f27b90a7ab0af61a54d911a59682005830683dc8a", size = 7779984, upload-time = "2026-02-24T19:12:48.642Z" }, + { url = "https://files.pythonhosted.org/packages/9a/e5/6650c9e7ad904c9a6730c4b762b1dfed4f7d7b0e981e3624a6ecd7abb7ed/wasmtime-42.0.0-py3-none-win_amd64.whl", hash = "sha256:3a360a1285457021efe24369490cd719996596f2cbe1aa62dae6ad68179cf0f9", size = 6403647, upload-time = "2026-02-24T19:12:50.373Z" }, + { url = "https://files.pythonhosted.org/packages/44/b2/e93046661deef4d8fee2f40080a28e5ff201cc98d4fb1929a46367c34778/wasmtime-42.0.0-py3-none-win_arm64.whl", hash = "sha256:8caa13a6ee264969449c008da1dcb8f9f6c954800853527714e7fcddbdda9166", size = 5397896, upload-time = "2026-02-24T19:12:51.639Z" }, ] [[package]] From ec489e33d6b7fc50aa3c8496cacdc3b0e3a37a56 Mon Sep 17 00:00:00 2001 From: Ciaran Ryan-Anderson Date: Mon, 1 Jun 2026 11:17:54 -0600 Subject: [PATCH 07/26] Refresh generated lockfiles --- Cargo.lock | 12 ++++++------ uv.lock | 36 ++++++++++++++++++------------------ 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2286043f7..99311349c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -619,9 +619,9 @@ dependencies = [ [[package]] name = "capnp" -version = "0.25.4" +version = "0.25.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63da65e5e9ffc3b8f993d4ad222a548152549351a643f6b850a7773cb6ff2809" +checksum = "1cfd2485d4b36ac9c5aa6572d7d35daa63a5b34f517627d6c34d068e616e4a73" dependencies = [ "embedded-io 0.7.1", ] @@ -5614,9 +5614,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" dependencies = [ "openssl-probe", "rustls-pki-types", @@ -6838,9 +6838,9 @@ checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-segmentation" -version = "1.13.2" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" [[package]] name = "unicode-width" diff --git a/uv.lock b/uv.lock index 99d65a64a..82c34b352 100644 --- a/uv.lock +++ b/uv.lock @@ -845,30 +845,30 @@ wheels = [ [[package]] name = "cupy-cuda13x" -version = "14.1.0" +version = "14.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cuda-pathfinder", marker = "python_full_version >= '3.11'" }, { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/18/e9/19185f325905eada94ed96f649a2b92336dcb6caa62a5adac514bb2f0de5/cupy_cuda13x-14.1.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:80f169592f5bbf7cb411ce4eeda315d06addb1a3cb14ed668e9d2ba287e3e4d4", size = 72670820, upload-time = "2026-05-23T01:11:17.547Z" }, - { url = "https://files.pythonhosted.org/packages/25/0a/0796a2465c86b7656e7b4e0aaa2b5e17f1ae2d088db1a43a1ffd83e9a468/cupy_cuda13x-14.1.0-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:de745ef499998d44e96dfa9be1f442047299bbc5d9c7a0738e378375a18ed7c5", size = 68695023, upload-time = "2026-05-23T01:11:21.78Z" }, - { url = "https://files.pythonhosted.org/packages/1c/55/ac9107d7b0d58fcf671b0b32a7905709b7c767abd6d91256648498fb2831/cupy_cuda13x-14.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:49f026a1526f00adbf7b56ee28e986725e5ce1e1cd455f2a1a56ff74e5049e28", size = 35289284, upload-time = "2026-05-23T01:11:24.926Z" }, - { url = "https://files.pythonhosted.org/packages/20/a0/b7dc0aff6097b2fb19535715fe1b98a113bdddf3eea56ac1acd878c77f43/cupy_cuda13x-14.1.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:dfc24cceaa8234272159419f2b0763c78968909e1c31120ba83c22fdca91872f", size = 73971015, upload-time = "2026-05-23T01:11:28.359Z" }, - { url = "https://files.pythonhosted.org/packages/4a/31/e6a8e5786d5038417963d50041c6dbb1b0376091f6c170e036a8997120c2/cupy_cuda13x-14.1.0-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:079d99f6c492f24692f7904c013fc164c2b3ce605b2036293d0f2f6ae31dc3a8", size = 70032754, upload-time = "2026-05-23T01:11:32.001Z" }, - { url = "https://files.pythonhosted.org/packages/64/6b/3d4a6d766a055e1dfb36d66655c818ae5b999ba12d6723966ee6c4eb4ba4/cupy_cuda13x-14.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:1ee0839c5bfa801cd6f5181fced40d38ca90538f4723e17614fccd47292c4450", size = 35290568, upload-time = "2026-05-23T01:11:36.073Z" }, - { url = "https://files.pythonhosted.org/packages/23/7e/21afe0ab60bd88acbfa0daa6e1d7beff31fc9ec72702173520f58236daec/cupy_cuda13x-14.1.0-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:9b83ce4965466bf2bf99aaa6ce594c0547ca696f451676cd1d46124443476fb0", size = 73277053, upload-time = "2026-05-23T01:11:40.406Z" }, - { url = "https://files.pythonhosted.org/packages/2c/2e/d3780ce0a8d951e632349bb989d8536e77e03e8ff1c419922ed933f3ba55/cupy_cuda13x-14.1.0-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:3d3a64a850f5560239b942a833a6498e2d9a5fff4efbb6e93cddfa8c4f53b9cf", size = 69532518, upload-time = "2026-05-23T01:11:44.38Z" }, - { url = "https://files.pythonhosted.org/packages/99/2d/5faee3a1626deac5feef290fd52460ad57460009e9738ec4f0e62d40af5b/cupy_cuda13x-14.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:9e42ff785aec56e76ffc05fc0d92f7eab2a970dc7c377ad61288a98aa10e7db8", size = 35192581, upload-time = "2026-05-23T01:11:47.759Z" }, - { url = "https://files.pythonhosted.org/packages/04/8a/31c58ffa8e1780c8f15492018997d5fb3548427f5fa0e6327becf26f00c6/cupy_cuda13x-14.1.0-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:42f85f692a589b92a86627113e1072c534cc9d9047433b4291b8bd7b49fb238a", size = 72812202, upload-time = "2026-05-23T01:11:51.015Z" }, - { url = "https://files.pythonhosted.org/packages/98/41/be34e911811a0369e3e66b1b618dfccdea1f84ad6a2cc17f146ce9095e99/cupy_cuda13x-14.1.0-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:eef76f0647af5a9bfe3d0bac641f201deb5f15a644f4b13a2e68c0c62e6808fe", size = 69094718, upload-time = "2026-05-23T01:11:57.103Z" }, - { url = "https://files.pythonhosted.org/packages/0a/c1/c92b4c9c2c561c1298dfad2e3dbb75e527ac1a15d567d8fb868fc277c80e/cupy_cuda13x-14.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:18338008d428bf04dcd73ab2489c6f90c39b7ff439ab2b609115b9bb0e16e0ec", size = 35171775, upload-time = "2026-05-23T01:12:00.57Z" }, - { url = "https://files.pythonhosted.org/packages/24/b4/8963aced61d836417ca681d7cd1b6b27916ed877a01f3adf7c902bd8f392/cupy_cuda13x-14.1.0-cp314-cp314-manylinux2014_aarch64.whl", hash = "sha256:fa77dc442a166e784e28e5c7dd4e1bb4b2ac54a2ec55c59c1af3c0ed27e14f69", size = 72680065, upload-time = "2026-05-23T01:12:03.979Z" }, - { url = "https://files.pythonhosted.org/packages/8b/a8/2ae8d8235a236564e65a73812ee0bf4c1afe96b7104f754f100832f015e9/cupy_cuda13x-14.1.0-cp314-cp314-manylinux2014_x86_64.whl", hash = "sha256:7824fc7757bac2d91d6c810c4f5376359c1eeaf5d37c2625c4a670705f3d9f36", size = 68432300, upload-time = "2026-05-23T01:12:07.777Z" }, - { url = "https://files.pythonhosted.org/packages/ee/12/8e1d2b9efda12e8ad5c648f1fc289454b7c6210c2f4d9e99d7663178d8e1/cupy_cuda13x-14.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:f3c9f5e61fefc7920bcd3da9818679ea8f9319cca080dd88118f463a2ca08e41", size = 35323531, upload-time = "2026-05-23T01:12:11.024Z" }, - { url = "https://files.pythonhosted.org/packages/f6/bc/6cceec523fd467fc6259c4c394d87a9e7e3b8f011685da028d9862bf8497/cupy_cuda13x-14.1.0-cp314-cp314t-manylinux2014_aarch64.whl", hash = "sha256:e5b2a0dcaa5fb27faf034f5e3d271eaa13c4a5351e2c6dec925a866c210f3605", size = 72984031, upload-time = "2026-05-23T01:12:14.388Z" }, - { url = "https://files.pythonhosted.org/packages/d3/43/180777ccc0f85ce4469f3e6e615c471968f482fed85827410090adf40523/cupy_cuda13x-14.1.0-cp314-cp314t-manylinux2014_x86_64.whl", hash = "sha256:69b314f0085d7ad46a671338e62b3f35270c144c31df8c443c0341b97a905980", size = 68662879, upload-time = "2026-05-23T01:12:18.04Z" }, + { url = "https://files.pythonhosted.org/packages/6a/ce/71352ce895400844df26553e3d723dd64754d19b657056fc52553ad6b725/cupy_cuda13x-14.1.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:ae3a75a7e9510fb03251420d85b4efa48187ee5fd48b08c88b7a0f0620bd779a", size = 72670263, upload-time = "2026-06-01T04:53:40.802Z" }, + { url = "https://files.pythonhosted.org/packages/5f/24/6143d51d9fbcd1aad63759be7840f6e0e4890bf7bfa1173a39689031cf33/cupy_cuda13x-14.1.1-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:223a9e1e6db911002ca5b94c348a3ed5c1d7869ba4dd6524ab3d0263123b2248", size = 68695025, upload-time = "2026-06-01T04:53:46.1Z" }, + { url = "https://files.pythonhosted.org/packages/c1/02/1b3dadb01306b3824c72b6e7da1d7cce5e2b3b7fcf901ce00364ff2a3059/cupy_cuda13x-14.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:2a656fbcdc1ca1c09b039f9ec6540e8d18e77ed66e92ae275a82b4d849bcc185", size = 35291771, upload-time = "2026-06-01T04:53:49.984Z" }, + { url = "https://files.pythonhosted.org/packages/35/a0/33ba64feccedf661960057a9967e2e623853f4757ba5be2f04f6503a4ac0/cupy_cuda13x-14.1.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:3d12e1020066a699f5e27f4c5597167dca042704c0ed1db74066c32c0c2dbfb1", size = 73970864, upload-time = "2026-06-01T04:53:53.903Z" }, + { url = "https://files.pythonhosted.org/packages/c1/99/d1add95f15f3ad0dec954688c012e97f991363c4a74ca970fc0ddb217534/cupy_cuda13x-14.1.1-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:424caa906c16f31328558151dd5e0596891eda7644f40ca9348c3eb14af084d1", size = 70032752, upload-time = "2026-06-01T04:54:02.944Z" }, + { url = "https://files.pythonhosted.org/packages/30/48/7a9fbc1184bb6288e173903984efbe2dbf9a29308b810d26ecac963d3690/cupy_cuda13x-14.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:0b9e6f6110cbf039dd75159f8adc99c4fb84cbcabf3025c6607e3864b09ba469", size = 35289510, upload-time = "2026-06-01T04:54:06.31Z" }, + { url = "https://files.pythonhosted.org/packages/8e/df/33e14f4648910db90d9aa3ac03c7012eec2e5d05a7ab69ec74a7864d6354/cupy_cuda13x-14.1.1-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:9226f3279c64aa6f07a79ba0081f3275a99a36c2db3f836f4b687dd8d77fa8bc", size = 73276230, upload-time = "2026-06-01T04:54:10.208Z" }, + { url = "https://files.pythonhosted.org/packages/ad/a7/7105dad3285c35451aae7efcc0a09e5b114de25065e3971552d906354e3e/cupy_cuda13x-14.1.1-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:a57c3eda202ffd70e34b9031a88f17c810a75e816398b4028360027cb3a4cd4d", size = 69532519, upload-time = "2026-06-01T04:54:14.589Z" }, + { url = "https://files.pythonhosted.org/packages/f3/4b/6f20833eedbfd1d44925780a2fdffaf72b3c78145a228359c7f2d534e0a8/cupy_cuda13x-14.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:c0ce59e54da561eeaebef0460242cfd159518d63b388d9d566d198d1d7614634", size = 35192036, upload-time = "2026-06-01T04:54:17.885Z" }, + { url = "https://files.pythonhosted.org/packages/e0/0f/149a9e6c561f44e6522be6c3fdacdaed17d8fd5a1651004a0782ce045502/cupy_cuda13x-14.1.1-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:cc671cb766f1c42cb6eed3bf27e9da6092721bcb3d77e09aef28e2f5b089ea38", size = 72811428, upload-time = "2026-06-01T04:54:22.432Z" }, + { url = "https://files.pythonhosted.org/packages/80/f6/f4cd043ad8c8e18410e9cea73a8de8778a0a05c705b8505729a794758bf1/cupy_cuda13x-14.1.1-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:ff4526725c1398ea19d578044737aa24859b08e1f469aba0ca45dfd6f9aa505d", size = 69094726, upload-time = "2026-06-01T04:54:26.424Z" }, + { url = "https://files.pythonhosted.org/packages/54/64/f2b60a0f4d73820d774906bf8684df0c8494820d78b3494121c7ec57ee25/cupy_cuda13x-14.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:54949b4e4f90e3588eeef25b55037f156578364e4835eb9ae1b93e236f2e58d5", size = 35171412, upload-time = "2026-06-01T04:54:31.313Z" }, + { url = "https://files.pythonhosted.org/packages/fd/ca/9bc8d6d40003640653161e2dba78740f2055df8bb48e216eed5584cecc3c/cupy_cuda13x-14.1.1-cp314-cp314-manylinux2014_aarch64.whl", hash = "sha256:8b068f6958811bc50d81bd0a83267ec4cffc3d7e842120b9646ec547f5a69298", size = 72680680, upload-time = "2026-06-01T04:54:35.077Z" }, + { url = "https://files.pythonhosted.org/packages/e8/2d/8c79c577e9b35c60e5600217d1a849ab76c18a289f99a4145aa85388a531/cupy_cuda13x-14.1.1-cp314-cp314-manylinux2014_x86_64.whl", hash = "sha256:39f8aeeb5bad16603956f8ec00094e058a9dd5db92ab514975686750363c3692", size = 68432306, upload-time = "2026-06-01T04:54:38.882Z" }, + { url = "https://files.pythonhosted.org/packages/c4/03/8d4d77138eb5f60a2a1fb5484a89dad2bc6bc6283682179994d722cfb4b5/cupy_cuda13x-14.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:dae6f77edfe96ab8e014d3e589dca33906d212fdf8f72e66850d4612bc031783", size = 35323057, upload-time = "2026-06-01T04:54:42.541Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c4/eb46fec30fffd7a57a80cc7f027e50a1d530b332e81362a8b874905da2d1/cupy_cuda13x-14.1.1-cp314-cp314t-manylinux2014_aarch64.whl", hash = "sha256:509f378c865c0b6bc9ed1dfe9e94b08b4511e9865363fdac55f9d66fe341e91d", size = 72984246, upload-time = "2026-06-01T04:54:46.464Z" }, + { url = "https://files.pythonhosted.org/packages/24/59/e0098ca2e1ba99a0086ad4b515b2d7dbb8ae0f13b9721c02eed0db4adec5/cupy_cuda13x-14.1.1-cp314-cp314t-manylinux2014_x86_64.whl", hash = "sha256:6c0d19789e9f9515988d51dffaff70af8b3dcdddcdf2fbafa9eff08df7be0a51", size = 68662887, upload-time = "2026-06-01T04:54:50.932Z" }, ] [[package]] From 96b1ffe22676b49bf113ad4eb9e6a59a3b881266 Mon Sep 17 00:00:00 2001 From: Ciaran Ryan-Anderson Date: Tue, 2 Jun 2026 07:35:27 -0600 Subject: [PATCH 08/26] Fix lint check issues --- .../tests/guppy/test_hugr_compiler_parity.py | 4 +- scripts/native_bench/bench_pecos/Cargo.lock | 549 ++++++++---------- 2 files changed, 255 insertions(+), 298 deletions(-) diff --git a/python/quantum-pecos/tests/guppy/test_hugr_compiler_parity.py b/python/quantum-pecos/tests/guppy/test_hugr_compiler_parity.py index 3c79feda8..0cdddf93f 100644 --- a/python/quantum-pecos/tests/guppy/test_hugr_compiler_parity.py +++ b/python/quantum-pecos/tests/guppy/test_hugr_compiler_parity.py @@ -108,9 +108,7 @@ def compare_compilers( # LLVM 21 can peel runtime loops, duplicating static call sites while # preserving the dynamic behavior. In that case exact call-site # multiplicity is not a robust parity signal. - if selene_set == rust_set and ( - "llvm.loop.peeled.count" in selene_ir or "llvm.loop.peeled.count" in rust_ir - ): + if selene_set == rust_set and ("llvm.loop.peeled.count" in selene_ir or "llvm.loop.peeled.count" in rust_ir): return True, "QIS call set matches; static call counts differ only after LLVM loop peeling" only_selene = selene_counts - rust_counts diff --git a/scripts/native_bench/bench_pecos/Cargo.lock b/scripts/native_bench/bench_pecos/Cargo.lock index 7a6893b8c..fd27d0964 100644 --- a/scripts/native_bench/bench_pecos/Cargo.lock +++ b/scripts/native_bench/bench_pecos/Cargo.lock @@ -120,15 +120,15 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "aws-lc-rs" -version = "1.16.2" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a054912289d18629dc78375ba2c3726a3afe3ff71b4edba9dedfca0e3446d1fc" +checksum = "5ec2f1fc3ec205783a5da9a7e6c1509cc69dedf09a1949e412c1e18469326d00" dependencies = [ "aws-lc-sys", "zeroize", @@ -136,9 +136,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.39.1" +version = "0.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a25cf98105baa966497416dbd42565ce3a8cf8dbfd59803ec9ad46f3126399" +checksum = "1a2f9779ce85b93ab6170dd940ad0169b5766ff848247aff13bb788b832fe3f4" dependencies = [ "cc", "cmake", @@ -178,7 +178,7 @@ dependencies = [ "quote", "regex", "rustc-hash 2.1.2", - "shlex", + "shlex 1.3.0", "syn", ] @@ -214,9 +214,9 @@ checksum = "b71798fca2c1fe1086445a7258a4bc81e6e49dcd24c8d0dd9a1e57395b603f51" [[package]] name = "bitflags" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" [[package]] name = "bitvec" @@ -260,9 +260,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.20.2" +version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] name = "bytemuck" @@ -316,9 +316,9 @@ dependencies = [ [[package]] name = "cargo-platform" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87a0c0e6148f11f01f32650a2ea02d532b2ad4e81d8bd41e6e565b5adc5e6082" +checksum = "dd0061da739915fae12ea00e16397555ed4371a6bb285431aab930f61b0aa4ba" dependencies = [ "serde", "serde_core", @@ -335,27 +335,21 @@ dependencies = [ "semver", "serde", "serde_json", - "thiserror 2.0.18", + "thiserror", ] [[package]] name = "cc" -version = "1.2.60" +version = "1.2.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20" +checksum = "556e016178bb5662a08681bbe0f00f8e17631781a4dfc8c45e466e4b185ec27f" dependencies = [ "find-msvc-tools", "jobserver", "libc", - "shlex", + "shlex 2.0.1", ] -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - [[package]] name = "cexpr" version = "0.6.0" @@ -385,7 +379,7 @@ checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" dependencies = [ "cfg-if", "cpufeatures 0.3.0", - "rand_core 0.10.0", + "rand_core 0.10.1", ] [[package]] @@ -495,9 +489,9 @@ dependencies = [ [[package]] name = "crc-catalog" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" +checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853" [[package]] name = "crc32fast" @@ -551,9 +545,9 @@ dependencies = [ [[package]] name = "crypto-common" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77727bb15fa921304124b128af125e7e3b968275d1b108b379190264f4423710" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" dependencies = [ "hybrid-array", ] @@ -579,13 +573,13 @@ dependencies = [ [[package]] name = "digest" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4850db49bf08e663084f7fb5c87d202ef91a3907271aff24a94eb97ff039153c" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" dependencies = [ "block-buffer 0.12.0", "const-oid", - "crypto-common 0.2.1", + "crypto-common 0.2.2", ] [[package]] @@ -621,9 +615,9 @@ dependencies = [ [[package]] name = "displaydoc" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" dependencies = [ "proc-macro2", "quote", @@ -656,9 +650,9 @@ checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "either" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" [[package]] name = "env_filter" @@ -707,13 +701,12 @@ checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" [[package]] name = "filetime" -version = "0.2.27" +version = "0.2.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98844151eee8917efc50bd9e8318cb963ae8b297431495d3f758616ea5c57db" +checksum = "5c287a33c7f0a620c38e641e7f60827713987b3c0f26e8ddc9462cc69cf75759" dependencies = [ "cfg-if", "libc", - "libredox", ] [[package]] @@ -878,7 +871,7 @@ dependencies = [ "cfg-if", "libc", "r-efi 6.0.0", - "rand_core 0.10.0", + "rand_core 0.10.1", "wasip2", "wasip3", ] @@ -955,7 +948,7 @@ dependencies = [ "hashbrown 0.16.1", "log", "presser", - "thiserror 2.0.18", + "thiserror", "windows", ] @@ -1016,9 +1009,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.17.0" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" [[package]] name = "heck" @@ -1034,9 +1027,9 @@ checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" [[package]] name = "http" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +checksum = "8be7462df143984c4598a256ef469b251d7d7f9e271135073e78fc535414f3d0" dependencies = [ "bytes", "itoa", @@ -1073,18 +1066,18 @@ checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "hybrid-array" -version = "0.4.10" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3944cf8cf766b40e2a1a333ee5e9b563f854d5fa49d6a8ca2764e97c6eddb214" +checksum = "9155a582abd142abc056962c29e3ce5ff2ad5469f4246b537ed42c5deba857da" dependencies = [ "typenum", ] [[package]] name = "hyper" -version = "1.9.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" +checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498" dependencies = [ "atomic-waker", "bytes", @@ -1102,15 +1095,14 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.7" +version = "0.27.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" dependencies = [ "http", "hyper", "hyper-util", "rustls", - "rustls-pki-types", "tokio", "tokio-rustls", "tower-service", @@ -1240,9 +1232,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" dependencies = [ "icu_normalizer", "icu_properties", @@ -1255,7 +1247,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.17.0", + "hashbrown 0.17.1", "rayon", "serde", "serde_core", @@ -1267,16 +1259,6 @@ version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" -[[package]] -name = "iri-string" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25e659a4bb38e810ebc252e53b5814ff908a8c58c2a9ce2fae1bbec24cbf4e20" -dependencies = [ - "memchr", - "serde", -] - [[package]] name = "is_terminal_polyfill" version = "1.70.2" @@ -1309,9 +1291,9 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jiff" -version = "0.2.23" +version = "0.2.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a3546dc96b6d42c5f24902af9e2538e82e39ad350b0c766eb3fbf2d8f3d8359" +checksum = "4603d3033e49e2b0e31229fcab20a5d40089c607d975cd9c80551dc69eed9102" dependencies = [ "jiff-static", "log", @@ -1322,9 +1304,9 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.23" +version = "0.2.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a8c8b344124222efd714b73bb41f8b5120b27a7cc1c75593a6ff768d9d05aa4" +checksum = "782d32378dddf207193ac91cefb848ad41abb58195c95168e1291227a0832b47" dependencies = [ "proc-macro2", "quote", @@ -1333,18 +1315,32 @@ dependencies = [ [[package]] name = "jni" -version = "0.21.1" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" dependencies = [ - "cesu8", "cfg-if", "combine", - "jni-sys 0.3.1", + "jni-macros", + "jni-sys 0.4.1", "log", - "thiserror 1.0.69", + "simd_cesu8", + "thiserror", "walkdir", - "windows-sys 0.45.0", + "windows-link", +] + +[[package]] +name = "jni-macros" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "simd_cesu8", + "syn", ] [[package]] @@ -1387,9 +1383,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.95" +version = "0.3.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca" +checksum = "142bc4740e452c1e57ade0cbc129f139c9093e354346f0872ef985f4f5cf5f11" dependencies = [ "cfg-if", "futures-util", @@ -1422,15 +1418,15 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libbz2-rs-sys" -version = "0.2.2" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c4a545a15244c7d945065b5d392b2d2d7f21526fba56ce51467b06ed445e8f7" +checksum = "34b357333733e8260735ba5894eb928c02ecc69c78715f01a8019e7fa7f2db4c" [[package]] name = "libc" -version = "0.2.184" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libloading" @@ -1460,14 +1456,11 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" +checksum = "f02ab6bace2054fb888a3c16f990117b579d14a3088e472d63c6011fa185c9d3" dependencies = [ - "bitflags", "libc", - "plain", - "redox_syscall 0.7.4", ] [[package]] @@ -1499,9 +1492,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.29" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +checksum = "616ec5685824bcc94416c6d4a7a446eea774a31efd7062c8480ba6fd06d7a6e5" [[package]] name = "lru-slab" @@ -1541,9 +1534,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.8.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" +checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8" [[package]] name = "minimal-lexical" @@ -1563,9 +1556,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" +checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" dependencies = [ "libc", "wasi", @@ -1574,9 +1567,9 @@ dependencies = [ [[package]] name = "naga" -version = "29.0.1" +version = "29.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2630921705b9b01dcdd0b6864b9562ca3c1951eecd0f0c4f5f04f61e412647" +checksum = "0dd91265cc2454558f659b3b4b9640f0ddb8cc6521277f166b8a8c181c898079" dependencies = [ "arrayvec", "bit-set 0.9.1", @@ -1594,7 +1587,7 @@ dependencies = [ "once_cell", "rustc-hash 1.1.0", "spirv", - "thiserror 2.0.18", + "thiserror", "unicode-ident", ] @@ -1710,9 +1703,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" [[package]] name = "num-integer" @@ -1857,7 +1850,7 @@ checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.18", + "redox_syscall", "smallvec", "windows-link", ] @@ -1876,11 +1869,12 @@ dependencies = [ "sevenz-rust", "sha2 0.11.0", "tar", - "thiserror 2.0.18", + "thiserror", "toml", "toml_edit", "xz2", "zip", + "zstd", ] [[package]] @@ -1892,9 +1886,9 @@ dependencies = [ "num-traits", "pecos-random", "rand 0.10.1", - "rand_core 0.10.0", + "rand_core 0.10.1", "smallvec", - "thiserror 2.0.18", + "thiserror", ] [[package]] @@ -1908,7 +1902,7 @@ dependencies = [ "pecos-core", "pecos-cuquantum-sys", "pecos-simulators", - "thiserror 2.0.18", + "thiserror", ] [[package]] @@ -1922,7 +1916,7 @@ dependencies = [ "libloading 0.9.0", "log", "pecos-build", - "thiserror 2.0.18", + "thiserror", ] [[package]] @@ -1937,7 +1931,7 @@ dependencies = [ "pecos-simulators", "pollster", "rand 0.10.1", - "rand_core 0.10.0", + "rand_core 0.10.1", "serde_json", "wgpu", ] @@ -1977,7 +1971,7 @@ name = "pecos-random" version = "0.2.0-dev.0" dependencies = [ "rand 0.10.1", - "rand_core 0.10.0", + "rand_core 0.10.1", "rapidhash", "wide", ] @@ -2023,15 +2017,9 @@ checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "pkg-config" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - -[[package]] -name = "plain" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" [[package]] name = "pollster" @@ -2047,9 +2035,9 @@ checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "portable-atomic-util" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "091397be61a01d4be58e7841595bd4bfedb15f1cd54977d79b8271e94ed799a3" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" dependencies = [ "portable-atomic", ] @@ -2116,9 +2104,9 @@ dependencies = [ [[package]] name = "profiling" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" +checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5" [[package]] name = "quinn" @@ -2134,7 +2122,7 @@ dependencies = [ "rustc-hash 2.1.2", "rustls", "socket2", - "thiserror 2.0.18", + "thiserror", "tokio", "tracing", "web-time", @@ -2150,13 +2138,13 @@ dependencies = [ "bytes", "getrandom 0.3.4", "lru-slab", - "rand 0.9.3", + "rand 0.9.4", "ring", "rustc-hash 2.1.2", "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.18", + "thiserror", "tinyvec", "tracing", "web-time", @@ -2205,9 +2193,9 @@ checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" [[package]] name = "rand" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ec095654a25171c2124e9e3393a930bddbffdc939556c914957a4c3e0a87166" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ "rand_chacha", "rand_core 0.9.5", @@ -2221,7 +2209,7 @@ checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" dependencies = [ "chacha20", "getrandom 0.4.2", - "rand_core 0.10.0", + "rand_core 0.10.1", ] [[package]] @@ -2245,9 +2233,9 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c8d0fd677905edcbeedbf2edb6494d676f0e98d54d5cf9bda0b061cb8fb8aba" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" [[package]] name = "rand_distr" @@ -2256,7 +2244,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463" dependencies = [ "num-traits", - "rand 0.9.3", + "rand 0.9.4", ] [[package]] @@ -2310,9 +2298,9 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] name = "rayon" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" dependencies = [ "either", "rayon-core", @@ -2348,15 +2336,6 @@ dependencies = [ "bitflags", ] -[[package]] -name = "redox_syscall" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f450ad9c3b1da563fb6948a8e0fb0fb9269711c9c73d9ea1de5058c79c8d643a" -dependencies = [ - "bitflags", -] - [[package]] name = "redox_users" version = "0.5.2" @@ -2365,7 +2344,7 @@ checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ "getrandom 0.2.17", "libredox", - "thiserror 2.0.18", + "thiserror", ] [[package]] @@ -2405,9 +2384,9 @@ checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" [[package]] name = "reqwest" -version = "0.13.2" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3f43e3283ab1488b624b44b0e988d0acea0b3214e694730a055cb6b2efa801" +checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" dependencies = [ "base64", "bytes", @@ -2466,6 +2445,15 @@ version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + [[package]] name = "rustix" version = "1.1.4" @@ -2481,9 +2469,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.37" +version = "0.23.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" +checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b" dependencies = [ "aws-lc-rs", "once_cell", @@ -2495,9 +2483,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" dependencies = [ "openssl-probe", "rustls-pki-types", @@ -2507,9 +2495,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.14.0" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" +checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" dependencies = [ "web-time", "zeroize", @@ -2517,9 +2505,9 @@ dependencies = [ [[package]] name = "rustls-platform-verifier" -version = "0.6.2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" +checksum = "26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0" dependencies = [ "core-foundation", "core-foundation-sys", @@ -2574,7 +2562,7 @@ dependencies = [ "num-traits", "petgraph", "priority-queue", - "rand 0.9.3", + "rand 0.9.4", "rand_distr", "rand_pcg", "rayon", @@ -2679,9 +2667,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.149" +version = "1.0.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" dependencies = [ "itoa", "memchr", @@ -2735,7 +2723,7 @@ checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" dependencies = [ "cfg-if", "cpufeatures 0.3.0", - "digest 0.11.2", + "digest 0.11.3", ] [[package]] @@ -2744,6 +2732,12 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + [[package]] name = "simba" version = "0.10.0" @@ -2762,6 +2756,22 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" +[[package]] +name = "simd_cesu8" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94f90157bb87cddf702797c5dadfa0be7d266cdf49e22da2fcaa32eff75b2c33" +dependencies = [ + "rustc_version", + "simdutf8", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + [[package]] name = "slab" version = "0.4.12" @@ -2785,9 +2795,9 @@ checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" +checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" dependencies = [ "libc", "windows-sys 0.61.2", @@ -2859,9 +2869,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tar" -version = "0.4.45" +version = "0.4.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22692a6476a21fa75fdfc11d452fda482af402c008cdbaf3476414e122040973" +checksum = "3f6221d9a6003c78398e3b239969f352578258df48c8eb051caadae0015bc840" dependencies = [ "filetime", "libc", @@ -2877,33 +2887,13 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - [[package]] name = "thiserror" version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ - "thiserror-impl 2.0.18", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn", + "thiserror-impl", ] [[package]] @@ -2974,9 +2964,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.51.1" +version = "1.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f66bf9585cda4b724d3e78ab34b73fb2bbaba9011b9bfdf69dc836382ea13b8c" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" dependencies = [ "bytes", "libc", @@ -3065,20 +3055,20 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.8" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" dependencies = [ "bitflags", "bytes", "futures-util", "http", "http-body", - "iri-string", "pin-project-lite", "tower", "tower-layer", "tower-service", + "url", ] [[package]] @@ -3126,9 +3116,9 @@ checksum = "8e28f89b80c87b8fb0cf04ab448d5dd0dd0ade2f8891bae878de66a75a28600e" [[package]] name = "typenum" -version = "1.19.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" [[package]] name = "unicode-ident" @@ -3211,11 +3201,11 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.2+wasi-0.2.9" +version = "1.0.3+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.57.1", ] [[package]] @@ -3224,14 +3214,14 @@ version = "0.4.0+wasi-0.3.0-rc-2026-01-06" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.51.0", ] [[package]] name = "wasm-bindgen" -version = "0.2.118" +version = "0.2.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89" +checksum = "3ed04576f974d2b2fba0f38c51dbc5518011e38c36bf1143164be765528fd409" dependencies = [ "cfg-if", "once_cell", @@ -3242,9 +3232,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.68" +version = "0.4.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f371d383f2fb139252e0bfac3b81b265689bf45b6874af544ffa4c975ac1ebf8" +checksum = "9473dbd2991ae90b6291c3c32c30c6187ac49aa32f9905d1cce280ec1e110b0f" dependencies = [ "js-sys", "wasm-bindgen", @@ -3252,9 +3242,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.118" +version = "0.2.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed" +checksum = "916151b09da36bd82f6615cbf3a419e2f0ba23a03c6160e8e92eb6bd4aa1dec6" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3262,9 +3252,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.118" +version = "0.2.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904" +checksum = "299047362ccbfce148b67ab7e73349f77748e00c8296f9542adfad2ad82c5c5e" dependencies = [ "bumpalo", "proc-macro2", @@ -3275,9 +3265,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.118" +version = "0.2.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129" +checksum = "9a929b2c61f11ba3e9bc35b50c1f25cb38e0e892c0c231ae2b8cf78d5dad4437" dependencies = [ "unicode-ident", ] @@ -3330,9 +3320,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.95" +version = "0.3.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f2dfbb17949fa2088e5d39408c48368947b86f7834484e87b73de55bc14d97d" +checksum = "6d621441cfc37b84979402712047321980c178f299193a3589d05b99e8763436" dependencies = [ "js-sys", "wasm-bindgen", @@ -3350,18 +3340,18 @@ dependencies = [ [[package]] name = "webpki-root-certs" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "804f18a4ac2676ffb4e8b5b5fa9ae38af06df08162314f96a68d2a363e21a8ca" +checksum = "f31141ce3fc3e300ae89b78c0dd67f9708061d1d2eda54b8209346fd6be9a92c" dependencies = [ "rustls-pki-types", ] [[package]] name = "wgpu" -version = "29.0.1" +version = "29.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c239a9a747bbd379590985bac952c2e53cb19873f7072b3370c6a6a8e06837" +checksum = "bb3feacc458f7bee8bc1737149b42b6c731aa461039a4264a67bb6681646b250" dependencies = [ "arrayvec", "bitflags", @@ -3389,9 +3379,9 @@ dependencies = [ [[package]] name = "wgpu-core" -version = "29.0.1" +version = "29.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e80ac6cf1895df6342f87d975162108f9d98772a0d74bc404ab7304ac29469e" +checksum = "02da3ad1b568337f25513b317870960ef87073ea0945502e44b864b67a8c77b7" dependencies = [ "arrayvec", "bit-set 0.9.1", @@ -3411,7 +3401,7 @@ dependencies = [ "raw-window-handle", "rustc-hash 1.1.0", "smallvec", - "thiserror 2.0.18", + "thiserror", "wgpu-core-deps-apple", "wgpu-core-deps-emscripten", "wgpu-core-deps-windows-linux-android", @@ -3422,36 +3412,36 @@ dependencies = [ [[package]] name = "wgpu-core-deps-apple" -version = "29.0.0" +version = "29.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43acd053312501689cd92a01a9638d37f3e41a5fd9534875efa8917ee2d11ac0" +checksum = "62e51b5447e144b3dbba4feb01f80f4fa21696fa0cd99afb2c3df1affd6fdb28" dependencies = [ "wgpu-hal", ] [[package]] name = "wgpu-core-deps-emscripten" -version = "29.0.0" +version = "29.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef043bf135cc68b6f667c55ff4e345ce2b5924d75bad36a47921b0287ca4b24a" +checksum = "3487cd6293a963bc5c0c0396f6a2192043c50003c07f4efdccbad3d90ec9d819" dependencies = [ "wgpu-hal", ] [[package]] name = "wgpu-core-deps-windows-linux-android" -version = "29.0.0" +version = "29.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "725d5c006a8c02967b6d93ef04f6537ec4593313e330cfe86d9d3f946eb90f28" +checksum = "1bfb01076d0aa08b0ba9bd741e178b5cc440f5abe99d9581323a4c8b5d1a1916" dependencies = [ "wgpu-hal", ] [[package]] name = "wgpu-hal" -version = "29.0.1" +version = "29.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89a47aef47636562f3937285af4c44b4b5b404b46577471411cc5313a921da7e" +checksum = "31f8e1a9e7a8512f276f7c62e018c7fa8d60954303fed2e5750114332049193f" dependencies = [ "android_system_properties", "arrayvec", @@ -3490,7 +3480,7 @@ dependencies = [ "raw-window-metal", "renderdoc-sys", "smallvec", - "thiserror 2.0.18", + "thiserror", "wasm-bindgen", "wayland-sys", "web-sys", @@ -3498,13 +3488,14 @@ dependencies = [ "wgpu-types", "windows", "windows-core", + "windows-result", ] [[package]] name = "wgpu-naga-bridge" -version = "29.0.1" +version = "29.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4684f4410da0cf95a4cb63bb5edaac022461dedb6adf0b64d0d9b5f6890d51" +checksum = "59c654c483f058800972c3645e95388a7eca31bf9fe1933bc20e036588a0be02" dependencies = [ "naga", "wgpu-types", @@ -3512,9 +3503,9 @@ dependencies = [ [[package]] name = "wgpu-types" -version = "29.0.1" +version = "29.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec2675540fb1a5cfa5ef122d3d5f390e2c75711a0b946410f2d6ac3a0f77d1f6" +checksum = "a9bcc31518a0e9735aefebedb5f7a9ef3ed1c42549c9f4c882fa9060ceaac639" dependencies = [ "bitflags", "bytemuck", @@ -3526,9 +3517,9 @@ dependencies = [ [[package]] name = "wide" -version = "1.2.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "198f6abc41fab83526d10880fa5c17e2b4ee44e763949b4bb34e2fd1e8ca48e4" +checksum = "9a7714cd0430a663154667c74da5d09325c2387695bee18b3f7f72825aa3693a" dependencies = [ "bytemuck", "safe_arch", @@ -3644,15 +3635,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - [[package]] name = "windows-sys" version = "0.52.0" @@ -3680,21 +3662,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - [[package]] name = "windows-targets" version = "0.52.6" @@ -3737,12 +3704,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" @@ -3755,12 +3716,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" @@ -3773,12 +3728,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -3803,12 +3752,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - [[package]] name = "windows_i686_msvc" version = "0.52.6" @@ -3821,12 +3764,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" @@ -3839,12 +3776,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" @@ -3857,12 +3788,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -3877,9 +3802,9 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" +checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" dependencies = [ "memchr", ] @@ -3893,6 +3818,12 @@ dependencies = [ "wit-bindgen-rust-macro", ] +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + [[package]] name = "wit-bindgen-core" version = "0.51.0" @@ -4037,18 +3968,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.48" +version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" +checksum = "3b065d4f0e55f82fae73202e189638116a87c55ab6b8e6c2721e13dd9d854ad1" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.48" +version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" +checksum = "0b631b19d36a892ab55420c92dbc83ccd79274f25be714855d3074aa71cab639" dependencies = [ "proc-macro2", "quote", @@ -4057,9 +3988,9 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" dependencies = [ "zerofrom-derive", ] @@ -4152,3 +4083,31 @@ dependencies = [ "log", "simd-adler32", ] + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", +] From 172400055a86b9585dcfff9321cb9f146d516fc0 Mon Sep 17 00:00:00 2001 From: Ciaran Ryan-Anderson Date: Wed, 3 Jun 2026 16:12:21 -0600 Subject: [PATCH 09/26] Fix LLVM 21 CI setup --- .github/workflows/julia-release.yml | 35 ++++++++---- .github/workflows/julia-test.yml | 12 ++-- .github/workflows/python-release.yml | 72 ++++++++++++++---------- .github/workflows/python-test.yml | 11 ++-- .github/workflows/rust-test.yml | 15 ++--- .github/workflows/test-docs-examples.yml | 9 +-- Justfile | 24 +++++++- julia/PECOS.jl/src/Decoder.jl | 12 +++- julia/PECOS.jl/src/Simulator.jl | 8 ++- scripts/ci/install-llvm-21-release.sh | 60 ++++++++++++++++++++ 10 files changed, 187 insertions(+), 71 deletions(-) create mode 100644 scripts/ci/install-llvm-21-release.sh diff --git a/.github/workflows/julia-release.yml b/.github/workflows/julia-release.yml index 113a9548e..84a106a68 100644 --- a/.github/workflows/julia-release.yml +++ b/.github/workflows/julia-release.yml @@ -16,6 +16,8 @@ permissions: env: TRIGGER_ON_PR_PUSH: true # Set to true to enable triggers on PR pushes + LLVM_VERSION: "21.1" + LLVM_RELEASE_VERSION: "21.1.8" on: push: @@ -123,35 +125,44 @@ jobs: - name: Set up Rust run: rustup show - - name: Install LLVM 14.0.6 using pecos-llvm (Unix) + - name: Install LLVM 21.1 (Unix) if: runner.os != 'Windows' run: | - echo "Installing LLVM using pecos..." - cargo run --locked -p pecos-cli --release -- install llvm + if [ "$RUNNER_OS" = "macOS" ]; then + echo "Installing LLVM 21 with Homebrew..." + HOMEBREW_NO_AUTO_UPDATE=1 brew install llvm@21 + LLVM_PREFIX="$(brew --prefix llvm@21)" + else + echo "Installing LLVM 21.1 using PECOS-managed packages..." + cargo run --locked -p pecos-cli --release -- llvm ensure --managed --no-configure || bash scripts/ci/install-llvm-21-release.sh + LLVM_PREFIX="$HOME/.pecos/deps/llvm-21.1" + fi echo "Setting LLVM environment variables..." - export PECOS_LLVM=$(cargo run --locked -p pecos-cli --release -- llvm find 2>/dev/null) - export LLVM_SYS_140_PREFIX="$PECOS_LLVM" + cargo run --locked -p pecos-cli --release -- llvm configure "$LLVM_PREFIX" + export PECOS_LLVM="$LLVM_PREFIX" + export LLVM_SYS_211_PREFIX="$LLVM_PREFIX" echo "PECOS_LLVM=$PECOS_LLVM" >> $GITHUB_ENV - echo "LLVM_SYS_140_PREFIX=$LLVM_SYS_140_PREFIX" >> $GITHUB_ENV + echo "LLVM_SYS_211_PREFIX=$LLVM_SYS_211_PREFIX" >> $GITHUB_ENV echo "Verifying LLVM installation..." cargo run --locked -p pecos-cli --release -- llvm check - - name: Install LLVM 14.0.6 using pecos-llvm (Windows) + - name: Install LLVM 21.1 (Windows) if: runner.os == 'Windows' shell: pwsh run: | - Write-Host "Installing LLVM using pecos..." - cargo run --locked -p pecos-cli --release -- install llvm + Write-Host "Installing LLVM 21.1 with Chocolatey..." + choco install llvm --version=${{ env.LLVM_RELEASE_VERSION }} -y --no-progress Write-Host "Setting LLVM environment variables..." - $env:PECOS_LLVM = (cargo run --locked -p pecos-cli --release -- llvm find 2>$null) - $env:LLVM_SYS_140_PREFIX = $env:PECOS_LLVM + $env:PECOS_LLVM = "C:\Program Files\LLVM" + $env:LLVM_SYS_211_PREFIX = $env:PECOS_LLVM + cargo run --locked -p pecos-cli --release -- llvm configure "$env:PECOS_LLVM" "PECOS_LLVM=$env:PECOS_LLVM" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append - "LLVM_SYS_140_PREFIX=$env:LLVM_SYS_140_PREFIX" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append + "LLVM_SYS_211_PREFIX=$env:LLVM_SYS_211_PREFIX" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append Write-Host "Verifying LLVM installation..." cargo run --locked -p pecos-cli --release -- llvm check diff --git a/.github/workflows/julia-test.yml b/.github/workflows/julia-test.yml index 8c2c26a3c..e75e253c3 100644 --- a/.github/workflows/julia-test.yml +++ b/.github/workflows/julia-test.yml @@ -65,7 +65,7 @@ jobs: # NOTE: LLVM is not currently needed for Julia FFI since we use pecos with default-features = false # Keeping this commented out in case we need to re-enable LLVM features in the future. # - # - name: Install LLVM 14.0.6 using pecos (Unix) + # - name: Install LLVM 21.1 using pecos (Unix) # if: runner.os != 'Windows' # run: | # echo "Installing LLVM using pecos..." @@ -73,15 +73,15 @@ jobs: # # echo "Setting LLVM environment variables..." # export PECOS_LLVM=$(cargo run -p pecos-cli --release -- llvm find 2>/dev/null) - # export LLVM_SYS_140_PREFIX="$PECOS_LLVM" + # export LLVM_SYS_211_PREFIX="$PECOS_LLVM" # # echo "PECOS_LLVM=$PECOS_LLVM" >> $GITHUB_ENV - # echo "LLVM_SYS_140_PREFIX=$LLVM_SYS_140_PREFIX" >> $GITHUB_ENV + # echo "LLVM_SYS_211_PREFIX=$LLVM_SYS_211_PREFIX" >> $GITHUB_ENV # # echo "Verifying LLVM installation..." # cargo run -p pecos-cli --release -- llvm check # - # - name: Install LLVM 14.0.6 using pecos (Windows) + # - name: Install LLVM 21.1 using pecos (Windows) # if: runner.os == 'Windows' # shell: pwsh # run: | @@ -90,10 +90,10 @@ jobs: # # Write-Host "Setting LLVM environment variables..." # $env:PECOS_LLVM = (cargo run -p pecos-cli --release -- llvm find 2>$null) - # $env:LLVM_SYS_140_PREFIX = $env:PECOS_LLVM + # $env:LLVM_SYS_211_PREFIX = $env:PECOS_LLVM # # "PECOS_LLVM=$env:PECOS_LLVM" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append - # "LLVM_SYS_140_PREFIX=$env:LLVM_SYS_140_PREFIX" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append + # "LLVM_SYS_211_PREFIX=$env:LLVM_SYS_211_PREFIX" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append # # Write-Host "Verifying LLVM installation..." # cargo run -p pecos-cli --release -- llvm check diff --git a/.github/workflows/python-release.yml b/.github/workflows/python-release.yml index 34ce638ec..f65242a9a 100644 --- a/.github/workflows/python-release.yml +++ b/.github/workflows/python-release.yml @@ -5,6 +5,8 @@ permissions: env: TRIGGER_ON_PR_PUSH: true # Set to true to enable triggers on PR pushes + LLVM_VERSION: "21.1" + LLVM_RELEASE_VERSION: "21.1.8" # Must match pecos_build::cmake::CMAKE_VERSION. The MWPF decoder feature # uses highs-sys, which needs cmake; the wheel build installs this version # via `pecos install cmake` and points highs-sys's cmake-rs at it via $CMAKE. @@ -98,10 +100,8 @@ jobs: gcc_ld_path: "/opt/rh/gcc-toolset-13/root/usr/lib64:/opt/rh/gcc-toolset-13/root/usr/lib:" gcc_cc: "/opt/rh/gcc-toolset-13/root/usr/bin/gcc" gcc_cxx: "/opt/rh/gcc-toolset-13/root/usr/bin/g++" - # Linux aarch64 - DISABLED: LLVM 14 not available in manylinux_2_28 (AlmaLinux 8) - # The prebuilt LLVM 14 binary is incompatible with the container, and - # the llvm-toolset module only provides LLVM 13. Re-enable when we have - # a solution (custom Docker image, build from source, or inkwell LLVM 13 support) + # Linux aarch64 - temporarily disabled while the LLVM 21.1 + # manylinux_2_28 bootstrap is validated on the primary x86_64 lane. # - os: ubuntu-24.04-arm # architecture: aarch64 # runner: ubuntu-24.04-arm @@ -211,16 +211,16 @@ jobs: CIBW_MANYLINUX_AARCH64_IMAGE: "manylinux_2_28" # Linux configuration - GCC Toolset and CUDA paths are conditional via matrix variables CIBW_ENVIRONMENT_LINUX: > - PATH=${{ matrix.gcc_path_prefix }}$HOME/.cargo/bin:$HOME/.pecos/deps/llvm-14/bin:$HOME/.pecos/deps/cmake-${{ env.PECOS_CMAKE_VERSION }}/bin:/usr/local/cuda-12.6/bin:$PATH + PATH=${{ matrix.gcc_path_prefix }}$HOME/.cargo/bin:$HOME/.pecos/deps/llvm-21.1/bin:$HOME/.pecos/deps/cmake-${{ env.PECOS_CMAKE_VERSION }}/bin:/usr/local/cuda-12.6/bin:$PATH LD_LIBRARY_PATH=${{ matrix.gcc_ld_path }}$LD_LIBRARY_PATH - LLVM_SYS_140_PREFIX=$HOME/.pecos/deps/llvm-14 + LLVM_SYS_211_PREFIX=$HOME/.pecos/deps/llvm-21.1 CMAKE=$HOME/.pecos/deps/cmake-${{ env.PECOS_CMAKE_VERSION }}/bin/cmake CUDA_PATH=/usr/local/cuda-12.6 MATURIN_PEP517_ARGS="--locked --features=extension-module,mwpf" CIBW_BEFORE_ALL_LINUX: | bash scripts/ci/ensure-rust.sh stable minimal export PATH=$HOME/.cargo/bin:$PATH - dnf install libffi-devel -y + dnf install -y libffi-devel xz # Install CUDA Toolkit for GPU support on x86_64 (compile-time only, no GPU needed) if [ "${{ matrix.install_cuda }}" = "true" ]; then echo "Installing GCC 13 (required for CUDA 12.6 compatibility)..." @@ -237,15 +237,16 @@ jobs: else echo "Skipping CUDA installation (GPU support not enabled for this build)" fi - cargo run --locked --release -p pecos-cli -- install llvm --force + cargo run --locked --release -p pecos-cli -- install llvm --force || bash scripts/ci/install-llvm-21-release.sh + cargo run --locked --release -p pecos-cli -- llvm configure "$HOME/.pecos/deps/llvm-21.1" cargo run --locked --release -p pecos-cli -- install cmake --force CIBW_REPAIR_WHEEL_COMMAND_LINUX: > auditwheel repair -w {dest_dir} {wheel} && pipx run abi3audit --strict --report {wheel} # macOS configuration CIBW_ENVIRONMENT_MACOS: > - PATH=$HOME/.cargo/bin:$HOME/.pecos/deps/llvm-14/bin:$HOME/.pecos/deps/cmake-${{ env.PECOS_CMAKE_VERSION }}/CMake.app/Contents/bin:$PATH - LLVM_SYS_140_PREFIX=$HOME/.pecos/deps/llvm-14 + PATH=$HOME/.cargo/bin:$HOME/.pecos/deps/llvm-21.1/bin:$HOME/.pecos/deps/cmake-${{ env.PECOS_CMAKE_VERSION }}/CMake.app/Contents/bin:$PATH + LLVM_SYS_211_PREFIX=$HOME/.pecos/deps/llvm-21.1 CMAKE=$HOME/.pecos/deps/cmake-${{ env.PECOS_CMAKE_VERSION }}/CMake.app/Contents/bin/cmake MACOSX_DEPLOYMENT_TARGET=13.2 SDKROOT=$(xcrun --show-sdk-path) @@ -254,7 +255,10 @@ jobs: bash scripts/ci/ensure-rust.sh stable minimal export PATH=$HOME/.cargo/bin:$PATH rustup update - cargo run --locked --release -p pecos-cli -- install llvm --force + HOMEBREW_NO_AUTO_UPDATE=1 brew install llvm@21 + mkdir -p "$HOME/.pecos/deps" + ln -sfn "$(brew --prefix llvm@21)" "$HOME/.pecos/deps/llvm-21.1" + cargo run --locked --release -p pecos-cli -- llvm configure "$HOME/.pecos/deps/llvm-21.1" cargo run --locked --release -p pecos-cli -- install cmake --force # Create a codesign wrapper that strips DYLD_LIBRARY_PATH to prevent # crashes on macOS 15 when bundled libc++ conflicts with system libc++ @@ -262,21 +266,22 @@ jobs: printf '#!/bin/bash\nunset DYLD_LIBRARY_PATH\nexec /usr/bin/codesign "$@"\n' > $HOME/.pecos/bin/codesign chmod +x $HOME/.pecos/bin/codesign CIBW_REPAIR_WHEEL_COMMAND_MACOS: > - PATH=$HOME/.pecos/bin:$PATH DYLD_LIBRARY_PATH=$HOME/.pecos/deps/llvm-14/lib delocate-wheel --require-archs {delocate_archs} -w {dest_dir} -v {wheel} && + PATH=$HOME/.pecos/bin:$PATH DYLD_LIBRARY_PATH=$HOME/.pecos/deps/llvm-21.1/lib delocate-wheel --require-archs {delocate_archs} -w {dest_dir} -v {wheel} && pipx run abi3audit --strict --report {wheel} # Windows configuration - CUDA via Jimver/cuda-toolkit (installed before cibuildwheel) CIBW_ENVIRONMENT_WINDOWS: > - PATH="C:\\Users\\runneradmin\\.pecos\\deps\\llvm-14\\bin;C:\\Users\\runneradmin\\.pecos\\deps\\cmake-${{ env.PECOS_CMAKE_VERSION }}\\bin;$PATH" - LLVM_SYS_140_PREFIX="C:\\Users\\runneradmin\\.pecos\\deps\\llvm-14" + PATH="C:\\Program Files\\LLVM\\bin;C:\\Users\\runneradmin\\.pecos\\deps\\cmake-${{ env.PECOS_CMAKE_VERSION }}\\bin;$PATH" + LLVM_SYS_211_PREFIX="C:\\Program Files\\LLVM" CMAKE="C:\\Users\\runneradmin\\.pecos\\deps\\cmake-${{ env.PECOS_CMAKE_VERSION }}\\bin\\cmake.exe" MATURIN_PEP517_ARGS="--locked --features=extension-module,mwpf" CIBW_BEFORE_ALL_WINDOWS: > - echo "=== Installing LLVM using pecos ===" && + echo "=== Installing LLVM 21.1 with Chocolatey ===" && rustup update && - cargo run --locked --release -p pecos-cli -- install llvm --force && + choco install llvm --version=${{ env.LLVM_RELEASE_VERSION }} -y --no-progress && + cargo run --locked --release -p pecos-cli -- llvm configure "C:\Program Files\LLVM" && cargo run --locked --release -p pecos-cli -- install cmake --force && echo "=== Checking LLVM installation ===" && - (test -d "C:\\Users\\runneradmin\\.pecos\\deps\\llvm-14" && echo "LLVM directory exists") || (echo "ERROR: LLVM directory not found!" && exit 1) + if exist "C:\Program Files\LLVM\bin\llvm-config.exe" (echo LLVM directory exists) else (echo ERROR: LLVM directory not found! && exit /b 1) # Install delvewheel and patch it to ignore ext-ms-win-* API sets # (delvewheel ignores api-ms-win-* but not ext-ms-win-* which are also Windows API sets) CIBW_BEFORE_BUILD_WINDOWS: > @@ -285,7 +290,7 @@ jobs: # Note: --no-dll excludes Windows system DLLs that should not be bundled # combase.dll and rmclient.dll are core Windows components that fail when bundled CIBW_REPAIR_WHEEL_COMMAND_WINDOWS: > - delvewheel repair -v --add-path "C:\\Users\\runneradmin\\.pecos\\deps\\llvm\\bin" --no-dll "combase.dll;rmclient.dll" -w {dest_dir} {wheel} && + delvewheel repair -v --add-path "C:\\Program Files\\LLVM\\bin" --no-dll "combase.dll;rmclient.dll" -w {dest_dir} {wheel} && pipx run abi3audit --strict --report {wheel} - name: Upload pecos-rslib wheels @@ -307,19 +312,20 @@ jobs: CIBW_MANYLINUX_X86_64_IMAGE: "manylinux_2_28" CIBW_MANYLINUX_AARCH64_IMAGE: "manylinux_2_28" CIBW_ENVIRONMENT_LINUX: > - PATH=$HOME/.cargo/bin:$HOME/.pecos/deps/llvm-14/bin:$PATH - LLVM_SYS_140_PREFIX=$HOME/.pecos/deps/llvm-14 + PATH=$HOME/.cargo/bin:$HOME/.pecos/deps/llvm-21.1/bin:$PATH + LLVM_SYS_211_PREFIX=$HOME/.pecos/deps/llvm-21.1 CIBW_BEFORE_ALL_LINUX: | bash scripts/ci/ensure-rust.sh stable minimal export PATH=$HOME/.cargo/bin:$PATH - dnf install libffi-devel -y - cargo run --locked --release -p pecos-cli -- install llvm --force + dnf install -y libffi-devel xz + cargo run --locked --release -p pecos-cli -- install llvm --force || bash scripts/ci/install-llvm-21-release.sh + cargo run --locked --release -p pecos-cli -- llvm configure "$HOME/.pecos/deps/llvm-21.1" CIBW_REPAIR_WHEEL_COMMAND_LINUX: > auditwheel repair -w {dest_dir} {wheel} && pipx run abi3audit --strict --report {wheel} CIBW_ENVIRONMENT_MACOS: > - PATH=$HOME/.cargo/bin:$HOME/.pecos/deps/llvm-14/bin:$PATH - LLVM_SYS_140_PREFIX=$HOME/.pecos/deps/llvm-14 + PATH=$HOME/.cargo/bin:$HOME/.pecos/deps/llvm-21.1/bin:$PATH + LLVM_SYS_211_PREFIX=$HOME/.pecos/deps/llvm-21.1 MACOSX_DEPLOYMENT_TARGET=13.2 SDKROOT=$(xcrun --show-sdk-path) CIBW_BEFORE_ALL_MACOS: | @@ -327,9 +333,12 @@ jobs: bash scripts/ci/ensure-rust.sh stable minimal export PATH=$HOME/.cargo/bin:$PATH fi - if [ ! -d "$HOME/.pecos/deps/llvm-14/bin" ]; then + if [ ! -d "$HOME/.pecos/deps/llvm-21.1/bin" ]; then rustup update - cargo run --locked --release -p pecos-cli -- install llvm --force + HOMEBREW_NO_AUTO_UPDATE=1 brew install llvm@21 + mkdir -p "$HOME/.pecos/deps" + ln -sfn "$(brew --prefix llvm@21)" "$HOME/.pecos/deps/llvm-21.1" + cargo run --locked --release -p pecos-cli -- llvm configure "$HOME/.pecos/deps/llvm-21.1" else echo "LLVM already installed from pecos-rslib build, skipping" fi @@ -337,19 +346,20 @@ jobs: printf '#!/bin/bash\nunset DYLD_LIBRARY_PATH\nexec /usr/bin/codesign "$@"\n' > $HOME/.pecos/bin/codesign chmod +x $HOME/.pecos/bin/codesign CIBW_REPAIR_WHEEL_COMMAND_MACOS: > - PATH=$HOME/.pecos/bin:$PATH DYLD_LIBRARY_PATH=$HOME/.pecos/deps/llvm-14/lib delocate-wheel --require-archs {delocate_archs} -w {dest_dir} -v {wheel} && + PATH=$HOME/.pecos/bin:$PATH DYLD_LIBRARY_PATH=$HOME/.pecos/deps/llvm-21.1/lib delocate-wheel --require-archs {delocate_archs} -w {dest_dir} -v {wheel} && pipx run abi3audit --strict --report {wheel} CIBW_ENVIRONMENT_WINDOWS: > - PATH="C:\\Users\\runneradmin\\.pecos\\deps\\llvm-14\\bin;$PATH" - LLVM_SYS_140_PREFIX="C:\\Users\\runneradmin\\.pecos\\deps\\llvm-14" + PATH="C:\\Program Files\\LLVM\\bin;$PATH" + LLVM_SYS_211_PREFIX="C:\\Program Files\\LLVM" CIBW_BEFORE_ALL_WINDOWS: > rustup update && - if not exist "C:\Users\runneradmin\.pecos\deps\llvm-14\bin" (cargo run --locked --release -p pecos-cli -- install llvm --force) else (echo LLVM already installed from pecos-rslib build) + if not exist "C:\Program Files\LLVM\bin\llvm-config.exe" (choco install llvm --version=${{ env.LLVM_RELEASE_VERSION }} -y --no-progress) else (echo LLVM already installed from pecos-rslib build) && + cargo run --locked --release -p pecos-cli -- llvm configure "C:\Program Files\LLVM" CIBW_BEFORE_BUILD_WINDOWS: > pip install delvewheel && python -c "import delvewheel._dll_list as d,inspect,re as r;p=inspect.getfile(d);c=open(p).read();n=chr(10);open(p,'w').write(c.replace(r\"re.compile('api-.*'),\",r\"re.compile('api-.*'),\"+n+r\" re.compile('ext-.*'),\")) if 'ext-.*' not in c else None" CIBW_REPAIR_WHEEL_COMMAND_WINDOWS: > - delvewheel repair -v --add-path "C:\\Users\\runneradmin\\.pecos\\deps\\llvm-14\\bin" --no-dll "combase.dll;rmclient.dll" -w {dest_dir} {wheel} && + delvewheel repair -v --add-path "C:\\Program Files\\LLVM\\bin" --no-dll "combase.dll;rmclient.dll" -w {dest_dir} {wheel} && pipx run abi3audit --strict --report {wheel} - name: Upload pecos-rslib-llvm wheels diff --git a/.github/workflows/python-test.yml b/.github/workflows/python-test.yml index eebabcc52..fe59e8e54 100644 --- a/.github/workflows/python-test.yml +++ b/.github/workflows/python-test.yml @@ -8,7 +8,8 @@ env: RUSTFLAGS: -C debuginfo=0 RUST_BACKTRACE: 1 PYTHONUTF8: 1 - LLVM_VERSION: "14.0.6" + LLVM_VERSION: "21.1" + LLVM_RELEASE_VERSION: "21.1.8" # Force the MWPF decoder feature on in CI so we exercise the cmake-dependent # build path and catch regressions. GitHub-hosted runners ship cmake. PECOS_BUILD_MWPF: "1" @@ -139,8 +140,8 @@ jobs: id: cache-llvm uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 with: - path: ~/.pecos/deps/llvm-14 - key: llvm-${{ env.LLVM_VERSION }}-${{ runner.os }}-${{ runner.arch }}-v2 + path: ~/.pecos/deps/llvm-21.1 + key: llvm-${{ env.LLVM_RELEASE_VERSION }}-${{ runner.os }}-${{ runner.arch }}-v2 # `just ci-env` is the first cargo invocation. Its `_msvc-bootstrap` # prerequisite writes the MSVC linker + LIB/INCLUDE into @@ -154,7 +155,7 @@ jobs: if: steps.cache-llvm.outputs.cache-hit != 'true' && github.event_name == 'push' && (github.ref_name == 'main' || github.ref_name == 'master' || github.ref_name == 'development' || github.ref_name == 'dev') uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 with: - path: ~/.pecos/deps/llvm-14 + path: ~/.pecos/deps/llvm-21.1 key: ${{ steps.cache-llvm.outputs.cache-primary-key }} - name: Install PECOS CLI @@ -279,7 +280,7 @@ jobs: # pecos-build (where the toml_edit work lives) and pecos-core are # publishable and need no LLVM/FFI/external toolchain -- the right # minimal canary. LLVM-needing crates additionally require the upstream - # llvm-sys LLVM_SYS_140_PREFIX (a universal llvm-sys requirement, not a + # llvm-sys LLVM_SYS_211_PREFIX (a universal llvm-sys requirement, not a # PECOS workaround) and are out of scope for this contract lane. - name: Vanilla cargo check (publishable crates, no just/bootstrap) shell: pwsh diff --git a/.github/workflows/rust-test.yml b/.github/workflows/rust-test.yml index c8a15f63a..e162b6e55 100644 --- a/.github/workflows/rust-test.yml +++ b/.github/workflows/rust-test.yml @@ -7,7 +7,8 @@ env: TRIGGER_ON_PR_PUSH: true # Set to true to enable triggers on PR pushes RUSTFLAGS: -C debuginfo=0 RUST_BACKTRACE: 1 - LLVM_VERSION: "14.0.6" + LLVM_VERSION: "21.1" + LLVM_RELEASE_VERSION: "21.1.8" on: push: @@ -89,8 +90,8 @@ jobs: id: cache-llvm uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 with: - path: ~/.pecos/deps/llvm-14 - key: llvm-${{ env.LLVM_VERSION }}-${{ runner.os }}-${{ runner.arch }}-v2 + path: ~/.pecos/deps/llvm-21.1 + key: llvm-${{ env.LLVM_RELEASE_VERSION }}-${{ runner.os }}-${{ runner.arch }}-v2 - name: Ensure LLVM ${{ env.LLVM_VERSION }} run: just ci-env @@ -99,7 +100,7 @@ jobs: if: steps.cache-llvm.outputs.cache-hit != 'true' && github.event_name == 'push' && (github.ref_name == 'main' || github.ref_name == 'master' || github.ref_name == 'development' || github.ref_name == 'dev') uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 with: - path: ~/.pecos/deps/llvm-14 + path: ~/.pecos/deps/llvm-21.1 key: ${{ steps.cache-llvm.outputs.cache-primary-key }} - name: Check formatting @@ -230,8 +231,8 @@ jobs: id: cache-llvm uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 with: - path: ~/.pecos/deps/llvm-14 - key: llvm-${{ env.LLVM_VERSION }}-${{ runner.os }}-${{ runner.arch }}-v2 + path: ~/.pecos/deps/llvm-21.1 + key: llvm-${{ env.LLVM_RELEASE_VERSION }}-${{ runner.os }}-${{ runner.arch }}-v2 - name: Bootstrap MSVC for the Cargo build path (Windows) if: runner.os == 'Windows' @@ -249,7 +250,7 @@ jobs: if: steps.cache-llvm.outputs.cache-hit != 'true' && github.event_name == 'push' && (github.ref_name == 'main' || github.ref_name == 'master' || github.ref_name == 'development' || github.ref_name == 'dev') uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 with: - path: ~/.pecos/deps/llvm-14 + path: ~/.pecos/deps/llvm-21.1 key: ${{ steps.cache-llvm.outputs.cache-primary-key }} - name: Install CUDA Toolkit (Linux) diff --git a/.github/workflows/test-docs-examples.yml b/.github/workflows/test-docs-examples.yml index c633a2a54..53ba5305c 100644 --- a/.github/workflows/test-docs-examples.yml +++ b/.github/workflows/test-docs-examples.yml @@ -22,7 +22,8 @@ env: RUSTFLAGS: -C debuginfo=0 RUST_BACKTRACE: 1 PYTHONUTF8: 1 - LLVM_VERSION: "14.0.6" + LLVM_VERSION: "21.1" + LLVM_RELEASE_VERSION: "21.1.8" jobs: docs-ci: @@ -73,8 +74,8 @@ jobs: id: cache-llvm uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 with: - path: ~/.pecos/deps/llvm-14 - key: llvm-${{ env.LLVM_VERSION }}-${{ runner.os }}-${{ runner.arch }}-v2 + path: ~/.pecos/deps/llvm-21.1 + key: llvm-${{ env.LLVM_RELEASE_VERSION }}-${{ runner.os }}-${{ runner.arch }}-v2 - name: Ensure LLVM ${{ env.LLVM_VERSION }} run: just ci-env @@ -83,7 +84,7 @@ jobs: if: steps.cache-llvm.outputs.cache-hit != 'true' && github.event_name == 'push' && (github.ref_name == 'main' || github.ref_name == 'master' || github.ref_name == 'development' || github.ref_name == 'dev') uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 with: - path: ~/.pecos/deps/llvm-14 + path: ~/.pecos/deps/llvm-21.1 key: ${{ steps.cache-llvm.outputs.cache-primary-key }} - name: Install dependencies and build diff --git a/Justfile b/Justfile index c7c5022c8..14574899a 100644 --- a/Justfile +++ b/Justfile @@ -58,7 +58,29 @@ setup-ci: _msvc-bootstrap ci-env: _msvc-bootstrap #!/usr/bin/env bash set -euo pipefail - {{pecos}} llvm ensure --managed --no-configure + LLVM_RELEASE_VERSION="${LLVM_RELEASE_VERSION:-21.1.8}" + case "${RUNNER_OS:-$(uname -s)}" in + Linux) + {{pecos}} llvm ensure --managed --no-configure || bash scripts/ci/install-llvm-21-release.sh + {{pecos}} llvm configure + ;; + macOS|Darwin) + if ! {{pecos}} llvm find >/dev/null 2>&1; then + HOMEBREW_NO_AUTO_UPDATE=1 brew install llvm@21 + fi + {{pecos}} llvm configure "$(brew --prefix llvm@21)" + ;; + Windows*|MINGW*|MSYS*|CYGWIN*) + if ! {{pecos}} llvm find >/dev/null 2>&1; then + powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "choco install llvm --version=$LLVM_RELEASE_VERSION -y --no-progress" + fi + {{pecos}} llvm configure "C:/Program Files/LLVM" + ;; + *) + {{pecos}} llvm ensure --managed --no-configure + {{pecos}} llvm configure + ;; + esac {{pecos}} env --github-actions # Check development environment for common problems diff --git a/julia/PECOS.jl/src/Decoder.jl b/julia/PECOS.jl/src/Decoder.jl index e028cf8ab..2a46ffcb4 100644 --- a/julia/PECOS.jl/src/Decoder.jl +++ b/julia/PECOS.jl/src/Decoder.jl @@ -44,11 +44,17 @@ export AbstractDecoder, DecodingResult, decode, check_count, bit_count Result of a decoding operation. """ struct DecodingResult - """Decoded observable/correction vector.""" + """ + Decoded observable/correction vector. + """ observable::Vector{UInt8} - """Weight/cost of the solution.""" + """ + Weight/cost of the solution. + """ weight::Float64 - """Whether the decoder converged (nothing = unknown).""" + """ + Whether the decoder converged (nothing = unknown). + """ converged::Union{Bool,Nothing} end diff --git a/julia/PECOS.jl/src/Simulator.jl b/julia/PECOS.jl/src/Simulator.jl index 18016e502..7ca8549cb 100644 --- a/julia/PECOS.jl/src/Simulator.jl +++ b/julia/PECOS.jl/src/Simulator.jl @@ -55,9 +55,13 @@ export sz!, h!, cx!, mz, reset!, rx!, rz!, rzz! Result of a Z-basis measurement. """ struct MeasurementResult - """Measurement outcome: false = |0>, true = |1>.""" + """ + Measurement outcome: false = |0>, true = |1>. + """ outcome::Bool - """Whether the outcome was deterministic.""" + """ + Whether the outcome was deterministic. + """ is_deterministic::Bool end diff --git a/scripts/ci/install-llvm-21-release.sh b/scripts/ci/install-llvm-21-release.sh new file mode 100644 index 000000000..b99b99ee8 --- /dev/null +++ b/scripts/ci/install-llvm-21-release.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash +set -euo pipefail + +LLVM_VERSION="${LLVM_VERSION:-21.1}" +LLVM_RELEASE_VERSION="${LLVM_RELEASE_VERSION:-21.1.8}" +INSTALL_DIR="${LLVM_INSTALL_DIR:-$HOME/.pecos/deps/llvm-$LLVM_VERSION}" + +case "$(uname -m)" in + x86_64|amd64) + ASSET="LLVM-${LLVM_RELEASE_VERSION}-Linux-X64.tar.xz" + SHA256="b3b7f2801d15d50736acea3c73982994d025b01c2f035b91ae3b49d1b575732b" + ;; + aarch64|arm64) + ASSET="LLVM-${LLVM_RELEASE_VERSION}-Linux-ARM64.tar.xz" + SHA256="65ce0b329514e5643407db2d02a5bd34bf33d159055dafa82825c8385bd01993" + ;; + *) + echo "Unsupported Linux architecture for LLVM ${LLVM_RELEASE_VERSION}: $(uname -m)" >&2 + exit 1 + ;; +esac + +if [ -x "$INSTALL_DIR/bin/llvm-config" ] && "$INSTALL_DIR/bin/llvm-config" --version | grep -q '^21\.1'; then + echo "LLVM $("$INSTALL_DIR/bin/llvm-config" --version) already installed at $INSTALL_DIR" + exit 0 +fi + +URL="https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_RELEASE_VERSION}/${ASSET}" +TMP_DIR="$(mktemp -d)" +trap 'rm -rf "$TMP_DIR"' EXIT + +ARCHIVE="$TMP_DIR/$ASSET" +EXTRACT_DIR="$TMP_DIR/extract" + +echo "Downloading official LLVM ${LLVM_RELEASE_VERSION} package: $ASSET" +if command -v curl >/dev/null 2>&1; then + curl --fail --location --retry 5 --retry-delay 5 --output "$ARCHIVE" "$URL" +else + python3 - "$URL" "$ARCHIVE" <<'PY' +import sys +import urllib.request + +url, dest = sys.argv[1], sys.argv[2] +with urllib.request.urlopen(url) as response, open(dest, "wb") as out: + out.write(response.read()) +PY +fi + +echo "$SHA256 $ARCHIVE" | sha256sum -c - + +mkdir -p "$EXTRACT_DIR" +tar -xJf "$ARCHIVE" -C "$EXTRACT_DIR" --strip-components=1 + +rm -rf "$INSTALL_DIR" +mkdir -p "$(dirname "$INSTALL_DIR")" +mv "$EXTRACT_DIR" "$INSTALL_DIR" + +"$INSTALL_DIR/bin/llvm-config" --version +"$INSTALL_DIR/bin/llvm-config" --shared-mode +echo "Installed LLVM ${LLVM_RELEASE_VERSION} to $INSTALL_DIR" From 3826c3451ae3e914e1e160e95bb6b9e2535bbd34 Mon Sep 17 00:00:00 2001 From: Ciaran Ryan-Anderson Date: Wed, 3 Jun 2026 16:30:54 -0600 Subject: [PATCH 10/26] Keep Chocolatey for Windows LLVM setup --- .github/workflows/python-test.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/python-test.yml b/.github/workflows/python-test.yml index fe59e8e54..83474847d 100644 --- a/.github/workflows/python-test.yml +++ b/.github/workflows/python-test.yml @@ -76,7 +76,6 @@ jobs: Remove-Item -Path "C:\Android" -Recurse -Force -ErrorAction SilentlyContinue Remove-Item -Path "C:\Program Files\dotnet" -Recurse -Force -ErrorAction SilentlyContinue Remove-Item -Path "C:\hostedtoolcache\CodeQL" -Recurse -Force -ErrorAction SilentlyContinue - Remove-Item -Path "C:\ProgramData\chocolatey" -Recurse -Force -ErrorAction SilentlyContinue - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: From 083fecfa87e98aa2f296a03c130a5ab1e95213b2 Mon Sep 17 00:00:00 2001 From: Ciaran Ryan-Anderson Date: Wed, 3 Jun 2026 16:46:56 -0600 Subject: [PATCH 11/26] Use LLVM archive on Windows CI --- .github/workflows/julia-release.yml | 7 +-- .github/workflows/python-release.yml | 24 +++++----- Justfile | 5 +- scripts/ci/install-llvm-21-windows.ps1 | 63 ++++++++++++++++++++++++++ 4 files changed, 82 insertions(+), 17 deletions(-) create mode 100644 scripts/ci/install-llvm-21-windows.ps1 diff --git a/.github/workflows/julia-release.yml b/.github/workflows/julia-release.yml index 84a106a68..e91d48276 100644 --- a/.github/workflows/julia-release.yml +++ b/.github/workflows/julia-release.yml @@ -153,11 +153,12 @@ jobs: if: runner.os == 'Windows' shell: pwsh run: | - Write-Host "Installing LLVM 21.1 with Chocolatey..." - choco install llvm --version=${{ env.LLVM_RELEASE_VERSION }} -y --no-progress + $llvmPrefix = Join-Path $env:USERPROFILE ".pecos\deps\llvm-21.1" + Write-Host "Installing LLVM 21.1 development archive..." + ./scripts/ci/install-llvm-21-windows.ps1 -InstallDir $llvmPrefix -Version ${{ env.LLVM_RELEASE_VERSION }} Write-Host "Setting LLVM environment variables..." - $env:PECOS_LLVM = "C:\Program Files\LLVM" + $env:PECOS_LLVM = $llvmPrefix $env:LLVM_SYS_211_PREFIX = $env:PECOS_LLVM cargo run --locked -p pecos-cli --release -- llvm configure "$env:PECOS_LLVM" diff --git a/.github/workflows/python-release.yml b/.github/workflows/python-release.yml index f65242a9a..6d0bf48fe 100644 --- a/.github/workflows/python-release.yml +++ b/.github/workflows/python-release.yml @@ -270,18 +270,18 @@ jobs: pipx run abi3audit --strict --report {wheel} # Windows configuration - CUDA via Jimver/cuda-toolkit (installed before cibuildwheel) CIBW_ENVIRONMENT_WINDOWS: > - PATH="C:\\Program Files\\LLVM\\bin;C:\\Users\\runneradmin\\.pecos\\deps\\cmake-${{ env.PECOS_CMAKE_VERSION }}\\bin;$PATH" - LLVM_SYS_211_PREFIX="C:\\Program Files\\LLVM" + PATH="C:\\Users\\runneradmin\\.pecos\\deps\\llvm-21.1\\bin;C:\\Users\\runneradmin\\.pecos\\deps\\cmake-${{ env.PECOS_CMAKE_VERSION }}\\bin;$PATH" + LLVM_SYS_211_PREFIX="C:\\Users\\runneradmin\\.pecos\\deps\\llvm-21.1" CMAKE="C:\\Users\\runneradmin\\.pecos\\deps\\cmake-${{ env.PECOS_CMAKE_VERSION }}\\bin\\cmake.exe" MATURIN_PEP517_ARGS="--locked --features=extension-module,mwpf" CIBW_BEFORE_ALL_WINDOWS: > - echo "=== Installing LLVM 21.1 with Chocolatey ===" && + echo "=== Installing LLVM 21.1 development archive ===" && rustup update && - choco install llvm --version=${{ env.LLVM_RELEASE_VERSION }} -y --no-progress && - cargo run --locked --release -p pecos-cli -- llvm configure "C:\Program Files\LLVM" && + powershell -NoProfile -ExecutionPolicy Bypass -File scripts\ci\install-llvm-21-windows.ps1 -InstallDir "C:\Users\runneradmin\.pecos\deps\llvm-21.1" -Version ${{ env.LLVM_RELEASE_VERSION }} && + cargo run --locked --release -p pecos-cli -- llvm configure "C:\Users\runneradmin\.pecos\deps\llvm-21.1" && cargo run --locked --release -p pecos-cli -- install cmake --force && echo "=== Checking LLVM installation ===" && - if exist "C:\Program Files\LLVM\bin\llvm-config.exe" (echo LLVM directory exists) else (echo ERROR: LLVM directory not found! && exit /b 1) + if exist "C:\Users\runneradmin\.pecos\deps\llvm-21.1\bin\llvm-config.exe" (echo LLVM directory exists) else (echo ERROR: LLVM directory not found! && exit /b 1) # Install delvewheel and patch it to ignore ext-ms-win-* API sets # (delvewheel ignores api-ms-win-* but not ext-ms-win-* which are also Windows API sets) CIBW_BEFORE_BUILD_WINDOWS: > @@ -290,7 +290,7 @@ jobs: # Note: --no-dll excludes Windows system DLLs that should not be bundled # combase.dll and rmclient.dll are core Windows components that fail when bundled CIBW_REPAIR_WHEEL_COMMAND_WINDOWS: > - delvewheel repair -v --add-path "C:\\Program Files\\LLVM\\bin" --no-dll "combase.dll;rmclient.dll" -w {dest_dir} {wheel} && + delvewheel repair -v --add-path "C:\\Users\\runneradmin\\.pecos\\deps\\llvm-21.1\\bin" --no-dll "combase.dll;rmclient.dll" -w {dest_dir} {wheel} && pipx run abi3audit --strict --report {wheel} - name: Upload pecos-rslib wheels @@ -349,17 +349,17 @@ jobs: PATH=$HOME/.pecos/bin:$PATH DYLD_LIBRARY_PATH=$HOME/.pecos/deps/llvm-21.1/lib delocate-wheel --require-archs {delocate_archs} -w {dest_dir} -v {wheel} && pipx run abi3audit --strict --report {wheel} CIBW_ENVIRONMENT_WINDOWS: > - PATH="C:\\Program Files\\LLVM\\bin;$PATH" - LLVM_SYS_211_PREFIX="C:\\Program Files\\LLVM" + PATH="C:\\Users\\runneradmin\\.pecos\\deps\\llvm-21.1\\bin;$PATH" + LLVM_SYS_211_PREFIX="C:\\Users\\runneradmin\\.pecos\\deps\\llvm-21.1" CIBW_BEFORE_ALL_WINDOWS: > rustup update && - if not exist "C:\Program Files\LLVM\bin\llvm-config.exe" (choco install llvm --version=${{ env.LLVM_RELEASE_VERSION }} -y --no-progress) else (echo LLVM already installed from pecos-rslib build) && - cargo run --locked --release -p pecos-cli -- llvm configure "C:\Program Files\LLVM" + if not exist "C:\Users\runneradmin\.pecos\deps\llvm-21.1\bin\llvm-config.exe" (powershell -NoProfile -ExecutionPolicy Bypass -File scripts\ci\install-llvm-21-windows.ps1 -InstallDir "C:\Users\runneradmin\.pecos\deps\llvm-21.1" -Version ${{ env.LLVM_RELEASE_VERSION }}) else (echo LLVM already installed from pecos-rslib build) && + cargo run --locked --release -p pecos-cli -- llvm configure "C:\Users\runneradmin\.pecos\deps\llvm-21.1" CIBW_BEFORE_BUILD_WINDOWS: > pip install delvewheel && python -c "import delvewheel._dll_list as d,inspect,re as r;p=inspect.getfile(d);c=open(p).read();n=chr(10);open(p,'w').write(c.replace(r\"re.compile('api-.*'),\",r\"re.compile('api-.*'),\"+n+r\" re.compile('ext-.*'),\")) if 'ext-.*' not in c else None" CIBW_REPAIR_WHEEL_COMMAND_WINDOWS: > - delvewheel repair -v --add-path "C:\\Program Files\\LLVM\\bin" --no-dll "combase.dll;rmclient.dll" -w {dest_dir} {wheel} && + delvewheel repair -v --add-path "C:\\Users\\runneradmin\\.pecos\\deps\\llvm-21.1\\bin" --no-dll "combase.dll;rmclient.dll" -w {dest_dir} {wheel} && pipx run abi3audit --strict --report {wheel} - name: Upload pecos-rslib-llvm wheels diff --git a/Justfile b/Justfile index 14574899a..90526c5ba 100644 --- a/Justfile +++ b/Justfile @@ -72,9 +72,10 @@ ci-env: _msvc-bootstrap ;; Windows*|MINGW*|MSYS*|CYGWIN*) if ! {{pecos}} llvm find >/dev/null 2>&1; then - powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "choco install llvm --version=$LLVM_RELEASE_VERSION -y --no-progress" + LLVM_PREFIX="${USERPROFILE:-$HOME}\\.pecos\\deps\\llvm-21.1" + powershell.exe -NoProfile -ExecutionPolicy Bypass -File scripts/ci/install-llvm-21-windows.ps1 -InstallDir "$LLVM_PREFIX" -Version "$LLVM_RELEASE_VERSION" fi - {{pecos}} llvm configure "C:/Program Files/LLVM" + {{pecos}} llvm configure ;; *) {{pecos}} llvm ensure --managed --no-configure diff --git a/scripts/ci/install-llvm-21-windows.ps1 b/scripts/ci/install-llvm-21-windows.ps1 new file mode 100644 index 000000000..be01b30d0 --- /dev/null +++ b/scripts/ci/install-llvm-21-windows.ps1 @@ -0,0 +1,63 @@ +param( + [string]$InstallDir = (Join-Path $env:USERPROFILE ".pecos\deps\llvm-21.1"), + [string]$Version = "" +) + +$ErrorActionPreference = "Stop" + +if (-not $Version) { + if ($env:LLVM_RELEASE_VERSION) { + $Version = $env:LLVM_RELEASE_VERSION + } + else { + $Version = "21.1.8" + } +} + +$ExpectedSha256 = "749d22f565fcd5718dbed06512572d0e5353b502c03fe1f7f17ee8b8aca21a47" +$RequiredVersion = "21.1" +$Asset = "clang+llvm-$Version-x86_64-pc-windows-msvc.tar.xz" +$Url = "https://github.com/llvm/llvm-project/releases/download/llvmorg-$Version/$Asset" +$LlvmConfig = Join-Path $InstallDir "bin\llvm-config.exe" + +if (Test-Path $LlvmConfig) { + $FoundVersion = (& $LlvmConfig --version).Trim() + if ($FoundVersion.StartsWith($RequiredVersion)) { + Write-Host "LLVM $FoundVersion already installed at $InstallDir" + exit 0 + } +} + +$TempDir = Join-Path ([System.IO.Path]::GetTempPath()) "pecos-llvm-$([System.Guid]::NewGuid())" +$Archive = Join-Path $TempDir $Asset +$ExtractDir = Join-Path $TempDir "extract" + +New-Item -ItemType Directory -Force -Path $TempDir | Out-Null +New-Item -ItemType Directory -Force -Path $ExtractDir | Out-Null + +try { + Write-Host "Downloading official LLVM $Version Windows development archive: $Asset" + Invoke-WebRequest -Uri $Url -OutFile $Archive + + $ActualSha256 = (Get-FileHash -Algorithm SHA256 $Archive).Hash.ToLowerInvariant() + if ($ActualSha256 -ne $ExpectedSha256) { + throw "SHA256 mismatch for $Asset. Expected $ExpectedSha256, got $ActualSha256" + } + + tar -xf $Archive -C $ExtractDir --strip-components=1 + + if (Test-Path $InstallDir) { + Remove-Item -Recurse -Force $InstallDir + } + New-Item -ItemType Directory -Force -Path (Split-Path -Parent $InstallDir) | Out-Null + Move-Item $ExtractDir $InstallDir + + & $LlvmConfig --version + & $LlvmConfig --shared-mode + Write-Host "Installed LLVM $Version to $InstallDir" +} +finally { + if (Test-Path $TempDir) { + Remove-Item -Recurse -Force $TempDir + } +} From f20055ab3532ccdfaaddf6f17b0ef95f046f5260 Mon Sep 17 00:00:00 2001 From: Ciaran Ryan-Anderson Date: Wed, 3 Jun 2026 17:04:54 -0600 Subject: [PATCH 12/26] Use manylinux 2.34 for LLVM wheels --- .github/workflows/python-release.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/.github/workflows/python-release.yml b/.github/workflows/python-release.yml index 6d0bf48fe..dc5914cf2 100644 --- a/.github/workflows/python-release.yml +++ b/.github/workflows/python-release.yml @@ -101,7 +101,7 @@ jobs: gcc_cc: "/opt/rh/gcc-toolset-13/root/usr/bin/gcc" gcc_cxx: "/opt/rh/gcc-toolset-13/root/usr/bin/g++" # Linux aarch64 - temporarily disabled while the LLVM 21.1 - # manylinux_2_28 bootstrap is validated on the primary x86_64 lane. + # manylinux_2_34 bootstrap is validated on the primary x86_64 lane. # - os: ubuntu-24.04-arm # architecture: aarch64 # runner: ubuntu-24.04-arm @@ -207,8 +207,8 @@ jobs: CIBW_BUILD: "cp310-*" CIBW_SKIP: "*-win32 *-manylinux_i686 *-musllinux*" CIBW_ARCHS_LINUX: ${{ matrix.cibw_archs }} - CIBW_MANYLINUX_X86_64_IMAGE: "manylinux_2_28" - CIBW_MANYLINUX_AARCH64_IMAGE: "manylinux_2_28" + CIBW_MANYLINUX_X86_64_IMAGE: "manylinux_2_34" + CIBW_MANYLINUX_AARCH64_IMAGE: "manylinux_2_34" # Linux configuration - GCC Toolset and CUDA paths are conditional via matrix variables CIBW_ENVIRONMENT_LINUX: > PATH=${{ matrix.gcc_path_prefix }}$HOME/.cargo/bin:$HOME/.pecos/deps/llvm-21.1/bin:$HOME/.pecos/deps/cmake-${{ env.PECOS_CMAKE_VERSION }}/bin:/usr/local/cuda-12.6/bin:$PATH @@ -227,7 +227,9 @@ jobs: dnf install -y gcc-toolset-13 source /opt/rh/gcc-toolset-13/enable echo "Installing CUDA Toolkit from NVIDIA repos..." - dnf config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel8/x86_64/cuda-rhel8.repo + . /etc/os-release + CUDA_RHEL_MAJOR="${VERSION_ID%%.*}" + dnf config-manager --add-repo "https://developer.download.nvidia.com/compute/cuda/repos/rhel${CUDA_RHEL_MAJOR}/x86_64/cuda-rhel${CUDA_RHEL_MAJOR}.repo" dnf install -y cuda-nvcc-12-6 cuda-cudart-devel-12-6 libcublas-devel-12-6 export CUDA_PATH=/usr/local/cuda-12.6 export PATH=$CUDA_PATH/bin:$PATH @@ -309,8 +311,8 @@ jobs: CIBW_BUILD: "cp310-*" CIBW_SKIP: "*-win32 *-manylinux_i686 *-musllinux*" CIBW_ARCHS_LINUX: ${{ matrix.cibw_archs }} - CIBW_MANYLINUX_X86_64_IMAGE: "manylinux_2_28" - CIBW_MANYLINUX_AARCH64_IMAGE: "manylinux_2_28" + CIBW_MANYLINUX_X86_64_IMAGE: "manylinux_2_34" + CIBW_MANYLINUX_AARCH64_IMAGE: "manylinux_2_34" CIBW_ENVIRONMENT_LINUX: > PATH=$HOME/.cargo/bin:$HOME/.pecos/deps/llvm-21.1/bin:$PATH LLVM_SYS_211_PREFIX=$HOME/.pecos/deps/llvm-21.1 From 099f54bf0149f0a0442634a0ce02ae1713b747bb Mon Sep 17 00:00:00 2001 From: Ciaran Ryan-Anderson Date: Wed, 3 Jun 2026 17:48:14 -0600 Subject: [PATCH 13/26] Fix Linux LLVM wheel setup --- .github/workflows/julia-release.yml | 2 +- .github/workflows/python-release.yml | 11 ++-- Justfile | 2 +- scripts/ci/install-llvm-21-conda-linux.sh | 77 +++++++++++++++++++++++ scripts/ci/install-llvm-21-release.sh | 21 ++++++- 5 files changed, 104 insertions(+), 9 deletions(-) create mode 100755 scripts/ci/install-llvm-21-conda-linux.sh mode change 100644 => 100755 scripts/ci/install-llvm-21-release.sh diff --git a/.github/workflows/julia-release.yml b/.github/workflows/julia-release.yml index e91d48276..45e95119b 100644 --- a/.github/workflows/julia-release.yml +++ b/.github/workflows/julia-release.yml @@ -134,7 +134,7 @@ jobs: LLVM_PREFIX="$(brew --prefix llvm@21)" else echo "Installing LLVM 21.1 using PECOS-managed packages..." - cargo run --locked -p pecos-cli --release -- llvm ensure --managed --no-configure || bash scripts/ci/install-llvm-21-release.sh + cargo run --locked -p pecos-cli --release -- llvm ensure --managed --no-configure || bash scripts/ci/install-llvm-21-conda-linux.sh LLVM_PREFIX="$HOME/.pecos/deps/llvm-21.1" fi diff --git a/.github/workflows/python-release.yml b/.github/workflows/python-release.yml index dc5914cf2..8fa27c1b0 100644 --- a/.github/workflows/python-release.yml +++ b/.github/workflows/python-release.yml @@ -212,7 +212,7 @@ jobs: # Linux configuration - GCC Toolset and CUDA paths are conditional via matrix variables CIBW_ENVIRONMENT_LINUX: > PATH=${{ matrix.gcc_path_prefix }}$HOME/.cargo/bin:$HOME/.pecos/deps/llvm-21.1/bin:$HOME/.pecos/deps/cmake-${{ env.PECOS_CMAKE_VERSION }}/bin:/usr/local/cuda-12.6/bin:$PATH - LD_LIBRARY_PATH=${{ matrix.gcc_ld_path }}$LD_LIBRARY_PATH + LD_LIBRARY_PATH=${{ matrix.gcc_ld_path }}$HOME/.pecos/deps/llvm-21.1/lib:$LD_LIBRARY_PATH LLVM_SYS_211_PREFIX=$HOME/.pecos/deps/llvm-21.1 CMAKE=$HOME/.pecos/deps/cmake-${{ env.PECOS_CMAKE_VERSION }}/bin/cmake CUDA_PATH=/usr/local/cuda-12.6 @@ -220,7 +220,7 @@ jobs: CIBW_BEFORE_ALL_LINUX: | bash scripts/ci/ensure-rust.sh stable minimal export PATH=$HOME/.cargo/bin:$PATH - dnf install -y libffi-devel xz + dnf install -y bzip2 libffi-devel xz # Install CUDA Toolkit for GPU support on x86_64 (compile-time only, no GPU needed) if [ "${{ matrix.install_cuda }}" = "true" ]; then echo "Installing GCC 13 (required for CUDA 12.6 compatibility)..." @@ -239,7 +239,7 @@ jobs: else echo "Skipping CUDA installation (GPU support not enabled for this build)" fi - cargo run --locked --release -p pecos-cli -- install llvm --force || bash scripts/ci/install-llvm-21-release.sh + bash scripts/ci/install-llvm-21-conda-linux.sh cargo run --locked --release -p pecos-cli -- llvm configure "$HOME/.pecos/deps/llvm-21.1" cargo run --locked --release -p pecos-cli -- install cmake --force CIBW_REPAIR_WHEEL_COMMAND_LINUX: > @@ -315,12 +315,13 @@ jobs: CIBW_MANYLINUX_AARCH64_IMAGE: "manylinux_2_34" CIBW_ENVIRONMENT_LINUX: > PATH=$HOME/.cargo/bin:$HOME/.pecos/deps/llvm-21.1/bin:$PATH + LD_LIBRARY_PATH=$HOME/.pecos/deps/llvm-21.1/lib:$LD_LIBRARY_PATH LLVM_SYS_211_PREFIX=$HOME/.pecos/deps/llvm-21.1 CIBW_BEFORE_ALL_LINUX: | bash scripts/ci/ensure-rust.sh stable minimal export PATH=$HOME/.cargo/bin:$PATH - dnf install -y libffi-devel xz - cargo run --locked --release -p pecos-cli -- install llvm --force || bash scripts/ci/install-llvm-21-release.sh + dnf install -y bzip2 libffi-devel xz + bash scripts/ci/install-llvm-21-conda-linux.sh cargo run --locked --release -p pecos-cli -- llvm configure "$HOME/.pecos/deps/llvm-21.1" CIBW_REPAIR_WHEEL_COMMAND_LINUX: > auditwheel repair -w {dest_dir} {wheel} && diff --git a/Justfile b/Justfile index 90526c5ba..c0425051f 100644 --- a/Justfile +++ b/Justfile @@ -61,7 +61,7 @@ ci-env: _msvc-bootstrap LLVM_RELEASE_VERSION="${LLVM_RELEASE_VERSION:-21.1.8}" case "${RUNNER_OS:-$(uname -s)}" in Linux) - {{pecos}} llvm ensure --managed --no-configure || bash scripts/ci/install-llvm-21-release.sh + {{pecos}} llvm ensure --managed --no-configure || bash scripts/ci/install-llvm-21-conda-linux.sh {{pecos}} llvm configure ;; macOS|Darwin) diff --git a/scripts/ci/install-llvm-21-conda-linux.sh b/scripts/ci/install-llvm-21-conda-linux.sh new file mode 100755 index 000000000..29b2adc4c --- /dev/null +++ b/scripts/ci/install-llvm-21-conda-linux.sh @@ -0,0 +1,77 @@ +#!/usr/bin/env bash +set -euo pipefail + +LLVM_VERSION="${LLVM_VERSION:-21.1}" +LLVM_RELEASE_VERSION="${LLVM_RELEASE_VERSION:-21.1.8}" +INSTALL_DIR="${LLVM_INSTALL_DIR:-$HOME/.pecos/deps/llvm-$LLVM_VERSION}" +MAMBA_VERSION="${MAMBA_VERSION:-latest}" +MAMBA_ROOT_PREFIX="${MAMBA_ROOT_PREFIX:-$HOME/.cache/pecos-micromamba}" + +case "$(uname -m)" in + x86_64|amd64) + MAMBA_PLATFORM="linux-64" + ;; + aarch64|arm64) + MAMBA_PLATFORM="linux-aarch64" + ;; + *) + echo "Unsupported Linux architecture for conda-forge LLVM ${LLVM_RELEASE_VERSION}: $(uname -m)" >&2 + exit 1 + ;; +esac + +llvm_is_valid() { + local llvm_config="$1" + + [ -x "$llvm_config" ] || return 1 + "$llvm_config" --version | grep -q '^21\.1' || return 1 + [ "$("$llvm_config" --shared-mode)" = "shared" ] || return 1 + "$llvm_config" --libnames --link-shared | grep -q 'libLLVM-21\.so' +} + +LLVM_CONFIG="$INSTALL_DIR/bin/llvm-config" +if llvm_is_valid "$LLVM_CONFIG"; then + echo "Shared LLVM $("$LLVM_CONFIG" --version) already installed at $INSTALL_DIR" + exit 0 +fi + +if [ -e "$INSTALL_DIR" ]; then + echo "Removing invalid or non-shared LLVM install at $INSTALL_DIR" + rm -rf "$INSTALL_DIR" +fi + +TMP_DIR="$(mktemp -d)" +trap 'rm -rf "$TMP_DIR"' EXIT + +if command -v micromamba >/dev/null 2>&1; then + MAMBA_BIN="$(command -v micromamba)" +else + MAMBA_URL="https://micro.mamba.pm/api/micromamba/${MAMBA_PLATFORM}/${MAMBA_VERSION}" + MAMBA_ARCHIVE="$TMP_DIR/micromamba.tar.bz2" + + echo "Downloading micromamba for ${MAMBA_PLATFORM}" + curl --fail --location --retry 5 --retry-delay 5 --output "$MAMBA_ARCHIVE" "$MAMBA_URL" + tar -xjf "$MAMBA_ARCHIVE" -C "$TMP_DIR" bin/micromamba + MAMBA_BIN="$TMP_DIR/bin/micromamba" +fi + +echo "Installing conda-forge LLVM ${LLVM_RELEASE_VERSION} to $INSTALL_DIR" +MAMBA_ROOT_PREFIX="$MAMBA_ROOT_PREFIX" "$MAMBA_BIN" create \ + -y \ + -p "$INSTALL_DIR" \ + --override-channels \ + -c conda-forge \ + "llvmdev=${LLVM_RELEASE_VERSION}" + +if ! llvm_is_valid "$LLVM_CONFIG"; then + echo "conda-forge LLVM install did not provide shared LLVM ${LLVM_RELEASE_VERSION}" >&2 + "$LLVM_CONFIG" --version >&2 || true + "$LLVM_CONFIG" --shared-mode >&2 || true + "$LLVM_CONFIG" --libnames --link-shared >&2 || true + exit 1 +fi + +"$LLVM_CONFIG" --version +"$LLVM_CONFIG" --shared-mode +"$LLVM_CONFIG" --libnames --link-shared +echo "Installed shared LLVM ${LLVM_RELEASE_VERSION} to $INSTALL_DIR" diff --git a/scripts/ci/install-llvm-21-release.sh b/scripts/ci/install-llvm-21-release.sh old mode 100644 new mode 100755 index b99b99ee8..14a553700 --- a/scripts/ci/install-llvm-21-release.sh +++ b/scripts/ci/install-llvm-21-release.sh @@ -20,9 +20,21 @@ case "$(uname -m)" in ;; esac -if [ -x "$INSTALL_DIR/bin/llvm-config" ] && "$INSTALL_DIR/bin/llvm-config" --version | grep -q '^21\.1'; then - echo "LLVM $("$INSTALL_DIR/bin/llvm-config" --version) already installed at $INSTALL_DIR" +llvm_is_shared() { + local llvm_config="$1" + + [ -x "$llvm_config" ] || return 1 + "$llvm_config" --version | grep -q '^21\.1' || return 1 + [ "$("$llvm_config" --shared-mode)" = "shared" ] || return 1 + "$llvm_config" --libnames --link-shared | grep -q 'libLLVM-21\.so' +} + +if llvm_is_shared "$INSTALL_DIR/bin/llvm-config"; then + echo "Shared LLVM $("$INSTALL_DIR/bin/llvm-config" --version) already installed at $INSTALL_DIR" exit 0 +elif [ -e "$INSTALL_DIR" ]; then + echo "Removing invalid or non-shared LLVM install at $INSTALL_DIR" + rm -rf "$INSTALL_DIR" fi URL="https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_RELEASE_VERSION}/${ASSET}" @@ -57,4 +69,9 @@ mv "$EXTRACT_DIR" "$INSTALL_DIR" "$INSTALL_DIR/bin/llvm-config" --version "$INSTALL_DIR/bin/llvm-config" --shared-mode +if ! llvm_is_shared "$INSTALL_DIR/bin/llvm-config"; then + echo "The official LLVM ${LLVM_RELEASE_VERSION} Linux archive does not provide libLLVM-21.so." >&2 + echo "PECOS CI needs a shared LLVM build; use scripts/ci/install-llvm-21-conda-linux.sh instead." >&2 + exit 1 +fi echo "Installed LLVM ${LLVM_RELEASE_VERSION} to $INSTALL_DIR" From 15f7262895a10f1ad495e60766034269d1fea32c Mon Sep 17 00:00:00 2001 From: Ciaran Ryan-Anderson Date: Wed, 3 Jun 2026 17:56:45 -0600 Subject: [PATCH 14/26] Fix Windows LLVM setup and docs timeout --- docs/user-guide/qec-guppy.md | 2 +- scripts/ci/install-llvm-21-windows.ps1 | 28 ++++++++++++++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/docs/user-guide/qec-guppy.md b/docs/user-guide/qec-guppy.md index 5318a6afc..04645d245 100644 --- a/docs/user-guide/qec-guppy.md +++ b/docs/user-guide/qec-guppy.md @@ -389,7 +389,7 @@ results = ( .quantum(state_vector()) .noise(depolarizing_noise().with_uniform_probability(0.001)) .seed(42) - .run(1000) + .run(100) ) ``` diff --git a/scripts/ci/install-llvm-21-windows.ps1 b/scripts/ci/install-llvm-21-windows.ps1 index be01b30d0..0981b728a 100644 --- a/scripts/ci/install-llvm-21-windows.ps1 +++ b/scripts/ci/install-llvm-21-windows.ps1 @@ -20,6 +20,24 @@ $Asset = "clang+llvm-$Version-x86_64-pc-windows-msvc.tar.xz" $Url = "https://github.com/llvm/llvm-project/releases/download/llvmorg-$Version/$Asset" $LlvmConfig = Join-Path $InstallDir "bin\llvm-config.exe" +function Get-Sha256Hex { + param([string]$Path) + + $Stream = [System.IO.File]::OpenRead($Path) + try { + $Sha256 = [System.Security.Cryptography.SHA256]::Create() + try { + return -join ($Sha256.ComputeHash($Stream) | ForEach-Object { $_.ToString("x2") }) + } + finally { + $Sha256.Dispose() + } + } + finally { + $Stream.Dispose() + } +} + if (Test-Path $LlvmConfig) { $FoundVersion = (& $LlvmConfig --version).Trim() if ($FoundVersion.StartsWith($RequiredVersion)) { @@ -37,9 +55,15 @@ New-Item -ItemType Directory -Force -Path $ExtractDir | Out-Null try { Write-Host "Downloading official LLVM $Version Windows development archive: $Asset" - Invoke-WebRequest -Uri $Url -OutFile $Archive + $Curl = Get-Command curl.exe -ErrorAction SilentlyContinue + if ($Curl) { + & $Curl.Source --fail --location --retry 5 --retry-delay 5 --output $Archive $Url + } + else { + Invoke-WebRequest -Uri $Url -OutFile $Archive + } - $ActualSha256 = (Get-FileHash -Algorithm SHA256 $Archive).Hash.ToLowerInvariant() + $ActualSha256 = Get-Sha256Hex $Archive if ($ActualSha256 -ne $ExpectedSha256) { throw "SHA256 mismatch for $Asset. Expected $ExpectedSha256, got $ActualSha256" } From 7e4a8aae0415711646aa2db910ea00e2a67b8e7b Mon Sep 17 00:00:00 2001 From: Ciaran Ryan-Anderson Date: Wed, 3 Jun 2026 18:21:44 -0600 Subject: [PATCH 15/26] Fix LLVM CI libclang setup --- .github/workflows/python-release.yml | 10 ++++- .github/workflows/python-test.yml | 2 +- .github/workflows/rust-test.yml | 4 +- .github/workflows/test-docs-examples.yml | 2 +- crates/pecos-cli/src/cli/env_cmd.rs | 54 ++++++++++++++++++++--- scripts/ci/install-llvm-21-conda-linux.sh | 17 +++++-- scripts/ci/install-llvm-21-windows.ps1 | 11 ++++- 7 files changed, 84 insertions(+), 16 deletions(-) diff --git a/.github/workflows/python-release.yml b/.github/workflows/python-release.yml index 8fa27c1b0..41d5c06ef 100644 --- a/.github/workflows/python-release.yml +++ b/.github/workflows/python-release.yml @@ -214,6 +214,7 @@ jobs: PATH=${{ matrix.gcc_path_prefix }}$HOME/.cargo/bin:$HOME/.pecos/deps/llvm-21.1/bin:$HOME/.pecos/deps/cmake-${{ env.PECOS_CMAKE_VERSION }}/bin:/usr/local/cuda-12.6/bin:$PATH LD_LIBRARY_PATH=${{ matrix.gcc_ld_path }}$HOME/.pecos/deps/llvm-21.1/lib:$LD_LIBRARY_PATH LLVM_SYS_211_PREFIX=$HOME/.pecos/deps/llvm-21.1 + LIBCLANG_PATH=$HOME/.pecos/deps/llvm-21.1/lib CMAKE=$HOME/.pecos/deps/cmake-${{ env.PECOS_CMAKE_VERSION }}/bin/cmake CUDA_PATH=/usr/local/cuda-12.6 MATURIN_PEP517_ARGS="--locked --features=extension-module,mwpf" @@ -249,6 +250,7 @@ jobs: CIBW_ENVIRONMENT_MACOS: > PATH=$HOME/.cargo/bin:$HOME/.pecos/deps/llvm-21.1/bin:$HOME/.pecos/deps/cmake-${{ env.PECOS_CMAKE_VERSION }}/CMake.app/Contents/bin:$PATH LLVM_SYS_211_PREFIX=$HOME/.pecos/deps/llvm-21.1 + LIBCLANG_PATH=$HOME/.pecos/deps/llvm-21.1/lib CMAKE=$HOME/.pecos/deps/cmake-${{ env.PECOS_CMAKE_VERSION }}/CMake.app/Contents/bin/cmake MACOSX_DEPLOYMENT_TARGET=13.2 SDKROOT=$(xcrun --show-sdk-path) @@ -274,12 +276,13 @@ jobs: CIBW_ENVIRONMENT_WINDOWS: > PATH="C:\\Users\\runneradmin\\.pecos\\deps\\llvm-21.1\\bin;C:\\Users\\runneradmin\\.pecos\\deps\\cmake-${{ env.PECOS_CMAKE_VERSION }}\\bin;$PATH" LLVM_SYS_211_PREFIX="C:\\Users\\runneradmin\\.pecos\\deps\\llvm-21.1" + LIBCLANG_PATH="C:\\Users\\runneradmin\\.pecos\\deps\\llvm-21.1\\bin" CMAKE="C:\\Users\\runneradmin\\.pecos\\deps\\cmake-${{ env.PECOS_CMAKE_VERSION }}\\bin\\cmake.exe" MATURIN_PEP517_ARGS="--locked --features=extension-module,mwpf" CIBW_BEFORE_ALL_WINDOWS: > echo "=== Installing LLVM 21.1 development archive ===" && rustup update && - powershell -NoProfile -ExecutionPolicy Bypass -File scripts\ci\install-llvm-21-windows.ps1 -InstallDir "C:\Users\runneradmin\.pecos\deps\llvm-21.1" -Version ${{ env.LLVM_RELEASE_VERSION }} && + powershell.exe -NoProfile -ExecutionPolicy Bypass -File scripts\ci\install-llvm-21-windows.ps1 -InstallDir "C:\Users\runneradmin\.pecos\deps\llvm-21.1" -Version ${{ env.LLVM_RELEASE_VERSION }} && cargo run --locked --release -p pecos-cli -- llvm configure "C:\Users\runneradmin\.pecos\deps\llvm-21.1" && cargo run --locked --release -p pecos-cli -- install cmake --force && echo "=== Checking LLVM installation ===" && @@ -317,6 +320,7 @@ jobs: PATH=$HOME/.cargo/bin:$HOME/.pecos/deps/llvm-21.1/bin:$PATH LD_LIBRARY_PATH=$HOME/.pecos/deps/llvm-21.1/lib:$LD_LIBRARY_PATH LLVM_SYS_211_PREFIX=$HOME/.pecos/deps/llvm-21.1 + LIBCLANG_PATH=$HOME/.pecos/deps/llvm-21.1/lib CIBW_BEFORE_ALL_LINUX: | bash scripts/ci/ensure-rust.sh stable minimal export PATH=$HOME/.cargo/bin:$PATH @@ -329,6 +333,7 @@ jobs: CIBW_ENVIRONMENT_MACOS: > PATH=$HOME/.cargo/bin:$HOME/.pecos/deps/llvm-21.1/bin:$PATH LLVM_SYS_211_PREFIX=$HOME/.pecos/deps/llvm-21.1 + LIBCLANG_PATH=$HOME/.pecos/deps/llvm-21.1/lib MACOSX_DEPLOYMENT_TARGET=13.2 SDKROOT=$(xcrun --show-sdk-path) CIBW_BEFORE_ALL_MACOS: | @@ -354,9 +359,10 @@ jobs: CIBW_ENVIRONMENT_WINDOWS: > PATH="C:\\Users\\runneradmin\\.pecos\\deps\\llvm-21.1\\bin;$PATH" LLVM_SYS_211_PREFIX="C:\\Users\\runneradmin\\.pecos\\deps\\llvm-21.1" + LIBCLANG_PATH="C:\\Users\\runneradmin\\.pecos\\deps\\llvm-21.1\\bin" CIBW_BEFORE_ALL_WINDOWS: > rustup update && - if not exist "C:\Users\runneradmin\.pecos\deps\llvm-21.1\bin\llvm-config.exe" (powershell -NoProfile -ExecutionPolicy Bypass -File scripts\ci\install-llvm-21-windows.ps1 -InstallDir "C:\Users\runneradmin\.pecos\deps\llvm-21.1" -Version ${{ env.LLVM_RELEASE_VERSION }}) else (echo LLVM already installed from pecos-rslib build) && + if not exist "C:\Users\runneradmin\.pecos\deps\llvm-21.1\bin\llvm-config.exe" (powershell.exe -NoProfile -ExecutionPolicy Bypass -File scripts\ci\install-llvm-21-windows.ps1 -InstallDir "C:\Users\runneradmin\.pecos\deps\llvm-21.1" -Version ${{ env.LLVM_RELEASE_VERSION }}) else (echo LLVM already installed from pecos-rslib build) && cargo run --locked --release -p pecos-cli -- llvm configure "C:\Users\runneradmin\.pecos\deps\llvm-21.1" CIBW_BEFORE_BUILD_WINDOWS: > pip install delvewheel && diff --git a/.github/workflows/python-test.yml b/.github/workflows/python-test.yml index 83474847d..289a8f715 100644 --- a/.github/workflows/python-test.yml +++ b/.github/workflows/python-test.yml @@ -140,7 +140,7 @@ jobs: uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 with: path: ~/.pecos/deps/llvm-21.1 - key: llvm-${{ env.LLVM_RELEASE_VERSION }}-${{ runner.os }}-${{ runner.arch }}-v2 + key: llvm-${{ env.LLVM_RELEASE_VERSION }}-${{ runner.os }}-${{ runner.arch }}-v3 # `just ci-env` is the first cargo invocation. Its `_msvc-bootstrap` # prerequisite writes the MSVC linker + LIB/INCLUDE into diff --git a/.github/workflows/rust-test.yml b/.github/workflows/rust-test.yml index e162b6e55..dd43be99f 100644 --- a/.github/workflows/rust-test.yml +++ b/.github/workflows/rust-test.yml @@ -91,7 +91,7 @@ jobs: uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 with: path: ~/.pecos/deps/llvm-21.1 - key: llvm-${{ env.LLVM_RELEASE_VERSION }}-${{ runner.os }}-${{ runner.arch }}-v2 + key: llvm-${{ env.LLVM_RELEASE_VERSION }}-${{ runner.os }}-${{ runner.arch }}-v3 - name: Ensure LLVM ${{ env.LLVM_VERSION }} run: just ci-env @@ -232,7 +232,7 @@ jobs: uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 with: path: ~/.pecos/deps/llvm-21.1 - key: llvm-${{ env.LLVM_RELEASE_VERSION }}-${{ runner.os }}-${{ runner.arch }}-v2 + key: llvm-${{ env.LLVM_RELEASE_VERSION }}-${{ runner.os }}-${{ runner.arch }}-v3 - name: Bootstrap MSVC for the Cargo build path (Windows) if: runner.os == 'Windows' diff --git a/.github/workflows/test-docs-examples.yml b/.github/workflows/test-docs-examples.yml index 53ba5305c..11972e83e 100644 --- a/.github/workflows/test-docs-examples.yml +++ b/.github/workflows/test-docs-examples.yml @@ -75,7 +75,7 @@ jobs: uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 with: path: ~/.pecos/deps/llvm-21.1 - key: llvm-${{ env.LLVM_RELEASE_VERSION }}-${{ runner.os }}-${{ runner.arch }}-v2 + key: llvm-${{ env.LLVM_RELEASE_VERSION }}-${{ runner.os }}-${{ runner.arch }}-v3 - name: Ensure LLVM ${{ env.LLVM_VERSION }} run: just ci-env diff --git a/crates/pecos-cli/src/cli/env_cmd.rs b/crates/pecos-cli/src/cli/env_cmd.rs index 70a19412d..f3f3585d6 100644 --- a/crates/pecos-cli/src/cli/env_cmd.rs +++ b/crates/pecos-cli/src/cli/env_cmd.rs @@ -26,9 +26,10 @@ use std::collections::BTreeMap; use std::ffi::OsString; use std::fmt::Write; +use std::fs; use std::fs::OpenOptions; use std::io::Write as IoWrite; -use std::path::Path; +use std::path::{Path, PathBuf}; use pecos_build::Result; use pecos_build::errors::Error; @@ -59,11 +60,16 @@ pub fn collect_env() -> BTreeMap { } } - if pecos_build::llvm::get_llvm_shared_mode(&llvm_path) - .is_ok_and(|mode| mode.trim().eq_ignore_ascii_case("shared")) - && let Ok(libdir) = pecos_build::llvm::get_llvm_libdir(&llvm_path) - { - add_llvm_runtime_library_path(&mut env, &libdir); + if let Ok(libdir) = pecos_build::llvm::get_llvm_libdir(&llvm_path) { + if pecos_build::llvm::get_llvm_shared_mode(&llvm_path) + .is_ok_and(|mode| mode.trim().eq_ignore_ascii_case("shared")) + { + add_llvm_runtime_library_path(&mut env, &libdir); + } + + if let Some(libclang_dir) = find_libclang_dir(&llvm_path, &libdir) { + env.insert("LIBCLANG_PATH".into(), libclang_dir.display().to_string()); + } } } @@ -161,6 +167,42 @@ fn prepend_path_env(env: &mut BTreeMap, key: &str, first: &Path) } } +fn find_libclang_dir(llvm_path: &Path, libdir: &Path) -> Option { + let mut candidates = vec![libdir.to_path_buf()]; + if cfg!(windows) { + candidates.insert(0, llvm_path.join("bin")); + } + + candidates + .into_iter() + .find(|candidate| contains_libclang(candidate)) +} + +fn contains_libclang(dir: &Path) -> bool { + let Ok(entries) = fs::read_dir(dir) else { + return false; + }; + + entries + .filter_map(std::result::Result::ok) + .any(|entry| entry.file_name().to_str().is_some_and(is_libclang_filename)) +} + +fn is_libclang_filename(name: &str) -> bool { + if cfg!(windows) { + return name.eq_ignore_ascii_case("libclang.dll"); + } + + if cfg!(target_os = "macos") { + return name == "libclang.dylib" + || (name.starts_with("libclang.") && name.ends_with(".dylib")); + } + + name == "libclang.so" + || name.starts_with("libclang.so.") + || name.starts_with("libclang-") && name.contains(".so") +} + /// Print environment in shell-eval format: `export KEY="VALUE"` pub fn print_shell(env: &BTreeMap) { for (key, value) in env { diff --git a/scripts/ci/install-llvm-21-conda-linux.sh b/scripts/ci/install-llvm-21-conda-linux.sh index 29b2adc4c..7bb3b845b 100755 --- a/scripts/ci/install-llvm-21-conda-linux.sh +++ b/scripts/ci/install-llvm-21-conda-linux.sh @@ -22,11 +22,17 @@ esac llvm_is_valid() { local llvm_config="$1" + local llvm_dir + + llvm_dir="$(dirname "$(dirname "$llvm_config")")" [ -x "$llvm_config" ] || return 1 "$llvm_config" --version | grep -q '^21\.1' || return 1 [ "$("$llvm_config" --shared-mode)" = "shared" ] || return 1 "$llvm_config" --libnames --link-shared | grep -q 'libLLVM-21\.so' + find "$llvm_dir/lib" -maxdepth 1 \ + \( -name 'libclang.so' -o -name 'libclang-*.so' -o -name 'libclang.so.*' -o -name 'libclang-*.so.*' \) \ + | grep -q . } LLVM_CONFIG="$INSTALL_DIR/bin/llvm-config" @@ -61,17 +67,22 @@ MAMBA_ROOT_PREFIX="$MAMBA_ROOT_PREFIX" "$MAMBA_BIN" create \ -p "$INSTALL_DIR" \ --override-channels \ -c conda-forge \ - "llvmdev=${LLVM_RELEASE_VERSION}" + "llvmdev=${LLVM_RELEASE_VERSION}" \ + "libclang=${LLVM_RELEASE_VERSION}" if ! llvm_is_valid "$LLVM_CONFIG"; then - echo "conda-forge LLVM install did not provide shared LLVM ${LLVM_RELEASE_VERSION}" >&2 + echo "conda-forge LLVM install did not provide shared LLVM and libclang ${LLVM_RELEASE_VERSION}" >&2 "$LLVM_CONFIG" --version >&2 || true "$LLVM_CONFIG" --shared-mode >&2 || true "$LLVM_CONFIG" --libnames --link-shared >&2 || true + find "$INSTALL_DIR/lib" -maxdepth 1 -name 'libclang*' -print >&2 || true exit 1 fi "$LLVM_CONFIG" --version "$LLVM_CONFIG" --shared-mode "$LLVM_CONFIG" --libnames --link-shared -echo "Installed shared LLVM ${LLVM_RELEASE_VERSION} to $INSTALL_DIR" +find "$INSTALL_DIR/lib" -maxdepth 1 \ + \( -name 'libclang.so' -o -name 'libclang-*.so' -o -name 'libclang.so.*' -o -name 'libclang-*.so.*' \) \ + -print +echo "Installed shared LLVM and libclang ${LLVM_RELEASE_VERSION} to $INSTALL_DIR" diff --git a/scripts/ci/install-llvm-21-windows.ps1 b/scripts/ci/install-llvm-21-windows.ps1 index 0981b728a..ff7b981fc 100644 --- a/scripts/ci/install-llvm-21-windows.ps1 +++ b/scripts/ci/install-llvm-21-windows.ps1 @@ -68,7 +68,16 @@ try { throw "SHA256 mismatch for $Asset. Expected $ExpectedSha256, got $ActualSha256" } - tar -xf $Archive -C $ExtractDir --strip-components=1 + $Tar = Join-Path $env:SystemRoot "System32\tar.exe" + if (-not (Test-Path $Tar)) { + $Tar = "tar.exe" + } + + Write-Host "Extracting LLVM archive with $Tar" + & $Tar -xf $Archive -C $ExtractDir --strip-components=1 + if ($LASTEXITCODE -ne 0) { + throw "tar failed with exit code $LASTEXITCODE" + } if (Test-Path $InstallDir) { Remove-Item -Recurse -Force $InstallDir From d0fcb02a52659b0ef7c05ad844ab870a0776a2de Mon Sep 17 00:00:00 2001 From: Ciaran Ryan-Anderson Date: Wed, 3 Jun 2026 18:51:25 -0600 Subject: [PATCH 16/26] Fix libclang path lint --- crates/pecos-cli/src/cli/env_cmd.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/crates/pecos-cli/src/cli/env_cmd.rs b/crates/pecos-cli/src/cli/env_cmd.rs index f3f3585d6..a99dc51fe 100644 --- a/crates/pecos-cli/src/cli/env_cmd.rs +++ b/crates/pecos-cli/src/cli/env_cmd.rs @@ -195,7 +195,10 @@ fn is_libclang_filename(name: &str) -> bool { if cfg!(target_os = "macos") { return name == "libclang.dylib" - || (name.starts_with("libclang.") && name.ends_with(".dylib")); + || (name.starts_with("libclang.") + && Path::new(name) + .extension() + .is_some_and(|extension| extension.eq_ignore_ascii_case("dylib"))); } name == "libclang.so" From ff49e49e4a9827326cf1f3feba3677591ceb4c78 Mon Sep 17 00:00:00 2001 From: Ciaran Ryan-Anderson Date: Wed, 3 Jun 2026 20:13:46 -0600 Subject: [PATCH 17/26] Fix Linux wheel policy --- .github/workflows/python-release.yml | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/.github/workflows/python-release.yml b/.github/workflows/python-release.yml index 41d5c06ef..a8f7d61eb 100644 --- a/.github/workflows/python-release.yml +++ b/.github/workflows/python-release.yml @@ -90,16 +90,14 @@ jobs: fail-fast: false matrix: include: - # Linux x86_64 with CUDA support (uses GCC Toolset 13 for CUDA compatibility) + # Linux x86_64 with CUDA support. Use the manylinux 2.34 image's + # default GCC 11 toolchain: CUDA 12.6 supports GCC 6.x-13.2, while + # GCC 13 emits libstdc++ symbols newer than auditwheel's + # manylinux_2_35 policy allows. - os: ubuntu-latest architecture: x86_64 cibw_archs: x86_64 install_cuda: true - # GCC Toolset 13 paths for CUDA compatibility - gcc_path_prefix: "/opt/rh/gcc-toolset-13/root/usr/bin:" - gcc_ld_path: "/opt/rh/gcc-toolset-13/root/usr/lib64:/opt/rh/gcc-toolset-13/root/usr/lib:" - gcc_cc: "/opt/rh/gcc-toolset-13/root/usr/bin/gcc" - gcc_cxx: "/opt/rh/gcc-toolset-13/root/usr/bin/g++" # Linux aarch64 - temporarily disabled while the LLVM 21.1 # manylinux_2_34 bootstrap is validated on the primary x86_64 lane. # - os: ubuntu-24.04-arm @@ -209,10 +207,9 @@ jobs: CIBW_ARCHS_LINUX: ${{ matrix.cibw_archs }} CIBW_MANYLINUX_X86_64_IMAGE: "manylinux_2_34" CIBW_MANYLINUX_AARCH64_IMAGE: "manylinux_2_34" - # Linux configuration - GCC Toolset and CUDA paths are conditional via matrix variables + # Linux configuration - CUDA paths are conditional via matrix variables CIBW_ENVIRONMENT_LINUX: > - PATH=${{ matrix.gcc_path_prefix }}$HOME/.cargo/bin:$HOME/.pecos/deps/llvm-21.1/bin:$HOME/.pecos/deps/cmake-${{ env.PECOS_CMAKE_VERSION }}/bin:/usr/local/cuda-12.6/bin:$PATH - LD_LIBRARY_PATH=${{ matrix.gcc_ld_path }}$HOME/.pecos/deps/llvm-21.1/lib:$LD_LIBRARY_PATH + PATH=$HOME/.cargo/bin:$HOME/.pecos/deps/llvm-21.1/bin:$HOME/.pecos/deps/cmake-${{ env.PECOS_CMAKE_VERSION }}/bin:/usr/local/cuda-12.6/bin:$PATH LLVM_SYS_211_PREFIX=$HOME/.pecos/deps/llvm-21.1 LIBCLANG_PATH=$HOME/.pecos/deps/llvm-21.1/lib CMAKE=$HOME/.pecos/deps/cmake-${{ env.PECOS_CMAKE_VERSION }}/bin/cmake @@ -224,9 +221,6 @@ jobs: dnf install -y bzip2 libffi-devel xz # Install CUDA Toolkit for GPU support on x86_64 (compile-time only, no GPU needed) if [ "${{ matrix.install_cuda }}" = "true" ]; then - echo "Installing GCC 13 (required for CUDA 12.6 compatibility)..." - dnf install -y gcc-toolset-13 - source /opt/rh/gcc-toolset-13/enable echo "Installing CUDA Toolkit from NVIDIA repos..." . /etc/os-release CUDA_RHEL_MAJOR="${VERSION_ID%%.*}" @@ -244,7 +238,7 @@ jobs: cargo run --locked --release -p pecos-cli -- llvm configure "$HOME/.pecos/deps/llvm-21.1" cargo run --locked --release -p pecos-cli -- install cmake --force CIBW_REPAIR_WHEEL_COMMAND_LINUX: > - auditwheel repair -w {dest_dir} {wheel} && + auditwheel repair --plat manylinux_2_35_${{ matrix.cibw_archs }} -w {dest_dir} {wheel} && pipx run abi3audit --strict --report {wheel} # macOS configuration CIBW_ENVIRONMENT_MACOS: > @@ -328,7 +322,7 @@ jobs: bash scripts/ci/install-llvm-21-conda-linux.sh cargo run --locked --release -p pecos-cli -- llvm configure "$HOME/.pecos/deps/llvm-21.1" CIBW_REPAIR_WHEEL_COMMAND_LINUX: > - auditwheel repair -w {dest_dir} {wheel} && + auditwheel repair --plat manylinux_2_35_${{ matrix.cibw_archs }} -w {dest_dir} {wheel} && pipx run abi3audit --strict --report {wheel} CIBW_ENVIRONMENT_MACOS: > PATH=$HOME/.cargo/bin:$HOME/.pecos/deps/llvm-21.1/bin:$PATH From 4b42fc81ed31c22e7799dba6eef1827f1559d234 Mon Sep 17 00:00:00 2001 From: Ciaran Ryan-Anderson Date: Wed, 3 Jun 2026 20:44:10 -0600 Subject: [PATCH 18/26] Fix macOS wheel deployment target --- .github/workflows/python-release.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/python-release.yml b/.github/workflows/python-release.yml index a8f7d61eb..468d2c551 100644 --- a/.github/workflows/python-release.yml +++ b/.github/workflows/python-release.yml @@ -7,6 +7,7 @@ env: TRIGGER_ON_PR_PUSH: true # Set to true to enable triggers on PR pushes LLVM_VERSION: "21.1" LLVM_RELEASE_VERSION: "21.1.8" + MACOS_WHEEL_DEPLOYMENT_TARGET: "15.0" # Must match pecos_build::cmake::CMAKE_VERSION. The MWPF decoder feature # uses highs-sys, which needs cmake; the wheel build installs this version # via `pecos install cmake` and points highs-sys's cmake-rs at it via $CMAKE. @@ -246,7 +247,7 @@ jobs: LLVM_SYS_211_PREFIX=$HOME/.pecos/deps/llvm-21.1 LIBCLANG_PATH=$HOME/.pecos/deps/llvm-21.1/lib CMAKE=$HOME/.pecos/deps/cmake-${{ env.PECOS_CMAKE_VERSION }}/CMake.app/Contents/bin/cmake - MACOSX_DEPLOYMENT_TARGET=13.2 + MACOSX_DEPLOYMENT_TARGET=${{ env.MACOS_WHEEL_DEPLOYMENT_TARGET }} SDKROOT=$(xcrun --show-sdk-path) MATURIN_PEP517_ARGS="--locked --features=extension-module,mwpf" CIBW_BEFORE_ALL_MACOS: | @@ -328,7 +329,7 @@ jobs: PATH=$HOME/.cargo/bin:$HOME/.pecos/deps/llvm-21.1/bin:$PATH LLVM_SYS_211_PREFIX=$HOME/.pecos/deps/llvm-21.1 LIBCLANG_PATH=$HOME/.pecos/deps/llvm-21.1/lib - MACOSX_DEPLOYMENT_TARGET=13.2 + MACOSX_DEPLOYMENT_TARGET=${{ env.MACOS_WHEEL_DEPLOYMENT_TARGET }} SDKROOT=$(xcrun --show-sdk-path) CIBW_BEFORE_ALL_MACOS: | if ! command -v cargo >/dev/null 2>&1; then From 2706d1fc46e617828a805e2929a52800561152e5 Mon Sep 17 00:00:00 2001 From: Ciaran Ryan-Anderson Date: Wed, 3 Jun 2026 21:37:15 -0600 Subject: [PATCH 19/26] Fix Linux wheel compiler --- .github/workflows/python-release.yml | 35 ++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/.github/workflows/python-release.yml b/.github/workflows/python-release.yml index 468d2c551..eb50d8553 100644 --- a/.github/workflows/python-release.yml +++ b/.github/workflows/python-release.yml @@ -91,10 +91,10 @@ jobs: fail-fast: false matrix: include: - # Linux x86_64 with CUDA support. Use the manylinux 2.34 image's - # default GCC 11 toolchain: CUDA 12.6 supports GCC 6.x-13.2, while - # GCC 13 emits libstdc++ symbols newer than auditwheel's - # manylinux_2_35 policy allows. + # Linux x86_64 with CUDA support. The manylinux 2.34 image's default + # compiler is GCC 14, which emits libstdc++ symbols newer than + # auditwheel's manylinux_2_35 policy allows. Install and pin the + # AlmaLinux system GCC 11 toolchain in the Linux build environment. - os: ubuntu-latest architecture: x86_64 cibw_archs: x86_64 @@ -215,11 +215,21 @@ jobs: LIBCLANG_PATH=$HOME/.pecos/deps/llvm-21.1/lib CMAKE=$HOME/.pecos/deps/cmake-${{ env.PECOS_CMAKE_VERSION }}/bin/cmake CUDA_PATH=/usr/local/cuda-12.6 + CC=/usr/bin/gcc + CXX=/usr/bin/g++ + CUDAHOSTCXX=/usr/bin/g++ + CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER=/usr/bin/gcc + CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=/usr/bin/gcc MATURIN_PEP517_ARGS="--locked --features=extension-module,mwpf" CIBW_BEFORE_ALL_LINUX: | bash scripts/ci/ensure-rust.sh stable minimal export PATH=$HOME/.cargo/bin:$PATH - dnf install -y bzip2 libffi-devel xz + dnf install -y bzip2 gcc gcc-c++ libffi-devel xz + export CC=/usr/bin/gcc + export CXX=/usr/bin/g++ + export CUDAHOSTCXX=/usr/bin/g++ + export CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER=/usr/bin/gcc + export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=/usr/bin/gcc # Install CUDA Toolkit for GPU support on x86_64 (compile-time only, no GPU needed) if [ "${{ matrix.install_cuda }}" = "true" ]; then echo "Installing CUDA Toolkit from NVIDIA repos..." @@ -231,10 +241,11 @@ jobs: export PATH=$CUDA_PATH/bin:$PATH echo "CUDA installed at $CUDA_PATH" nvcc --version - gcc --version else echo "Skipping CUDA installation (GPU support not enabled for this build)" fi + "$CC" --version + "$CXX" --version bash scripts/ci/install-llvm-21-conda-linux.sh cargo run --locked --release -p pecos-cli -- llvm configure "$HOME/.pecos/deps/llvm-21.1" cargo run --locked --release -p pecos-cli -- install cmake --force @@ -316,10 +327,20 @@ jobs: LD_LIBRARY_PATH=$HOME/.pecos/deps/llvm-21.1/lib:$LD_LIBRARY_PATH LLVM_SYS_211_PREFIX=$HOME/.pecos/deps/llvm-21.1 LIBCLANG_PATH=$HOME/.pecos/deps/llvm-21.1/lib + CC=/usr/bin/gcc + CXX=/usr/bin/g++ + CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER=/usr/bin/gcc + CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=/usr/bin/gcc CIBW_BEFORE_ALL_LINUX: | bash scripts/ci/ensure-rust.sh stable minimal export PATH=$HOME/.cargo/bin:$PATH - dnf install -y bzip2 libffi-devel xz + dnf install -y bzip2 gcc gcc-c++ libffi-devel xz + export CC=/usr/bin/gcc + export CXX=/usr/bin/g++ + export CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER=/usr/bin/gcc + export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=/usr/bin/gcc + "$CC" --version + "$CXX" --version bash scripts/ci/install-llvm-21-conda-linux.sh cargo run --locked --release -p pecos-cli -- llvm configure "$HOME/.pecos/deps/llvm-21.1" CIBW_REPAIR_WHEEL_COMMAND_LINUX: > From bcacb19bb021caad4f4c350928ccc90b5fff353e Mon Sep 17 00:00:00 2001 From: Ciaran Ryan-Anderson Date: Thu, 4 Jun 2026 06:37:37 -0600 Subject: [PATCH 20/26] Fix Linux wheel repair path --- .github/workflows/python-release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/python-release.yml b/.github/workflows/python-release.yml index eb50d8553..bc91d1686 100644 --- a/.github/workflows/python-release.yml +++ b/.github/workflows/python-release.yml @@ -250,6 +250,7 @@ jobs: cargo run --locked --release -p pecos-cli -- llvm configure "$HOME/.pecos/deps/llvm-21.1" cargo run --locked --release -p pecos-cli -- install cmake --force CIBW_REPAIR_WHEEL_COMMAND_LINUX: > + LD_LIBRARY_PATH=$HOME/.pecos/deps/llvm-21.1/lib:$LD_LIBRARY_PATH auditwheel repair --plat manylinux_2_35_${{ matrix.cibw_archs }} -w {dest_dir} {wheel} && pipx run abi3audit --strict --report {wheel} # macOS configuration @@ -344,6 +345,7 @@ jobs: bash scripts/ci/install-llvm-21-conda-linux.sh cargo run --locked --release -p pecos-cli -- llvm configure "$HOME/.pecos/deps/llvm-21.1" CIBW_REPAIR_WHEEL_COMMAND_LINUX: > + LD_LIBRARY_PATH=$HOME/.pecos/deps/llvm-21.1/lib:$LD_LIBRARY_PATH auditwheel repair --plat manylinux_2_35_${{ matrix.cibw_archs }} -w {dest_dir} {wheel} && pipx run abi3audit --strict --report {wheel} CIBW_ENVIRONMENT_MACOS: > From 52da0483fdf6691d90a5fdbad42a678894bc2a37 Mon Sep 17 00:00:00 2001 From: Ciaran Ryan-Anderson Date: Thu, 4 Jun 2026 23:02:59 -0600 Subject: [PATCH 21/26] Fix Windows LLVM extraction --- scripts/ci/install-llvm-21-windows.ps1 | 61 +++++++++++++++++++++++--- 1 file changed, 54 insertions(+), 7 deletions(-) diff --git a/scripts/ci/install-llvm-21-windows.ps1 b/scripts/ci/install-llvm-21-windows.ps1 index ff7b981fc..29630d8b0 100644 --- a/scripts/ci/install-llvm-21-windows.ps1 +++ b/scripts/ci/install-llvm-21-windows.ps1 @@ -20,6 +20,34 @@ $Asset = "clang+llvm-$Version-x86_64-pc-windows-msvc.tar.xz" $Url = "https://github.com/llvm/llvm-project/releases/download/llvmorg-$Version/$Asset" $LlvmConfig = Join-Path $InstallDir "bin\llvm-config.exe" +function Find-SevenZip { + foreach ($Name in @("7z.exe", "7zz.exe", "7za.exe")) { + $Command = Get-Command $Name -ErrorAction SilentlyContinue + if ($Command) { + return $Command.Source + } + } + + $Candidates = @() + if ($env:ProgramFiles) { + $Candidates += Join-Path $env:ProgramFiles "7-Zip\7z.exe" + } + if (${env:ProgramFiles(x86)}) { + $Candidates += Join-Path ${env:ProgramFiles(x86)} "7-Zip\7z.exe" + } + if ($env:ChocolateyInstall) { + $Candidates += Join-Path $env:ChocolateyInstall "bin\7z.exe" + } + + foreach ($Candidate in $Candidates) { + if ($Candidate -and (Test-Path $Candidate)) { + return $Candidate + } + } + + return $null +} + function Get-Sha256Hex { param([string]$Path) @@ -48,9 +76,11 @@ if (Test-Path $LlvmConfig) { $TempDir = Join-Path ([System.IO.Path]::GetTempPath()) "pecos-llvm-$([System.Guid]::NewGuid())" $Archive = Join-Path $TempDir $Asset +$TarDir = Join-Path $TempDir "tar" $ExtractDir = Join-Path $TempDir "extract" New-Item -ItemType Directory -Force -Path $TempDir | Out-Null +New-Item -ItemType Directory -Force -Path $TarDir | Out-Null New-Item -ItemType Directory -Force -Path $ExtractDir | Out-Null try { @@ -68,22 +98,39 @@ try { throw "SHA256 mismatch for $Asset. Expected $ExpectedSha256, got $ActualSha256" } - $Tar = Join-Path $env:SystemRoot "System32\tar.exe" - if (-not (Test-Path $Tar)) { - $Tar = "tar.exe" + $SevenZip = Find-SevenZip + if (-not $SevenZip) { + throw "7-Zip is required to extract $Asset on Windows. Windows tar.exe can hang for hours on this archive in CI; install 7-Zip or provide an existing LLVM 21.1 install." } - Write-Host "Extracting LLVM archive with $Tar" - & $Tar -xf $Archive -C $ExtractDir --strip-components=1 + Write-Host "Extracting compressed LLVM archive with $SevenZip" + & $SevenZip x -y -bb0 "-o$TarDir" $Archive if ($LASTEXITCODE -ne 0) { - throw "tar failed with exit code $LASTEXITCODE" + throw "7-Zip failed to decompress $Asset with exit code $LASTEXITCODE" + } + + $TarArchive = Get-ChildItem -Path $TarDir -File -Filter "*.tar" | Select-Object -First 1 + if (-not $TarArchive) { + throw "7-Zip did not produce a .tar payload from $Asset" + } + + Write-Host "Extracting LLVM payload with $SevenZip" + & $SevenZip x -y -bb0 "-o$ExtractDir" $TarArchive.FullName + if ($LASTEXITCODE -ne 0) { + throw "7-Zip failed to extract $($TarArchive.Name) with exit code $LASTEXITCODE" + } + + $PayloadRoots = @(Get-ChildItem -Path $ExtractDir -Directory) + if ($PayloadRoots.Count -ne 1) { + throw "Expected one LLVM payload directory in $ExtractDir, found $($PayloadRoots.Count)" } + $PayloadDir = $PayloadRoots[0].FullName if (Test-Path $InstallDir) { Remove-Item -Recurse -Force $InstallDir } New-Item -ItemType Directory -Force -Path (Split-Path -Parent $InstallDir) | Out-Null - Move-Item $ExtractDir $InstallDir + Move-Item -Path $PayloadDir -Destination $InstallDir & $LlvmConfig --version & $LlvmConfig --shared-mode From abdb945720022ee90878e262a252bd4fa02355b8 Mon Sep 17 00:00:00 2001 From: Ciaran Ryan-Anderson Date: Fri, 5 Jun 2026 08:40:53 -0600 Subject: [PATCH 22/26] Fix Windows LLVM CI linking --- .github/workflows/rust-test.yml | 24 ++++++++- Justfile | 8 ++- scripts/ci/install-llvm-21-windows.ps1 | 37 ++++++++++++++ scripts/ci/llvm-config-wrapper.rs | 70 ++++++++++++++++++++++++++ 4 files changed, 133 insertions(+), 6 deletions(-) create mode 100644 scripts/ci/llvm-config-wrapper.rs diff --git a/.github/workflows/rust-test.yml b/.github/workflows/rust-test.yml index dd43be99f..51bd1eed2 100644 --- a/.github/workflows/rust-test.yml +++ b/.github/workflows/rust-test.yml @@ -294,4 +294,26 @@ jobs: - name: Run tests (Windows) if: runner.os == 'Windows' - run: cargo run --locked -p pecos-cli --release -- rust test + shell: bash + run: | + set -euo pipefail + # Windows CI uses the official LLVM development archive, which is + # static-only for MSVC. Keep this lane targeted so it still exercises + # LLVM without fanning out many static HUGR linker jobs at once. + cargo test --locked --workspace --release \ + --exclude pecos-rslib \ + --exclude pecos-rslib-cuda \ + --exclude pecos-julia-ffi \ + --exclude pecos-go-ffi \ + --exclude pecos-rslib-exp \ + --exclude pecos-rslib-llvm \ + --exclude pecos-cuquantum \ + --exclude pecos-cli \ + --exclude pecos-decoders \ + --exclude pecos-gpu-sims \ + --exclude pecos-hugr-qis \ + --exclude pecos-llvm + cargo test --locked -p pecos-cli --features=runtime --release + cargo test --locked -p pecos-llvm --release + cargo test --locked -p pecos-qis --no-default-features --features=llvm --release + cargo test --locked -p pecos-hugr-qis --release diff --git a/Justfile b/Justfile index c0425051f..1760a430e 100644 --- a/Justfile +++ b/Justfile @@ -71,11 +71,9 @@ ci-env: _msvc-bootstrap {{pecos}} llvm configure "$(brew --prefix llvm@21)" ;; Windows*|MINGW*|MSYS*|CYGWIN*) - if ! {{pecos}} llvm find >/dev/null 2>&1; then - LLVM_PREFIX="${USERPROFILE:-$HOME}\\.pecos\\deps\\llvm-21.1" - powershell.exe -NoProfile -ExecutionPolicy Bypass -File scripts/ci/install-llvm-21-windows.ps1 -InstallDir "$LLVM_PREFIX" -Version "$LLVM_RELEASE_VERSION" - fi - {{pecos}} llvm configure + LLVM_PREFIX="${USERPROFILE:-$HOME}\\.pecos\\deps\\llvm-21.1" + powershell.exe -NoProfile -ExecutionPolicy Bypass -File scripts/ci/install-llvm-21-windows.ps1 -InstallDir "$LLVM_PREFIX" -Version "$LLVM_RELEASE_VERSION" + {{pecos}} llvm configure "$LLVM_PREFIX" ;; *) {{pecos}} llvm ensure --managed --no-configure diff --git a/scripts/ci/install-llvm-21-windows.ps1 b/scripts/ci/install-llvm-21-windows.ps1 index 29630d8b0..8deee25d3 100644 --- a/scripts/ci/install-llvm-21-windows.ps1 +++ b/scripts/ci/install-llvm-21-windows.ps1 @@ -19,6 +19,7 @@ $RequiredVersion = "21.1" $Asset = "clang+llvm-$Version-x86_64-pc-windows-msvc.tar.xz" $Url = "https://github.com/llvm/llvm-project/releases/download/llvmorg-$Version/$Asset" $LlvmConfig = Join-Path $InstallDir "bin\llvm-config.exe" +$LlvmConfigReal = Join-Path $InstallDir "bin\llvm-config.real.exe" function Find-SevenZip { foreach ($Name in @("7z.exe", "7zz.exe", "7za.exe")) { @@ -66,9 +67,44 @@ function Get-Sha256Hex { } } +function Install-LlvmConfigWrapper { + $WrapperSource = Join-Path $PSScriptRoot "llvm-config-wrapper.rs" + if (-not (Test-Path $WrapperSource)) { + throw "LLVM config wrapper source not found: $WrapperSource" + } + + if (-not (Test-Path $LlvmConfigReal)) { + if (-not (Test-Path $LlvmConfig)) { + throw "llvm-config.exe not found at $LlvmConfig" + } + Move-Item -Force -Path $LlvmConfig -Destination $LlvmConfigReal + } + elseif (Test-Path $LlvmConfig) { + Remove-Item -Force $LlvmConfig + } + + $Rustc = Get-Command rustc.exe -ErrorAction SilentlyContinue + if (-not $Rustc) { + throw "rustc.exe is required to repair the LLVM Windows llvm-config system library output" + } + + Write-Host "Installing PECOS llvm-config wrapper" + & $Rustc.Source --edition=2021 -O -o $LlvmConfig $WrapperSource + if ($LASTEXITCODE -ne 0) { + throw "rustc failed to build llvm-config wrapper with exit code $LASTEXITCODE" + } + + $SystemLibs = (& $LlvmConfig --system-libs --link-static).Trim() + $Libxml2Static = Join-Path $InstallDir "lib\libxml2s.lib" + if ((-not (Test-Path $Libxml2Static)) -and $SystemLibs -match "(^|\s)libxml2s\.lib($|\s)") { + throw "LLVM config wrapper did not filter missing libxml2s.lib from --system-libs" + } +} + if (Test-Path $LlvmConfig) { $FoundVersion = (& $LlvmConfig --version).Trim() if ($FoundVersion.StartsWith($RequiredVersion)) { + Install-LlvmConfigWrapper Write-Host "LLVM $FoundVersion already installed at $InstallDir" exit 0 } @@ -134,6 +170,7 @@ try { & $LlvmConfig --version & $LlvmConfig --shared-mode + Install-LlvmConfigWrapper Write-Host "Installed LLVM $Version to $InstallDir" } finally { diff --git a/scripts/ci/llvm-config-wrapper.rs b/scripts/ci/llvm-config-wrapper.rs new file mode 100644 index 000000000..c136c97aa --- /dev/null +++ b/scripts/ci/llvm-config-wrapper.rs @@ -0,0 +1,70 @@ +use std::env; +use std::io::{self, Write}; +use std::path::Path; +use std::process::{Command, ExitCode}; + +fn llvm_lib_exists(current_exe: &Path, lib_name: &str) -> bool { + let Some(bin_dir) = current_exe.parent() else { + return false; + }; + let Some(prefix_dir) = bin_dir.parent() else { + return false; + }; + prefix_dir.join("lib").join(lib_name).exists() +} + +fn filter_system_libs(current_exe: &Path, stdout: &[u8]) -> Vec { + let output = String::from_utf8_lossy(stdout); + let mut filtered = output + .split_whitespace() + .filter(|token| { + !token.eq_ignore_ascii_case("libxml2s.lib") || llvm_lib_exists(current_exe, token) + }) + .collect::>() + .join(" "); + + if output.ends_with('\n') { + filtered.push('\n'); + } + filtered.into_bytes() +} + +fn main() -> ExitCode { + let args = env::args_os().skip(1).collect::>(); + let current_exe = match env::current_exe() { + Ok(path) => path, + Err(error) => { + let _ = writeln!( + io::stderr(), + "failed to locate llvm-config wrapper: {error}" + ); + return ExitCode::FAILURE; + } + }; + let real_config = current_exe.with_file_name("llvm-config.real.exe"); + let output = match Command::new(&real_config).args(&args).output() { + Ok(output) => output, + Err(error) => { + let _ = writeln!( + io::stderr(), + "failed to run {}: {error}", + real_config.display() + ); + return ExitCode::FAILURE; + } + }; + + let _ = io::stderr().write_all(&output.stderr); + let is_system_libs = args.iter().any(|arg| arg == "--system-libs"); + let stdout = if is_system_libs && output.status.success() { + filter_system_libs(¤t_exe, &output.stdout) + } else { + output.stdout + }; + let _ = io::stdout().write_all(&stdout); + + match output.status.code() { + Some(code) if (0..=255).contains(&code) => ExitCode::from(code as u8), + Some(_) | None => ExitCode::FAILURE, + } +} From d417c72f5456f8ec2e9b52ee7767cf958a7fa3fb Mon Sep 17 00:00:00 2001 From: Ciaran Ryan-Anderson Date: Fri, 5 Jun 2026 11:57:33 -0600 Subject: [PATCH 23/26] Use conda-forge LLVM on Windows --- .github/workflows/julia-release.yml | 9 +- .github/workflows/python-release.yml | 26 +-- .github/workflows/rust-test.yml | 21 +- Justfile | 5 +- crates/pecos-build/src/llvm.rs | 44 ++-- crates/pecos-build/src/llvm/installer.rs | 11 +- docs/development/dev-tools.md | 10 +- docs/user-guide/llvm-setup.md | 30 ++- scripts/ci/install-llvm-21-windows.ps1 | 259 +++++++++++++++-------- scripts/ci/llvm-config-wrapper.rs | 70 ------ 10 files changed, 250 insertions(+), 235 deletions(-) delete mode 100644 scripts/ci/llvm-config-wrapper.rs diff --git a/.github/workflows/julia-release.yml b/.github/workflows/julia-release.yml index 45e95119b..8ca225664 100644 --- a/.github/workflows/julia-release.yml +++ b/.github/workflows/julia-release.yml @@ -153,17 +153,20 @@ jobs: if: runner.os == 'Windows' shell: pwsh run: | - $llvmPrefix = Join-Path $env:USERPROFILE ".pecos\deps\llvm-21.1" - Write-Host "Installing LLVM 21.1 development archive..." - ./scripts/ci/install-llvm-21-windows.ps1 -InstallDir $llvmPrefix -Version ${{ env.LLVM_RELEASE_VERSION }} + $llvmRoot = Join-Path $env:USERPROFILE ".pecos\deps\llvm-21.1" + $llvmPrefix = Join-Path $llvmRoot "Library" + Write-Host "Installing conda-forge LLVM 21.1..." + ./scripts/ci/install-llvm-21-windows.ps1 -InstallDir $llvmRoot -Version ${{ env.LLVM_RELEASE_VERSION }} Write-Host "Setting LLVM environment variables..." $env:PECOS_LLVM = $llvmPrefix $env:LLVM_SYS_211_PREFIX = $env:PECOS_LLVM + $env:LIBCLANG_PATH = Join-Path $llvmPrefix "bin" cargo run --locked -p pecos-cli --release -- llvm configure "$env:PECOS_LLVM" "PECOS_LLVM=$env:PECOS_LLVM" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append "LLVM_SYS_211_PREFIX=$env:LLVM_SYS_211_PREFIX" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append + "LIBCLANG_PATH=$env:LIBCLANG_PATH" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append Write-Host "Verifying LLVM installation..." cargo run --locked -p pecos-cli --release -- llvm check diff --git a/.github/workflows/python-release.yml b/.github/workflows/python-release.yml index bc91d1686..423fca4b2 100644 --- a/.github/workflows/python-release.yml +++ b/.github/workflows/python-release.yml @@ -281,19 +281,19 @@ jobs: pipx run abi3audit --strict --report {wheel} # Windows configuration - CUDA via Jimver/cuda-toolkit (installed before cibuildwheel) CIBW_ENVIRONMENT_WINDOWS: > - PATH="C:\\Users\\runneradmin\\.pecos\\deps\\llvm-21.1\\bin;C:\\Users\\runneradmin\\.pecos\\deps\\cmake-${{ env.PECOS_CMAKE_VERSION }}\\bin;$PATH" - LLVM_SYS_211_PREFIX="C:\\Users\\runneradmin\\.pecos\\deps\\llvm-21.1" - LIBCLANG_PATH="C:\\Users\\runneradmin\\.pecos\\deps\\llvm-21.1\\bin" + PATH="C:\\Users\\runneradmin\\.pecos\\deps\\llvm-21.1\\Library\\bin;C:\\Users\\runneradmin\\.pecos\\deps\\cmake-${{ env.PECOS_CMAKE_VERSION }}\\bin;$PATH" + LLVM_SYS_211_PREFIX="C:\\Users\\runneradmin\\.pecos\\deps\\llvm-21.1\\Library" + LIBCLANG_PATH="C:\\Users\\runneradmin\\.pecos\\deps\\llvm-21.1\\Library\\bin" CMAKE="C:\\Users\\runneradmin\\.pecos\\deps\\cmake-${{ env.PECOS_CMAKE_VERSION }}\\bin\\cmake.exe" MATURIN_PEP517_ARGS="--locked --features=extension-module,mwpf" CIBW_BEFORE_ALL_WINDOWS: > - echo "=== Installing LLVM 21.1 development archive ===" && + echo "=== Installing conda-forge LLVM 21.1 ===" && rustup update && powershell.exe -NoProfile -ExecutionPolicy Bypass -File scripts\ci\install-llvm-21-windows.ps1 -InstallDir "C:\Users\runneradmin\.pecos\deps\llvm-21.1" -Version ${{ env.LLVM_RELEASE_VERSION }} && - cargo run --locked --release -p pecos-cli -- llvm configure "C:\Users\runneradmin\.pecos\deps\llvm-21.1" && + cargo run --locked --release -p pecos-cli -- llvm configure "C:\Users\runneradmin\.pecos\deps\llvm-21.1\Library" && cargo run --locked --release -p pecos-cli -- install cmake --force && echo "=== Checking LLVM installation ===" && - if exist "C:\Users\runneradmin\.pecos\deps\llvm-21.1\bin\llvm-config.exe" (echo LLVM directory exists) else (echo ERROR: LLVM directory not found! && exit /b 1) + if exist "C:\Users\runneradmin\.pecos\deps\llvm-21.1\Library\bin\llvm-config.exe" (echo LLVM directory exists) else (echo ERROR: LLVM directory not found! && exit /b 1) # Install delvewheel and patch it to ignore ext-ms-win-* API sets # (delvewheel ignores api-ms-win-* but not ext-ms-win-* which are also Windows API sets) CIBW_BEFORE_BUILD_WINDOWS: > @@ -302,7 +302,7 @@ jobs: # Note: --no-dll excludes Windows system DLLs that should not be bundled # combase.dll and rmclient.dll are core Windows components that fail when bundled CIBW_REPAIR_WHEEL_COMMAND_WINDOWS: > - delvewheel repair -v --add-path "C:\\Users\\runneradmin\\.pecos\\deps\\llvm-21.1\\bin" --no-dll "combase.dll;rmclient.dll" -w {dest_dir} {wheel} && + delvewheel repair -v --add-path "C:\\Users\\runneradmin\\.pecos\\deps\\llvm-21.1\\Library\\bin" --no-dll "combase.dll;rmclient.dll" -w {dest_dir} {wheel} && pipx run abi3audit --strict --report {wheel} - name: Upload pecos-rslib wheels @@ -375,18 +375,18 @@ jobs: PATH=$HOME/.pecos/bin:$PATH DYLD_LIBRARY_PATH=$HOME/.pecos/deps/llvm-21.1/lib delocate-wheel --require-archs {delocate_archs} -w {dest_dir} -v {wheel} && pipx run abi3audit --strict --report {wheel} CIBW_ENVIRONMENT_WINDOWS: > - PATH="C:\\Users\\runneradmin\\.pecos\\deps\\llvm-21.1\\bin;$PATH" - LLVM_SYS_211_PREFIX="C:\\Users\\runneradmin\\.pecos\\deps\\llvm-21.1" - LIBCLANG_PATH="C:\\Users\\runneradmin\\.pecos\\deps\\llvm-21.1\\bin" + PATH="C:\\Users\\runneradmin\\.pecos\\deps\\llvm-21.1\\Library\\bin;$PATH" + LLVM_SYS_211_PREFIX="C:\\Users\\runneradmin\\.pecos\\deps\\llvm-21.1\\Library" + LIBCLANG_PATH="C:\\Users\\runneradmin\\.pecos\\deps\\llvm-21.1\\Library\\bin" CIBW_BEFORE_ALL_WINDOWS: > rustup update && - if not exist "C:\Users\runneradmin\.pecos\deps\llvm-21.1\bin\llvm-config.exe" (powershell.exe -NoProfile -ExecutionPolicy Bypass -File scripts\ci\install-llvm-21-windows.ps1 -InstallDir "C:\Users\runneradmin\.pecos\deps\llvm-21.1" -Version ${{ env.LLVM_RELEASE_VERSION }}) else (echo LLVM already installed from pecos-rslib build) && - cargo run --locked --release -p pecos-cli -- llvm configure "C:\Users\runneradmin\.pecos\deps\llvm-21.1" + if not exist "C:\Users\runneradmin\.pecos\deps\llvm-21.1\Library\bin\llvm-config.exe" (powershell.exe -NoProfile -ExecutionPolicy Bypass -File scripts\ci\install-llvm-21-windows.ps1 -InstallDir "C:\Users\runneradmin\.pecos\deps\llvm-21.1" -Version ${{ env.LLVM_RELEASE_VERSION }}) else (echo LLVM already installed from pecos-rslib build) && + cargo run --locked --release -p pecos-cli -- llvm configure "C:\Users\runneradmin\.pecos\deps\llvm-21.1\Library" CIBW_BEFORE_BUILD_WINDOWS: > pip install delvewheel && python -c "import delvewheel._dll_list as d,inspect,re as r;p=inspect.getfile(d);c=open(p).read();n=chr(10);open(p,'w').write(c.replace(r\"re.compile('api-.*'),\",r\"re.compile('api-.*'),\"+n+r\" re.compile('ext-.*'),\")) if 'ext-.*' not in c else None" CIBW_REPAIR_WHEEL_COMMAND_WINDOWS: > - delvewheel repair -v --add-path "C:\\Users\\runneradmin\\.pecos\\deps\\llvm-21.1\\bin" --no-dll "combase.dll;rmclient.dll" -w {dest_dir} {wheel} && + delvewheel repair -v --add-path "C:\\Users\\runneradmin\\.pecos\\deps\\llvm-21.1\\Library\\bin" --no-dll "combase.dll;rmclient.dll" -w {dest_dir} {wheel} && pipx run abi3audit --strict --report {wheel} - name: Upload pecos-rslib-llvm wheels diff --git a/.github/workflows/rust-test.yml b/.github/workflows/rust-test.yml index 51bd1eed2..003f43fac 100644 --- a/.github/workflows/rust-test.yml +++ b/.github/workflows/rust-test.yml @@ -297,23 +297,4 @@ jobs: shell: bash run: | set -euo pipefail - # Windows CI uses the official LLVM development archive, which is - # static-only for MSVC. Keep this lane targeted so it still exercises - # LLVM without fanning out many static HUGR linker jobs at once. - cargo test --locked --workspace --release \ - --exclude pecos-rslib \ - --exclude pecos-rslib-cuda \ - --exclude pecos-julia-ffi \ - --exclude pecos-go-ffi \ - --exclude pecos-rslib-exp \ - --exclude pecos-rslib-llvm \ - --exclude pecos-cuquantum \ - --exclude pecos-cli \ - --exclude pecos-decoders \ - --exclude pecos-gpu-sims \ - --exclude pecos-hugr-qis \ - --exclude pecos-llvm - cargo test --locked -p pecos-cli --features=runtime --release - cargo test --locked -p pecos-llvm --release - cargo test --locked -p pecos-qis --no-default-features --features=llvm --release - cargo test --locked -p pecos-hugr-qis --release + cargo run --locked -p pecos-cli --release -- rust test diff --git a/Justfile b/Justfile index 1760a430e..6ce2129e7 100644 --- a/Justfile +++ b/Justfile @@ -71,8 +71,9 @@ ci-env: _msvc-bootstrap {{pecos}} llvm configure "$(brew --prefix llvm@21)" ;; Windows*|MINGW*|MSYS*|CYGWIN*) - LLVM_PREFIX="${USERPROFILE:-$HOME}\\.pecos\\deps\\llvm-21.1" - powershell.exe -NoProfile -ExecutionPolicy Bypass -File scripts/ci/install-llvm-21-windows.ps1 -InstallDir "$LLVM_PREFIX" -Version "$LLVM_RELEASE_VERSION" + LLVM_ENV_ROOT="${USERPROFILE:-$HOME}\\.pecos\\deps\\llvm-21.1" + LLVM_PREFIX="${LLVM_ENV_ROOT}\\Library" + powershell.exe -NoProfile -ExecutionPolicy Bypass -File scripts/ci/install-llvm-21-windows.ps1 -InstallDir "$LLVM_ENV_ROOT" -Version "$LLVM_RELEASE_VERSION" {{pecos}} llvm configure "$LLVM_PREFIX" ;; *) diff --git a/crates/pecos-build/src/llvm.rs b/crates/pecos-build/src/llvm.rs index a3c98f1bb..7a2d4ebb4 100644 --- a/crates/pecos-build/src/llvm.rs +++ b/crates/pecos-build/src/llvm.rs @@ -62,9 +62,9 @@ pub fn is_required_llvm_version(version: &str) -> bool { pub fn find_llvm(repo_root: Option) -> Option { // 1. Check versioned deps path: ~/.pecos/deps/llvm-{version}/ if let Ok(deps_llvm) = crate::home::get_llvm_dir_path() - && is_valid_llvm(&deps_llvm) + && let Some(llvm_prefix) = valid_llvm_prefix(&deps_llvm) { - return Some(deps_llvm); + return Some(llvm_prefix); } // 2. Check legacy top-level path: ~/.pecos/llvm/ @@ -74,24 +74,24 @@ pub fn find_llvm(repo_root: Option) -> Option { #[cfg(target_os = "windows")] { let user_llvm_new = pecos_dir.join(format!("LLVM-{REQUIRED_VERSION}")); - if is_valid_llvm(&user_llvm_new) { - crate::home::print_legacy_warning("LLVM", &user_llvm_new); - return Some(user_llvm_new); + if let Some(llvm_prefix) = valid_llvm_prefix(&user_llvm_new) { + crate::home::print_legacy_warning("LLVM", &llvm_prefix); + return Some(llvm_prefix); } } let user_llvm_legacy = pecos_dir.join("llvm"); - if is_valid_llvm(&user_llvm_legacy) { - crate::home::print_legacy_warning("LLVM", &user_llvm_legacy); - return Some(user_llvm_legacy); + if let Some(llvm_prefix) = valid_llvm_prefix(&user_llvm_legacy) { + crate::home::print_legacy_warning("LLVM", &llvm_prefix); + return Some(llvm_prefix); } } // 3. Check for project-local LLVM if let Some(root) = repo_root { let local_llvm = root.join("llvm"); - if is_valid_llvm(&local_llvm) { - return Some(local_llvm); + if let Some(llvm_prefix) = valid_llvm_prefix(&local_llvm) { + return Some(llvm_prefix); } } @@ -99,6 +99,22 @@ pub fn find_llvm(repo_root: Option) -> Option { find_system_llvm() } +fn valid_llvm_prefix(path: &Path) -> Option { + if is_valid_llvm(path) { + return Some(path.to_path_buf()); + } + + #[cfg(target_os = "windows")] + { + let conda_library_prefix = path.join("Library"); + if is_valid_llvm(&conda_library_prefix) { + return Some(conda_library_prefix); + } + } + + None +} + /// Find the LLVM installation Cargo should use for this project. /// /// An explicit `.cargo/config.toml` setting takes priority because `cargo` @@ -405,11 +421,11 @@ pub fn print_llvm_not_found_error() { #[cfg(target_os = "windows")] { - eprintln!("Windows MSVC LLVM builds do not provide shared libLLVM."); - eprintln!("Use WSL2/Linux for the full HUGR test lane, or configure a full"); - eprintln!("LLVM 21 package for targeted static LLVM builds:"); + eprintln!("The official Windows LLVM installer is not sufficient for PECOS."); + eprintln!("Use scripts\\ci\\install-llvm-21-windows.ps1 for the conda-forge"); + eprintln!("LLVM 21.1 toolchain, then configure its Library prefix:"); eprintln!(); - eprintln!(" {cmd} llvm configure C:\\path\\to\\llvm"); + eprintln!(" {cmd} llvm configure %USERPROFILE%\\.pecos\\deps\\llvm-21.1\\Library"); eprintln!(); } diff --git a/crates/pecos-build/src/llvm/installer.rs b/crates/pecos-build/src/llvm/installer.rs index d0a327f62..3c4fcf64b 100644 --- a/crates/pecos-build/src/llvm/installer.rs +++ b/crates/pecos-build/src/llvm/installer.rs @@ -37,11 +37,12 @@ pub fn managed_install_unavailable_reason() -> Option<&'static str> { #[cfg(target_os = "windows")] { Some( - "PECOS-managed shared LLVM is not available on Windows MSVC because \ - LLVM does not provide the libLLVM shared-library target there. Use \ - WSL2/Linux for the full HUGR test lane, or configure a full LLVM 21 \ - package for targeted static LLVM builds with `pecos llvm configure \ - C:\\path\\to\\llvm`.", + "PECOS-managed LLVM is not implemented in the CLI on Windows yet. \ + Use `scripts\\ci\\install-llvm-21-windows.ps1` to install the \ + conda-forge LLVM 21.1 toolchain under `%USERPROFILE%\\.pecos\\deps`, \ + then run `pecos llvm configure \ + %USERPROFILE%\\.pecos\\deps\\llvm-21.1\\Library`, or configure \ + your own full LLVM 21.1 install.", ) } diff --git a/docs/development/dev-tools.md b/docs/development/dev-tools.md index 1be1a64f5..e6747b24b 100644 --- a/docs/development/dev-tools.md +++ b/docs/development/dev-tools.md @@ -121,9 +121,9 @@ large toolchain install. `pecos install llvm` prints what it is about to install and asks for confirmation before downloading. On macOS, install Homebrew LLVM 21 (`brew install llvm@21`) and run -`pecos llvm configure`. On native Windows MSVC, LLVM does not provide shared -`libLLVM`; use WSL2/Linux for the full HUGR test lane, or configure a full LLVM -development package for targeted static builds. +`pecos llvm configure`. On native Windows MSVC, use +`scripts\ci\install-llvm-21-windows.ps1` to install the conda-forge LLVM 21.1 +toolchain, then configure `~\.pecos\deps\llvm-21.1\Library`. `pecos rust test` requires shared LLVM for the workspace HUGR test lane. LLVM 21.1 static test links can use multiple GB of RAM each, so PECOS fails early @@ -231,8 +231,8 @@ cargo build -p pecos --features llvm ``` On macOS use `brew install llvm@21 && pecos llvm configure`. On native Windows -MSVC, use WSL2/Linux for the full HUGR test lane or configure a full LLVM 21 -package for targeted static builds. +MSVC, use `scripts\ci\install-llvm-21-windows.ps1` and configure +`~\.pecos\deps\llvm-21.1\Library`. Or using Justfile: ```bash diff --git a/docs/user-guide/llvm-setup.md b/docs/user-guide/llvm-setup.md index 32de5edcc..fccc1f4a1 100644 --- a/docs/user-guide/llvm-setup.md +++ b/docs/user-guide/llvm-setup.md @@ -42,10 +42,10 @@ The `install` command automatically: This is the **recommended approach** where PECOS can provide a verified shared LLVM package. On Debian/Ubuntu-compatible Linux distributions, PECOS downloads the apt.llvm.org LLVM 21 packages into `~/.pecos/deps/llvm-21.1/` without using -`sudo`. On macOS, use Homebrew for LLVM 21. On Windows MSVC, LLVM does not -provide the shared `libLLVM` target PECOS requires for the full workspace HUGR -test lane; use WSL2/Linux for that lane, or configure a full LLVM package for -targeted static LLVM builds. +`sudo`. On macOS, use Homebrew for LLVM 21. On Windows MSVC, use the +conda-forge helper in the Windows section below; it installs a full LLVM +development environment under `~/.pecos/deps/llvm-21.1/` and configures +`~/.pecos/deps/llvm-21.1/Library` as the LLVM prefix. This is a developer toolchain install: the CLI prints the install size/behavior and asks for confirmation before downloading. Use `--yes` to accept the prompt @@ -92,11 +92,17 @@ Install LLVM 21.1 using your system's package manager, then configure PECOS: === "Windows" !!! warning "Windows LLVM Requirement" - The official LLVM Windows installer (`LLVM-*.exe`) is **toolchain-only** and lacks required development files (`llvm-config.exe` and headers). LLVM's MSVC builds also do not provide shared `libLLVM`, so `pecos rust test` / `just dev` with the full HUGR test lane is not supported on native Windows. + The official LLVM Windows installer (`LLVM-*.exe`) is **toolchain-only** and lacks required development files (`llvm-config.exe`, headers, and `libclang.dll`). Use a full LLVM development package built for the MSVC dynamic runtime. - **Recommended for full development tests:** Use WSL2/Linux and Option 1 above. + **Recommended for full development tests:** Use the PECOS conda-forge helper: - **Alternative for targeted static LLVM builds:** Download a full development package from: + ```powershell + .\scripts\ci\install-llvm-21-windows.ps1 -InstallDir "$env:USERPROFILE\.pecos\deps\llvm-21.1" + cargo run -p pecos-cli -- llvm configure "$env:USERPROFILE\.pecos\deps\llvm-21.1\Library" + cargo build --features llvm + ``` + + **Alternative:** Configure another full LLVM 21.1 development package that includes `llvm-config.exe`, headers, static MSVC libraries built against the dynamic runtime, and `libclang.dll`. - [bitgate/llvm-windows-full-builds](https://github.com/bitgate/llvm-windows-full-builds) (recommended) - [vovkos/llvm-package-windows](https://github.com/vovkos/llvm-package-windows) @@ -297,13 +303,15 @@ this order: **Windows:** -- Native Windows LLVM is static-only for PECOS's purposes -- Use WSL2/Linux for the full HUGR test lane -- For targeted static LLVM builds, configure a full development package with `pecos llvm configure C:\path\to\llvm` +- The official LLVM installer is not sufficient for PECOS development builds +- Use `scripts\ci\install-llvm-21-windows.ps1` for the conda-forge LLVM 21.1 toolchain +- Configure `~\.pecos\deps\llvm-21.1\Library`, not the conda environment root ### Security -All downloaded LLVM packages are verified with SHA256 checksums to ensure integrity. +Linux managed packages are checked against apt metadata hashes. Windows helper +packages are installed by micromamba from conda-forge, using conda package +metadata and checksums. ## Troubleshooting diff --git a/scripts/ci/install-llvm-21-windows.ps1 b/scripts/ci/install-llvm-21-windows.ps1 index 8deee25d3..5b5a69103 100644 --- a/scripts/ci/install-llvm-21-windows.ps1 +++ b/scripts/ci/install-llvm-21-windows.ps1 @@ -4,6 +4,7 @@ param( ) $ErrorActionPreference = "Stop" +$ProgressPreference = "SilentlyContinue" if (-not $Version) { if ($env:LLVM_RELEASE_VERSION) { @@ -14,12 +15,17 @@ if (-not $Version) { } } -$ExpectedSha256 = "749d22f565fcd5718dbed06512572d0e5353b502c03fe1f7f17ee8b8aca21a47" $RequiredVersion = "21.1" -$Asset = "clang+llvm-$Version-x86_64-pc-windows-msvc.tar.xz" -$Url = "https://github.com/llvm/llvm-project/releases/download/llvmorg-$Version/$Asset" -$LlvmConfig = Join-Path $InstallDir "bin\llvm-config.exe" -$LlvmConfigReal = Join-Path $InstallDir "bin\llvm-config.real.exe" +$MambaVersion = if ($env:MAMBA_VERSION) { $env:MAMBA_VERSION } else { "latest" } +$MambaRoot = if ($env:MAMBA_ROOT_PREFIX) { + $env:MAMBA_ROOT_PREFIX +} +else { + Join-Path $env:USERPROFILE ".cache\pecos-micromamba" +} +$LlvmPrefix = Join-Path $InstallDir "Library" +$LlvmConfig = Join-Path $LlvmPrefix "bin\llvm-config.exe" +$Libclang = Join-Path $LlvmPrefix "bin\libclang.dll" function Find-SevenZip { foreach ($Name in @("7z.exe", "7zz.exe", "7za.exe")) { @@ -49,129 +55,198 @@ function Find-SevenZip { return $null } -function Get-Sha256Hex { - param([string]$Path) +function Invoke-DownloadFile { + param( + [string]$Url, + [string]$Output + ) - $Stream = [System.IO.File]::OpenRead($Path) - try { - $Sha256 = [System.Security.Cryptography.SHA256]::Create() - try { - return -join ($Sha256.ComputeHash($Stream) | ForEach-Object { $_.ToString("x2") }) - } - finally { - $Sha256.Dispose() + $Curl = Get-Command curl.exe -ErrorAction SilentlyContinue + if ($Curl) { + & $Curl.Source --fail --location --retry 5 --retry-delay 5 --output $Output $Url + if ($LASTEXITCODE -ne 0) { + throw "curl failed to download $Url with exit code $LASTEXITCODE" } } - finally { - $Stream.Dispose() + else { + Invoke-WebRequest -Uri $Url -OutFile $Output } } -function Install-LlvmConfigWrapper { - $WrapperSource = Join-Path $PSScriptRoot "llvm-config-wrapper.rs" - if (-not (Test-Path $WrapperSource)) { - throw "LLVM config wrapper source not found: $WrapperSource" - } +function Expand-TarBz2 { + param( + [string]$Archive, + [string]$Destination + ) - if (-not (Test-Path $LlvmConfigReal)) { - if (-not (Test-Path $LlvmConfig)) { - throw "llvm-config.exe not found at $LlvmConfig" + New-Item -ItemType Directory -Force -Path $Destination | Out-Null + + $SevenZip = Find-SevenZip + if ($SevenZip) { + $Stage = Join-Path $Destination "_stage" + New-Item -ItemType Directory -Force -Path $Stage | Out-Null + + & $SevenZip x -y -bb0 "-o$Stage" $Archive + if ($LASTEXITCODE -ne 0) { + throw "7-Zip failed to decompress $Archive with exit code $LASTEXITCODE" + } + + $TarArchive = Get-ChildItem -Path $Stage -File -Filter "*.tar" | Select-Object -First 1 + if (-not $TarArchive) { + throw "7-Zip did not produce a .tar payload from $Archive" + } + + & $SevenZip x -y -bb0 "-o$Destination" $TarArchive.FullName + if ($LASTEXITCODE -ne 0) { + throw "7-Zip failed to extract $($TarArchive.Name) with exit code $LASTEXITCODE" } - Move-Item -Force -Path $LlvmConfig -Destination $LlvmConfigReal - } - elseif (Test-Path $LlvmConfig) { - Remove-Item -Force $LlvmConfig - } - $Rustc = Get-Command rustc.exe -ErrorAction SilentlyContinue - if (-not $Rustc) { - throw "rustc.exe is required to repair the LLVM Windows llvm-config system library output" + Remove-Item -Recurse -Force $Stage + return } - Write-Host "Installing PECOS llvm-config wrapper" - & $Rustc.Source --edition=2021 -O -o $LlvmConfig $WrapperSource - if ($LASTEXITCODE -ne 0) { - throw "rustc failed to build llvm-config wrapper with exit code $LASTEXITCODE" + $Tar = Get-Command tar.exe -ErrorAction SilentlyContinue + if (-not $Tar) { + throw "7-Zip or tar.exe is required to extract micromamba on Windows" } - $SystemLibs = (& $LlvmConfig --system-libs --link-static).Trim() - $Libxml2Static = Join-Path $InstallDir "lib\libxml2s.lib" - if ((-not (Test-Path $Libxml2Static)) -and $SystemLibs -match "(^|\s)libxml2s\.lib($|\s)") { - throw "LLVM config wrapper did not filter missing libxml2s.lib from --system-libs" + & $Tar.Source -xjf $Archive -C $Destination + if ($LASTEXITCODE -ne 0) { + throw "tar.exe failed to extract $Archive with exit code $LASTEXITCODE" } } -if (Test-Path $LlvmConfig) { - $FoundVersion = (& $LlvmConfig --version).Trim() - if ($FoundVersion.StartsWith($RequiredVersion)) { - Install-LlvmConfigWrapper - Write-Host "LLVM $FoundVersion already installed at $InstallDir" - exit 0 +function Get-Micromamba { + param([string]$TempDir) + + foreach ($Name in @("micromamba.exe", "micromamba")) { + $Command = Get-Command $Name -ErrorAction SilentlyContinue + if ($Command) { + return $Command.Source + } } -} -$TempDir = Join-Path ([System.IO.Path]::GetTempPath()) "pecos-llvm-$([System.Guid]::NewGuid())" -$Archive = Join-Path $TempDir $Asset -$TarDir = Join-Path $TempDir "tar" -$ExtractDir = Join-Path $TempDir "extract" + $Url = "https://micro.mamba.pm/api/micromamba/win-64/$MambaVersion" + $Archive = Join-Path $TempDir "micromamba.tar.bz2" + $ExtractDir = Join-Path $TempDir "micromamba" -New-Item -ItemType Directory -Force -Path $TempDir | Out-Null -New-Item -ItemType Directory -Force -Path $TarDir | Out-Null -New-Item -ItemType Directory -Force -Path $ExtractDir | Out-Null + Write-Host "Downloading micromamba for win-64" + Invoke-DownloadFile -Url $Url -Output $Archive + Expand-TarBz2 -Archive $Archive -Destination $ExtractDir -try { - Write-Host "Downloading official LLVM $Version Windows development archive: $Asset" - $Curl = Get-Command curl.exe -ErrorAction SilentlyContinue - if ($Curl) { - & $Curl.Source --fail --location --retry 5 --retry-delay 5 --output $Archive $Url - } - else { - Invoke-WebRequest -Uri $Url -OutFile $Archive + $MambaBin = Join-Path $ExtractDir "Library\bin\micromamba.exe" + if (-not (Test-Path $MambaBin)) { + throw "micromamba.exe not found at $MambaBin after extraction" } - $ActualSha256 = Get-Sha256Hex $Archive - if ($ActualSha256 -ne $ExpectedSha256) { - throw "SHA256 mismatch for $Asset. Expected $ExpectedSha256, got $ActualSha256" + return $MambaBin +} + +function Test-LlvmInstall { + if (-not (Test-Path $LlvmConfig)) { + return $false } - $SevenZip = Find-SevenZip - if (-not $SevenZip) { - throw "7-Zip is required to extract $Asset on Windows. Windows tar.exe can hang for hours on this archive in CI; install 7-Zip or provide an existing LLVM 21.1 install." + if (-not (Test-Path $Libclang)) { + return $false } - Write-Host "Extracting compressed LLVM archive with $SevenZip" - & $SevenZip x -y -bb0 "-o$TarDir" $Archive - if ($LASTEXITCODE -ne 0) { - throw "7-Zip failed to decompress $Asset with exit code $LASTEXITCODE" + try { + $FoundVersion = (& $LlvmConfig --version).Trim() + if (-not $FoundVersion.StartsWith($RequiredVersion)) { + return $false + } + + $LibDir = (& $LlvmConfig --libdir).Trim() + if (-not (Test-Path $LibDir)) { + return $false + } + + $StaticLibs = (& $LlvmConfig --libnames --link-static).Trim() + if ([string]::IsNullOrWhiteSpace($StaticLibs)) { + return $false + } } + catch { + return $false + } + + return $true +} - $TarArchive = Get-ChildItem -Path $TarDir -File -Filter "*.tar" | Select-Object -First 1 - if (-not $TarArchive) { - throw "7-Zip did not produce a .tar payload from $Asset" +function Write-LlvmDiagnostics { + Write-Host "LLVM prefix: $LlvmPrefix" + if (Test-Path $LlvmConfig) { + & $LlvmConfig --version + & $LlvmConfig --shared-mode + & $LlvmConfig --libdir + & $LlvmConfig --libnames --link-static core + & $LlvmConfig --system-libs --link-static + } + else { + Write-Host "llvm-config.exe not found at $LlvmConfig" } - Write-Host "Extracting LLVM payload with $SevenZip" - & $SevenZip x -y -bb0 "-o$ExtractDir" $TarArchive.FullName - if ($LASTEXITCODE -ne 0) { - throw "7-Zip failed to extract $($TarArchive.Name) with exit code $LASTEXITCODE" + if (Test-Path $Libclang) { + Write-Host "Found libclang: $Libclang" + } + else { + Write-Host "libclang.dll not found at $Libclang" } +} + +if (Test-LlvmInstall) { + $FoundVersion = (& $LlvmConfig --version).Trim() + Write-Host "conda-forge LLVM $FoundVersion already installed at $LlvmPrefix" + exit 0 +} + +if (Test-Path $InstallDir) { + Write-Host "Removing invalid or incompatible LLVM environment at $InstallDir" + Remove-Item -Recurse -Force $InstallDir +} + +New-Item -ItemType Directory -Force -Path (Split-Path -Parent $InstallDir) | Out-Null +New-Item -ItemType Directory -Force -Path $MambaRoot | Out-Null + +$TempDir = Join-Path ([System.IO.Path]::GetTempPath()) "pecos-micromamba-$([System.Guid]::NewGuid())" +New-Item -ItemType Directory -Force -Path $TempDir | Out-Null - $PayloadRoots = @(Get-ChildItem -Path $ExtractDir -Directory) - if ($PayloadRoots.Count -ne 1) { - throw "Expected one LLVM payload directory in $ExtractDir, found $($PayloadRoots.Count)" +try { + $MambaBin = Get-Micromamba -TempDir $TempDir + + Write-Host "Installing conda-forge LLVM $Version, clang $Version, and libclang $Version to $InstallDir" + $OldMambaRoot = $env:MAMBA_ROOT_PREFIX + $env:MAMBA_ROOT_PREFIX = $MambaRoot + try { + & $MambaBin create ` + -y ` + -p $InstallDir ` + --override-channels ` + -c conda-forge ` + "llvmdev=$Version" ` + "clang=$Version" ` + "libclang=$Version" + if ($LASTEXITCODE -ne 0) { + throw "micromamba failed to create LLVM environment with exit code $LASTEXITCODE" + } + } + finally { + if ($null -eq $OldMambaRoot) { + Remove-Item Env:MAMBA_ROOT_PREFIX -ErrorAction SilentlyContinue + } + else { + $env:MAMBA_ROOT_PREFIX = $OldMambaRoot + } } - $PayloadDir = $PayloadRoots[0].FullName - if (Test-Path $InstallDir) { - Remove-Item -Recurse -Force $InstallDir + if (-not (Test-LlvmInstall)) { + Write-LlvmDiagnostics + throw "conda-forge LLVM install did not provide usable LLVM $RequiredVersion static libraries and libclang" } - New-Item -ItemType Directory -Force -Path (Split-Path -Parent $InstallDir) | Out-Null - Move-Item -Path $PayloadDir -Destination $InstallDir - & $LlvmConfig --version - & $LlvmConfig --shared-mode - Install-LlvmConfigWrapper - Write-Host "Installed LLVM $Version to $InstallDir" + Write-LlvmDiagnostics + Write-Host "Installed conda-forge LLVM $Version to $LlvmPrefix" } finally { if (Test-Path $TempDir) { diff --git a/scripts/ci/llvm-config-wrapper.rs b/scripts/ci/llvm-config-wrapper.rs deleted file mode 100644 index c136c97aa..000000000 --- a/scripts/ci/llvm-config-wrapper.rs +++ /dev/null @@ -1,70 +0,0 @@ -use std::env; -use std::io::{self, Write}; -use std::path::Path; -use std::process::{Command, ExitCode}; - -fn llvm_lib_exists(current_exe: &Path, lib_name: &str) -> bool { - let Some(bin_dir) = current_exe.parent() else { - return false; - }; - let Some(prefix_dir) = bin_dir.parent() else { - return false; - }; - prefix_dir.join("lib").join(lib_name).exists() -} - -fn filter_system_libs(current_exe: &Path, stdout: &[u8]) -> Vec { - let output = String::from_utf8_lossy(stdout); - let mut filtered = output - .split_whitespace() - .filter(|token| { - !token.eq_ignore_ascii_case("libxml2s.lib") || llvm_lib_exists(current_exe, token) - }) - .collect::>() - .join(" "); - - if output.ends_with('\n') { - filtered.push('\n'); - } - filtered.into_bytes() -} - -fn main() -> ExitCode { - let args = env::args_os().skip(1).collect::>(); - let current_exe = match env::current_exe() { - Ok(path) => path, - Err(error) => { - let _ = writeln!( - io::stderr(), - "failed to locate llvm-config wrapper: {error}" - ); - return ExitCode::FAILURE; - } - }; - let real_config = current_exe.with_file_name("llvm-config.real.exe"); - let output = match Command::new(&real_config).args(&args).output() { - Ok(output) => output, - Err(error) => { - let _ = writeln!( - io::stderr(), - "failed to run {}: {error}", - real_config.display() - ); - return ExitCode::FAILURE; - } - }; - - let _ = io::stderr().write_all(&output.stderr); - let is_system_libs = args.iter().any(|arg| arg == "--system-libs"); - let stdout = if is_system_libs && output.status.success() { - filter_system_libs(¤t_exe, &output.stdout) - } else { - output.stdout - }; - let _ = io::stdout().write_all(&stdout); - - match output.status.code() { - Some(code) if (0..=255).contains(&code) => ExitCode::from(code as u8), - Some(_) | None => ExitCode::FAILURE, - } -} From e5936a31ea2c8f4b0996b6c58b26c54e1c8acdce Mon Sep 17 00:00:00 2001 From: Ciaran Ryan-Anderson Date: Fri, 5 Jun 2026 20:49:13 -0600 Subject: [PATCH 24/26] Fix Windows micromamba path detection --- scripts/ci/install-llvm-21-windows.ps1 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/ci/install-llvm-21-windows.ps1 b/scripts/ci/install-llvm-21-windows.ps1 index 5b5a69103..e5fb57f7a 100644 --- a/scripts/ci/install-llvm-21-windows.ps1 +++ b/scripts/ci/install-llvm-21-windows.ps1 @@ -86,7 +86,7 @@ function Expand-TarBz2 { $Stage = Join-Path $Destination "_stage" New-Item -ItemType Directory -Force -Path $Stage | Out-Null - & $SevenZip x -y -bb0 "-o$Stage" $Archive + & $SevenZip x -y -bb0 "-o$Stage" $Archive | Out-Null if ($LASTEXITCODE -ne 0) { throw "7-Zip failed to decompress $Archive with exit code $LASTEXITCODE" } @@ -96,7 +96,7 @@ function Expand-TarBz2 { throw "7-Zip did not produce a .tar payload from $Archive" } - & $SevenZip x -y -bb0 "-o$Destination" $TarArchive.FullName + & $SevenZip x -y -bb0 "-o$Destination" $TarArchive.FullName | Out-Null if ($LASTEXITCODE -ne 0) { throw "7-Zip failed to extract $($TarArchive.Name) with exit code $LASTEXITCODE" } @@ -110,7 +110,7 @@ function Expand-TarBz2 { throw "7-Zip or tar.exe is required to extract micromamba on Windows" } - & $Tar.Source -xjf $Archive -C $Destination + & $Tar.Source -xjf $Archive -C $Destination | Out-Null if ($LASTEXITCODE -ne 0) { throw "tar.exe failed to extract $Archive with exit code $LASTEXITCODE" } From af2fc5baaa6afd0d0ba5e91ec5672bba4aa53313 Mon Sep 17 00:00:00 2001 From: Ciaran Ryan-Anderson Date: Sat, 6 Jun 2026 10:00:01 -0600 Subject: [PATCH 25/26] Fix Windows conda LLVM setup --- crates/pecos-cli/src/cli/rust_cmd.rs | 7 +++++++ scripts/ci/install-llvm-21-windows.ps1 | 28 ++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/crates/pecos-cli/src/cli/rust_cmd.rs b/crates/pecos-cli/src/cli/rust_cmd.rs index 4ac013805..c833dcc6d 100644 --- a/crates/pecos-cli/src/cli/rust_cmd.rs +++ b/crates/pecos-cli/src/cli/rust_cmd.rs @@ -98,6 +98,13 @@ fn reject_static_llvm_workspace_test() -> Result<()> { return Ok(()); } + if cfg!(target_os = "windows") && matches!(link_mode, LlvmLinkMode::Static) { + println!( + "Windows MSVC uses static LLVM libraries because llvm-sys does not support dynamic LLVM linking on this target." + ); + return Ok(()); + } + let mode = if matches!(link_mode, LlvmLinkMode::Static) { "static" } else { diff --git a/scripts/ci/install-llvm-21-windows.ps1 b/scripts/ci/install-llvm-21-windows.ps1 index e5fb57f7a..5c298827d 100644 --- a/scripts/ci/install-llvm-21-windows.ps1 +++ b/scripts/ci/install-llvm-21-windows.ps1 @@ -25,6 +25,7 @@ else { } $LlvmPrefix = Join-Path $InstallDir "Library" $LlvmConfig = Join-Path $LlvmPrefix "bin\llvm-config.exe" +$LlvmBin = Join-Path $LlvmPrefix "bin" $Libclang = Join-Path $LlvmPrefix "bin\libclang.dll" function Find-SevenZip { @@ -143,6 +144,8 @@ function Get-Micromamba { } function Test-LlvmInstall { + Repair-LibclangForBindgen + if (-not (Test-Path $LlvmConfig)) { return $false } @@ -174,6 +177,27 @@ function Test-LlvmInstall { return $true } +function Repair-LibclangForBindgen { + if (Test-Path $Libclang) { + return + } + + if (-not (Test-Path $LlvmBin)) { + return + } + + $PackagedLibclang = Get-ChildItem -Path $LlvmBin -File -Filter "libclang-*.dll" | + Sort-Object Name | + Select-Object -First 1 + + if (-not $PackagedLibclang) { + return + } + + Write-Host "Creating bindgen-compatible libclang.dll from $($PackagedLibclang.Name)" + Copy-Item -Force -Path $PackagedLibclang.FullName -Destination $Libclang +} + function Write-LlvmDiagnostics { Write-Host "LLVM prefix: $LlvmPrefix" if (Test-Path $LlvmConfig) { @@ -192,6 +216,10 @@ function Write-LlvmDiagnostics { } else { Write-Host "libclang.dll not found at $Libclang" + if (Test-Path $LlvmBin) { + Get-ChildItem -Path $LlvmBin -File -Filter "*clang*.dll" | + ForEach-Object { Write-Host " candidate: $($_.FullName)" } + } } } From 9cbe64f621a5584488061cfd657a529b34893183 Mon Sep 17 00:00:00 2001 From: Ciaran Ryan-Anderson Date: Sat, 6 Jun 2026 10:52:35 -0600 Subject: [PATCH 26/26] Install Windows LLVM zlib import library --- scripts/ci/install-llvm-21-windows.ps1 | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/scripts/ci/install-llvm-21-windows.ps1 b/scripts/ci/install-llvm-21-windows.ps1 index 5c298827d..6d3511b44 100644 --- a/scripts/ci/install-llvm-21-windows.ps1 +++ b/scripts/ci/install-llvm-21-windows.ps1 @@ -26,6 +26,7 @@ else { $LlvmPrefix = Join-Path $InstallDir "Library" $LlvmConfig = Join-Path $LlvmPrefix "bin\llvm-config.exe" $LlvmBin = Join-Path $LlvmPrefix "bin" +$LlvmLib = Join-Path $LlvmPrefix "lib" $Libclang = Join-Path $LlvmPrefix "bin\libclang.dll" function Find-SevenZip { @@ -169,6 +170,13 @@ function Test-LlvmInstall { if ([string]::IsNullOrWhiteSpace($StaticLibs)) { return $false } + + if ($StaticLibs -match "(^|\s)z\.lib($|\s)") { + $ZlibImportLib = Join-Path $LlvmLib "z.lib" + if (-not (Test-Path $ZlibImportLib)) { + return $false + } + } } catch { return $false @@ -243,7 +251,7 @@ New-Item -ItemType Directory -Force -Path $TempDir | Out-Null try { $MambaBin = Get-Micromamba -TempDir $TempDir - Write-Host "Installing conda-forge LLVM $Version, clang $Version, and libclang $Version to $InstallDir" + Write-Host "Installing conda-forge LLVM $Version, clang $Version, libclang $Version, and zlib to $InstallDir" $OldMambaRoot = $env:MAMBA_ROOT_PREFIX $env:MAMBA_ROOT_PREFIX = $MambaRoot try { @@ -254,7 +262,8 @@ try { -c conda-forge ` "llvmdev=$Version" ` "clang=$Version" ` - "libclang=$Version" + "libclang=$Version" ` + "zlib" if ($LASTEXITCODE -ne 0) { throw "micromamba failed to create LLVM environment with exit code $LASTEXITCODE" }