From 835febd757f9b55d00e5253f0fa081e2643482f9 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Thu, 17 Oct 2024 11:38:19 +0200 Subject: [PATCH 01/55] chore: Update dependencies --- Cargo.lock | 630 ++++++++++++++++++++++++++++++++++++++++++++++++----- Cargo.toml | 9 +- 2 files changed, 579 insertions(+), 60 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e702c9c..27405f5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,23 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + [[package]] name = "ahash" version = "0.8.11" @@ -64,16 +81,34 @@ version = "52.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05048a8932648b63f21c37d88b552ccc8a65afb6dfe9fc9f30ce79174c2e7a85" dependencies = [ - "arrow-arith", - "arrow-array", - "arrow-buffer", - "arrow-cast", - "arrow-data", - "arrow-ord", - "arrow-row", - "arrow-schema", - "arrow-select", - "arrow-string", + "arrow-arith 52.2.0", + "arrow-array 52.2.0", + "arrow-buffer 52.2.0", + "arrow-cast 52.2.0", + "arrow-data 52.2.0", + "arrow-ord 52.2.0", + "arrow-row 52.2.0", + "arrow-schema 52.2.0", + "arrow-select 52.2.0", + "arrow-string 52.2.0", +] + +[[package]] +name = "arrow" +version = "53.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4caf25cdc4a985f91df42ed9e9308e1adbcd341a31a72605c697033fcef163e3" +dependencies = [ + "arrow-arith 53.2.0", + "arrow-array 53.2.0", + "arrow-buffer 53.2.0", + "arrow-cast 53.2.0", + "arrow-data 53.2.0", + "arrow-ord 53.2.0", + "arrow-row 53.2.0", + "arrow-schema 53.2.0", + "arrow-select 53.2.0", + "arrow-string 53.2.0", ] [[package]] @@ -82,10 +117,25 @@ version = "52.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d8a57966e43bfe9a3277984a14c24ec617ad874e4c0e1d2a1b083a39cfbf22c" dependencies = [ - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", + "arrow-array 52.2.0", + "arrow-buffer 52.2.0", + "arrow-data 52.2.0", + "arrow-schema 52.2.0", + "chrono", + "half", + "num", +] + +[[package]] +name = "arrow-arith" +version = "53.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91f2dfd1a7ec0aca967dfaa616096aec49779adc8eccec005e2f5e4111b1192a" +dependencies = [ + "arrow-array 53.2.0", + "arrow-buffer 53.2.0", + "arrow-data 53.2.0", + "arrow-schema 53.2.0", "chrono", "half", "num", @@ -98,9 +148,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16f4a9468c882dc66862cef4e1fd8423d47e67972377d85d80e022786427768c" dependencies = [ "ahash", - "arrow-buffer", - "arrow-data", - "arrow-schema", + "arrow-buffer 52.2.0", + "arrow-data 52.2.0", + "arrow-schema 52.2.0", + "chrono", + "half", + "hashbrown", + "num", +] + +[[package]] +name = "arrow-array" +version = "53.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d39387ca628be747394890a6e47f138ceac1aa912eab64f02519fed24b637af8" +dependencies = [ + "ahash", + "arrow-buffer 53.2.0", + "arrow-data 53.2.0", + "arrow-schema 53.2.0", "chrono", "half", "hashbrown", @@ -118,22 +184,53 @@ dependencies = [ "num", ] +[[package]] +name = "arrow-buffer" +version = "53.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e51e05228852ffe3eb391ce7178a0f97d2cf80cc6ef91d3c4a6b3cb688049ec" +dependencies = [ + "bytes", + "half", + "num", +] + [[package]] name = "arrow-cast" version = "52.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da26719e76b81d8bc3faad1d4dbdc1bcc10d14704e63dc17fc9f3e7e1e567c8e" dependencies = [ - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", - "arrow-select", + "arrow-array 52.2.0", + "arrow-buffer 52.2.0", + "arrow-data 52.2.0", + "arrow-schema 52.2.0", + "arrow-select 52.2.0", + "atoi", + "base64", + "chrono", + "half", + "lexical-core 0.8.5", + "num", + "ryu", +] + +[[package]] +name = "arrow-cast" +version = "53.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d09aea56ec9fa267f3f3f6cdab67d8a9974cbba90b3aa38c8fe9d0bb071bd8c1" +dependencies = [ + "arrow-array 53.2.0", + "arrow-buffer 53.2.0", + "arrow-data 53.2.0", + "arrow-schema 53.2.0", + "arrow-select 53.2.0", "atoi", "base64", "chrono", "half", - "lexical-core", + "lexical-core 1.0.2", "num", "ryu", ] @@ -144,8 +241,20 @@ version = "52.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd9d6f18c65ef7a2573ab498c374d8ae364b4a4edf67105357491c031f716ca5" dependencies = [ - "arrow-buffer", - "arrow-schema", + "arrow-buffer 52.2.0", + "arrow-schema 52.2.0", + "half", + "num", +] + +[[package]] +name = "arrow-data" +version = "53.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98ae0af50890b494cebd7d6b04b35e896205c1d1df7b29a6272c5d0d0249ef5" +dependencies = [ + "arrow-buffer 53.2.0", + "arrow-schema 53.2.0", "half", "num", ] @@ -156,11 +265,26 @@ version = "52.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42745f86b1ab99ef96d1c0bcf49180848a64fe2c7a7a0d945bc64fa2b21ba9bc" dependencies = [ - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", - "arrow-select", + "arrow-array 52.2.0", + "arrow-buffer 52.2.0", + "arrow-data 52.2.0", + "arrow-schema 52.2.0", + "arrow-select 52.2.0", + "half", + "num", +] + +[[package]] +name = "arrow-ord" +version = "53.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2883d7035e0b600fb4c30ce1e50e66e53d8656aa729f2bfa4b51d359cf3ded52" +dependencies = [ + "arrow-array 53.2.0", + "arrow-buffer 53.2.0", + "arrow-data 53.2.0", + "arrow-schema 53.2.0", + "arrow-select 53.2.0", "half", "num", ] @@ -172,10 +296,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cd09a518c602a55bd406bcc291a967b284cfa7a63edfbf8b897ea4748aad23c" dependencies = [ "ahash", - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", + "arrow-array 52.2.0", + "arrow-buffer 52.2.0", + "arrow-data 52.2.0", + "arrow-schema 52.2.0", + "half", +] + +[[package]] +name = "arrow-row" +version = "53.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "552907e8e587a6fde4f8843fd7a27a576a260f65dab6c065741ea79f633fc5be" +dependencies = [ + "ahash", + "arrow-array 53.2.0", + "arrow-buffer 53.2.0", + "arrow-data 53.2.0", + "arrow-schema 53.2.0", "half", ] @@ -188,6 +326,15 @@ dependencies = [ "bitflags 2.6.0", ] +[[package]] +name = "arrow-schema" +version = "53.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "539ada65246b949bd99ffa0881a9a15a4a529448af1a07a9838dd78617dafab1" +dependencies = [ + "bitflags 2.6.0", +] + [[package]] name = "arrow-select" version = "52.2.0" @@ -195,10 +342,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "600bae05d43483d216fb3494f8c32fdbefd8aa4e1de237e790dbb3d9f44690a3" dependencies = [ "ahash", - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", + "arrow-array 52.2.0", + "arrow-buffer 52.2.0", + "arrow-data 52.2.0", + "arrow-schema 52.2.0", + "num", +] + +[[package]] +name = "arrow-select" +version = "53.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6259e566b752da6dceab91766ed8b2e67bf6270eb9ad8a6e07a33c1bede2b125" +dependencies = [ + "ahash", + "arrow-array 53.2.0", + "arrow-buffer 53.2.0", + "arrow-data 53.2.0", + "arrow-schema 53.2.0", "num", ] @@ -208,11 +369,28 @@ version = "52.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0dc1985b67cb45f6606a248ac2b4a288849f196bab8c657ea5589f47cdd55e6" dependencies = [ - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", - "arrow-select", + "arrow-array 52.2.0", + "arrow-buffer 52.2.0", + "arrow-data 52.2.0", + "arrow-schema 52.2.0", + "arrow-select 52.2.0", + "memchr", + "num", + "regex", + "regex-syntax", +] + +[[package]] +name = "arrow-string" +version = "53.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3179ccbd18ebf04277a095ba7321b93fd1f774f18816bd5f6b3ce2f594edb6c" +dependencies = [ + "arrow-array 53.2.0", + "arrow-buffer 53.2.0", + "arrow-data 53.2.0", + "arrow-schema 53.2.0", + "arrow-select 53.2.0", "memchr", "num", "regex", @@ -240,6 +418,12 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + [[package]] name = "bindgen" version = "0.69.5" @@ -335,6 +519,27 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +[[package]] +name = "bzip2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" +dependencies = [ + "bzip2-sys", + "libc", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.11+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + [[package]] name = "cast" version = "0.3.0" @@ -347,6 +552,8 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd9de9f2205d5ef3fd67e685b0df337994ddd4495e2a28d185500d0e1edfea47" dependencies = [ + "jobserver", + "libc", "shlex", ] @@ -404,6 +611,16 @@ dependencies = [ "half", ] +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + [[package]] name = "clang-sys" version = "1.8.1" @@ -479,6 +696,12 @@ dependencies = [ "tiny-keccak", ] +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -494,6 +717,15 @@ dependencies = [ "libc", ] +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + [[package]] name = "criterion" version = "0.5.1" @@ -577,6 +809,15 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6ca96b45ca70b8045e0462f191bd209fcb3c3bfe8dbfb1257ada54c4dd59169" +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + [[package]] name = "digest" version = "0.10.7" @@ -585,6 +826,7 @@ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", + "subtle", ] [[package]] @@ -714,6 +956,16 @@ dependencies = [ "reborrow", ] +[[package]] +name = "flate2" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + [[package]] name = "gemm" version = "0.18.0" @@ -895,6 +1147,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + [[package]] name = "home" version = "0.5.9" @@ -946,6 +1207,15 @@ version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array", +] + [[package]] name = "is-terminal" version = "0.4.13" @@ -990,6 +1260,15 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + [[package]] name = "js-sys" version = "0.3.72" @@ -1017,11 +1296,24 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2cde5de06e8d4c2faabc400238f9ae1c74d5412d03a7bd067645ccbc47070e46" dependencies = [ - "lexical-parse-float", - "lexical-parse-integer", - "lexical-util", - "lexical-write-float", - "lexical-write-integer", + "lexical-parse-float 0.8.5", + "lexical-parse-integer 0.8.6", + "lexical-util 0.8.5", + "lexical-write-float 0.8.5", + "lexical-write-integer 0.8.5", +] + +[[package]] +name = "lexical-core" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0431c65b318a590c1de6b8fd6e72798c92291d27762d94c9e6c37ed7a73d8458" +dependencies = [ + "lexical-parse-float 1.0.2", + "lexical-parse-integer 1.0.2", + "lexical-util 1.0.3", + "lexical-write-float 1.0.2", + "lexical-write-integer 1.0.2", ] [[package]] @@ -1030,8 +1322,19 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683b3a5ebd0130b8fb52ba0bdc718cc56815b6a097e28ae5a6997d0ad17dc05f" dependencies = [ - "lexical-parse-integer", - "lexical-util", + "lexical-parse-integer 0.8.6", + "lexical-util 0.8.5", + "static_assertions", +] + +[[package]] +name = "lexical-parse-float" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb17a4bdb9b418051aa59d41d65b1c9be5affab314a872e5ad7f06231fb3b4e0" +dependencies = [ + "lexical-parse-integer 1.0.2", + "lexical-util 1.0.3", "static_assertions", ] @@ -1041,7 +1344,17 @@ version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d0994485ed0c312f6d965766754ea177d07f9c00c9b82a5ee62ed5b47945ee9" dependencies = [ - "lexical-util", + "lexical-util 0.8.5", + "static_assertions", +] + +[[package]] +name = "lexical-parse-integer" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5df98f4a4ab53bf8b175b363a34c7af608fe31f93cc1fb1bf07130622ca4ef61" +dependencies = [ + "lexical-util 1.0.3", "static_assertions", ] @@ -1054,14 +1367,34 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "lexical-util" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85314db53332e5c192b6bca611fb10c114a80d1b831ddac0af1e9be1b9232ca0" +dependencies = [ + "static_assertions", +] + [[package]] name = "lexical-write-float" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accabaa1c4581f05a3923d1b4cfd124c329352288b7b9da09e766b0668116862" dependencies = [ - "lexical-util", - "lexical-write-integer", + "lexical-util 0.8.5", + "lexical-write-integer 0.8.5", + "static_assertions", +] + +[[package]] +name = "lexical-write-float" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e7c3ad4e37db81c1cbe7cf34610340adc09c322871972f74877a712abc6c809" +dependencies = [ + "lexical-util 1.0.3", + "lexical-write-integer 1.0.2", "static_assertions", ] @@ -1071,7 +1404,17 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1b6f3d1f4422866b68192d62f77bc5c700bee84f3069f2469d7bc8c77852446" dependencies = [ - "lexical-util", + "lexical-util 0.8.5", + "static_assertions", +] + +[[package]] +name = "lexical-write-integer" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb89e9f6958b83258afa3deed90b5de9ef68eef090ad5086c791cd2345610162" +dependencies = [ + "lexical-util 1.0.3", "static_assertions", ] @@ -1166,6 +1509,15 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +[[package]] +name = "miniz_oxide" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +dependencies = [ + "adler2", +] + [[package]] name = "multiversion" version = "0.7.4" @@ -1327,6 +1679,12 @@ dependencies = [ "rand", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-integer" version = "0.1.46" @@ -1394,7 +1752,7 @@ name = "nutpie" version = "0.13.2" dependencies = [ "anyhow", - "arrow", + "arrow 53.2.0", "bridgestan", "criterion", "indicatif", @@ -1407,6 +1765,7 @@ dependencies = [ "rand_distr", "rayon", "smallvec", + "tch", "thiserror", "time-humanize", "upon", @@ -1419,7 +1778,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8573e3b5c83e8ec0570ebbd75dd6fdc7dfcfa5da9b5f9d9d63fedefebbd9cf8" dependencies = [ "anyhow", - "arrow", + "arrow 52.2.0", "faer", "itertools 0.13.0", "multiversion", @@ -1466,6 +1825,17 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "password-hash" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" +dependencies = [ + "base64ct", + "rand_core", + "subtle", +] + [[package]] name = "paste" version = "1.0.15" @@ -1490,6 +1860,18 @@ dependencies = [ "once_cell", ] +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest", + "hmac", + "password-hash", + "sha2", +] + [[package]] name = "pest" version = "2.7.14" @@ -1535,6 +1917,12 @@ dependencies = [ "sha2", ] +[[package]] +name = "pkg-config" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" + [[package]] name = "plotters" version = "0.3.7" @@ -1569,6 +1957,12 @@ version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.20" @@ -1839,6 +2233,16 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +[[package]] +name = "safetensors" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93279b86b3de76f820a8854dd06cbc33cfa57a417b19c47f6a25280112fb1df" +dependencies = [ + "serde", + "serde_json", +] + [[package]] name = "same-file" version = "1.0.6" @@ -1892,6 +2296,17 @@ dependencies = [ "serde", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sha2" version = "0.10.8" @@ -1921,6 +2336,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + [[package]] name = "syn" version = "1.0.109" @@ -1969,6 +2390,23 @@ version = "0.12.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" +[[package]] +name = "tch" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3585f5bbf1ddf2498d7586bf870c7bb785a0bf1be09c54d0f93fce51d5f3c7fc" +dependencies = [ + "half", + "lazy_static", + "libc", + "ndarray", + "rand", + "safetensors", + "thiserror", + "torch-sys", + "zip", +] + [[package]] name = "thiserror" version = "1.0.69" @@ -1989,6 +2427,25 @@ dependencies = [ "syn 2.0.87", ] +[[package]] +name = "time" +version = "0.3.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde", + "time-core", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + [[package]] name = "time-humanize" version = "0.1.3" @@ -2014,6 +2471,18 @@ dependencies = [ "serde_json", ] +[[package]] +name = "torch-sys" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef116d446d79bb2447748550baee86850d2d32d366cc9bdd4b217bdbe10cac63" +dependencies = [ + "anyhow", + "cc", + "libc", + "zip", +] + [[package]] name = "typenum" version = "1.17.0" @@ -2285,3 +2754,52 @@ dependencies = [ "quote", "syn 2.0.87", ] + +[[package]] +name = "zip" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" +dependencies = [ + "aes", + "byteorder", + "bzip2", + "constant_time_eq", + "crc32fast", + "crossbeam-utils", + "flate2", + "hmac", + "pbkdf2", + "sha1", + "time", + "zstd", +] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.13+zstd.1.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/Cargo.toml b/Cargo.toml index 48634d8..e2badad 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,20 +27,21 @@ numpy = "0.21.0" rand = "0.8.5" thiserror = "1.0.44" rand_chacha = "0.3.1" -rayon = "1.9.0" +rayon = "1.10.0" # Keep arrow in sync with nuts-rs requirements -arrow = { version = "52.0.0", default-features = false, features = ["ffi"] } +arrow = { version = "53.1.0", default-features = false, features = ["ffi"] } anyhow = "1.0.72" itertools = "0.13.0" bridgestan = "2.5.0" rand_distr = "0.4.3" -smallvec = "1.11.0" +smallvec = "1.13.0" upon = { version = "0.8.1", default-features = false, features = [] } time-humanize = { version = "0.1.3", default-features = false } indicatif = "0.17.8" +tch = { version = "0.17.0", optional = true } [dependencies.pyo3] -version = "0.21.0" +version = "0.21.2" features = ["extension-module", "anyhow"] [dev-dependencies] From e336d6724a012887de61cbc1b271c0fa116427d0 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Thu, 17 Oct 2024 11:39:35 +0200 Subject: [PATCH 02/55] style: Add some type hints --- python/nutpie/compile_pymc.py | 6 +++--- python/nutpie/compiled_pyfunc.py | 2 +- python/nutpie/sample.py | 10 +++++----- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/python/nutpie/compile_pymc.py b/python/nutpie/compile_pymc.py index 9a2faa3..247d2dd 100644 --- a/python/nutpie/compile_pymc.py +++ b/python/nutpie/compile_pymc.py @@ -5,7 +5,7 @@ from functools import wraps from importlib.util import find_spec from math import prod -from typing import TYPE_CHECKING, Any, Callable, Literal, Optional, Union +from typing import TYPE_CHECKING, Any, Callable, Literal, Optional, Union, cast import numpy as np import pandas as pd @@ -270,7 +270,7 @@ def _compile_pymc_model_numba( warnings.filterwarnings( "ignore", message="Cannot cache compiled function .* as it uses dynamic globals", - category=numba.NumbaWarning, + category=numba.NumbaWarning, # type: ignore ) logp_numba = numba.cfunc(c_sig, **kwargs)(logp_numba_raw) @@ -283,7 +283,7 @@ def _compile_pymc_model_numba( warnings.filterwarnings( "ignore", message="Cannot cache compiled function .* as it uses dynamic globals", - category=numba.NumbaWarning, + category=numba.NumbaWarning, # type: ignore ) expand_numba = numba.cfunc(c_sig_expand, **kwargs)(expand_numba_raw) diff --git a/python/nutpie/compiled_pyfunc.py b/python/nutpie/compiled_pyfunc.py index 9ede109..df4404e 100644 --- a/python/nutpie/compiled_pyfunc.py +++ b/python/nutpie/compiled_pyfunc.py @@ -5,7 +5,7 @@ import numpy as np -from nutpie import _lib +from nutpie import _lib # type: ignore from nutpie.sample import CompiledModel SeedType = int diff --git a/python/nutpie/sample.py b/python/nutpie/sample.py index 6c5bfc6..2baddcc 100644 --- a/python/nutpie/sample.py +++ b/python/nutpie/sample.py @@ -1,13 +1,13 @@ import os from dataclasses import dataclass -from typing import Any, Literal, Optional, overload +from typing import Any, Literal, Optional, cast, overload import arviz import numpy as np import pandas as pd import pyarrow -from nutpie import _lib +from nutpie import _lib # type: ignore @dataclass(frozen=True) @@ -281,7 +281,7 @@ def in_colab(): if in_colab(): return True try: - shell = get_ipython().__class__.__name__ + shell = get_ipython().__class__.__name__ # type: ignore if shell == "ZMQInteractiveShell": # Jupyter notebook, Spyder or qtconsole try: from IPython.display import ( @@ -608,10 +608,10 @@ def sample( if cores is None: try: # Only available in python>=3.13 - available = os.process_cpu_count() + available = os.process_cpu_count() # type: ignore except AttributeError: available = os.cpu_count() - cores = min(chains, available) + cores = min(chains, cast(int, available)) if init_mean is None: init_mean = np.zeros(compiled_model.n_dim) From 9d82b527da52f92c6cf51737c2f8e1c8910cacf3 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Thu, 17 Oct 2024 11:40:24 +0200 Subject: [PATCH 03/55] feat: Add transforming adaptation --- python/nutpie/compile_pymc.py | 23 +- python/nutpie/compiled_pyfunc.py | 14 + python/nutpie/sample.py | 14 + src/pyfunc.rs | 189 ++++++++++- src/pymc.rs | 1 + src/stan.rs | 1 + src/wrapper.rs | 524 ++++++++++++++++++++----------- 7 files changed, 579 insertions(+), 187 deletions(-) diff --git a/python/nutpie/compile_pymc.py b/python/nutpie/compile_pymc.py index 247d2dd..58b6b0d 100644 --- a/python/nutpie/compile_pymc.py +++ b/python/nutpie/compile_pymc.py @@ -371,14 +371,24 @@ def _compile_pymc_model_jax( logp_fn = logp_fn_pt.vm.jit_fn expand_fn = expand_fn_pt.vm.jit_fn + logp_shared_names = [var.name for var in logp_fn_pt.get_shared()] + expand_shared_names = [var.name for var in expand_fn_pt.get_shared()] + if gradient_backend == "jax": orig_logp_fn = logp_fn._fun - @jax.jit def logp_fn_jax_grad(x, *shared): return jax.value_and_grad(lambda x: orig_logp_fn(x, *shared)[0])(x) + static_argnums = list(range(1, len(logp_shared_names) + 1)) + logp_fn_jax_grad = jax.jit( + logp_fn_jax_grad, + # static_argnums=static_argnums, + ) + logp_fn = logp_fn_jax_grad + else: + orig_logp_fn = None shared_data = {} shared_vars = {} @@ -390,9 +400,6 @@ def logp_fn_jax_grad(x, *shared): shared_vars[val.name] = val seen.add(val) - logp_shared_names = [var.name for var in logp_fn_pt.get_shared()] - expand_shared_names = [var.name for var in expand_fn_pt.get_shared()] - def make_logp_func(): def logp(x, **shared): logp, grad = logp_fn(x, *[shared[name] for name in logp_shared_names]) @@ -401,7 +408,8 @@ def logp(x, **shared): return logp names, slices, shapes = shape_info - dtypes = [np.float64] * len(names) + # TODO do not cast to float64 + dtypes = [np.dtype("float64")] * len(names) def make_expand_func(seed1, seed2, chain): # TODO handle seeds @@ -427,6 +435,7 @@ def expand(x, **shared): shared_data=shared_data, dims=dims, coords=coords, + raw_logp_fn=orig_logp_fn, ) @@ -506,7 +515,7 @@ def compile_pymc_model( raise ValueError(f"Backend must be one of numba and jax. Got {backend}") -def _compute_shapes(model): +def _compute_shapes(model) -> dict[str, tuple[int, ...]]: import pytensor from pymc.initial_point import make_initial_point_fn @@ -681,7 +690,7 @@ def _make_functions( for var in remaining_rvs: all_names.append(var.name) - shape = shapes[var.name] + shape = cast(tuple[int, ...], shapes[var.name]) all_shapes.append(shape) length = prod(shape) all_slices.append(slice(count, count + length)) diff --git a/python/nutpie/compiled_pyfunc.py b/python/nutpie/compiled_pyfunc.py index df4404e..a34cfdd 100644 --- a/python/nutpie/compiled_pyfunc.py +++ b/python/nutpie/compiled_pyfunc.py @@ -20,6 +20,8 @@ class PyFuncModel(CompiledModel): _n_dim: int _variables: list[_lib.PyVariable] _coords: dict[str, Any] + _make_transform_adapter: Callable | None + _raw_logp_fn: Callable | None @property def shapes(self) -> dict[str, tuple[int, ...]]: @@ -60,12 +62,20 @@ def make_expand_func(seed1, seed2, chain): expand_fn = self._make_expand_func(seed1, seed2, chain) return partial(expand_fn, **self._shared_data) + if self._make_transform_adapter is not None: + make_transform_adapter = partial( + self._make_transform_adapter, logp_fn=self._raw_logp_fn + ) + else: + make_transform_adapter = None + return _lib.PyModel( make_logp_func, make_expand_func, self._variables, self.n_dim, self._make_initial_points, + make_transform_adapter, ) @@ -81,6 +91,8 @@ def from_pyfunc( dims: dict[str, tuple[str, ...]] | None = None, shared_data: dict[str, Any] | None = None, make_initial_point_fn: Callable[[SeedType], np.ndarray] | None, + make_transform_adapter=None, + raw_logp_fn=None, ): variables = [] for name, shape, dtype in zip( @@ -111,4 +123,6 @@ def from_pyfunc( _make_initial_points=make_initial_point_fn, _variables=variables, _shared_data=shared_data, + _make_transform_adapter=make_transform_adapter, + _raw_logp_fn=raw_logp_fn, ) diff --git a/python/nutpie/sample.py b/python/nutpie/sample.py index 2baddcc..097a824 100644 --- a/python/nutpie/sample.py +++ b/python/nutpie/sample.py @@ -461,6 +461,7 @@ def sample( save_warmup: bool, progress_bar: bool, low_rank_modified_mass_matrix: bool = False, + transform_adapt: bool = False, init_mean: Optional[np.ndarray], return_raw_trace: bool, blocking: Literal[True], @@ -480,6 +481,7 @@ def sample( save_warmup: bool, progress_bar: bool, low_rank_modified_mass_matrix: bool = False, + transform_adapt: bool = False, init_mean: Optional[np.ndarray], return_raw_trace: bool, blocking: Literal[False], @@ -498,6 +500,7 @@ def sample( save_warmup: bool = True, progress_bar: bool = True, low_rank_modified_mass_matrix: bool = False, + transform_adapt: bool = False, init_mean: Optional[np.ndarray] = None, return_raw_trace: bool = False, blocking: bool = True, @@ -585,6 +588,9 @@ def sample( mass_matrix_gamma: float > 0, default=1e-5 Regularisation parameter for the eigenvalues. Only applicable with low_rank_modified_mass_matrix=True. + transform_adapt: bool, default=False + Use the experimental transform adaptation algorithm + during tuning. **kwargs Pass additional arguments to nutpie._lib.PySamplerArgs @@ -594,10 +600,18 @@ def sample( An ArviZ ``InferenceData`` object that contains the samples. """ + if low_rank_modified_mass_matrix and transform_adapt: + raise ValueError( + "Specify only one of `low_rank_modified_mass_matrix` and `transform_adapt`" + ) + if low_rank_modified_mass_matrix: settings = _lib.PyNutsSettings.LowRank(seed) + elif transform_adapt: + settings = _lib.PyNutsSettings.Transform(seed) else: settings = _lib.PyNutsSettings.Diag(seed) + settings.num_tune = tune settings.num_draws = draws settings.num_chains = chains diff --git a/src/pyfunc.rs b/src/pyfunc.rs index 07b32d5..75d6e22 100644 --- a/src/pyfunc.rs +++ b/src/pyfunc.rs @@ -8,11 +8,12 @@ use arrow::{ }, datatypes::{DataType, Field, Float32Type, Float64Type, Int64Type}, }; -use numpy::{PyArray1, PyReadonlyArray1}; +use numpy::{NotContiguousError, PyArray1, PyReadonlyArray1}; use nuts_rs::{CpuLogpFunc, CpuMath, DrawStorage, LogpError, Model}; use pyo3::{ - pyclass, pymethods, - types::{PyAnyMethods, PyDict, PyDictMethods}, + exceptions::PyRuntimeError, + intern, pyclass, pymethods, + types::{PyAnyMethods, PyDict, PyDictMethods, PyList}, Bound, Py, PyAny, PyErr, Python, }; use rand::Rng; @@ -75,6 +76,7 @@ pub struct PyModel { make_expand_func: Py, init_point_func: Option>, variables: Vec, + transform_adapter: Option>, ndim: usize, } @@ -87,6 +89,7 @@ impl PyModel { variables: Vec, ndim: usize, init_point_func: Option>, + transform_adapter: Option>, ) -> Self { Self { make_logp_func, @@ -94,6 +97,7 @@ impl PyModel { init_point_func, variables, ndim, + transform_adapter, } } } @@ -103,9 +107,11 @@ pub enum PyLogpError { #[error("Bad logp value: {0}")] BadLogp(f64), #[error("Python error: {0}")] - PyError(PyErr), + PyError(#[from] PyErr), #[error("logp function must return float.")] ReturnTypeError(), + #[error("Python retured a non-contigous array")] + NotContiguousError(#[from] NotContiguousError), } impl LogpError for PyLogpError { @@ -121,20 +127,29 @@ impl LogpError for PyLogpError { .expect("Could not access is_recoverable in error check"); }), Self::ReturnTypeError() => false, + Self::NotContiguousError(_) => false, } } } pub struct PyDensity { logp: Py, + transform_adapter: Option>, dim: usize, } impl PyDensity { - fn new(logp_clone_func: &Py, dim: usize) -> Result { + fn new( + logp_clone_func: &Py, + dim: usize, + transform_adapter: Option<&Py>, + ) -> Result { let logp_func = Python::with_gil(|py| logp_clone_func.call0(py))?; + let transform_adapter = + transform_adapter.map(|val| Python::with_gil(|py| val.clone_ref(py))); Ok(Self { logp: logp_func, + transform_adapter, dim, }) } @@ -142,6 +157,7 @@ impl PyDensity { impl CpuLogpFunc for PyDensity { type LogpError = PyLogpError; + type TransformParams = Py; fn logp(&mut self, position: &[f64], grad: &mut [f64]) -> Result { Python::with_gil(|py| { @@ -172,6 +188,168 @@ impl CpuLogpFunc for PyDensity { fn dim(&self) -> usize { self.dim } + + fn inv_transform_normalize( + &mut self, + params: &Self::TransformParams, + untransformed_position: &[f64], + untransofrmed_gradient: &[f64], + transformed_position: &mut [f64], + transformed_gradient: &mut [f64], + ) -> std::result::Result { + Python::with_gil(|py| { + let untransformed_position = PyArray1::from_slice_bound(py, untransformed_position); + let untransformed_gradient = PyArray1::from_slice_bound(py, untransofrmed_gradient); + + let output = params + .getattr(py, intern!(py, "inv_transform"))? + .call1(py, (untransformed_position, untransformed_gradient))?; + let (logdet, transformed_position_out, transformed_gradient_out): ( + f64, + PyReadonlyArray1, + PyReadonlyArray1, + ) = output.extract(py)?; + + transformed_position.copy_from_slice(transformed_position_out.as_slice()?); + transformed_gradient.copy_from_slice(transformed_gradient_out.as_slice()?); + Ok(logdet) + }) + } + + fn init_from_transformed_position( + &mut self, + params: &Self::TransformParams, + untransformed_position: &mut [f64], + untransformed_gradient: &mut [f64], + transformed_position: &[f64], + transformed_gradient: &mut [f64], + ) -> std::result::Result<(f64, f64), Self::LogpError> { + Python::with_gil(|py| { + let transformed_position = PyArray1::from_slice_bound(py, transformed_position); + + let output = params + .getattr(py, intern!(py, "init_from_transformed_position"))? + .call1(py, (transformed_position,))?; + let ( + logp, + logdet, + untransformed_position_out, + untransformed_gradient_out, + transformed_gradient_out, + ): ( + f64, + f64, + PyReadonlyArray1, + PyReadonlyArray1, + PyReadonlyArray1, + ) = output.extract(py)?; + + untransformed_position.copy_from_slice(untransformed_position_out.as_slice()?); + untransformed_gradient.copy_from_slice(untransformed_gradient_out.as_slice()?); + transformed_gradient.copy_from_slice(transformed_gradient_out.as_slice()?); + Ok((logp, logdet)) + }) + } + + fn init_from_untransformed_position( + &mut self, + params: &Self::TransformParams, + untransformed_position: &[f64], + untransformed_gradient: &mut [f64], + transformed_position: &mut [f64], + transformed_gradient: &mut [f64], + ) -> std::result::Result<(f64, f64), Self::LogpError> { + Python::with_gil(|py| { + let untransformed_position = PyArray1::from_slice_bound(py, untransformed_position); + + let output = params + .getattr(py, intern!(py, "init_from_untransformed_position"))? + .call1(py, (untransformed_position,))?; + let ( + logp, + logdet, + untransformed_gradient_out, + transformed_position_out, + transformed_gradient_out, + ): ( + f64, + f64, + PyReadonlyArray1, + PyReadonlyArray1, + PyReadonlyArray1, + ) = output.extract(py)?; + + untransformed_gradient.copy_from_slice(untransformed_gradient_out.as_slice()?); + transformed_position.copy_from_slice(transformed_position_out.as_slice()?); + transformed_gradient.copy_from_slice(transformed_gradient_out.as_slice()?); + Ok((logp, logdet)) + }) + } + + fn update_transformation<'a, R: rand::Rng + ?Sized>( + &'a mut self, + rng: &mut R, + untransformed_positions: impl ExactSizeIterator, + untransformed_gradients: impl ExactSizeIterator, + params: &'a mut Self::TransformParams, + ) -> std::result::Result<(), Self::LogpError> { + Python::with_gil(|py| { + let positions = PyList::new_bound( + py, + untransformed_positions.map(|pos| PyArray1::from_slice_bound(py, pos)), + ); + let gradients = PyList::new_bound( + py, + untransformed_gradients.map(|grad| PyArray1::from_slice_bound(py, grad)), + ); + + let seed = rng.next_u64(); + + params + .getattr(py, intern!(py, "update"))? + .call1(py, (seed, positions, gradients))?; + Ok(()) + }) + } + + fn new_transformation( + &mut self, + rng: &mut R, + untransformed_position: &[f64], + untransfogmed_gradient: &[f64], + chain: u64, + ) -> std::result::Result { + Python::with_gil(|py| { + let position = PyArray1::from_slice_bound(py, untransformed_position); + let gradient = PyArray1::from_slice_bound(py, untransfogmed_gradient); + + let seed = rng.next_u64(); + + let transformer = self + .transform_adapter + .as_ref() + .ok_or_else(|| { + PyLogpError::PyError(PyRuntimeError::new_err( + "No transformation adapter specified", + )) + })? + .call1(py, (seed, position, gradient, chain))?; + + Ok(transformer) + }) + } + + fn transformation_id( + &self, + params: &Self::TransformParams, + ) -> std::result::Result { + Python::with_gil(|py| { + let id: i64 = params + .getattr(py, intern!(py, "transformation_id"))? + .extract(py)?; + Ok(id) + }) + } } pub struct PyTrace { @@ -471,6 +649,7 @@ impl Model for PyModel { Ok(CpuMath::new(PyDensity::new( &self.make_logp_func, self.ndim, + self.transform_adapter.as_ref(), )?)) } diff --git a/src/pymc.rs b/src/pymc.rs index b7862cf..fc57842 100644 --- a/src/pymc.rs +++ b/src/pymc.rs @@ -114,6 +114,7 @@ impl LogpError for ErrorCode { impl<'a> CpuLogpFunc for &'a LogpFunc { type LogpError = ErrorCode; + type TransformParams = (); fn dim(&self) -> usize { self.dim diff --git a/src/stan.rs b/src/stan.rs index 0564cd2..bb5f975 100644 --- a/src/stan.rs +++ b/src/stan.rs @@ -213,6 +213,7 @@ impl LogpError for StanLogpError { impl<'model> CpuLogpFunc for StanDensity<'model> { type LogpError = StanLogpError; + type TransformParams = (); fn logp(&mut self, position: &[f64], grad: &mut [f64]) -> Result { let logp = self.0.log_density_gradient(position, true, true, grad)?; diff --git a/src/wrapper.rs b/src/wrapper.rs index 6f9ad49..c81d3a4 100644 --- a/src/wrapper.rs +++ b/src/wrapper.rs @@ -14,8 +14,8 @@ use crate::{ use anyhow::{bail, Context, Result}; use arrow::array::Array; use nuts_rs::{ - AdaptOptions, ChainProgress, DiagAdaptExpSettings, DiagGradNutsSettings, LowRankNutsSettings, - LowRankSettings, NutsSettings, ProgressCallback, Sampler, SamplerWaitResult, Trace, + ChainProgress, DiagGradNutsSettings, LowRankNutsSettings, ProgressCallback, Sampler, + SamplerWaitResult, Trace, TransformedNutsSettings, }; use pyo3::{ exceptions::PyTimeoutError, @@ -66,97 +66,20 @@ impl PyChainProgress { } } -#[derive(Clone)] -enum InnerSettings { - LowRank(LowRankSettings), - Diag(DiagAdaptExpSettings), -} - #[pyclass] #[derive(Clone)] pub struct PyNutsSettings { - settings: NutsSettings<()>, - adapt: InnerSettings, + inner: Settings, } +#[derive(Clone, Debug)] enum Settings { Diag(DiagGradNutsSettings), LowRank(LowRankNutsSettings), -} - -// Would be much nicer with -// https://doc.rust-lang.org/nightly/unstable-book/language-features/type-changing-struct-update.html -fn combine_settings( - inner: T, - settings: NutsSettings<()>, -) -> NutsSettings { - let adapt = AdaptOptions { - dual_average_options: settings.adapt_options.dual_average_options, - mass_matrix_options: inner, - early_window: settings.adapt_options.early_window, - step_size_window: settings.adapt_options.step_size_window, - mass_matrix_switch_freq: settings.adapt_options.mass_matrix_switch_freq, - early_mass_matrix_switch_freq: settings.adapt_options.early_mass_matrix_switch_freq, - mass_matrix_update_freq: settings.adapt_options.mass_matrix_update_freq, - }; - NutsSettings { - num_tune: settings.num_tune, - num_draws: settings.num_draws, - maxdepth: settings.maxdepth, - store_gradient: settings.store_gradient, - store_unconstrained: settings.store_unconstrained, - max_energy_error: settings.max_energy_error, - store_divergences: settings.store_divergences, - adapt_options: adapt, - check_turning: settings.check_turning, - num_chains: settings.num_chains, - seed: settings.seed, - } -} - -fn split_settings(settings: NutsSettings) -> (NutsSettings<()>, T) { - let adapt_settings = settings.adapt_options; - let mass_matrix_settings = adapt_settings.mass_matrix_options; - - let remaining: AdaptOptions<()> = AdaptOptions { - dual_average_options: adapt_settings.dual_average_options, - mass_matrix_options: (), - early_window: adapt_settings.early_window, - step_size_window: adapt_settings.step_size_window, - mass_matrix_switch_freq: adapt_settings.mass_matrix_switch_freq, - early_mass_matrix_switch_freq: adapt_settings.early_mass_matrix_switch_freq, - mass_matrix_update_freq: adapt_settings.mass_matrix_update_freq, - }; - - let settings = NutsSettings { - adapt_options: remaining, - num_tune: settings.num_tune, - num_draws: settings.num_draws, - maxdepth: settings.maxdepth, - store_gradient: settings.store_gradient, - store_unconstrained: settings.store_unconstrained, - max_energy_error: settings.max_energy_error, - store_divergences: settings.store_divergences, - check_turning: settings.check_turning, - num_chains: settings.num_chains, - seed: settings.seed, - }; - - (settings, mass_matrix_settings) + Transforming(TransformedNutsSettings), } impl PyNutsSettings { - fn into_settings(self) -> Settings { - match self.adapt { - InnerSettings::LowRank(mass_matrix) => { - Settings::LowRank(combine_settings(mass_matrix, self.settings)) - } - InnerSettings::Diag(mass_matrix) => { - Settings::Diag(combine_settings(mass_matrix, self.settings)) - } - } - } - fn new_diag(seed: Option) -> Self { let seed = seed.unwrap_or_else(|| { let mut rng = thread_rng(); @@ -167,11 +90,8 @@ impl PyNutsSettings { ..Default::default() }; - let (settings, inner) = split_settings(settings); - Self { - settings, - adapt: InnerSettings::Diag(inner), + inner: Settings::Diag(settings), } } @@ -185,15 +105,28 @@ impl PyNutsSettings { ..Default::default() }; - let (settings, inner) = split_settings(settings); + Self { + inner: Settings::LowRank(settings), + } + } + + fn new_tranform_adapt(seed: Option) -> Self { + let seed = seed.unwrap_or_else(|| { + let mut rng = thread_rng(); + rng.next_u64() + }); + let settings = TransformedNutsSettings { + seed, + ..Default::default() + }; Self { - settings, - adapt: InnerSettings::LowRank(inner), + inner: Settings::Transforming(settings), } } } +// TODO switch to serde to expose all the options... #[pymethods] impl PyNutsSettings { #[staticmethod] @@ -208,206 +141,427 @@ impl PyNutsSettings { PyNutsSettings::new_low_rank(seed) } + #[staticmethod] + #[allow(non_snake_case)] + fn Transform(seed: Option) -> Self { + PyNutsSettings::new_tranform_adapt(seed) + } + #[getter] fn num_tune(&self) -> u64 { - self.settings.num_tune + match &self.inner { + Settings::Diag(nuts_settings) => nuts_settings.num_tune, + Settings::LowRank(nuts_settings) => nuts_settings.num_tune, + Settings::Transforming(nuts_settings) => nuts_settings.num_tune, + } } #[setter(num_tune)] fn set_num_tune(&mut self, val: u64) { - self.settings.num_tune = val + match &mut self.inner { + Settings::Diag(nuts_settings) => nuts_settings.num_tune = val, + Settings::LowRank(nuts_settings) => nuts_settings.num_tune = val, + Settings::Transforming(nuts_settings) => nuts_settings.num_tune = val, + } } #[getter] fn num_chains(&self) -> usize { - self.settings.num_chains + match &self.inner { + Settings::Diag(nuts_settings) => nuts_settings.num_chains, + Settings::LowRank(nuts_settings) => nuts_settings.num_chains, + Settings::Transforming(nuts_settings) => nuts_settings.num_chains, + } } #[setter(num_chains)] fn set_num_chains(&mut self, val: usize) { - self.settings.num_chains = val; + match &mut self.inner { + Settings::Diag(nuts_settings) => nuts_settings.num_chains = val, + Settings::LowRank(nuts_settings) => nuts_settings.num_chains = val, + Settings::Transforming(nuts_settings) => nuts_settings.num_chains = val, + } } #[getter] fn num_draws(&self) -> u64 { - self.settings.num_draws + match &self.inner { + Settings::Diag(nuts_settings) => nuts_settings.num_draws, + Settings::LowRank(nuts_settings) => nuts_settings.num_draws, + Settings::Transforming(nuts_settings) => nuts_settings.num_draws, + } } #[setter(num_draws)] fn set_num_draws(&mut self, val: u64) { - self.settings.num_draws = val; + match &mut self.inner { + Settings::Diag(nuts_settings) => nuts_settings.num_draws = val, + Settings::LowRank(nuts_settings) => nuts_settings.num_draws = val, + Settings::Transforming(nuts_settings) => nuts_settings.num_draws = val, + } } #[getter] - fn window_switch_freq(&self) -> u64 { - self.settings.adapt_options.mass_matrix_switch_freq + fn window_switch_freq(&self) -> Result { + match &self.inner { + Settings::Diag(nuts_settings) => { + Ok(nuts_settings.adapt_options.mass_matrix_switch_freq) + } + Settings::LowRank(nuts_settings) => { + Ok(nuts_settings.adapt_options.mass_matrix_switch_freq) + } + Settings::Transforming(_) => { + bail!("Option window_switch_freq not availbale for transformation adaptation") + } + } } #[setter(window_switch_freq)] - fn set_window_switch_freq(&mut self, val: u64) { - self.settings.adapt_options.mass_matrix_switch_freq = val; + fn set_window_switch_freq(&mut self, val: u64) -> Result<()> { + match &mut self.inner { + Settings::Diag(nuts_settings) => { + nuts_settings.adapt_options.mass_matrix_switch_freq = val; + Ok(()) + } + Settings::LowRank(nuts_settings) => { + nuts_settings.adapt_options.mass_matrix_switch_freq = val; + Ok(()) + } + Settings::Transforming(_) => { + bail!("Option window_switch_freq not availbale for transformation adaptation") + } + } } #[getter] - fn early_window_switch_freq(&self) -> u64 { - self.settings.adapt_options.early_mass_matrix_switch_freq + fn early_window_switch_freq(&self) -> Result { + match &self.inner { + Settings::Diag(nuts_settings) => { + Ok(nuts_settings.adapt_options.early_mass_matrix_switch_freq) + } + Settings::LowRank(nuts_settings) => { + Ok(nuts_settings.adapt_options.early_mass_matrix_switch_freq) + } + Settings::Transforming(_) => { + bail!("Option early_window_switch_freq not availbale for transformation adaptation") + } + } } #[setter(early_window_switch_freq)] - fn set_early_window_switch_freq(&mut self, val: u64) { - self.settings.adapt_options.early_mass_matrix_switch_freq = val; + fn set_early_window_switch_freq(&mut self, val: u64) -> Result<()> { + match &mut self.inner { + Settings::Diag(nuts_settings) => { + nuts_settings.adapt_options.early_mass_matrix_switch_freq = val; + Ok(()) + } + Settings::LowRank(nuts_settings) => { + nuts_settings.adapt_options.early_mass_matrix_switch_freq = val; + Ok(()) + } + Settings::Transforming(_) => { + bail!("Option early_window_switch_freq not availbale for transformation adaptation") + } + } } + #[getter] fn initial_step(&self) -> f64 { - self.settings - .adapt_options - .dual_average_options - .initial_step + match &self.inner { + Settings::Diag(nuts_settings) => { + nuts_settings + .adapt_options + .dual_average_options + .initial_step + } + Settings::LowRank(nuts_settings) => { + nuts_settings + .adapt_options + .dual_average_options + .initial_step + } + Settings::Transforming(nuts_settings) => { + nuts_settings + .adapt_options + .dual_average_options + .initial_step + } + } } #[setter(initial_step)] fn set_initial_step(&mut self, val: f64) { - self.settings - .adapt_options - .dual_average_options - .initial_step = val + match &mut self.inner { + Settings::Diag(nuts_settings) => { + nuts_settings + .adapt_options + .dual_average_options + .initial_step = val; + } + Settings::LowRank(nuts_settings) => { + nuts_settings + .adapt_options + .dual_average_options + .initial_step = val; + } + Settings::Transforming(nuts_settings) => { + nuts_settings + .adapt_options + .dual_average_options + .initial_step = val; + } + } } #[getter] fn maxdepth(&self) -> u64 { - self.settings.maxdepth + match &self.inner { + Settings::Diag(nuts_settings) => nuts_settings.maxdepth, + Settings::LowRank(nuts_settings) => nuts_settings.maxdepth, + Settings::Transforming(nuts_settings) => nuts_settings.maxdepth, + } } #[setter(maxdepth)] fn set_maxdepth(&mut self, val: u64) { - self.settings.maxdepth = val + match &mut self.inner { + Settings::Diag(nuts_settings) => nuts_settings.maxdepth = val, + Settings::LowRank(nuts_settings) => nuts_settings.maxdepth = val, + Settings::Transforming(nuts_settings) => nuts_settings.maxdepth = val, + } } #[getter] fn store_gradient(&self) -> bool { - self.settings.store_gradient + match &self.inner { + Settings::Diag(nuts_settings) => nuts_settings.store_gradient, + Settings::LowRank(nuts_settings) => nuts_settings.store_gradient, + Settings::Transforming(nuts_settings) => nuts_settings.store_gradient, + } } #[setter(store_gradient)] fn set_store_gradient(&mut self, val: bool) { - self.settings.store_gradient = val; + match &mut self.inner { + Settings::Diag(nuts_settings) => nuts_settings.store_gradient = val, + Settings::LowRank(nuts_settings) => nuts_settings.store_gradient = val, + Settings::Transforming(nuts_settings) => nuts_settings.store_gradient = val, + } } #[getter] fn store_unconstrained(&self) -> bool { - self.settings.store_unconstrained + match &self.inner { + Settings::Diag(nuts_settings) => nuts_settings.store_unconstrained, + Settings::LowRank(nuts_settings) => nuts_settings.store_unconstrained, + Settings::Transforming(nuts_settings) => nuts_settings.store_unconstrained, + } } #[setter(store_unconstrained)] fn set_store_unconstrained(&mut self, val: bool) { - self.settings.store_unconstrained = val; + match &mut self.inner { + Settings::Diag(nuts_settings) => nuts_settings.store_unconstrained = val, + Settings::LowRank(nuts_settings) => nuts_settings.store_unconstrained = val, + Settings::Transforming(nuts_settings) => nuts_settings.store_unconstrained = val, + } } #[getter] fn store_divergences(&self) -> bool { - self.settings.store_divergences + match &self.inner { + Settings::Diag(nuts_settings) => nuts_settings.store_divergences, + Settings::LowRank(nuts_settings) => nuts_settings.store_divergences, + Settings::Transforming(nuts_settings) => nuts_settings.store_divergences, + } } #[setter(store_divergences)] fn set_store_divergences(&mut self, val: bool) { - self.settings.store_divergences = val; + match &mut self.inner { + Settings::Diag(nuts_settings) => nuts_settings.store_divergences = val, + Settings::LowRank(nuts_settings) => nuts_settings.store_divergences = val, + Settings::Transforming(nuts_settings) => nuts_settings.store_divergences = val, + } } #[getter] fn max_energy_error(&self) -> f64 { - self.settings.max_energy_error + match &self.inner { + Settings::Diag(nuts_settings) => nuts_settings.max_energy_error, + Settings::LowRank(nuts_settings) => nuts_settings.max_energy_error, + Settings::Transforming(nuts_settings) => nuts_settings.max_energy_error, + } } #[setter(max_energy_error)] fn set_max_energy_error(&mut self, val: f64) { - self.settings.max_energy_error = val + match &mut self.inner { + Settings::Diag(nuts_settings) => nuts_settings.max_energy_error = val, + Settings::LowRank(nuts_settings) => nuts_settings.max_energy_error = val, + Settings::Transforming(nuts_settings) => nuts_settings.max_energy_error = val, + } } - #[setter(target_accept)] - fn set_target_accept(&mut self, val: f64) { - self.settings - .adapt_options - .dual_average_options - .target_accept = val; + #[getter] + fn set_target_accept(&self) -> f64 { + match &self.inner { + Settings::Diag(nuts_settings) => { + nuts_settings + .adapt_options + .dual_average_options + .target_accept + } + Settings::LowRank(nuts_settings) => { + nuts_settings + .adapt_options + .dual_average_options + .target_accept + } + Settings::Transforming(nuts_settings) => { + nuts_settings + .adapt_options + .dual_average_options + .target_accept + } + } } - #[getter] - fn target_accept(&self) -> f64 { - self.settings - .adapt_options - .dual_average_options - .target_accept + #[setter(target_accept)] + fn target_accept(&mut self, val: f64) { + match &mut self.inner { + Settings::Diag(nuts_settings) => { + nuts_settings + .adapt_options + .dual_average_options + .target_accept = val + } + Settings::LowRank(nuts_settings) => { + nuts_settings + .adapt_options + .dual_average_options + .target_accept = val + } + Settings::Transforming(nuts_settings) => { + nuts_settings + .adapt_options + .dual_average_options + .target_accept = val + } + } } #[getter] - fn store_mass_matrix(&self) -> bool { - match &self.adapt { - InnerSettings::LowRank(low_rank) => low_rank.store_mass_matrix, - InnerSettings::Diag(diag) => diag.store_mass_matrix, + fn store_mass_matrix(&self) -> Result { + match &self.inner { + Settings::LowRank(settings) => { + Ok(settings.adapt_options.mass_matrix_options.store_mass_matrix) + } + Settings::Diag(settings) => { + Ok(settings.adapt_options.mass_matrix_options.store_mass_matrix) + } + Settings::Transforming(_) => { + bail!("Option store_mass_matrix not availbale for transformation adaptation") + } } } #[setter(store_mass_matrix)] - fn set_store_mass_matrix(&mut self, val: bool) { - match &mut self.adapt { - InnerSettings::LowRank(low_rank) => { - low_rank.store_mass_matrix = val; + fn set_store_mass_matrix(&mut self, val: bool) -> Result<()> { + match &mut self.inner { + Settings::LowRank(settings) => { + settings.adapt_options.mass_matrix_options.store_mass_matrix = val; + Ok(()) } - InnerSettings::Diag(diag) => { - diag.store_mass_matrix = val; + Settings::Diag(settings) => { + settings.adapt_options.mass_matrix_options.store_mass_matrix = val; + Ok(()) + } + Settings::Transforming(_) => { + bail!("Option store_mass_matrix not availbale for transformation adaptation") } } } #[getter] fn use_grad_based_mass_matrix(&self) -> Result { - match &self.adapt { - InnerSettings::LowRank(_) => { - bail!("grad based mass matrix not available for low-rank adaptation") + match &self.inner { + Settings::LowRank(_) => { + bail!("non-grad based mass matrix not available for low-rank adaptation") + } + Settings::Transforming(_) => { + bail!("non-grad based mass matrix not available for transforming adaptation") } - InnerSettings::Diag(diag) => Ok(diag.use_grad_based_estimate), + Settings::Diag(diag) => Ok(diag + .adapt_options + .mass_matrix_options + .use_grad_based_estimate), } } #[setter(use_grad_based_mass_matrix)] fn set_use_grad_based_mass_matrix(&mut self, val: bool) -> Result<()> { - match &mut self.adapt { - InnerSettings::LowRank(_) => { - bail!("grad based mass matrix not available for low-rank adaptation") + match &mut self.inner { + Settings::LowRank(_) => { + bail!("non-grad based mass matrix not available for low-rank adaptation"); } - InnerSettings::Diag(diag) => { - diag.use_grad_based_estimate = val; + Settings::Transforming(_) => { + bail!("non-grad based mass matrix not available for transforming adaptation"); + } + Settings::Diag(diag) => { + diag.adapt_options + .mass_matrix_options + .use_grad_based_estimate = val; } } Ok(()) } #[getter] - fn mass_matrix_switch_freq(&self) -> u64 { - self.settings.adapt_options.mass_matrix_switch_freq + fn mass_matrix_switch_freq(&self) -> Result { + match &self.inner { + Settings::Diag(settings) => Ok(settings.adapt_options.mass_matrix_switch_freq), + Settings::LowRank(settings) => Ok(settings.adapt_options.mass_matrix_switch_freq), + Settings::Transforming(_) => { + bail!("mass_matrix_switch_freq not available for transforming adaptation"); + } + } } #[setter(mass_matrix_switch_freq)] - fn set_mass_matrix_switch_freq(&mut self, val: u64) { - self.settings.adapt_options.mass_matrix_switch_freq = val; + fn set_mass_matrix_switch_freq(&mut self, val: u64) -> Result<()> { + match &mut self.inner { + Settings::Diag(settings) => settings.adapt_options.mass_matrix_switch_freq = val, + Settings::LowRank(settings) => settings.adapt_options.mass_matrix_switch_freq = val, + Settings::Transforming(_) => { + bail!("mass_matrix_switch_freq not available for transforming adaptation"); + } + } + Ok(()) } #[getter] fn mass_matrix_eigval_cutoff(&self) -> Result { - match &self.adapt { - InnerSettings::LowRank(inner) => Ok(inner.eigval_cutoff), - InnerSettings::Diag(_) => { - bail!("eigenvalue cutoff not available for diag mass matrix adaptation") + match &self.inner { + Settings::LowRank(inner) => Ok(inner.adapt_options.mass_matrix_options.eigval_cutoff), + Settings::Diag(_) => { + bail!("eigenvalue cutoff not available for diag mass matrix adaptation"); + } + Settings::Transforming(_) => { + bail!("eigenvalue cutoff not available for transfor adaptation"); } } } #[setter(mass_matrix_eigval_cutoff)] fn set_mass_matrix_eigval_cutoff(&mut self, val: f64) -> Result<()> { - match &mut self.adapt { - InnerSettings::LowRank(inner) => inner.eigval_cutoff = val, - InnerSettings::Diag(_) => { - bail!("eigenvalue cutoff not available for diag mass matrix adaptation") + match &mut self.inner { + Settings::LowRank(inner) => inner.adapt_options.mass_matrix_options.eigval_cutoff = val, + Settings::Diag(_) => { + bail!("eigenvalue cutoff not available for diag mass matrix adaptation"); + } + Settings::Transforming(_) => { + bail!("eigenvalue cutoff not available for transfor adaptation"); } } Ok(()) @@ -415,20 +569,28 @@ impl PyNutsSettings { #[getter] fn mass_matrix_gamma(&self) -> Result { - match &self.adapt { - InnerSettings::LowRank(inner) => Ok(inner.gamma), - InnerSettings::Diag(_) => { - bail!("gamma not available for diag mass matrix adaptation") + match &self.inner { + Settings::LowRank(inner) => Ok(inner.adapt_options.mass_matrix_options.gamma), + Settings::Diag(_) => { + bail!("gamma not available for diag mass matrix adaptation"); + } + Settings::Transforming(_) => { + bail!("gamma not available for transform adaptation"); } } } #[setter(mass_matrix_gamma)] fn set_mass_matrix_gamma(&mut self, val: f64) -> Result<()> { - match &mut self.adapt { - InnerSettings::LowRank(inner) => inner.gamma = val, - InnerSettings::Diag(_) => { - bail!("gamma not available for diag mass matrix adaptation") + match &mut self.inner { + Settings::LowRank(inner) => { + inner.adapt_options.mass_matrix_options.gamma = val; + } + Settings::Diag(_) => { + bail!("gamma not available for diag mass matrix adaptation"); + } + Settings::Transforming(_) => { + bail!("gamma not available for transform adaptation"); } } Ok(()) @@ -517,7 +679,7 @@ impl PySampler { progress_type: ProgressType, ) -> PyResult { let callback = progress_type.into_callback()?; - match settings.into_settings() { + match settings.inner { Settings::LowRank(settings) => { let sampler = Sampler::new(model, settings, cores, callback)?; Ok(PySampler(SamplerState::Running(sampler))) @@ -526,6 +688,10 @@ impl PySampler { let sampler = Sampler::new(model, settings, cores, callback)?; Ok(PySampler(SamplerState::Running(sampler))) } + Settings::Transforming(settings) => { + let sampler = Sampler::new(model, settings, cores, callback)?; + Ok(PySampler(SamplerState::Running(sampler))) + } } } @@ -537,7 +703,7 @@ impl PySampler { progress_type: ProgressType, ) -> PyResult { let callback = progress_type.into_callback()?; - match settings.into_settings() { + match settings.inner { Settings::LowRank(settings) => { let sampler = Sampler::new(model, settings, cores, callback)?; Ok(PySampler(SamplerState::Running(sampler))) @@ -546,6 +712,10 @@ impl PySampler { let sampler = Sampler::new(model, settings, cores, callback)?; Ok(PySampler(SamplerState::Running(sampler))) } + Settings::Transforming(settings) => { + let sampler = Sampler::new(model, settings, cores, callback)?; + Ok(PySampler(SamplerState::Running(sampler))) + } } } @@ -557,7 +727,7 @@ impl PySampler { progress_type: ProgressType, ) -> PyResult { let callback = progress_type.into_callback()?; - match settings.into_settings() { + match settings.inner { Settings::LowRank(settings) => { let sampler = Sampler::new(model, settings, cores, callback)?; Ok(PySampler(SamplerState::Running(sampler))) @@ -566,6 +736,10 @@ impl PySampler { let sampler = Sampler::new(model, settings, cores, callback)?; Ok(PySampler(SamplerState::Running(sampler))) } + Settings::Transforming(settings) => { + let sampler = Sampler::new(model, settings, cores, callback)?; + Ok(PySampler(SamplerState::Running(sampler))) + } } } From 4faf55fb19be60932e74e04141e36a76530684ef Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Thu, 17 Oct 2024 11:44:00 +0200 Subject: [PATCH 04/55] docs: Add documentation template --- book.toml | 6 + docs/SUMMARY.md | 8 + docs/benchmarks.md | 1 + docs/nf-adapt.md | 3 + docs/pymc-usage.md | 1 + docs/stan-usage.md | 3 + python/nutpie/compiled_pyfunc.py | 307 ++++++++++++++++++++++++++++++- 7 files changed, 324 insertions(+), 5 deletions(-) create mode 100644 book.toml create mode 100644 docs/SUMMARY.md create mode 100644 docs/benchmarks.md create mode 100644 docs/nf-adapt.md create mode 100644 docs/pymc-usage.md create mode 100644 docs/stan-usage.md diff --git a/book.toml b/book.toml new file mode 100644 index 0000000..9835ea7 --- /dev/null +++ b/book.toml @@ -0,0 +1,6 @@ +[book] +authors = ["Adrian Seyboldt"] +language = "en" +multilingual = false +src = "docs" +title = "nutpie" diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md new file mode 100644 index 0000000..279cdd3 --- /dev/null +++ b/docs/SUMMARY.md @@ -0,0 +1,8 @@ +# Summary + +[Introduction](../README.md) + +- [Usage with PyMC](./pymc-usage.md) +- [Usage with Stan](./stan-usage.md) +- [Adaptation with normalizing flows](./nf-adapt.md) +- [Benchmarks](./benchmarks.md) diff --git a/docs/benchmarks.md b/docs/benchmarks.md new file mode 100644 index 0000000..680d565 --- /dev/null +++ b/docs/benchmarks.md @@ -0,0 +1 @@ +# Benchmarks diff --git a/docs/nf-adapt.md b/docs/nf-adapt.md new file mode 100644 index 0000000..d9d0325 --- /dev/null +++ b/docs/nf-adapt.md @@ -0,0 +1,3 @@ +# Adaptation with normalizing flows + +**Experimental** diff --git a/docs/pymc-usage.md b/docs/pymc-usage.md new file mode 100644 index 0000000..e66c098 --- /dev/null +++ b/docs/pymc-usage.md @@ -0,0 +1 @@ +# Usage with PyMC models diff --git a/docs/stan-usage.md b/docs/stan-usage.md new file mode 100644 index 0000000..78259ef --- /dev/null +++ b/docs/stan-usage.md @@ -0,0 +1,3 @@ +# Usage with Stan models + +foobar diff --git a/python/nutpie/compiled_pyfunc.py b/python/nutpie/compiled_pyfunc.py index a34cfdd..4f2ee15 100644 --- a/python/nutpie/compiled_pyfunc.py +++ b/python/nutpie/compiled_pyfunc.py @@ -11,6 +11,304 @@ SeedType = int +def make_transform_adapter(*, verbose=False, window_size=2000): + import jax + import equinox as eqx + import jax.numpy as jnp + import flowjax + import flowjax.train + import flowjax.flows + import optax + import traceback + + class FisherLoss: + @eqx.filter_jit + def __call__( + self, + params, + static, + x, + condition=None, + key=None, + ): + flow = flowjax.train.losses.unwrap( + eqx.combine(params, static, is_leaf=eqx.is_inexact_array) + ) + + def compute_loss(bijection, draw, grad): + draw, grad, _ = bijection.inverse_gradient_and_val( + draw, grad, jnp.array(0.0) + ) + return ((draw + grad) ** 2).sum() + + assert x.shape[1] == 2 + draws = x[:, 0, :] + grads = x[:, 1, :] + return jnp.log( + jax.vmap(compute_loss, [None, 0, 0])( + flow.bijection, draws, grads + ).mean() + ) + + def _get_untransformed(bijection, draw_trafo, grad_trafo): + bijection = flowjax.train.losses.unwrap(bijection) + draw = bijection.inverse(draw_trafo) + _, pull_grad_fn = jax.vjp(bijection.transform_and_log_det, draw) + (grad,) = pull_grad_fn((grad_trafo, 1.0)) + return draw, grad + + pull_points = eqx.filter_jit(jax.vmap(_get_untransformed, [None, 0, 0])) + + def fit_flow(key, bijection, positions, gradients, **kwargs): + flow = flowjax.flows.Transformed( + flowjax.distributions.StandardNormal(bijection.shape), bijection + ) + + points = jnp.transpose(jnp.array([positions, gradients]), [1, 0, 2]) + + key, train_key = jax.random.split(key) + + fit, losses, opt_state = flowjax.train.fit_to_data( + key=train_key, + dist=flow, + x=points, + loss_fn=FisherLoss(), + **kwargs, + ) + + draws_pulled, grads_pulled = pull_points(fit.bijection, positions, gradients) + final_cost = np.log(((draws_pulled + grads_pulled) ** 2).sum(1).mean(0)) + return fit, final_cost, opt_state + + def make_flow(seed, positions, gradients, *, n_layers): + positions = np.array(positions) + gradients = np.array(gradients) + + n_draws, n_dim = positions.shape + + if n_dim < 2: + n_layers = 0 + + assert positions.shape == gradients.shape + assert n_draws > 0 + + if n_draws == 0: + raise ValueError("No draws") + elif n_draws == 1: + diag = 1 / jnp.abs(gradients[0]) + mean = jnp.zeros_like(diag) + else: + diag = jnp.sqrt(positions.std(0) / gradients.std(0)) + mean = positions.mean(0) + diag * gradients.mean(0) + + key = jax.random.PRNGKey(seed % (2**63)) + + flows = [ + flowjax.flows.Affine(loc=mean, scale=diag), + ] + + for layer in range(n_layers): + key, key_couple, key_permute, key_init = jax.random.split(key, 4) + + scale = flowjax.wrappers.Parameterize( + lambda x: jnp.exp(jnp.arcsinh(x)), jnp.array(0.0) + ) + affine = eqx.tree_at( + where=lambda aff: aff.scale, + pytree=flowjax.bijections.Affine(), + replace=scale, + ) + + coupling = flowjax.bijections.coupling.Coupling( + key_couple, + transformer=affine, + untransformed_dim=n_dim // 2, + dim=n_dim, + nn_activation=jax.nn.gelu, + nn_width=n_dim // 2, + nn_depth=1, + ) + + if layer == n_layers - 1: + flow = coupling + else: + flow = flowjax.flows._add_default_permute(coupling, n_dim, key_permute) + + flows.append(flow) + + return flowjax.bijections.Chain(flows[::-1]) + + @eqx.filter_jit + def _init_from_transformed_position(logp_fn, bijection, transformed_position): + bijection = flowjax.train.losses.unwrap(bijection) + (untransformed_position, logdet), pull_grad = jax.vjp( + bijection.transform_and_log_det, transformed_position + ) + logp, untransformed_gradient = jax.value_and_grad(lambda x: logp_fn(x)[0])( + untransformed_position + ) + (transformed_gradient,) = pull_grad((untransformed_gradient, 1.0)) + return ( + logp, + logdet, + untransformed_position, + untransformed_gradient, + transformed_gradient, + ) + + @eqx.filter_jit + def _init_from_untransformed_position(logp_fn, bijection, untransformed_position): + logp, untransformed_gradient = jax.value_and_grad(lambda x: logp_fn(x)[0])( + untransformed_position + ) + logdet, transformed_position, transformed_gradient = _inv_transform( + bijection, untransformed_position, untransformed_gradient + ) + return ( + logp, + logdet, + untransformed_gradient, + transformed_position, + transformed_gradient, + ) + + @eqx.filter_jit + def _inv_transform(bijection, untransformed_position, untransformed_gradient): + bijection = flowjax.train.losses.unwrap(bijection) + transformed_position, transformed_gradient, logdet = ( + bijection.inverse_gradient_and_val( + untransformed_position, untransformed_gradient, 0.0 + ) + ) + return -logdet, transformed_position, transformed_gradient + + class TransformAdapter: + def __init__( + self, + seed, + position, + gradient, + chain, + *, + logp_fn, + make_flow_fn, + verbose=False, + window_size=2000, + ): + self._logp_fn = logp_fn + self._make_flow_fn = make_flow_fn + self._chain = chain + self._verbose = verbose + self._window_size = window_size + try: + self._bijection = make_flow_fn(seed, [position], [gradient], n_layers=0) + except Exception as e: + print("make_flow", e) + print(traceback.format_exc()) + raise + self.index = 0 + + @property + def transformation_id(self): + return self.index + + def update(self, seed, positions, gradients): + self.index += 1 + if self._verbose: + print(f"Chain {self._chain}: Total available points: {len(positions)}") + n_draws = len(positions) + if n_draws == 0: + return + try: + if self.index <= 10: + self._bijection = self._make_flow_fn( + seed, positions[-10:], gradients[-10:], n_layers=0 + ) + return + + positions = np.array(positions[-self._window_size :]) + gradients = np.array(gradients[-self._window_size :]) + + assert np.isfinite(positions).all() + assert np.isfinite(gradients).all() + + if len(self._bijection.bijections) == 1: + self._bijection = self._make_flow_fn( + seed, positions, gradients, n_layers=8 + ) + + # make_flow might still only return a single trafo if the for 1d problems + if len(self._bijection.bijections) == 1: + return + + # TODO don't reuse seed + key = jax.random.PRNGKey(seed % (2**63)) + fit, final_cost, _ = fit_flow( + key, + self._bijection, + positions, + gradients, + show_progress=self._verbose, + optimizer=optax.adabelief(1e-3), + batch_size=128, + ) + if self._verbose: + print(f"Chain {self._chain}: final cost {final_cost}") + if np.isfinite(final_cost).all(): + self._bijection = fit.bijection + else: + self._bijection = self._make_flow_fn( + seed, positions, gradients, n_layers=0 + ) + except Exception as e: + print("update error:", e) + print(traceback.format_exc()) + + def init_from_transformed_position(self, transformed_position): + try: + logp, logdet, *arrays = _init_from_transformed_position( + self._logp_fn, + self._bijection, + jnp.array(transformed_position), + ) + return float(logp), float(logdet), *[np.array(val) for val in arrays] + except Exception as e: + print(e) + print(traceback.format_exc()) + raise + + def init_from_untransformed_position(self, untransformed_position): + try: + logp, logdet, *arrays = _init_from_untransformed_position( + self._logp_fn, + self._bijection, + jnp.array(untransformed_position), + ) + return float(logp), float(logdet), *[np.array(val) for val in arrays] + except Exception as e: + print(e) + print(traceback.format_exc()) + raise + + def inv_transform(self, position, gradient): + try: + logdet, *arrays = _inv_transform( + self._bijection, jnp.array(position), jnp.array(gradient) + ) + return logdet, *[np.array(val) for val in arrays] + except Exception as e: + print(e) + print(traceback.format_exc()) + raise + + return partial( + TransformAdapter, + verbose=verbose, + window_size=window_size, + make_flow_fn=make_flow, + ) + + @dataclass(frozen=True) class PyFuncModel(CompiledModel): _make_logp_func: Callable @@ -62,12 +360,10 @@ def make_expand_func(seed1, seed2, chain): expand_fn = self._make_expand_func(seed1, seed2, chain) return partial(expand_fn, **self._shared_data) - if self._make_transform_adapter is not None: - make_transform_adapter = partial( - self._make_transform_adapter, logp_fn=self._raw_logp_fn - ) + if self._raw_logp_fn is not None: + make_adapter = partial(make_transform_adapter(), logp_fn=self._raw_logp_fn) else: - make_transform_adapter = None + make_adapter = None return _lib.PyModel( make_logp_func, @@ -76,6 +372,7 @@ def make_expand_func(seed1, seed2, chain): self.n_dim, self._make_initial_points, make_transform_adapter, + make_adapter, ) From 7f14b8cd7eae22d31e1f2630a7066086abbb85e7 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Fri, 18 Oct 2024 18:50:37 +0200 Subject: [PATCH 05/55] Clean up optimizer arguments --- python/nutpie/compiled_pyfunc.py | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/python/nutpie/compiled_pyfunc.py b/python/nutpie/compiled_pyfunc.py index 4f2ee15..7719575 100644 --- a/python/nutpie/compiled_pyfunc.py +++ b/python/nutpie/compiled_pyfunc.py @@ -11,7 +11,7 @@ SeedType = int -def make_transform_adapter(*, verbose=False, window_size=2000): +def make_transform_adapter(*, verbose=True, window_size=2000, show_progress=False): import jax import equinox as eqx import jax.numpy as jnp @@ -50,16 +50,7 @@ def compute_loss(bijection, draw, grad): ).mean() ) - def _get_untransformed(bijection, draw_trafo, grad_trafo): - bijection = flowjax.train.losses.unwrap(bijection) - draw = bijection.inverse(draw_trafo) - _, pull_grad_fn = jax.vjp(bijection.transform_and_log_det, draw) - (grad,) = pull_grad_fn((grad_trafo, 1.0)) - return draw, grad - - pull_points = eqx.filter_jit(jax.vmap(_get_untransformed, [None, 0, 0])) - - def fit_flow(key, bijection, positions, gradients, **kwargs): + def fit_flow(key, bijection, loss_fn, positions, gradients, **kwargs): flow = flowjax.flows.Transformed( flowjax.distributions.StandardNormal(bijection.shape), bijection ) @@ -72,12 +63,11 @@ def fit_flow(key, bijection, positions, gradients, **kwargs): key=train_key, dist=flow, x=points, - loss_fn=FisherLoss(), + loss_fn=loss_fn, **kwargs, ) - draws_pulled, grads_pulled = pull_points(fit.bijection, positions, gradients) - final_cost = np.log(((draws_pulled + grads_pulled) ** 2).sum(1).mean(0)) + final_cost = losses["val"][-1] return fit, final_cost, opt_state def make_flow(seed, positions, gradients, *, n_layers): @@ -108,7 +98,7 @@ def make_flow(seed, positions, gradients, *, n_layers): ] for layer in range(n_layers): - key, key_couple, key_permute, key_init = jax.random.split(key, 4) + key, key_couple, key_permute = jax.random.split(key, 3) scale = flowjax.wrappers.Parameterize( lambda x: jnp.exp(jnp.arcsinh(x)), jnp.array(0.0) @@ -194,12 +184,16 @@ def __init__( make_flow_fn, verbose=False, window_size=2000, + show_progress=False, ): self._logp_fn = logp_fn self._make_flow_fn = make_flow_fn self._chain = chain self._verbose = verbose self._window_size = window_size + self._optimizer = optax.adabelief(1e-3) + self._loss_fn = FisherLoss() + self._show_progress = show_progress try: self._bijection = make_flow_fn(seed, [position], [gradient], n_layers=0) except Exception as e: @@ -246,10 +240,11 @@ def update(self, seed, positions, gradients): fit, final_cost, _ = fit_flow( key, self._bijection, + self._loss_fn, positions, gradients, - show_progress=self._verbose, - optimizer=optax.adabelief(1e-3), + show_progress=self._show_progress, + optimizer=self._optimizer, batch_size=128, ) if self._verbose: @@ -306,6 +301,7 @@ def inv_transform(self, position, gradient): verbose=verbose, window_size=window_size, make_flow_fn=make_flow, + show_progress=show_progress, ) From 100fbef72fad7278be733abaa17904de3f825982 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Fri, 18 Oct 2024 18:50:59 +0200 Subject: [PATCH 06/55] Fix logdet sign --- python/nutpie/compiled_pyfunc.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/python/nutpie/compiled_pyfunc.py b/python/nutpie/compiled_pyfunc.py index 7719575..31f8606 100644 --- a/python/nutpie/compiled_pyfunc.py +++ b/python/nutpie/compiled_pyfunc.py @@ -170,7 +170,7 @@ def _inv_transform(bijection, untransformed_position, untransformed_gradient): untransformed_position, untransformed_gradient, 0.0 ) ) - return -logdet, transformed_position, transformed_gradient + return logdet, transformed_position, transformed_gradient class TransformAdapter: def __init__( @@ -220,8 +220,11 @@ def update(self, seed, positions, gradients): ) return - positions = np.array(positions[-self._window_size :]) - gradients = np.array(gradients[-self._window_size :]) + positions = np.array(positions[500:][-self._window_size :]) + gradients = np.array(gradients[500:][-self._window_size :]) + + if len(positions) == 0: + return assert np.isfinite(positions).all() assert np.isfinite(gradients).all() From 25246e926afb836108f4d21153454f7262a081b2 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Fri, 25 Oct 2024 23:05:58 +0200 Subject: [PATCH 07/55] chore: Update dependencies --- Cargo.lock | 546 ++++++++++------------------------------------------- Cargo.toml | 14 +- 2 files changed, 111 insertions(+), 449 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 27405f5..f43842a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -75,55 +75,22 @@ version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" -[[package]] -name = "arrow" -version = "52.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05048a8932648b63f21c37d88b552ccc8a65afb6dfe9fc9f30ce79174c2e7a85" -dependencies = [ - "arrow-arith 52.2.0", - "arrow-array 52.2.0", - "arrow-buffer 52.2.0", - "arrow-cast 52.2.0", - "arrow-data 52.2.0", - "arrow-ord 52.2.0", - "arrow-row 52.2.0", - "arrow-schema 52.2.0", - "arrow-select 52.2.0", - "arrow-string 52.2.0", -] - [[package]] name = "arrow" version = "53.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4caf25cdc4a985f91df42ed9e9308e1adbcd341a31a72605c697033fcef163e3" dependencies = [ - "arrow-arith 53.2.0", - "arrow-array 53.2.0", - "arrow-buffer 53.2.0", - "arrow-cast 53.2.0", - "arrow-data 53.2.0", - "arrow-ord 53.2.0", - "arrow-row 53.2.0", - "arrow-schema 53.2.0", - "arrow-select 53.2.0", - "arrow-string 53.2.0", -] - -[[package]] -name = "arrow-arith" -version = "52.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d8a57966e43bfe9a3277984a14c24ec617ad874e4c0e1d2a1b083a39cfbf22c" -dependencies = [ - "arrow-array 52.2.0", - "arrow-buffer 52.2.0", - "arrow-data 52.2.0", - "arrow-schema 52.2.0", - "chrono", - "half", - "num", + "arrow-arith", + "arrow-array", + "arrow-buffer", + "arrow-cast", + "arrow-data", + "arrow-ord", + "arrow-row", + "arrow-schema", + "arrow-select", + "arrow-string", ] [[package]] @@ -132,28 +99,12 @@ version = "53.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91f2dfd1a7ec0aca967dfaa616096aec49779adc8eccec005e2f5e4111b1192a" dependencies = [ - "arrow-array 53.2.0", - "arrow-buffer 53.2.0", - "arrow-data 53.2.0", - "arrow-schema 53.2.0", - "chrono", - "half", - "num", -] - -[[package]] -name = "arrow-array" -version = "52.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f4a9468c882dc66862cef4e1fd8423d47e67972377d85d80e022786427768c" -dependencies = [ - "ahash", - "arrow-buffer 52.2.0", - "arrow-data 52.2.0", - "arrow-schema 52.2.0", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", "chrono", "half", - "hashbrown", "num", ] @@ -164,26 +115,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d39387ca628be747394890a6e47f138ceac1aa912eab64f02519fed24b637af8" dependencies = [ "ahash", - "arrow-buffer 53.2.0", - "arrow-data 53.2.0", - "arrow-schema 53.2.0", + "arrow-buffer", + "arrow-data", + "arrow-schema", "chrono", "half", "hashbrown", "num", ] -[[package]] -name = "arrow-buffer" -version = "52.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c975484888fc95ec4a632cdc98be39c085b1bb518531b0c80c5d462063e5daa1" -dependencies = [ - "bytes", - "half", - "num", -] - [[package]] name = "arrow-buffer" version = "53.2.0" @@ -195,81 +135,34 @@ dependencies = [ "num", ] -[[package]] -name = "arrow-cast" -version = "52.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da26719e76b81d8bc3faad1d4dbdc1bcc10d14704e63dc17fc9f3e7e1e567c8e" -dependencies = [ - "arrow-array 52.2.0", - "arrow-buffer 52.2.0", - "arrow-data 52.2.0", - "arrow-schema 52.2.0", - "arrow-select 52.2.0", - "atoi", - "base64", - "chrono", - "half", - "lexical-core 0.8.5", - "num", - "ryu", -] - [[package]] name = "arrow-cast" version = "53.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d09aea56ec9fa267f3f3f6cdab67d8a9974cbba90b3aa38c8fe9d0bb071bd8c1" dependencies = [ - "arrow-array 53.2.0", - "arrow-buffer 53.2.0", - "arrow-data 53.2.0", - "arrow-schema 53.2.0", - "arrow-select 53.2.0", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "arrow-select", "atoi", "base64", "chrono", "half", - "lexical-core 1.0.2", + "lexical-core", "num", "ryu", ] -[[package]] -name = "arrow-data" -version = "52.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd9d6f18c65ef7a2573ab498c374d8ae364b4a4edf67105357491c031f716ca5" -dependencies = [ - "arrow-buffer 52.2.0", - "arrow-schema 52.2.0", - "half", - "num", -] - [[package]] name = "arrow-data" version = "53.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b98ae0af50890b494cebd7d6b04b35e896205c1d1df7b29a6272c5d0d0249ef5" dependencies = [ - "arrow-buffer 53.2.0", - "arrow-schema 53.2.0", - "half", - "num", -] - -[[package]] -name = "arrow-ord" -version = "52.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42745f86b1ab99ef96d1c0bcf49180848a64fe2c7a7a0d945bc64fa2b21ba9bc" -dependencies = [ - "arrow-array 52.2.0", - "arrow-buffer 52.2.0", - "arrow-data 52.2.0", - "arrow-schema 52.2.0", - "arrow-select 52.2.0", + "arrow-buffer", + "arrow-schema", "half", "num", ] @@ -280,29 +173,15 @@ version = "53.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2883d7035e0b600fb4c30ce1e50e66e53d8656aa729f2bfa4b51d359cf3ded52" dependencies = [ - "arrow-array 53.2.0", - "arrow-buffer 53.2.0", - "arrow-data 53.2.0", - "arrow-schema 53.2.0", - "arrow-select 53.2.0", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "arrow-select", "half", "num", ] -[[package]] -name = "arrow-row" -version = "52.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd09a518c602a55bd406bcc291a967b284cfa7a63edfbf8b897ea4748aad23c" -dependencies = [ - "ahash", - "arrow-array 52.2.0", - "arrow-buffer 52.2.0", - "arrow-data 52.2.0", - "arrow-schema 52.2.0", - "half", -] - [[package]] name = "arrow-row" version = "53.2.0" @@ -310,22 +189,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "552907e8e587a6fde4f8843fd7a27a576a260f65dab6c065741ea79f633fc5be" dependencies = [ "ahash", - "arrow-array 53.2.0", - "arrow-buffer 53.2.0", - "arrow-data 53.2.0", - "arrow-schema 53.2.0", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", "half", ] -[[package]] -name = "arrow-schema" -version = "52.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e972cd1ff4a4ccd22f86d3e53e835c2ed92e0eea6a3e8eadb72b4f1ac802cf8" -dependencies = [ - "bitflags 2.6.0", -] - [[package]] name = "arrow-schema" version = "53.2.0" @@ -335,20 +205,6 @@ dependencies = [ "bitflags 2.6.0", ] -[[package]] -name = "arrow-select" -version = "52.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "600bae05d43483d216fb3494f8c32fdbefd8aa4e1de237e790dbb3d9f44690a3" -dependencies = [ - "ahash", - "arrow-array 52.2.0", - "arrow-buffer 52.2.0", - "arrow-data 52.2.0", - "arrow-schema 52.2.0", - "num", -] - [[package]] name = "arrow-select" version = "53.2.0" @@ -356,28 +212,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6259e566b752da6dceab91766ed8b2e67bf6270eb9ad8a6e07a33c1bede2b125" dependencies = [ "ahash", - "arrow-array 53.2.0", - "arrow-buffer 53.2.0", - "arrow-data 53.2.0", - "arrow-schema 53.2.0", - "num", -] - -[[package]] -name = "arrow-string" -version = "52.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dc1985b67cb45f6606a248ac2b4a288849f196bab8c657ea5589f47cdd55e6" -dependencies = [ - "arrow-array 52.2.0", - "arrow-buffer 52.2.0", - "arrow-data 52.2.0", - "arrow-schema 52.2.0", - "arrow-select 52.2.0", - "memchr", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", "num", - "regex", - "regex-syntax", ] [[package]] @@ -386,11 +225,11 @@ version = "53.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3179ccbd18ebf04277a095ba7321b93fd1f774f18816bd5f6b3ce2f594edb6c" dependencies = [ - "arrow-array 53.2.0", - "arrow-buffer 53.2.0", - "arrow-data 53.2.0", - "arrow-schema 53.2.0", - "arrow-select 53.2.0", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "arrow-select", "memchr", "num", "regex", @@ -857,7 +696,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" dependencies = [ - "heck 0.5.0", + "heck", "proc-macro2", "quote", "syn 2.0.87", @@ -930,15 +769,10 @@ dependencies = [ "matrixcompare", "matrixcompare-core", "nano-gemm", - "npyz", "num-complex", "num-traits", "paste", - "rand", - "rand_distr", - "rayon", "reborrow", - "serde", ] [[package]] @@ -1031,7 +865,6 @@ dependencies = [ "paste", "pulp", "raw-cpuid", - "rayon", "seq-macro", "sysctl", ] @@ -1050,7 +883,6 @@ dependencies = [ "num-traits", "paste", "raw-cpuid", - "rayon", "seq-macro", ] @@ -1129,12 +961,6 @@ version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - [[package]] name = "heck" version = "0.5.0" @@ -1290,41 +1116,17 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" -[[package]] -name = "lexical-core" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cde5de06e8d4c2faabc400238f9ae1c74d5412d03a7bd067645ccbc47070e46" -dependencies = [ - "lexical-parse-float 0.8.5", - "lexical-parse-integer 0.8.6", - "lexical-util 0.8.5", - "lexical-write-float 0.8.5", - "lexical-write-integer 0.8.5", -] - [[package]] name = "lexical-core" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0431c65b318a590c1de6b8fd6e72798c92291d27762d94c9e6c37ed7a73d8458" dependencies = [ - "lexical-parse-float 1.0.2", - "lexical-parse-integer 1.0.2", - "lexical-util 1.0.3", - "lexical-write-float 1.0.2", - "lexical-write-integer 1.0.2", -] - -[[package]] -name = "lexical-parse-float" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683b3a5ebd0130b8fb52ba0bdc718cc56815b6a097e28ae5a6997d0ad17dc05f" -dependencies = [ - "lexical-parse-integer 0.8.6", - "lexical-util 0.8.5", - "static_assertions", + "lexical-parse-float", + "lexical-parse-integer", + "lexical-util", + "lexical-write-float", + "lexical-write-integer", ] [[package]] @@ -1333,18 +1135,8 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb17a4bdb9b418051aa59d41d65b1c9be5affab314a872e5ad7f06231fb3b4e0" dependencies = [ - "lexical-parse-integer 1.0.2", - "lexical-util 1.0.3", - "static_assertions", -] - -[[package]] -name = "lexical-parse-integer" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d0994485ed0c312f6d965766754ea177d07f9c00c9b82a5ee62ed5b47945ee9" -dependencies = [ - "lexical-util 0.8.5", + "lexical-parse-integer", + "lexical-util", "static_assertions", ] @@ -1354,16 +1146,7 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5df98f4a4ab53bf8b175b363a34c7af608fe31f93cc1fb1bf07130622ca4ef61" dependencies = [ - "lexical-util 1.0.3", - "static_assertions", -] - -[[package]] -name = "lexical-util" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5255b9ff16ff898710eb9eb63cb39248ea8a5bb036bea8085b1a767ff6c4e3fc" -dependencies = [ + "lexical-util", "static_assertions", ] @@ -1376,35 +1159,14 @@ dependencies = [ "static_assertions", ] -[[package]] -name = "lexical-write-float" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accabaa1c4581f05a3923d1b4cfd124c329352288b7b9da09e766b0668116862" -dependencies = [ - "lexical-util 0.8.5", - "lexical-write-integer 0.8.5", - "static_assertions", -] - [[package]] name = "lexical-write-float" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e7c3ad4e37db81c1cbe7cf34610340adc09c322871972f74877a712abc6c809" dependencies = [ - "lexical-util 1.0.3", - "lexical-write-integer 1.0.2", - "static_assertions", -] - -[[package]] -name = "lexical-write-integer" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1b6f3d1f4422866b68192d62f77bc5c700bee84f3069f2469d7bc8c77852446" -dependencies = [ - "lexical-util 0.8.5", + "lexical-util", + "lexical-write-integer", "static_assertions", ] @@ -1414,7 +1176,7 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb89e9f6958b83258afa3deed90b5de9ef68eef090ad5086c791cd2345610162" dependencies = [ - "lexical-util 1.0.3", + "lexical-util", "static_assertions", ] @@ -1446,16 +1208,6 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - [[package]] name = "log" version = "0.4.22" @@ -1624,24 +1376,28 @@ dependencies = [ ] [[package]] -name = "nom" -version = "7.1.3" +name = "ndarray" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +checksum = "882ed72dce9365842bf196bdeedf5055305f11fc8c03dee7bb0194a6cad34841" dependencies = [ - "memchr", - "minimal-lexical", + "matrixmultiply", + "num-complex", + "num-integer", + "num-traits", + "portable-atomic", + "portable-atomic-util", + "rawpointer", ] [[package]] -name = "npyz" -version = "0.8.3" +name = "nom" +version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13f27ea175875c472b3df61ece89a6d6ef4e0627f43704e400c782f174681ebd" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" dependencies = [ - "byteorder", - "num-bigint", - "py_literal", + "memchr", + "minimal-lexical", ] [[package]] @@ -1676,7 +1432,6 @@ checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ "bytemuck", "num-traits", - "rand", ] [[package]] @@ -1734,12 +1489,12 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] name = "numpy" -version = "0.21.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec170733ca37175f5d75a5bea5911d6ff45d2cd52849ce98b685394e4f2f37f4" +checksum = "edb929bc0da91a4d85ed6c0a84deaa53d411abfb387fc271124f91bf6b89f14e" dependencies = [ "libc", - "ndarray", + "ndarray 0.16.1", "num-complex", "num-integer", "num-traits", @@ -1749,10 +1504,10 @@ dependencies = [ [[package]] name = "nutpie" -version = "0.13.2" +version = "0.14.0" dependencies = [ "anyhow", - "arrow 53.2.0", + "arrow", "bridgestan", "criterion", "indicatif", @@ -1773,12 +1528,12 @@ dependencies = [ [[package]] name = "nuts-rs" -version = "0.12.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8573e3b5c83e8ec0570ebbd75dd6fdc7dfcfa5da9b5f9d9d63fedefebbd9cf8" +checksum = "55fad6cdecd2d51675b7f167657817304ac421a18d0efff93914e295935ef4c0" dependencies = [ "anyhow", - "arrow 52.2.0", + "arrow", "faer", "itertools 0.13.0", "multiversion", @@ -1802,29 +1557,6 @@ version = "11.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" -[[package]] -name = "parking_lot" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets", -] - [[package]] name = "password-hash" version = "0.4.2" @@ -1872,51 +1604,6 @@ dependencies = [ "sha2", ] -[[package]] -name = "pest" -version = "2.7.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442" -dependencies = [ - "memchr", - "thiserror", - "ucd-trie", -] - -[[package]] -name = "pest_derive" -version = "2.7.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d214365f632b123a47fd913301e14c946c61d1c183ee245fa76eb752e59a02dd" -dependencies = [ - "pest", - "pest_generator", -] - -[[package]] -name = "pest_generator" -version = "2.7.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb55586734301717aea2ac313f50b2eb8f60d2fc3dc01d190eefa2e625f60c4e" -dependencies = [ - "pest", - "pest_meta", - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "pest_meta" -version = "2.7.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b75da2a70cf4d9cb76833c990ac9cd3923c9a8905a8929789ce347c84564d03d" -dependencies = [ - "once_cell", - "pest", - "sha2", -] - [[package]] name = "pkg-config" version = "0.3.31" @@ -1957,6 +1644,15 @@ version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" +[[package]] +name = "portable-atomic-util" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90a7d5beecc52a491b54d6dd05c7a45ba1801666a5baad9fdbfc6fef8d2d206c" +dependencies = [ + "portable-atomic", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -2003,31 +1699,18 @@ dependencies = [ "reborrow", ] -[[package]] -name = "py_literal" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "102df7a3d46db9d3891f178dcc826dc270a6746277a9ae6436f8d29fd490a8e1" -dependencies = [ - "num-bigint", - "num-complex", - "num-traits", - "pest", - "pest_derive", -] - [[package]] name = "pyo3" -version = "0.21.2" +version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e00b96a521718e08e03b1a622f01c8a8deb50719335de3f60b3b3950f069d8" +checksum = "f402062616ab18202ae8319da13fa4279883a2b8a9d9f83f20dbade813ce1884" dependencies = [ "anyhow", "cfg-if", "indoc", "libc", "memoffset", - "parking_lot", + "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", @@ -2037,9 +1720,9 @@ dependencies = [ [[package]] name = "pyo3-build-config" -version = "0.21.2" +version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7883df5835fafdad87c0d888b266c8ec0f4c9ca48a5bed6bbb592e8dedee1b50" +checksum = "b14b5775b5ff446dd1056212d778012cbe8a0fbffd368029fd9e25b514479c38" dependencies = [ "once_cell", "target-lexicon", @@ -2047,9 +1730,9 @@ dependencies = [ [[package]] name = "pyo3-ffi" -version = "0.21.2" +version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01be5843dc60b916ab4dad1dca6d20b9b4e6ddc8e15f50c47fe6d85f1fb97403" +checksum = "9ab5bcf04a2cdcbb50c7d6105de943f543f9ed92af55818fd17b660390fc8636" dependencies = [ "libc", "pyo3-build-config", @@ -2057,9 +1740,9 @@ dependencies = [ [[package]] name = "pyo3-macros" -version = "0.21.2" +version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77b34069fc0682e11b31dbd10321cbf94808394c56fd996796ce45217dfac53c" +checksum = "0fd24d897903a9e6d80b968368a34e1525aeb719d568dba8b3d4bfa5dc67d453" dependencies = [ "proc-macro2", "pyo3-macros-backend", @@ -2069,11 +1752,11 @@ dependencies = [ [[package]] name = "pyo3-macros-backend" -version = "0.21.2" +version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08260721f32db5e1a5beae69a55553f56b99bd0e1c3e6e0a5e8851a9d0f5a85c" +checksum = "36c011a03ba1e50152b4b394b479826cad97e7a21eb52df179cd91ac411cbfbe" dependencies = [ - "heck 0.4.1", + "heck", "proc-macro2", "pyo3-build-config", "quote", @@ -2170,15 +1853,6 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430" -[[package]] -name = "redox_syscall" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" -dependencies = [ - "bitflags 2.6.0", -] - [[package]] name = "regex" version = "1.11.1" @@ -2252,12 +1926,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - [[package]] name = "seq-macro" version = "0.3.5" @@ -2392,14 +2060,14 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tch" -version = "0.17.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3585f5bbf1ddf2498d7586bf870c7bb785a0bf1be09c54d0f93fce51d5f3c7fc" +checksum = "f139aa58f0189998a9674f8617b60e054226d98d541e444cd7db5ed986fcc35f" dependencies = [ "half", "lazy_static", "libc", - "ndarray", + "ndarray 0.15.6", "rand", "safetensors", "thiserror", @@ -2473,9 +2141,9 @@ dependencies = [ [[package]] name = "torch-sys" -version = "0.17.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef116d446d79bb2447748550baee86850d2d32d366cc9bdd4b217bdbe10cac63" +checksum = "0c787d00c8e04c9d37db6c4f0048f52820906ee7c42de5bae68a844fa8242fea" dependencies = [ "anyhow", "cc", @@ -2489,12 +2157,6 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" -[[package]] -name = "ucd-trie" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" - [[package]] name = "unicode-ident" version = "1.0.13" diff --git a/Cargo.toml b/Cargo.toml index e2badad..cd6b5ed 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,9 +1,9 @@ [package] name = "nutpie" -version = "0.13.2" +version = "0.14.0" authors = [ - "Adrian Seyboldt ", - "PyMC Developers ", + "Adrian Seyboldt ", + "PyMC Developers ", ] edition = "2021" license = "MIT" @@ -22,8 +22,8 @@ name = "_lib" crate-type = ["cdylib"] [dependencies] -nuts-rs = "0.12.1" -numpy = "0.21.0" +nuts-rs = "0.13.0" +numpy = "0.22.0" rand = "0.8.5" thiserror = "1.0.44" rand_chacha = "0.3.1" @@ -38,10 +38,10 @@ smallvec = "1.13.0" upon = { version = "0.8.1", default-features = false, features = [] } time-humanize = { version = "0.1.3", default-features = false } indicatif = "0.17.8" -tch = { version = "0.17.0", optional = true } +tch = { version = "0.18.0", optional = true } [dependencies.pyo3] -version = "0.21.2" +version = "0.22.5" features = ["extension-module", "anyhow"] [dev-dependencies] From 799b8d4d44d3536f0398e18ad18c1a7b83e3822f Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Fri, 25 Oct 2024 23:07:10 +0200 Subject: [PATCH 08/55] Add transforming adaptation for stan --- python/nutpie/compile_stan.py | 18 +- python/nutpie/compiled_pyfunc.py | 312 ++----------------------------- src/progress.rs | 6 +- src/pyfunc.rs | 231 +++++++++-------------- src/pymc.rs | 8 +- src/stan.rs | 175 ++++++++++++++++- src/wrapper.rs | 280 +++++++++++++++++++++++++-- 7 files changed, 559 insertions(+), 471 deletions(-) diff --git a/python/nutpie/compile_stan.py b/python/nutpie/compile_stan.py index 7a28052..70ecd14 100644 --- a/python/nutpie/compile_stan.py +++ b/python/nutpie/compile_stan.py @@ -1,9 +1,10 @@ +from functools import partial import json import tempfile from dataclasses import dataclass, replace from importlib.util import find_spec from pathlib import Path -from typing import Any, Optional +from typing import Any, Optional, Callable import numpy as np import pandas as pd @@ -11,6 +12,7 @@ from nutpie import _lib from nutpie.sample import CompiledModel +from nutpie.transform_adapter import make_transform_adapter class _NumpyArrayEncoder(json.JSONEncoder): @@ -28,6 +30,7 @@ class CompiledStanModel(CompiledModel): library: Any model: Any model_name: Optional[str] = None + _transform_adapt_args: dict | None = None def with_data(self, *, seed=None, **updates): if self.data is None: @@ -42,7 +45,15 @@ def with_data(self, *, seed=None, **updates): else: data_json = None - model = _lib.StanModel(self.library, seed, data_json) + kwargs = self._transform_adapt_args + if kwargs is None: + kwargs = {} + make_adapter = partial( + make_transform_adapter(**kwargs), + logp_fn=None, + ) + + model = _lib.StanModel(self.library, seed, data_json, make_adapter) coords = self._coords if coords is None: coords = {} @@ -75,6 +86,9 @@ def with_dims(self, **dims): dims_new.update(dims) return replace(self, dims=dims_new) + def with_transform_adapt(self, **kwargs): + return replace(self, _transform_adapt_args=kwargs).with_data() + def _make_model(self, init_mean): if self.model is None: return self.with_data().model diff --git a/python/nutpie/compiled_pyfunc.py b/python/nutpie/compiled_pyfunc.py index 31f8606..7298534 100644 --- a/python/nutpie/compiled_pyfunc.py +++ b/python/nutpie/compiled_pyfunc.py @@ -7,307 +7,11 @@ from nutpie import _lib # type: ignore from nutpie.sample import CompiledModel +from nutpie.transform_adapter import make_transform_adapter SeedType = int -def make_transform_adapter(*, verbose=True, window_size=2000, show_progress=False): - import jax - import equinox as eqx - import jax.numpy as jnp - import flowjax - import flowjax.train - import flowjax.flows - import optax - import traceback - - class FisherLoss: - @eqx.filter_jit - def __call__( - self, - params, - static, - x, - condition=None, - key=None, - ): - flow = flowjax.train.losses.unwrap( - eqx.combine(params, static, is_leaf=eqx.is_inexact_array) - ) - - def compute_loss(bijection, draw, grad): - draw, grad, _ = bijection.inverse_gradient_and_val( - draw, grad, jnp.array(0.0) - ) - return ((draw + grad) ** 2).sum() - - assert x.shape[1] == 2 - draws = x[:, 0, :] - grads = x[:, 1, :] - return jnp.log( - jax.vmap(compute_loss, [None, 0, 0])( - flow.bijection, draws, grads - ).mean() - ) - - def fit_flow(key, bijection, loss_fn, positions, gradients, **kwargs): - flow = flowjax.flows.Transformed( - flowjax.distributions.StandardNormal(bijection.shape), bijection - ) - - points = jnp.transpose(jnp.array([positions, gradients]), [1, 0, 2]) - - key, train_key = jax.random.split(key) - - fit, losses, opt_state = flowjax.train.fit_to_data( - key=train_key, - dist=flow, - x=points, - loss_fn=loss_fn, - **kwargs, - ) - - final_cost = losses["val"][-1] - return fit, final_cost, opt_state - - def make_flow(seed, positions, gradients, *, n_layers): - positions = np.array(positions) - gradients = np.array(gradients) - - n_draws, n_dim = positions.shape - - if n_dim < 2: - n_layers = 0 - - assert positions.shape == gradients.shape - assert n_draws > 0 - - if n_draws == 0: - raise ValueError("No draws") - elif n_draws == 1: - diag = 1 / jnp.abs(gradients[0]) - mean = jnp.zeros_like(diag) - else: - diag = jnp.sqrt(positions.std(0) / gradients.std(0)) - mean = positions.mean(0) + diag * gradients.mean(0) - - key = jax.random.PRNGKey(seed % (2**63)) - - flows = [ - flowjax.flows.Affine(loc=mean, scale=diag), - ] - - for layer in range(n_layers): - key, key_couple, key_permute = jax.random.split(key, 3) - - scale = flowjax.wrappers.Parameterize( - lambda x: jnp.exp(jnp.arcsinh(x)), jnp.array(0.0) - ) - affine = eqx.tree_at( - where=lambda aff: aff.scale, - pytree=flowjax.bijections.Affine(), - replace=scale, - ) - - coupling = flowjax.bijections.coupling.Coupling( - key_couple, - transformer=affine, - untransformed_dim=n_dim // 2, - dim=n_dim, - nn_activation=jax.nn.gelu, - nn_width=n_dim // 2, - nn_depth=1, - ) - - if layer == n_layers - 1: - flow = coupling - else: - flow = flowjax.flows._add_default_permute(coupling, n_dim, key_permute) - - flows.append(flow) - - return flowjax.bijections.Chain(flows[::-1]) - - @eqx.filter_jit - def _init_from_transformed_position(logp_fn, bijection, transformed_position): - bijection = flowjax.train.losses.unwrap(bijection) - (untransformed_position, logdet), pull_grad = jax.vjp( - bijection.transform_and_log_det, transformed_position - ) - logp, untransformed_gradient = jax.value_and_grad(lambda x: logp_fn(x)[0])( - untransformed_position - ) - (transformed_gradient,) = pull_grad((untransformed_gradient, 1.0)) - return ( - logp, - logdet, - untransformed_position, - untransformed_gradient, - transformed_gradient, - ) - - @eqx.filter_jit - def _init_from_untransformed_position(logp_fn, bijection, untransformed_position): - logp, untransformed_gradient = jax.value_and_grad(lambda x: logp_fn(x)[0])( - untransformed_position - ) - logdet, transformed_position, transformed_gradient = _inv_transform( - bijection, untransformed_position, untransformed_gradient - ) - return ( - logp, - logdet, - untransformed_gradient, - transformed_position, - transformed_gradient, - ) - - @eqx.filter_jit - def _inv_transform(bijection, untransformed_position, untransformed_gradient): - bijection = flowjax.train.losses.unwrap(bijection) - transformed_position, transformed_gradient, logdet = ( - bijection.inverse_gradient_and_val( - untransformed_position, untransformed_gradient, 0.0 - ) - ) - return logdet, transformed_position, transformed_gradient - - class TransformAdapter: - def __init__( - self, - seed, - position, - gradient, - chain, - *, - logp_fn, - make_flow_fn, - verbose=False, - window_size=2000, - show_progress=False, - ): - self._logp_fn = logp_fn - self._make_flow_fn = make_flow_fn - self._chain = chain - self._verbose = verbose - self._window_size = window_size - self._optimizer = optax.adabelief(1e-3) - self._loss_fn = FisherLoss() - self._show_progress = show_progress - try: - self._bijection = make_flow_fn(seed, [position], [gradient], n_layers=0) - except Exception as e: - print("make_flow", e) - print(traceback.format_exc()) - raise - self.index = 0 - - @property - def transformation_id(self): - return self.index - - def update(self, seed, positions, gradients): - self.index += 1 - if self._verbose: - print(f"Chain {self._chain}: Total available points: {len(positions)}") - n_draws = len(positions) - if n_draws == 0: - return - try: - if self.index <= 10: - self._bijection = self._make_flow_fn( - seed, positions[-10:], gradients[-10:], n_layers=0 - ) - return - - positions = np.array(positions[500:][-self._window_size :]) - gradients = np.array(gradients[500:][-self._window_size :]) - - if len(positions) == 0: - return - - assert np.isfinite(positions).all() - assert np.isfinite(gradients).all() - - if len(self._bijection.bijections) == 1: - self._bijection = self._make_flow_fn( - seed, positions, gradients, n_layers=8 - ) - - # make_flow might still only return a single trafo if the for 1d problems - if len(self._bijection.bijections) == 1: - return - - # TODO don't reuse seed - key = jax.random.PRNGKey(seed % (2**63)) - fit, final_cost, _ = fit_flow( - key, - self._bijection, - self._loss_fn, - positions, - gradients, - show_progress=self._show_progress, - optimizer=self._optimizer, - batch_size=128, - ) - if self._verbose: - print(f"Chain {self._chain}: final cost {final_cost}") - if np.isfinite(final_cost).all(): - self._bijection = fit.bijection - else: - self._bijection = self._make_flow_fn( - seed, positions, gradients, n_layers=0 - ) - except Exception as e: - print("update error:", e) - print(traceback.format_exc()) - - def init_from_transformed_position(self, transformed_position): - try: - logp, logdet, *arrays = _init_from_transformed_position( - self._logp_fn, - self._bijection, - jnp.array(transformed_position), - ) - return float(logp), float(logdet), *[np.array(val) for val in arrays] - except Exception as e: - print(e) - print(traceback.format_exc()) - raise - - def init_from_untransformed_position(self, untransformed_position): - try: - logp, logdet, *arrays = _init_from_untransformed_position( - self._logp_fn, - self._bijection, - jnp.array(untransformed_position), - ) - return float(logp), float(logdet), *[np.array(val) for val in arrays] - except Exception as e: - print(e) - print(traceback.format_exc()) - raise - - def inv_transform(self, position, gradient): - try: - logdet, *arrays = _inv_transform( - self._bijection, jnp.array(position), jnp.array(gradient) - ) - return logdet, *[np.array(val) for val in arrays] - except Exception as e: - print(e) - print(traceback.format_exc()) - raise - - return partial( - TransformAdapter, - verbose=verbose, - window_size=window_size, - make_flow_fn=make_flow, - show_progress=show_progress, - ) - - @dataclass(frozen=True) class PyFuncModel(CompiledModel): _make_logp_func: Callable @@ -317,8 +21,8 @@ class PyFuncModel(CompiledModel): _n_dim: int _variables: list[_lib.PyVariable] _coords: dict[str, Any] - _make_transform_adapter: Callable | None _raw_logp_fn: Callable | None + _transform_adapt_args: dict | None = None @property def shapes(self) -> dict[str, tuple[int, ...]]: @@ -341,6 +45,9 @@ def with_data(self, **updates): updated.update(**updates) return dataclasses.replace(self, _shared_data=updated) + def with_transform_adapt(self, **kwargs): + return dataclasses.replace(self, _transform_adapt_args=kwargs) + def _make_sampler(self, settings, init_mean, cores, progress_type): model = self._make_model(init_mean) return _lib.PySampler.from_pyfunc( @@ -360,7 +67,13 @@ def make_expand_func(seed1, seed2, chain): return partial(expand_fn, **self._shared_data) if self._raw_logp_fn is not None: - make_adapter = partial(make_transform_adapter(), logp_fn=self._raw_logp_fn) + kwargs = self._transform_adapt_args + if kwargs is None: + kwargs = {} + make_adapter = partial( + make_transform_adapter(**kwargs), + logp_fn=self._raw_logp_fn, + ) else: make_adapter = None @@ -419,6 +132,5 @@ def from_pyfunc( _make_initial_points=make_initial_point_fn, _variables=variables, _shared_data=shared_data, - _make_transform_adapter=make_transform_adapter, _raw_logp_fn=raw_logp_fn, ) diff --git a/src/progress.rs b/src/progress.rs index 906c50d..2403e15 100644 --- a/src/progress.rs +++ b/src/progress.rs @@ -1,4 +1,4 @@ -use std::{collections::BTreeMap, time::Duration}; +use std::{collections::BTreeMap, sync::Arc, time::Duration}; use anyhow::{Context, Result}; use indicatif::ProgressBar; @@ -10,13 +10,13 @@ use upon::{Engine, Value}; pub struct ProgressHandler { engine: Engine<'static>, template: String, - callback: Py, + callback: Arc>, rate: Duration, n_cores: usize, } impl ProgressHandler { - pub fn new(callback: Py, rate: Duration, template: String, n_cores: usize) -> Self { + pub fn new(callback: Arc>, rate: Duration, template: String, n_cores: usize) -> Self { let engine = Engine::new(); Self { engine, diff --git a/src/pyfunc.rs b/src/pyfunc.rs index 75d6e22..37a25d6 100644 --- a/src/pyfunc.rs +++ b/src/pyfunc.rs @@ -12,8 +12,8 @@ use numpy::{NotContiguousError, PyArray1, PyReadonlyArray1}; use nuts_rs::{CpuLogpFunc, CpuMath, DrawStorage, LogpError, Model}; use pyo3::{ exceptions::PyRuntimeError, - intern, pyclass, pymethods, - types::{PyAnyMethods, PyDict, PyDictMethods, PyList}, + pyclass, pymethods, + types::{PyAnyMethods, PyDict, PyDictMethods}, Bound, Py, PyAny, PyErr, Python, }; use rand::Rng; @@ -21,6 +21,8 @@ use rand_distr::{Distribution, StandardNormal, Uniform}; use smallvec::SmallVec; use thiserror::Error; +use crate::wrapper::PyTransformAdapt; + #[pyclass] #[derive(Debug, Clone)] #[non_exhaustive] @@ -72,17 +74,18 @@ impl PyVariable { #[pyclass] #[derive(Debug, Clone)] pub struct PyModel { - make_logp_func: Py, - make_expand_func: Py, - init_point_func: Option>, - variables: Vec, - transform_adapter: Option>, + make_logp_func: Arc>, + make_expand_func: Arc>, + init_point_func: Arc>>, + variables: Arc>, + transform_adapter: Option, ndim: usize, } #[pymethods] impl PyModel { #[new] + #[pyo3(signature = (make_logp_func, make_expand_func, variables, ndim, transform_adapter=None))] fn new<'py>( make_logp_func: Py, make_expand_func: Py, @@ -92,12 +95,12 @@ impl PyModel { transform_adapter: Option>, ) -> Self { Self { - make_logp_func, - make_expand_func, - init_point_func, - variables, + make_logp_func: Arc::new(make_logp_func), + make_expand_func: Arc::new(make_expand_func), + init_point_func: Arc::new(init_point_func), + variables: Arc::new(variables), ndim, - transform_adapter, + transform_adapter: transform_adapter.map(PyTransformAdapt::new), } } } @@ -112,6 +115,8 @@ pub enum PyLogpError { ReturnTypeError(), #[error("Python retured a non-contigous array")] NotContiguousError(#[from] NotContiguousError), + #[error("Unknown error: {0}")] + Anyhow(#[from] anyhow::Error), } impl LogpError for PyLogpError { @@ -128,13 +133,14 @@ impl LogpError for PyLogpError { }), Self::ReturnTypeError() => false, Self::NotContiguousError(_) => false, + Self::Anyhow(_) => false, } } } pub struct PyDensity { logp: Py, - transform_adapter: Option>, + transform_adapter: Option, dim: usize, } @@ -142,11 +148,10 @@ impl PyDensity { fn new( logp_clone_func: &Py, dim: usize, - transform_adapter: Option<&Py>, + transform_adapter: Option<&PyTransformAdapt>, ) -> Result { let logp_func = Python::with_gil(|py| logp_clone_func.call0(py))?; - let transform_adapter = - transform_adapter.map(|val| Python::with_gil(|py| val.clone_ref(py))); + let transform_adapter = transform_adapter.map(|val| val.clone()); Ok(Self { logp: logp_func, transform_adapter, @@ -191,99 +196,68 @@ impl CpuLogpFunc for PyDensity { fn inv_transform_normalize( &mut self, - params: &Self::TransformParams, + params: &Py, untransformed_position: &[f64], - untransofrmed_gradient: &[f64], + untransformed_gradient: &[f64], transformed_position: &mut [f64], transformed_gradient: &mut [f64], ) -> std::result::Result { - Python::with_gil(|py| { - let untransformed_position = PyArray1::from_slice_bound(py, untransformed_position); - let untransformed_gradient = PyArray1::from_slice_bound(py, untransofrmed_gradient); - - let output = params - .getattr(py, intern!(py, "inv_transform"))? - .call1(py, (untransformed_position, untransformed_gradient))?; - let (logdet, transformed_position_out, transformed_gradient_out): ( - f64, - PyReadonlyArray1, - PyReadonlyArray1, - ) = output.extract(py)?; - - transformed_position.copy_from_slice(transformed_position_out.as_slice()?); - transformed_gradient.copy_from_slice(transformed_gradient_out.as_slice()?); - Ok(logdet) - }) + let logdet = self + .transform_adapter + .as_mut() + .ok_or_else(|| PyRuntimeError::new_err("No transformation adapter specified"))? + .inv_transform_normalize( + params, + untransformed_position, + untransformed_gradient, + transformed_position, + transformed_gradient, + )?; + Ok(logdet) } fn init_from_transformed_position( &mut self, - params: &Self::TransformParams, + params: &Py, untransformed_position: &mut [f64], untransformed_gradient: &mut [f64], transformed_position: &[f64], transformed_gradient: &mut [f64], ) -> std::result::Result<(f64, f64), Self::LogpError> { - Python::with_gil(|py| { - let transformed_position = PyArray1::from_slice_bound(py, transformed_position); - - let output = params - .getattr(py, intern!(py, "init_from_transformed_position"))? - .call1(py, (transformed_position,))?; - let ( - logp, - logdet, - untransformed_position_out, - untransformed_gradient_out, - transformed_gradient_out, - ): ( - f64, - f64, - PyReadonlyArray1, - PyReadonlyArray1, - PyReadonlyArray1, - ) = output.extract(py)?; - - untransformed_position.copy_from_slice(untransformed_position_out.as_slice()?); - untransformed_gradient.copy_from_slice(untransformed_gradient_out.as_slice()?); - transformed_gradient.copy_from_slice(transformed_gradient_out.as_slice()?); - Ok((logp, logdet)) - }) + let (logp, logdet) = self + .transform_adapter + .as_mut() + .ok_or_else(|| PyRuntimeError::new_err("No transformation adapter specified"))? + .init_from_transformed_position( + params, + untransformed_position, + untransformed_gradient, + transformed_position, + transformed_gradient, + )?; + Ok((logp, logdet)) } fn init_from_untransformed_position( &mut self, - params: &Self::TransformParams, + params: &Py, untransformed_position: &[f64], untransformed_gradient: &mut [f64], transformed_position: &mut [f64], transformed_gradient: &mut [f64], ) -> std::result::Result<(f64, f64), Self::LogpError> { - Python::with_gil(|py| { - let untransformed_position = PyArray1::from_slice_bound(py, untransformed_position); - - let output = params - .getattr(py, intern!(py, "init_from_untransformed_position"))? - .call1(py, (untransformed_position,))?; - let ( - logp, - logdet, - untransformed_gradient_out, - transformed_position_out, - transformed_gradient_out, - ): ( - f64, - f64, - PyReadonlyArray1, - PyReadonlyArray1, - PyReadonlyArray1, - ) = output.extract(py)?; - - untransformed_gradient.copy_from_slice(untransformed_gradient_out.as_slice()?); - transformed_position.copy_from_slice(transformed_position_out.as_slice()?); - transformed_gradient.copy_from_slice(transformed_gradient_out.as_slice()?); - Ok((logp, logdet)) - }) + let (logp, logdet) = self + .transform_adapter + .as_mut() + .ok_or_else(|| PyRuntimeError::new_err("No transformation adapter specified"))? + .init_from_untransformed_position( + params, + untransformed_position, + untransformed_gradient, + transformed_position, + transformed_gradient, + )?; + Ok((logp, logdet)) } fn update_transformation<'a, R: rand::Rng + ?Sized>( @@ -291,70 +265,48 @@ impl CpuLogpFunc for PyDensity { rng: &mut R, untransformed_positions: impl ExactSizeIterator, untransformed_gradients: impl ExactSizeIterator, - params: &'a mut Self::TransformParams, + params: &'a mut Py, ) -> std::result::Result<(), Self::LogpError> { - Python::with_gil(|py| { - let positions = PyList::new_bound( - py, - untransformed_positions.map(|pos| PyArray1::from_slice_bound(py, pos)), - ); - let gradients = PyList::new_bound( - py, - untransformed_gradients.map(|grad| PyArray1::from_slice_bound(py, grad)), - ); - - let seed = rng.next_u64(); - - params - .getattr(py, intern!(py, "update"))? - .call1(py, (seed, positions, gradients))?; - Ok(()) - }) + self.transform_adapter + .as_mut() + .ok_or_else(|| PyRuntimeError::new_err("No transformation adapter specified"))? + .update_transformation( + rng, + untransformed_positions, + untransformed_gradients, + params, + )?; + Ok(()) } fn new_transformation( &mut self, rng: &mut R, untransformed_position: &[f64], - untransfogmed_gradient: &[f64], + untransformed_gradient: &[f64], chain: u64, - ) -> std::result::Result { - Python::with_gil(|py| { - let position = PyArray1::from_slice_bound(py, untransformed_position); - let gradient = PyArray1::from_slice_bound(py, untransfogmed_gradient); - - let seed = rng.next_u64(); - - let transformer = self - .transform_adapter - .as_ref() - .ok_or_else(|| { - PyLogpError::PyError(PyRuntimeError::new_err( - "No transformation adapter specified", - )) - })? - .call1(py, (seed, position, gradient, chain))?; - - Ok(transformer) - }) - } - - fn transformation_id( - &self, - params: &Self::TransformParams, - ) -> std::result::Result { - Python::with_gil(|py| { - let id: i64 = params - .getattr(py, intern!(py, "transformation_id"))? - .extract(py)?; - Ok(id) - }) + ) -> std::result::Result, Self::LogpError> { + let trafo = self + .transform_adapter + .as_mut() + .ok_or_else(|| PyRuntimeError::new_err("No transformation adapter specified"))? + .new_transformation(rng, untransformed_position, untransformed_gradient, chain)?; + Ok(trafo) + } + + fn transformation_id(&self, params: &Py) -> std::result::Result { + let id = self + .transform_adapter + .as_ref() + .ok_or_else(|| PyRuntimeError::new_err("No transformation adapter specified"))? + .transformation_id(params)?; + Ok(id) } } pub struct PyTrace { expand: Py, - variables: Vec, + variables: Arc>, builder: StructBuilder, } @@ -362,7 +314,7 @@ impl PyTrace { pub fn new( rng: &mut R, chain: u64, - variables: Vec, + variables: Arc>, make_expand_func: &Py, capacity: usize, ) -> Result { @@ -412,6 +364,7 @@ impl TensorShape { #[pymethods] impl TensorShape { #[new] + #[pyo3(signature = (shape, dims=None))] fn py_new(shape: Vec, dims: Option>>) -> Result { let dims = dims.unwrap_or(shape.iter().map(|_| None).collect()); if dims.len() != shape.len() { diff --git a/src/pymc.rs b/src/pymc.rs index fc57842..39dfc76 100644 --- a/src/pymc.rs +++ b/src/pymc.rs @@ -39,7 +39,7 @@ type RawExpandFunc = unsafe extern "C" fn( #[derive(Clone)] pub(crate) struct LogpFunc { func: RawLogpFunc, - _keep_alive: PyObject, + _keep_alive: Arc, user_data_ptr: UserData, dim: usize, } @@ -55,7 +55,7 @@ impl LogpFunc { unsafe { std::mem::transmute::<*const c_void, RawLogpFunc>(ptr as *const c_void) }; Self { func, - _keep_alive: keep_alive, + _keep_alive: Arc::new(keep_alive), user_data_ptr: user_data_ptr as UserData, dim, } @@ -66,7 +66,7 @@ impl LogpFunc { #[derive(Clone)] pub(crate) struct ExpandFunc { func: RawExpandFunc, - _keep_alive: PyObject, + _keep_alive: Arc, user_data_ptr: UserData, dim: usize, expanded_dim: usize, @@ -87,7 +87,7 @@ impl ExpandFunc { Self { dim, expanded_dim, - _keep_alive: keep_alive, + _keep_alive: Arc::new(keep_alive), user_data_ptr: user_data_ptr as UserData, func, } diff --git a/src/stan.rs b/src/stan.rs index bb5f975..ab7c3dc 100644 --- a/src/stan.rs +++ b/src/stan.rs @@ -7,6 +7,7 @@ use arrow::datatypes::{DataType, Field}; use bridgestan::open_library; use itertools::{izip, Itertools}; use nuts_rs::{CpuLogpFunc, CpuMath, DrawStorage, LogpError, Model, Settings}; +use pyo3::exceptions::PyRuntimeError; use pyo3::prelude::*; use pyo3::types::{PyDict, PyTuple}; use pyo3::{exceptions::PyValueError, pyclass, pymethods, PyResult}; @@ -17,6 +18,8 @@ use smallvec::{SmallVec, ToSmallVec}; use thiserror::Error; +use crate::wrapper::PyTransformAdapt; + type InnerModel = bridgestan::Model>; #[pyclass] @@ -68,6 +71,7 @@ impl StanVariable { pub struct StanModel { model: Arc, variables: Vec, + transform_adapter: Option, } /// Return meta information about the constrained parameters of the model @@ -136,7 +140,13 @@ fn params( #[pymethods] impl StanModel { #[new] - pub fn new(lib: StanLibrary, seed: Option, data: Option) -> anyhow::Result { + #[pyo3(signature = (lib, seed=None, data=None, transform_adapter=None))] + pub fn new( + lib: StanLibrary, + seed: Option, + data: Option, + transform_adapter: Option>, + ) -> anyhow::Result { let seed = match seed { Some(seed) => seed, None => thread_rng().next_u32(), @@ -146,7 +156,12 @@ impl StanModel { bridgestan::Model::new(lib.0, data.as_ref(), seed).map_err(anyhow::Error::new)?, ); let variables = params(&model, true, true)?; - Ok(StanModel { model, variables }) + let transform_adapter = transform_adapter.map(PyTransformAdapt::new); + Ok(StanModel { + model, + variables, + transform_adapter, + }) } pub fn variables<'py>(&self, py: Python<'py>) -> PyResult> { @@ -195,7 +210,10 @@ impl StanModel { */ } -pub struct StanDensity<'model>(&'model InnerModel); +pub struct StanDensity<'model> { + inner: &'model InnerModel, + transform_adapter: Option, +} #[derive(Debug, Error)] pub enum StanLogpError { @@ -203,6 +221,10 @@ pub enum StanLogpError { BridgeStan(#[from] bridgestan::BridgeStanError), #[error("Bad logp value: {0}")] BadLogp(f64), + #[error("Python exception: {0}")] + PyErr(#[from] PyErr), + #[error("Unspecified Error: {0}")] + Anyhow(#[from] anyhow::Error), } impl LogpError for StanLogpError { @@ -213,10 +235,12 @@ impl LogpError for StanLogpError { impl<'model> CpuLogpFunc for StanDensity<'model> { type LogpError = StanLogpError; - type TransformParams = (); + type TransformParams = Py; fn logp(&mut self, position: &[f64], grad: &mut [f64]) -> Result { - let logp = self.0.log_density_gradient(position, true, true, grad)?; + let logp = self + .inner + .log_density_gradient(position, true, true, grad)?; if !logp.is_finite() { return Err(StanLogpError::BadLogp(logp)); } @@ -224,7 +248,141 @@ impl<'model> CpuLogpFunc for StanDensity<'model> { } fn dim(&self) -> usize { - self.0.param_unc_num() + self.inner.param_unc_num() + } + + fn inv_transform_normalize( + &mut self, + params: &Py, + untransformed_position: &[f64], + untransformed_gradient: &[f64], + transformed_position: &mut [f64], + transformed_gradient: &mut [f64], + ) -> std::result::Result { + let logdet = self + .transform_adapter + .as_mut() + .ok_or_else(|| PyRuntimeError::new_err("No transformation adapter specified"))? + .inv_transform_normalize( + params, + untransformed_position, + untransformed_gradient, + transformed_position, + transformed_gradient, + ) + .context("failed inv_transform_normalize")?; + Ok(logdet) + } + + fn init_from_transformed_position( + &mut self, + params: &Py, + untransformed_position: &mut [f64], + untransformed_gradient: &mut [f64], + transformed_position: &[f64], + transformed_gradient: &mut [f64], + ) -> std::result::Result<(f64, f64), Self::LogpError> { + let adapter = self + .transform_adapter + .as_mut() + .ok_or_else(|| PyRuntimeError::new_err("No transformation adapter specified"))?; + + let part1 = adapter + .init_from_transformed_position_part1( + params, + untransformed_position, + transformed_position, + ) + .context("Failed init_from_transformed_position_part1")?; + + let logp = self.logp(untransformed_position, untransformed_gradient)?; + + let adapter = self + .transform_adapter + .as_mut() + .ok_or_else(|| PyRuntimeError::new_err("No transformation adapter specified"))?; + + let logdet = adapter + .init_from_transformed_position_part2( + params, + part1, + untransformed_gradient, + transformed_gradient, + ) + .context("Failed init_from_transformed_position_part2")?; + Ok((logp, logdet)) + } + + fn init_from_untransformed_position( + &mut self, + params: &Py, + untransformed_position: &[f64], + untransformed_gradient: &mut [f64], + transformed_position: &mut [f64], + transformed_gradient: &mut [f64], + ) -> std::result::Result<(f64, f64), Self::LogpError> { + let logp = self + .logp(untransformed_position, untransformed_gradient) + .context("Failed to call stan logp function")?; + + let logdet = self + .transform_adapter + .as_mut() + .ok_or_else(|| PyRuntimeError::new_err("No transformation adapter specified"))? + .inv_transform_normalize( + params, + untransformed_position, + untransformed_gradient, + transformed_position, + transformed_gradient, + ) + .context("Failed inv_transform_normalize in stan init_from_untransformed_position")?; + Ok((logp, logdet)) + } + + fn update_transformation<'a, R: rand::Rng + ?Sized>( + &'a mut self, + rng: &mut R, + untransformed_positions: impl ExactSizeIterator, + untransformed_gradients: impl ExactSizeIterator, + params: &'a mut Py, + ) -> std::result::Result<(), Self::LogpError> { + self.transform_adapter + .as_mut() + .ok_or_else(|| PyRuntimeError::new_err("No transformation adapter specified"))? + .update_transformation( + rng, + untransformed_positions, + untransformed_gradients, + params, + ) + .context("Failed to update the transformation")?; + Ok(()) + } + + fn new_transformation( + &mut self, + rng: &mut R, + untransformed_position: &[f64], + untransformed_gradient: &[f64], + chain: u64, + ) -> std::result::Result, Self::LogpError> { + let trafo = self + .transform_adapter + .as_mut() + .ok_or_else(|| PyRuntimeError::new_err("No transformation adapter specified"))? + .new_transformation(rng, untransformed_position, untransformed_gradient, chain) + .context("Could not create transformation adapter")?; + Ok(trafo) + } + + fn transformation_id(&self, params: &Py) -> std::result::Result { + let id = self + .transform_adapter + .as_ref() + .ok_or_else(|| PyRuntimeError::new_err("No transformation adapter specified"))? + .transformation_id(params)?; + Ok(id) } } @@ -388,7 +546,10 @@ impl Model for StanModel { } fn math(&self) -> anyhow::Result> { - Ok(CpuMath::new(StanDensity(&self.model))) + Ok(CpuMath::new(StanDensity { + inner: &self.model, + transform_adapter: self.transform_adapter.as_ref().map(|v| v.clone()), + })) } fn init_position( diff --git a/src/wrapper.rs b/src/wrapper.rs index c81d3a4..7b50341 100644 --- a/src/wrapper.rs +++ b/src/wrapper.rs @@ -13,6 +13,7 @@ use crate::{ use anyhow::{bail, Context, Result}; use arrow::array::Array; +use numpy::{PyArray1, PyReadonlyArray1}; use nuts_rs::{ ChainProgress, DiagGradNutsSettings, LowRankNutsSettings, ProgressCallback, Sampler, SamplerWaitResult, Trace, TransformedNutsSettings, @@ -20,6 +21,7 @@ use nuts_rs::{ use pyo3::{ exceptions::PyTimeoutError, ffi::Py_uintptr_t, + intern, prelude::*, types::{PyList, PyTuple}, }; @@ -131,18 +133,21 @@ impl PyNutsSettings { impl PyNutsSettings { #[staticmethod] #[allow(non_snake_case)] + #[pyo3(signature = (seed=None))] fn Diag(seed: Option) -> Self { PyNutsSettings::new_diag(seed) } #[staticmethod] #[allow(non_snake_case)] + #[pyo3(signature = (seed=None))] fn LowRank(seed: Option) -> Self { PyNutsSettings::new_low_rank(seed) } #[staticmethod] #[allow(non_snake_case)] + #[pyo3(signature = (seed=None))] fn Transform(seed: Option) -> Self { PyNutsSettings::new_tranform_adapt(seed) } @@ -210,8 +215,8 @@ impl PyNutsSettings { Settings::LowRank(nuts_settings) => { Ok(nuts_settings.adapt_options.mass_matrix_switch_freq) } - Settings::Transforming(_) => { - bail!("Option window_switch_freq not availbale for transformation adaptation") + Settings::Transforming(nuts_settings) => { + Ok(nuts_settings.adapt_options.transform_update_freq) } } } @@ -227,8 +232,9 @@ impl PyNutsSettings { nuts_settings.adapt_options.mass_matrix_switch_freq = val; Ok(()) } - Settings::Transforming(_) => { - bail!("Option window_switch_freq not availbale for transformation adaptation") + Settings::Transforming(nuts_settings) => { + nuts_settings.adapt_options.transform_update_freq = val; + Ok(()) } } } @@ -604,13 +610,12 @@ pub(crate) enum SamplerState { } #[derive(Clone)] -#[pyclass] -pub enum ProgressType { +enum InnerProgressType { Callback { rate: Duration, n_cores: usize, template: String, - callback: Py, + callback: Arc>, }, Indicatif { rate: Duration, @@ -618,10 +623,14 @@ pub enum ProgressType { None {}, } +#[pyclass] +#[derive(Clone)] +pub struct ProgressType(InnerProgressType); + impl ProgressType { fn into_callback(self) -> Result> { - match self { - ProgressType::Callback { + match self.0 { + InnerProgressType::Callback { callback, rate, n_cores, @@ -632,11 +641,11 @@ impl ProgressType { Ok(Some(callback)) } - ProgressType::Indicatif { rate } => { + InnerProgressType::Indicatif { rate } => { let handler = IndicatifHandler::new(rate); Ok(Some(handler.into_callback()?)) } - ProgressType::None {} => Ok(None), + InnerProgressType::None {} => Ok(None), } } } @@ -646,23 +655,23 @@ impl ProgressType { #[staticmethod] fn indicatif(rate: u64) -> Self { let rate = Duration::from_millis(rate); - ProgressType::Indicatif { rate } + ProgressType(InnerProgressType::Indicatif { rate }) } #[staticmethod] fn none() -> Self { - ProgressType::None {} + ProgressType(InnerProgressType::None {}) } #[staticmethod] fn template_callback(rate: u64, template: String, n_cores: usize, callback: Py) -> Self { let rate = Duration::from_millis(rate); - ProgressType::Callback { - callback, + ProgressType(InnerProgressType::Callback { + callback: Arc::new(callback), template, n_cores, rate, - } + }) } } @@ -787,6 +796,7 @@ impl PySampler { }) } + #[pyo3(signature = (timeout_seconds=None))] fn wait(&mut self, py: Python<'_>, timeout_seconds: Option) -> PyResult<()> { py.allow_threads(|| { let timeout = match timeout_seconds { @@ -937,6 +947,244 @@ fn export_array(py: Python<'_>, data: Arc) -> PyResult { Ok(data.into_py(py)) } +#[pyclass] +#[derive(Debug, Clone)] +pub struct PyTransformAdapt(Arc>); + +#[pymethods] +impl PyTransformAdapt { + #[new] + pub fn new(adapter: Py) -> Self { + Self(Arc::new(adapter)) + } +} + +impl PyTransformAdapt { + pub fn inv_transform_normalize( + &mut self, + params: &Py, + untransformed_position: &[f64], + untransformed_gradient: &[f64], + transformed_position: &mut [f64], + transformed_gradient: &mut [f64], + ) -> Result { + Python::with_gil(|py| { + let untransformed_position = PyArray1::from_slice_bound(py, untransformed_position); + let untransformed_gradient = PyArray1::from_slice_bound(py, untransformed_gradient); + + let output = params + .getattr(py, intern!(py, "inv_transform")) + .context("Could not access attribute inv_transform")? + .call1(py, (untransformed_position, untransformed_gradient)) + .context("Failed to call adapter.inv_transform")?; + let (logdet, transformed_position_out, transformed_gradient_out): ( + f64, + PyReadonlyArray1, + PyReadonlyArray1, + ) = output + .extract(py) + .context("Execpected results from adapter.inv_transform")?; + + if !transformed_position_out + .as_slice()? + .iter() + .all(|&x| x.is_finite()) + { + bail!("Transformed position is not finite"); + } + if !transformed_gradient_out + .as_slice()? + .iter() + .all(|&x| x.is_finite()) + { + bail!("Transformed position is not finite"); + } + + transformed_position.copy_from_slice( + transformed_position_out + .as_slice() + .context("Could not copy transformed_position")?, + ); + + transformed_gradient.copy_from_slice( + transformed_gradient_out + .as_slice() + .context("Could not copy transformed_gradient")?, + ); + Ok(logdet) + }) + } + + pub fn init_from_transformed_position( + &mut self, + params: &Py, + untransformed_position: &mut [f64], + untransformed_gradient: &mut [f64], + transformed_position: &[f64], + transformed_gradient: &mut [f64], + ) -> Result<(f64, f64)> { + Python::with_gil(|py| { + let transformed_position = PyArray1::from_slice_bound(py, transformed_position); + + let output = params + .getattr(py, intern!(py, "init_from_transformed_position"))? + .call1(py, (transformed_position,))?; + let ( + logp, + logdet, + untransformed_position_out, + untransformed_gradient_out, + transformed_gradient_out, + ): ( + f64, + f64, + PyReadonlyArray1, + PyReadonlyArray1, + PyReadonlyArray1, + ) = output.extract(py)?; + + untransformed_position.copy_from_slice(untransformed_position_out.as_slice()?); + untransformed_gradient.copy_from_slice(untransformed_gradient_out.as_slice()?); + transformed_gradient.copy_from_slice(transformed_gradient_out.as_slice()?); + Ok((logp, logdet)) + }) + } + + pub fn init_from_transformed_position_part1( + &mut self, + params: &Py, + untransformed_position: &mut [f64], + transformed_position: &[f64], + ) -> Result> { + Python::with_gil(|py| { + let transformed_position = PyArray1::from_slice_bound(py, transformed_position); + + let output = params + .getattr(py, intern!(py, "init_from_transformed_position_part1"))? + .call1(py, (transformed_position,))?; + let (untransformed_position_out, part1): (PyReadonlyArray1, Py) = + output.extract(py)?; + + untransformed_position.copy_from_slice(untransformed_position_out.as_slice()?); + Ok(part1) + }) + } + + pub fn init_from_transformed_position_part2( + &mut self, + params: &Py, + part1: Py, + untransformed_gradient: &[f64], + transformed_gradient: &mut [f64], + ) -> Result { + Python::with_gil(|py| { + let untransformed_gradient = PyArray1::from_slice_bound(py, untransformed_gradient); + + let output = params + .getattr(py, intern!(py, "init_from_transformed_position_part2"))? + .call1(py, (part1, untransformed_gradient))?; + let (logdet, transformed_gradient_out): (f64, PyReadonlyArray1) = + output.extract(py)?; + + transformed_gradient.copy_from_slice(transformed_gradient_out.as_slice()?); + Ok(logdet) + }) + } + + pub fn init_from_untransformed_position( + &mut self, + params: &Py, + untransformed_position: &[f64], + untransformed_gradient: &mut [f64], + transformed_position: &mut [f64], + transformed_gradient: &mut [f64], + ) -> Result<(f64, f64)> { + Python::with_gil(|py| { + let untransformed_position = PyArray1::from_slice_bound(py, untransformed_position); + + let output = params + .getattr(py, intern!(py, "init_from_untransformed_position")) + .context("No attribute init_from_untransformed_position")? + .call1(py, (untransformed_position,)) + .context("Failed adapter.init_from_untransformed_position")?; + let ( + logp, + logdet, + untransformed_gradient_out, + transformed_position_out, + transformed_gradient_out, + ): ( + f64, + f64, + PyReadonlyArray1, + PyReadonlyArray1, + PyReadonlyArray1, + ) = output + .extract(py) + .context("Unexpected return value of init_from_untransformed_position")?; + + untransformed_gradient.copy_from_slice(untransformed_gradient_out.as_slice()?); + transformed_position.copy_from_slice(transformed_position_out.as_slice()?); + transformed_gradient.copy_from_slice(transformed_gradient_out.as_slice()?); + Ok((logp, logdet)) + }) + } + + pub fn update_transformation<'a, R: rand::Rng + ?Sized>( + &'a mut self, + rng: &mut R, + untransformed_positions: impl ExactSizeIterator, + untransformed_gradients: impl ExactSizeIterator, + params: &'a mut Py, + ) -> Result<()> { + Python::with_gil(|py| { + let positions = PyList::new_bound( + py, + untransformed_positions.map(|pos| PyArray1::from_slice_bound(py, pos)), + ); + let gradients = PyList::new_bound( + py, + untransformed_gradients.map(|grad| PyArray1::from_slice_bound(py, grad)), + ); + + let seed = rng.next_u64(); + + params + .getattr(py, intern!(py, "update"))? + .call1(py, (seed, positions, gradients))?; + Ok(()) + }) + } + + pub fn new_transformation( + &mut self, + rng: &mut R, + untransformed_position: &[f64], + untransformed_gradient: &[f64], + chain: u64, + ) -> Result> { + Python::with_gil(|py| { + let position = PyArray1::from_slice_bound(py, untransformed_position); + let gradient = PyArray1::from_slice_bound(py, untransformed_gradient); + + let seed = rng.next_u64(); + + let transformer = self.0.call1(py, (seed, position, gradient, chain))?; + + Ok(transformer) + }) + } + + pub fn transformation_id(&self, params: &Py) -> Result { + Python::with_gil(|py| { + let id: i64 = params + .getattr(py, intern!(py, "transformation_id"))? + .extract(py)?; + Ok(id) + }) + } +} + /// A Python module implemented in Rust. #[pymodule] pub fn _lib(m: &Bound<'_, PyModule>) -> PyResult<()> { From 300c2dbb85ad45e3ee6477a5190a7242ce10eb48 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Mon, 11 Nov 2024 13:39:20 +0100 Subject: [PATCH 09/55] feat: Add transformation file for normalizing flows --- python/nutpie/transform_adapter.py | 527 +++++++++++++++++++++++++++++ 1 file changed, 527 insertions(+) create mode 100644 python/nutpie/transform_adapter.py diff --git a/python/nutpie/transform_adapter.py b/python/nutpie/transform_adapter.py new file mode 100644 index 0000000..136fbf8 --- /dev/null +++ b/python/nutpie/transform_adapter.py @@ -0,0 +1,527 @@ +def make_transform_adapter( + *, + verbose=False, + window_size=2000, + show_progress=False, + nn_depth=1, + nn_width=None, + num_layers=8, + num_diag_windows=10, + learning_rate=1e-3, + scale_layer=False, + untransformed_dim=None, + zero_init=True, +): + import jax + import equinox as eqx + import jax.numpy as jnp + import flowjax + import flowjax.train + import flowjax.flows + from flowjax.bijections import mvscale + import optax + import traceback + from paramax import Parameterize, unwrap + from functools import partial + + import numpy as np + + class FisherLoss: + @eqx.filter_jit + def __call__( + self, + params, + static, + x, + condition=None, + key=None, + return_all_costs=False, + ): + flow = unwrap(eqx.combine(params, static, is_leaf=eqx.is_inexact_array)) + + def compute_loss(bijection, draw, grad): + draw, grad, _ = bijection.inverse_gradient_and_val( + draw, grad, jnp.array(0.0) + ) + return ((draw + grad) ** 2).sum() + + assert x.shape[1] == 2 + draws = x[:, 0, :] + grads = x[:, 1, :] + + if return_all_costs: + return jax.vmap(compute_loss, [None, 0, 0])( + flow.bijection, draws, grads + ) + + return jnp.log( + jax.vmap(compute_loss, [None, 0, 0])( + flow.bijection, draws, grads + ).mean() + ) + + def fit_flow(key, bijection, loss_fn, points, **kwargs): + flow = flowjax.flows.Transformed( + flowjax.distributions.StandardNormal(bijection.shape), bijection + ) + + key, train_key = jax.random.split(key) + + fit, losses = flowjax.train.fit_to_data( + key=train_key, + dist=flow, + x=points, + loss_fn=loss_fn, + **kwargs, + ) + return fit.bijection, losses + + def make_flow( + seed, + positions, + gradients, + *, + zero_init=False, + scale_layer=False, + untransformed_dim=None, + n_layers, + ): + positions = np.array(positions) + gradients = np.array(gradients) + + n_draws, n_dim = positions.shape + + if n_dim < 2: + n_layers = 0 + + assert positions.shape == gradients.shape + assert n_draws > 0 + + if n_draws == 0: + raise ValueError("No draws") + elif n_draws == 1: + assert np.all(gradients != 0) + diag = np.clip(1 / jnp.sqrt(jnp.abs(gradients[0])), 1e-5, 1e5) + assert np.isfinite(diag).all() + mean = jnp.zeros_like(diag) + else: + pos_std = np.clip(positions.std(0), 1e-8, 1e8) + grad_std = np.clip(gradients.std(0), 1e-8, 1e8) + diag = jnp.sqrt(pos_std / grad_std) + mean = positions.mean(0) + gradients.mean(0) * diag * diag + + key = jax.random.PRNGKey(seed % (2**63)) + + flows = [ + flowjax.flows.Affine(loc=mean, scale=diag), + ] + + if n_layers == 0: + return flowjax.flows.Chain(flows) + + def make_layer(key, is_last=False): + key, key_couple, key_permute = jax.random.split(key, 3) + + scale = Parameterize( + lambda x: x + jnp.sqrt(1 + x**2), + jnp.array(0.0), + # lambda x: jnp.exp(jnp.arcsinh(x)), jnp.array(0.0), + ) + affine = eqx.tree_at( + where=lambda aff: aff.scale, + pytree=flowjax.bijections.Affine(), + replace=scale, + ) + + if nn_width is None: + width = n_dim // 2 + else: + width = nn_width + + if untransformed_dim is None: + untrans_dim = n_dim // 2 + else: + untrans_dim = untransformed_dim + + coupling = flowjax.bijections.coupling.Coupling( + key_couple, + transformer=affine, + untransformed_dim=untrans_dim, + dim=n_dim, + nn_activation=jax.nn.gelu, + nn_width=width, + nn_depth=nn_depth, + ) + if zero_init: + coupling = jax.tree_util.tree_map( + lambda x: x * 1e-3 if eqx.is_inexact_array(x) else x, + coupling, + ) + + if is_last: + flow = flowjax.bijections.Chain([coupling]) + else: + flow = flowjax.flows._add_default_permute(coupling, n_dim, key_permute) + + if scale_layer: + bijections = list(flow.bijections) + bijections.append(mvscale.MvScale4(jnp.ones(n_dim) * 1e-5)) + # bijections.append(mvscale.MvScale3(jnp.ones(n_dim) * 1e-5)) + flow = flowjax.bijections.Chain(bijections) + + return flow + + if n_layers == 1: + bijection = make_layer(key, is_last=True) + else: + keys = jax.random.split(key, n_layers - 1) + layers = eqx.filter_vmap(make_layer)(keys) + bijection = flowjax.bijections.Scan(layers) + + key, key_layer = jax.random.split(key) + last = make_layer(key_layer, is_last=True) + + bijection = flowjax.bijections.Chain([bijection, last]) + + return flowjax.bijections.Chain([bijection, *flows]) + + @eqx.filter_jit + def _init_from_transformed_position(logp_fn, bijection, transformed_position): + bijection = unwrap(bijection) + (untransformed_position, logdet), pull_grad = jax.vjp( + bijection.transform_and_log_det, transformed_position + ) + logp, untransformed_gradient = jax.value_and_grad(lambda x: logp_fn(x)[0])( + untransformed_position + ) + (transformed_gradient,) = pull_grad((untransformed_gradient, 1.0)) + return ( + logp, + logdet, + untransformed_position, + untransformed_gradient, + transformed_gradient, + ) + + @eqx.filter_jit + def _init_from_transformed_position_part1(logp_fn, bijection, transformed_position): + bijection = unwrap(bijection) + (untransformed_position, logdet) = bijection.transform_and_log_det( + transformed_position + ) + + return (logdet, untransformed_position) + + @eqx.filter_jit + def _init_from_transformed_position_part2( + bijection, + part1, + untransformed_gradient, + ): + logdet, untransformed_position, transformed_position = part1 + bijection = unwrap(bijection) + _, pull_grad = jax.vjp(bijection.transform_and_log_det, transformed_position) + (transformed_gradient,) = pull_grad((untransformed_gradient, 1.0)) + return ( + logdet, + transformed_gradient, + ) + + @eqx.filter_jit + def _init_from_untransformed_position(logp_fn, bijection, untransformed_position): + logp, untransformed_gradient = jax.value_and_grad(lambda x: logp_fn(x)[0])( + untransformed_position + ) + logdet, transformed_position, transformed_gradient = _inv_transform( + bijection, untransformed_position, untransformed_gradient + ) + return ( + logp, + logdet, + untransformed_gradient, + transformed_position, + transformed_gradient, + ) + + @eqx.filter_jit + def _inv_transform(bijection, untransformed_position, untransformed_gradient): + bijection = unwrap(bijection) + transformed_position, transformed_gradient, logdet = ( + bijection.inverse_gradient_and_val( + untransformed_position, untransformed_gradient, 0.0 + ) + ) + return logdet, transformed_position, transformed_gradient + + class TransformAdapter: + def __init__( + self, + seed, + position, + gradient, + chain, + *, + logp_fn, + make_flow_fn, + verbose=False, + window_size=2000, + show_progress=False, + num_diag_windows=10, + learning_rate=1e-3, + zero_init=True, + untransformed_dim=None, + ): + self._logp_fn = logp_fn + self._make_flow_fn = make_flow_fn + self._chain = chain + self._verbose = verbose + self._window_size = window_size + self._optimizer = optax.apply_if_finite(optax.adabelief(learning_rate), 50) + self._loss_fn = FisherLoss() + self._show_progress = show_progress + self._num_diag_windows = num_diag_windows + self._zero_init = zero_init + self._untransformed_dim = untransformed_dim + try: + self._bijection = make_flow_fn(seed, [position], [gradient], n_layers=0) + except Exception as e: + print("make_flow", e) + print(traceback.format_exc()) + raise + self.index = 0 + + @property + def transformation_id(self): + return self.index + + def update(self, seed, positions, gradients): + self.index += 1 + if self._verbose: + print(f"Chain {self._chain}: Total available points: {len(positions)}") + n_draws = len(positions) + if n_draws == 0: + return + try: + if self.index <= self._num_diag_windows: + size = len(positions) + positions = positions[-size // 5 + 3 :] + gradients = gradients[-size // 5 + 3 :] + + fit = self._make_flow_fn(seed, positions, gradients, n_layers=0) + points = jnp.transpose(jnp.array([positions, gradients]), [1, 0, 2]) + + flow = flowjax.flows.Transformed( + flowjax.distributions.StandardNormal(fit.shape), fit + ) + params, static = eqx.partition(flow, eqx.is_inexact_array) + new_loss = self._loss_fn(params, static, points) + + print("loss from diag:", new_loss) + + if np.isfinite(new_loss): + self._bijection = fit + + return + + positions = np.array(positions[500:][-self._window_size :]) + gradients = np.array(gradients[500:][-self._window_size :]) + + if len(positions) == 0: + return + + if not np.isfinite(gradients).all(): + print(gradients) + print(gradients.shape) + print((~np.isfinite(gradients)).nonzero()) + + assert np.isfinite(positions).all() + assert np.isfinite(gradients).all() + + # TODO don't reuse seed + key = jax.random.PRNGKey(seed % (2**63)) + points = jnp.transpose(jnp.array([positions, gradients]), [1, 0, 2]) + + if len(self._bijection.bijections) == 1: + base = self._make_flow_fn( + seed, + positions, + gradients, + n_layers=num_layers, + untransformed_dim=self._untransformed_dim, + zero_init=self._zero_init, + ) + flow = flowjax.flows.Transformed( + flowjax.distributions.StandardNormal(base.shape), base + ) + params, static = eqx.partition(flow, eqx.is_inexact_array) + if self._verbose: + print( + "loss before optimization: ", + self._loss_fn(params, static, points[-500:]), + ) + else: + base = self._bijection + + # make_flow might still only return a single trafo if the for 1d problems + if len(base.bijections) == 1: + self._bijection = base + return + + fit, _ = fit_flow( + key, + base, + self._loss_fn, + points, + show_progress=self._show_progress, + optimizer=self._optimizer, + batch_size=128, + ) + + flow = flowjax.flows.Transformed( + flowjax.distributions.StandardNormal(fit.shape), fit + ) + params, static = eqx.partition(flow, eqx.is_inexact_array) + new_loss = self._loss_fn(params, static, points[-500:]) + + flow = flowjax.flows.Transformed( + flowjax.distributions.StandardNormal(self._bijection.shape), + self._bijection, + ) + params, static = eqx.partition(flow, eqx.is_inexact_array) + old_loss = self._loss_fn(params, static, points[-500:]) + + if self._verbose: + print( + f"Chain {self._chain}: New loss {new_loss}, old loss {old_loss}" + ) + + if not np.isfinite(old_loss): + flow = flowjax.flows.Transformed( + flowjax.distributions.StandardNormal(self._bijection.shape), + self._bijection, + ) + params, static = eqx.partition(flow, eqx.is_inexact_array) + print( + self._loss_fn( + params, static, points[-500:], return_all_costs=True + ) + ) + + if not np.isfinite(new_loss): + flow = flowjax.flows.Transformed( + flowjax.distributions.StandardNormal(fit.shape), fit + ) + params, static = eqx.partition(flow, eqx.is_inexact_array) + print( + self._loss_fn( + params, static, points[-500:], return_all_costs=True + ) + ) + + if (not np.isfinite(old_loss)) and (not np.isfinite(new_loss)): + self._bijection = self._make_flow_fn( + seed, positions, gradients, n_layers=0 + ) + return + + if not np.isfinite(new_loss): + return + + if new_loss > old_loss: + return + + self._bijection = fit + + except Exception as e: + print("update error:", e) + print(traceback.format_exc()) + + def init_from_transformed_position(self, transformed_position): + try: + logp, logdet, *arrays = _init_from_transformed_position( + self._logp_fn, + self._bijection, + jnp.array(transformed_position), + ) + return ( + float(logp), + float(logdet), + *[np.array(val, dtype="float64") for val in arrays], + ) + except Exception as e: + print(e) + print(traceback.format_exc()) + raise + + def init_from_transformed_position_part1(self, transformed_position): + try: + transformed_position = jnp.array(transformed_position) + logdet, untransformed_position = _init_from_transformed_position_part1( + self._logp_fn, + self._bijection, + transformed_position, + ) + part1 = (logdet, untransformed_position, transformed_position) + return np.array(untransformed_position, dtype="float64"), part1 + except Exception as e: + print(e) + print(traceback.format_exc()) + raise + + def init_from_transformed_position_part2( + self, + part1, + untransformed_gradient, + ): + try: + # TODO We could extract the arrays from the pull_grad function + # to reuse computation from part1 + logdet, *arrays = _init_from_transformed_position_part2( + self._bijection, + part1, + untransformed_gradient, + ) + return float(logdet), *[ + np.array(val, dtype="float64") for val in arrays + ] + except Exception as e: + print(e) + print(traceback.format_exc()) + raise + + def init_from_untransformed_position(self, untransformed_position): + try: + logp, logdet, *arrays = _init_from_untransformed_position( + self._logp_fn, + self._bijection, + jnp.array(untransformed_position), + ) + arrays = [np.array(val, dtype="float64") for val in arrays] + return float(logp), float(logdet), *arrays + except Exception as e: + print(e) + print(traceback.format_exc()) + raise + + def inv_transform(self, position, gradient): + try: + logdet, *arrays = _inv_transform( + self._bijection, jnp.array(position), jnp.array(gradient) + ) + return logdet, *[np.array(val, dtype="float64") for val in arrays] + except Exception as e: + print(e) + print(traceback.format_exc()) + raise + + return partial( + TransformAdapter, + verbose=verbose, + window_size=window_size, + make_flow_fn=partial(make_flow, scale_layer=scale_layer), + show_progress=show_progress, + num_diag_windows=num_diag_windows, + learning_rate=learning_rate, + zero_init=zero_init, + untransformed_dim=untransformed_dim, + ) From 42374ea45e3f165b1c95d2b47f7b67a3532c6444 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Thu, 14 Nov 2024 17:43:04 +0100 Subject: [PATCH 10/55] chore: Update dependencies --- Cargo.lock | 32 ++++++++++++++++++++++++++------ Cargo.toml | 6 +++--- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f43842a..2c09233 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -317,7 +317,7 @@ dependencies = [ "libloading", "log", "path-absolutize", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1521,7 +1521,7 @@ dependencies = [ "rayon", "smallvec", "tch", - "thiserror", + "thiserror 2.0.3", "time-humanize", "upon", ] @@ -1542,7 +1542,7 @@ dependencies = [ "rand_chacha", "rand_distr", "rayon", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2042,7 +2042,7 @@ dependencies = [ "byteorder", "enum-as-inner", "libc", - "thiserror", + "thiserror 1.0.69", "walkdir", ] @@ -2070,7 +2070,7 @@ dependencies = [ "ndarray 0.15.6", "rand", "safetensors", - "thiserror", + "thiserror 1.0.69", "torch-sys", "zip", ] @@ -2081,7 +2081,16 @@ version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c006c85c7651b3cf2ada4584faa36773bd07bac24acfb39f3c431b36d7e667aa" +dependencies = [ + "thiserror-impl 2.0.3", ] [[package]] @@ -2095,6 +2104,17 @@ dependencies = [ "syn 2.0.87", ] +[[package]] +name = "thiserror-impl" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f077553d607adc1caf65430528a576c757a71ed73944b66ebb58ef2bbd243568" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "time" version = "0.3.36" diff --git a/Cargo.toml b/Cargo.toml index cd6b5ed..22bed6a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,8 +2,8 @@ name = "nutpie" version = "0.14.0" authors = [ - "Adrian Seyboldt ", - "PyMC Developers ", + "Adrian Seyboldt ", + "PyMC Developers ", ] edition = "2021" license = "MIT" @@ -25,7 +25,7 @@ crate-type = ["cdylib"] nuts-rs = "0.13.0" numpy = "0.22.0" rand = "0.8.5" -thiserror = "1.0.44" +thiserror = "2.0.3" rand_chacha = "0.3.1" rayon = "1.10.0" # Keep arrow in sync with nuts-rs requirements From ea15908b93a182fe8445559c005275601da4773a Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Thu, 14 Nov 2024 17:43:31 +0100 Subject: [PATCH 11/55] fix: Move mvscale import to be conditional --- python/nutpie/transform_adapter.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/nutpie/transform_adapter.py b/python/nutpie/transform_adapter.py index 136fbf8..f658ca6 100644 --- a/python/nutpie/transform_adapter.py +++ b/python/nutpie/transform_adapter.py @@ -18,7 +18,6 @@ def make_transform_adapter( import flowjax import flowjax.train import flowjax.flows - from flowjax.bijections import mvscale import optax import traceback from paramax import Parameterize, unwrap @@ -164,6 +163,8 @@ def make_layer(key, is_last=False): flow = flowjax.flows._add_default_permute(coupling, n_dim, key_permute) if scale_layer: + from flowjax.bijections import mvscale + bijections = list(flow.bijections) bijections.append(mvscale.MvScale4(jnp.ones(n_dim) * 1e-5)) # bijections.append(mvscale.MvScale3(jnp.ones(n_dim) * 1e-5)) From 7b4dd2e5d13c3dcb3afc9376bc85343385635fbb Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Thu, 14 Nov 2024 18:07:49 +0100 Subject: [PATCH 12/55] fix: Some rebase issues --- python/nutpie/compiled_pyfunc.py | 5 ++--- src/pyfunc.rs | 8 ++++---- src/pymc.rs | 5 ++--- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/python/nutpie/compiled_pyfunc.py b/python/nutpie/compiled_pyfunc.py index 7298534..d0f9732 100644 --- a/python/nutpie/compiled_pyfunc.py +++ b/python/nutpie/compiled_pyfunc.py @@ -82,9 +82,8 @@ def make_expand_func(seed1, seed2, chain): make_expand_func, self._variables, self.n_dim, - self._make_initial_points, - make_transform_adapter, - make_adapter, + init_point_func=self._make_initial_points, + transform_adapter=make_adapter, ) diff --git a/src/pyfunc.rs b/src/pyfunc.rs index 37a25d6..a6220a2 100644 --- a/src/pyfunc.rs +++ b/src/pyfunc.rs @@ -17,7 +17,7 @@ use pyo3::{ Bound, Py, PyAny, PyErr, Python, }; use rand::Rng; -use rand_distr::{Distribution, StandardNormal, Uniform}; +use rand_distr::{Distribution, Uniform}; use smallvec::SmallVec; use thiserror::Error; @@ -76,7 +76,7 @@ impl PyVariable { pub struct PyModel { make_logp_func: Arc>, make_expand_func: Arc>, - init_point_func: Arc>>, + init_point_func: Option>>, variables: Arc>, transform_adapter: Option, ndim: usize, @@ -85,7 +85,7 @@ pub struct PyModel { #[pymethods] impl PyModel { #[new] - #[pyo3(signature = (make_logp_func, make_expand_func, variables, ndim, transform_adapter=None))] + #[pyo3(signature = (make_logp_func, make_expand_func, variables, ndim, *, init_point_func=None, transform_adapter=None))] fn new<'py>( make_logp_func: Py, make_expand_func: Py, @@ -97,7 +97,7 @@ impl PyModel { Self { make_logp_func: Arc::new(make_logp_func), make_expand_func: Arc::new(make_expand_func), - init_point_func: Arc::new(init_point_func), + init_point_func: init_point_func.map(|x| x.into()), variables: Arc::new(variables), ndim, transform_adapter: transform_adapter.map(PyTransformAdapt::new), diff --git a/src/pymc.rs b/src/pymc.rs index 39dfc76..526e18b 100644 --- a/src/pymc.rs +++ b/src/pymc.rs @@ -13,7 +13,6 @@ use pyo3::{ types::{PyAnyMethods, PyList}, Bound, Py, PyAny, PyObject, PyResult, Python, }; -use rand::{distributions::Uniform, prelude::Distribution}; use thiserror::Error; @@ -232,7 +231,7 @@ pub(crate) struct PyMcModel { dim: usize, density: LogpFunc, expand: ExpandFunc, - init_func: Py, + init_func: Arc>, var_sizes: Vec, var_names: Vec, } @@ -252,7 +251,7 @@ impl PyMcModel { dim, density, expand, - init_func, + init_func: init_func.into(), var_names: var_names.extract()?, var_sizes: var_sizes.extract()?, }) From 6ec04e51a193b6025162843b2665d032d1fdd369 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Thu, 14 Nov 2024 18:13:34 +0100 Subject: [PATCH 13/55] style: Fix ruff issues --- python/nutpie/compile_pymc.py | 2 +- python/nutpie/compile_stan.py | 4 ++-- python/nutpie/transform_adapter.py | 17 +++++++++-------- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/python/nutpie/compile_pymc.py b/python/nutpie/compile_pymc.py index 58b6b0d..5510053 100644 --- a/python/nutpie/compile_pymc.py +++ b/python/nutpie/compile_pymc.py @@ -380,7 +380,7 @@ def _compile_pymc_model_jax( def logp_fn_jax_grad(x, *shared): return jax.value_and_grad(lambda x: orig_logp_fn(x, *shared)[0])(x) - static_argnums = list(range(1, len(logp_shared_names) + 1)) + # static_argnums = list(range(1, len(logp_shared_names) + 1)) logp_fn_jax_grad = jax.jit( logp_fn_jax_grad, # static_argnums=static_argnums, diff --git a/python/nutpie/compile_stan.py b/python/nutpie/compile_stan.py index 70ecd14..138652d 100644 --- a/python/nutpie/compile_stan.py +++ b/python/nutpie/compile_stan.py @@ -1,10 +1,10 @@ -from functools import partial import json import tempfile from dataclasses import dataclass, replace +from functools import partial from importlib.util import find_spec from pathlib import Path -from typing import Any, Optional, Callable +from typing import Any, Optional import numpy as np import pandas as pd diff --git a/python/nutpie/transform_adapter.py b/python/nutpie/transform_adapter.py index f658ca6..e0e601b 100644 --- a/python/nutpie/transform_adapter.py +++ b/python/nutpie/transform_adapter.py @@ -12,18 +12,18 @@ def make_transform_adapter( untransformed_dim=None, zero_init=True, ): - import jax + import traceback + from functools import partial + import equinox as eqx - import jax.numpy as jnp import flowjax - import flowjax.train import flowjax.flows + import flowjax.train + import jax + import jax.numpy as jnp + import numpy as np import optax - import traceback from paramax import Parameterize, unwrap - from functools import partial - - import numpy as np class FisherLoss: @eqx.filter_jit @@ -363,7 +363,7 @@ def update(self, seed, positions, gradients): else: base = self._bijection - # make_flow might still only return a single trafo if the for 1d problems + # make_flow might still only return a single trafo for 1d problems if len(base.bijections) == 1: self._bijection = base return @@ -436,6 +436,7 @@ def update(self, seed, positions, gradients): except Exception as e: print("update error:", e) print(traceback.format_exc()) + raise def init_from_transformed_position(self, transformed_position): try: From 2c29e11ab4749b893f1881b8911f40f6bba0d87a Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Thu, 14 Nov 2024 18:14:30 +0100 Subject: [PATCH 14/55] feat: Add pixi config for development --- .gitattributes | 2 + pixi.lock | 4013 ++++++++++++++++++++++++++++++++++++++++++++++++ pixi.toml | 24 + 3 files changed, 4039 insertions(+) create mode 100644 .gitattributes create mode 100644 pixi.lock create mode 100644 pixi.toml diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..8f61a8e --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# SCM syntax highlighting +pixi.lock linguist-language=YAML linguist-generated=true diff --git a/pixi.lock b/pixi.lock new file mode 100644 index 0000000..745d684 --- /dev/null +++ b/pixi.lock @@ -0,0 +1,4013 @@ +version: 5 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + indexes: + - https://pypi.org/simple + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/arviz-0.20.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.43-h4bf12b8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.43-h4852527_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/blas-2.125-openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.3-heb4867d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-hebfffa5_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cons-0.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py312h68727a3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/etuples-0.3.9-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.54.1-py312h178313f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-13.3.0-h9576a4e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-13.3.0-hfea6d02_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-13.3.0-hc28eda2_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.12-hb9ae30d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-12.0.0-hba01fac_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h6470451_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-13.3.0-h9576a4e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-13.3.0-hdbfa832_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-13.3.0-h6834431_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h5netcdf-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.12.1-nompi_py312hedeef09_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-9.0.0-hda332d3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jax-0.4.34-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/jaxlib-0.4.34-cpu_py312haec0345_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-he073ed8_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py312h68727a3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.10.1-hbbe4b11_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.22-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-13.3.0-h84ea5a7_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-hd3e95f3_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.65.5-hf5c653b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.1-default_hecaa2ac_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm14-14.0.6-hcd5def8_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.27.5-h5b01275_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.4-hc0ffecb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-13.3.0-heb74ff8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-13.3.0-h84ea5a7_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-he137b08_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.5-hb346dea_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-19.1.3-h024ca30_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.43.0-py312h374181b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/logical-unification-0.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py312hd3ec401_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/maturin-1.7.4-py312h6ab59e4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/minikanren-1.0.3-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-service-2.4.2-py312hf224ee7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ml_dtypes-0.5.0-py312hf9745cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/multipledispatch-0.6.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numba-0.60.0-py312h83e6fd3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.28-pthreads_h6ec200e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt-einsum-3.4.0-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py312hf9745cd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.54.0-h4c5309f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.0.0-py312h7b63e92_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pymc-5.18.0-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pymc-base-5.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytensor-2.25.5-py312h97902ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytensor-base-2.25.5-py312h25a0e75_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.7-hc5c86c4_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.20.3-pyhe28f650_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h77b4e00_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py312h62794b6_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h4a8ded7_18.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-h84d6215_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.1.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py312h66e93f0_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2024.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-einstats-0.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-he73a12e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2024.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + - pypi: https://files.pythonhosted.org/packages/a2/ad/e0d3c824784ff121c03cc031f944bc7e139a8f1870ffd2845cc2dd76f6c4/absl_py-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/02/c8/542c1f9513136b431b101d06fb547e94d3ebc1d33740c3024315b55d4ada/bridgestan-2.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/46/dd/c1ff2eb8fbf95a8ca804abb1cc3ce70b283ee7b4bc653c3abac245670400/chex-0.1.87-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e9/59/f189b03d743364a350c972b89fe08a6db5bbbdc5f1ea6b604b3eee0a7967/dllist-1.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/15/9f/3be7f03bf66c8d7d2956b727d984595e4af899f3c15ef2c653029008bf3b/equinox-0.11.8-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1f/e4/0826dfde2db3fb3a34954323a84d0e6b6fdbc7eb5278c84159c6d43290ac/etils-1.10.0-py3-none-any.whl + - pypi: git+https://github.com/aseyboldt/flowjax.git@1c282f2ded78e81c7ce6a96f61523a9f18bf8edc + - pypi: https://files.pythonhosted.org/packages/56/ae/220537f80eb82ae43a299de31edb2a91a28b8c5fb8046e9ff853ec7763cd/jaxtyping-0.2.34-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5c/24/28d0bb21600a78e46754947333ec9a297044af884d360092eb8561575fe9/optax-0.2.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/f8/7b1f5b84f84e43face7349ac2df23f0f75d36b5b4a1c1c0305edce82bcc8/paramax-0.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2b/78/57043611a16c655c8350b4c01b8d6abfb38cc2acb475238b62c2146186d7/tqdm-4.67.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/bb/d43e5c75054e53efce310e79d63df0ac3f25e34c926be5dffb7d283fb2a8/typeguard-2.13.3-py3-none-any.whl +packages: +- kind: conda + name: _libgcc_mutex + version: '0.1' + build: conda_forge + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + license: None + purls: [] + size: 2562 + timestamp: 1578324546067 +- kind: conda + name: _openmp_mutex + version: '4.5' + build: 2_kmp_llvm + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 + sha256: 84a66275da3a66e3f3e70e9d8f10496d807d01a9e4ec16cd2274cc5e28c478fc + md5: 562b26ba2e19059551a811e72ab7f793 + depends: + - _libgcc_mutex 0.1 conda_forge + - llvm-openmp >=9.0.1 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 5744 + timestamp: 1650742457817 +- kind: pypi + name: absl-py + version: 2.1.0 + url: https://files.pythonhosted.org/packages/a2/ad/e0d3c824784ff121c03cc031f944bc7e139a8f1870ffd2845cc2dd76f6c4/absl_py-2.1.0-py3-none-any.whl + sha256: 526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308 + requires_python: '>=3.7' +- kind: conda + name: arviz + version: 0.20.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/arviz-0.20.0-pyhd8ed1ab_0.conda + sha256: 2e86300d089555741c8f81a73e72aa90f90cda35b494329e1b940e2d31845936 + md5: 7e13efee221dc6ad25fcc2e4d65df7e3 + depends: + - h5netcdf >=1.0.2 + - matplotlib-base >=3.5 + - numpy >=1.23.0 + - packaging + - pandas >=1.5.0 + - python >=3.10 + - scipy >=1.9.0 + - setuptools >=60.0.0 + - typing_extensions >=4.1.0 + - xarray >=2022.6.0 + - xarray-einstats >=0.3 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/arviz?source=hash-mapping + size: 1473292 + timestamp: 1727611803479 +- kind: conda + name: atk-1.0 + version: 2.38.0 + build: h04ea711_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda + sha256: df682395d05050cd1222740a42a551281210726a67447e5258968dd55854302e + md5: f730d54ba9cd543666d7220c9f7ed563 + depends: + - libgcc-ng >=12 + - libglib >=2.80.0,<3.0a0 + - libstdcxx-ng >=12 + constrains: + - atk-1.0 2.38.0 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + size: 355900 + timestamp: 1713896169874 +- kind: conda + name: binutils_impl_linux-64 + version: '2.43' + build: h4bf12b8_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.43-h4bf12b8_2.conda + sha256: 267e78990247369b13234bda270f31beb56a600b4851a8244e31dd9ad85b3b17 + md5: cf0c5521ac2a20dfa6c662a4009eeef6 + depends: + - ld_impl_linux-64 2.43 h712a8e2_2 + - sysroot_linux-64 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 5682777 + timestamp: 1729655371045 +- kind: conda + name: binutils_linux-64 + version: '2.43' + build: h4852527_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.43-h4852527_2.conda + sha256: df52bd8b8b2a20a0c529d9ad08aaf66093ac318aa8a33d270f18274341a77062 + md5: 18aba879ddf1f8f28145ca6fcb873d8c + depends: + - binutils_impl_linux-64 2.43 h4bf12b8_2 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 34945 + timestamp: 1729655404893 +- kind: conda + name: blas + version: '2.125' + build: openblas + build_number: 25 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/blas-2.125-openblas.conda + sha256: 23498a320b65c514c132c2b01bdedc2e08ffc9dfd8c7fd46609ac16ff4bc8a90 + md5: 0c46b8a31a587738befc587dd8e52558 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - blas-devel 3.9.0 25_linux64_openblas + - libblas 3.9.0 25_linux64_openblas + - libcblas 3.9.0 25_linux64_openblas + - libgcc >=13 + - libgfortran + - libgfortran5 >=13.3.0 + - liblapack 3.9.0 25_linux64_openblas + - liblapacke 3.9.0 25_linux64_openblas + - llvm-openmp >=19.1.2 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 15793 + timestamp: 1729642984458 +- kind: conda + name: blas-devel + version: 3.9.0 + build: 25_linux64_openblas + build_number: 25 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-25_linux64_openblas.conda + sha256: 69483b31161b62716ee529f206f7614bcb45fd230fc9bf47f2fb1840ed406b6f + md5: 02c516384c77f5a7b4d03ed6c0412c57 + depends: + - libblas 3.9.0 25_linux64_openblas + - libcblas 3.9.0 25_linux64_openblas + - liblapack 3.9.0 25_linux64_openblas + - liblapacke 3.9.0 25_linux64_openblas + - openblas 0.3.28.* + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 15609 + timestamp: 1729642921261 +- kind: pypi + name: bridgestan + version: 2.5.0 + url: https://files.pythonhosted.org/packages/02/c8/542c1f9513136b431b101d06fb547e94d3ebc1d33740c3024315b55d4ada/bridgestan-2.5.0-py3-none-any.whl + sha256: f417836f35258688759ad46351621d8bb03440d84965f778c82ee702be93f300 + requires_dist: + - numpy + - dllist + - pandas ; extra == 'test' + - pytest ; extra == 'test' + - pytest-cov ; extra == 'test' + requires_python: '>=3.9' +- kind: conda + name: brotli + version: 1.1.0 + build: hb9d3cd8_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda + sha256: fcb0b5b28ba7492093e54f3184435144e074dfceab27ac8e6a9457e736565b0b + md5: 98514fe74548d768907ce7a13f680e8f + depends: + - __glibc >=2.17,<3.0.a0 + - brotli-bin 1.1.0 hb9d3cd8_2 + - libbrotlidec 1.1.0 hb9d3cd8_2 + - libbrotlienc 1.1.0 hb9d3cd8_2 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 19264 + timestamp: 1725267697072 +- kind: conda + name: brotli-bin + version: 1.1.0 + build: hb9d3cd8_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda + sha256: 261364d7445513b9a4debc345650fad13c627029bfc800655a266bf1e375bc65 + md5: c63b5e52939e795ba8d26e35d767a843 + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlidec 1.1.0 hb9d3cd8_2 + - libbrotlienc 1.1.0 hb9d3cd8_2 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 18881 + timestamp: 1725267688731 +- kind: conda + name: bzip2 + version: 1.0.8 + build: h4bc722e_7 + build_number: 7 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 252783 + timestamp: 1720974456583 +- kind: conda + name: c-ares + version: 1.34.3 + build: heb4867d_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.3-heb4867d_0.conda + sha256: 1015d731c05ef7de298834833d680b08dea58980b907f644345bd457f9498c99 + md5: 09a6c610d002e54e18353c06ef61a253 + depends: + - __glibc >=2.28,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 205575 + timestamp: 1731181837907 +- kind: conda + name: ca-certificates + version: 2024.8.30 + build: hbcca054_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda + sha256: afee721baa6d988e27fef1832f68d6f32ac8cc99cdf6015732224c2841a09cea + md5: c27d1c142233b5bc9ca570c6e2e0c244 + license: ISC + purls: [] + size: 159003 + timestamp: 1725018903918 +- kind: conda + name: cached-property + version: 1.5.2 + build: hd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 + sha256: 561e6660f26c35d137ee150187d89767c988413c978e1b712d53f27ddf70ea17 + md5: 9b347a7ec10940d3f7941ff6c460b551 + depends: + - cached_property >=1.5.2,<1.5.3.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 4134 + timestamp: 1615209571450 +- kind: conda + name: cached_property + version: 1.5.2 + build: pyha770c72_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 + sha256: 6dbf7a5070cc43d90a1e4c2ec0c541c69d8e30a0e25f50ce9f6e4a432e42c5d7 + md5: 576d629e47797577ab0f1b351297ef4a + depends: + - python >=3.6 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/cached-property?source=hash-mapping + size: 11065 + timestamp: 1615209567874 +- kind: conda + name: cachetools + version: 5.5.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.0-pyhd8ed1ab_0.conda + sha256: 0abdbbfc2e9c21079a943f42a2dcd950b1a8093ec474fc017e83da0ec4e6cbf4 + md5: 5bad039db72bd8f134a5cff3ebaa190d + depends: + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cachetools?source=hash-mapping + size: 14727 + timestamp: 1724028288793 +- kind: conda + name: cairo + version: 1.18.0 + build: hebfffa5_3 + build_number: 3 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-hebfffa5_3.conda + sha256: aee5b9e6ef71cdfb2aee9beae3ea91910ca761c01c0ef32052e3f94a252fa173 + md5: fceaedf1cdbcb02df9699a0d9b005292 + depends: + - __glibc >=2.17,<3.0.a0 + - fontconfig >=2.14.2,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - icu >=75.1,<76.0a0 + - libgcc-ng >=12 + - libglib >=2.80.3,<3.0a0 + - libpng >=1.6.43,<1.7.0a0 + - libstdcxx-ng >=12 + - libxcb >=1.16,<2.0.0a0 + - libzlib >=1.3.1,<2.0a0 + - pixman >=0.43.2,<1.0a0 + - xorg-libice >=1.1.1,<2.0a0 + - xorg-libsm >=1.2.4,<2.0a0 + - xorg-libx11 >=1.8.9,<2.0a0 + - xorg-libxext >=1.3.4,<2.0a0 + - xorg-libxrender >=0.9.11,<0.10.0a0 + - zlib + license: LGPL-2.1-only or MPL-1.1 + purls: [] + size: 983604 + timestamp: 1721138900054 +- kind: conda + name: certifi + version: 2024.8.30 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda + sha256: 7020770df338c45ac6b560185956c32f0a5abf4b76179c037f115fc7d687819f + md5: 12f7d00853807b0531775e9be891cb11 + depends: + - python >=3.7 + license: ISC + purls: + - pkg:pypi/certifi?source=hash-mapping + size: 163752 + timestamp: 1725278204397 +- kind: pypi + name: chex + version: 0.1.87 + url: https://files.pythonhosted.org/packages/46/dd/c1ff2eb8fbf95a8ca804abb1cc3ce70b283ee7b4bc653c3abac245670400/chex-0.1.87-py3-none-any.whl + sha256: ce536475661fd96d21be0c1728ecdbedd03f8ff950c662dfc338c92ea782cb16 + requires_dist: + - absl-py>=0.9.0 + - typing-extensions>=4.2.0 + - jax>=0.4.27 + - jaxlib>=0.4.27 + - numpy>=1.24.1 + - toolz>=0.9.0 + - setuptools ; python_full_version >= '3.12' + requires_python: '>=3.9' +- kind: conda + name: cloudpickle + version: 3.1.0 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.0-pyhd8ed1ab_1.conda + sha256: 5a33d0d3ef33121c546eaf78b3dac2141fc4d30bbaeb3959bbc66fcd5e99ced6 + md5: c88ca2bb7099167912e3b26463fff079 + depends: + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/cloudpickle?source=hash-mapping + size: 25952 + timestamp: 1729059365471 +- kind: conda + name: colorama + version: 0.4.6 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + sha256: 2c1b2e9755ce3102bca8d69e8f26e4f087ece73f50418186aee7c74bef8e1698 + md5: 3faab06a954c2a04039983f2c4a50d99 + depends: + - python >=3.7 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/colorama?source=hash-mapping + size: 25170 + timestamp: 1666700778190 +- kind: conda + name: cons + version: 0.4.6 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/cons-0.4.6-pyhd8ed1ab_0.conda + sha256: d814c65f7f9c9f48658a4499b93fcb99a6f468768751912e79b7af8283c841c9 + md5: 38c162ffeb9a31493d0ef33c09a5ba9f + depends: + - logical-unification >=0.4.1 + - python >=3.6 + license: LGPL-3.0-only + license_family: LGPL + purls: + - pkg:pypi/cons?source=hash-mapping + size: 14401 + timestamp: 1687647866301 +- kind: conda + name: contourpy + version: 1.3.1 + build: py312h68727a3_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py312h68727a3_0.conda + sha256: e977af50b844b5b8cfec358131a4e923f0aa718e8334321cf8d84f5093576259 + md5: f5fbba0394ee45e9a64a73c2a994126a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.23 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/contourpy?source=hash-mapping + size: 276332 + timestamp: 1731428454756 +- kind: conda + name: cycler + version: 0.12.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda + sha256: f221233f21b1d06971792d491445fd548224641af9443739b4b7b6d5d72954a8 + md5: 5cd86562580f274031ede6aa6aa24441 + depends: + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/cycler?source=hash-mapping + size: 13458 + timestamp: 1696677888423 +- kind: pypi + name: dllist + version: 1.2.0 + url: https://files.pythonhosted.org/packages/e9/59/f189b03d743364a350c972b89fe08a6db5bbbdc5f1ea6b604b3eee0a7967/dllist-1.2.0-py3-none-any.whl + sha256: f2ca5fd60d12161b6a472bc340bbae5de53ddd40c5923d9df84e85170b9a8629 + requires_dist: + - pytest ; extra == 'test' + - pytest-cov ; extra == 'test' + requires_python: '>=3.8' +- kind: pypi + name: equinox + version: 0.11.8 + url: https://files.pythonhosted.org/packages/15/9f/3be7f03bf66c8d7d2956b727d984595e4af899f3c15ef2c653029008bf3b/equinox-0.11.8-py3-none-any.whl + sha256: 552292b473956693e8e8973bdae9b58aaec54fd48e192921beb82995e3a9c995 + requires_dist: + - jax>=0.4.13,!=0.4.27 + - jaxtyping>=0.2.20 + - typing-extensions>=4.5.0 + requires_python: '>=3.9' +- kind: pypi + name: etils + version: 1.10.0 + url: https://files.pythonhosted.org/packages/1f/e4/0826dfde2db3fb3a34954323a84d0e6b6fdbc7eb5278c84159c6d43290ac/etils-1.10.0-py3-none-any.whl + sha256: 0777fe60a234b4c65ca53470fc64f2dd2d0c6bca7fcc623fdaa8d7fa5a317098 + requires_dist: + - etils[array-types] ; extra == 'all' + - etils[eapp] ; extra == 'all' + - etils[ecolab] ; extra == 'all' + - etils[edc] ; extra == 'all' + - etils[enp] ; extra == 'all' + - etils[epath] ; extra == 'all' + - etils[epath-gcs] ; extra == 'all' + - etils[epath-s3] ; extra == 'all' + - etils[epy] ; extra == 'all' + - etils[etqdm] ; extra == 'all' + - etils[etree] ; extra == 'all' + - etils[etree-dm] ; extra == 'all' + - etils[etree-jax] ; extra == 'all' + - etils[etree-tf] ; extra == 'all' + - etils[enp] ; extra == 'array-types' + - pytest ; extra == 'dev' + - pytest-subtests ; extra == 'dev' + - pytest-xdist ; extra == 'dev' + - pyink ; extra == 'dev' + - pylint>=2.6.0 ; extra == 'dev' + - chex ; extra == 'dev' + - fiddle ; extra == 'dev' + - torch ; extra == 'dev' + - optree ; extra == 'dev' + - tensorflow-datasets ; extra == 'dev' + - pydantic ; extra == 'dev' + - sphinx-apitree[ext] ; extra == 'docs' + - etils[dev,all] ; extra == 'docs' + - absl-py ; extra == 'eapp' + - simple-parsing ; extra == 'eapp' + - etils[epy] ; extra == 'eapp' + - jupyter ; extra == 'ecolab' + - numpy ; extra == 'ecolab' + - mediapy ; extra == 'ecolab' + - packaging ; extra == 'ecolab' + - protobuf ; extra == 'ecolab' + - etils[enp] ; extra == 'ecolab' + - etils[epy] ; extra == 'ecolab' + - etils[etree] ; extra == 'ecolab' + - etils[epy] ; extra == 'edc' + - numpy ; extra == 'enp' + - etils[epy] ; extra == 'enp' + - fsspec ; extra == 'epath' + - importlib-resources ; extra == 'epath' + - typing-extensions ; extra == 'epath' + - zipp ; extra == 'epath' + - etils[epy] ; extra == 'epath' + - gcsfs ; extra == 'epath-gcs' + - etils[epath] ; extra == 'epath-gcs' + - s3fs ; extra == 'epath-s3' + - etils[epath] ; extra == 'epath-s3' + - typing-extensions ; extra == 'epy' + - absl-py ; extra == 'etqdm' + - tqdm ; extra == 'etqdm' + - etils[epy] ; extra == 'etqdm' + - etils[array-types] ; extra == 'etree' + - etils[epy] ; extra == 'etree' + - etils[enp] ; extra == 'etree' + - etils[etqdm] ; extra == 'etree' + - dm-tree ; extra == 'etree-dm' + - etils[etree] ; extra == 'etree-dm' + - jax[cpu] ; extra == 'etree-jax' + - etils[etree] ; extra == 'etree-jax' + - tensorflow ; extra == 'etree-tf' + - etils[etree] ; extra == 'etree-tf' + - etils[ecolab] ; extra == 'lazy-imports' + requires_python: '>=3.10' +- kind: conda + name: etuples + version: 0.3.9 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/etuples-0.3.9-pyhd8ed1ab_0.conda + sha256: 7e0742833d2348f4b0607575c98b9d05e3fa323d265bb57f787d410e6970111d + md5: bc1fc711e8ec404bd6109ab4eb0e4a67 + depends: + - cons + - multipledispatch + - python >=3.6 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/etuples?source=hash-mapping + size: 17451 + timestamp: 1684304361743 +- kind: conda + name: exceptiongroup + version: 1.2.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda + sha256: e0edd30c4b7144406bb4da975e6bb97d6bc9c0e999aa4efe66ae108cada5d5b5 + md5: d02ae936e42063ca46af6cdad2dbd1e0 + depends: + - python >=3.7 + license: MIT and PSF-2.0 + purls: + - pkg:pypi/exceptiongroup?source=hash-mapping + size: 20418 + timestamp: 1720869435725 +- kind: conda + name: filelock + version: 3.16.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda + sha256: 1da766da9dba05091af87977922fe60dc7464091a9ccffb3765d403189d39be4 + md5: 916f8ec5dd4128cd5f207a3c4c07b2c6 + depends: + - python >=3.7 + license: Unlicense + purls: + - pkg:pypi/filelock?source=hash-mapping + size: 17357 + timestamp: 1726613593584 +- kind: pypi + name: flowjax + version: 16.0.0 + url: git+https://github.com/aseyboldt/flowjax.git@1c282f2ded78e81c7ce6a96f61523a9f18bf8edc + requires_dist: + - jax>=0.4.16 + - equinox>=0.10 + - jaxtyping + - tqdm + - optax + - paramax + - pytest ; extra == 'dev' + - beartype ; extra == 'dev' + - ruff ; extra == 'dev' + - sphinx ; extra == 'dev' + - sphinx-book-theme ; extra == 'dev' + - sphinx-copybutton ; extra == 'dev' + - sphinx-autodoc-typehints ; extra == 'dev' + - nbsphinx ; extra == 'dev' + - ipython ; extra == 'dev' + - numpyro ; extra == 'dev' + requires_python: '>=3.10' +- kind: conda + name: font-ttf-dejavu-sans-mono + version: '2.37' + build: hab24e00_0 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b + md5: 0c96522c6bdaed4b1566d11387caaf45 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 397370 + timestamp: 1566932522327 +- kind: conda + name: font-ttf-inconsolata + version: '3.000' + build: h77eed37_0 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c + md5: 34893075a5c9e55cdafac56607368fc6 + license: OFL-1.1 + license_family: Other + purls: [] + size: 96530 + timestamp: 1620479909603 +- kind: conda + name: font-ttf-source-code-pro + version: '2.038' + build: h77eed37_0 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 + md5: 4d59c254e01d9cde7957100457e2d5fb + license: OFL-1.1 + license_family: Other + purls: [] + size: 700814 + timestamp: 1620479612257 +- kind: conda + name: font-ttf-ubuntu + version: '0.83' + build: h77eed37_3 + build_number: 3 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 + md5: 49023d73832ef61042f6a237cb2687e7 + license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 + license_family: Other + purls: [] + size: 1620504 + timestamp: 1727511233259 +- kind: conda + name: fontconfig + version: 2.15.0 + build: h7e30c49_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda + sha256: 7093aa19d6df5ccb6ca50329ef8510c6acb6b0d8001191909397368b65b02113 + md5: 8f5b0b297b59e1ac160ad4beec99dbee + depends: + - __glibc >=2.17,<3.0.a0 + - freetype >=2.12.1,<3.0a0 + - libexpat >=2.6.3,<3.0a0 + - libgcc >=13 + - libuuid >=2.38.1,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 265599 + timestamp: 1730283881107 +- kind: conda + name: fonts-conda-ecosystem + version: '1' + build: '0' + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 + md5: fee5683a3f04bd15cbd8318b096a27ab + depends: + - fonts-conda-forge + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 3667 + timestamp: 1566974674465 +- kind: conda + name: fonts-conda-forge + version: '1' + build: '0' + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 + sha256: 53f23a3319466053818540bcdf2091f253cbdbab1e0e9ae7b9e509dcaa2a5e38 + md5: f766549260d6815b0c52253f1fb1bb29 + depends: + - font-ttf-dejavu-sans-mono + - font-ttf-inconsolata + - font-ttf-source-code-pro + - font-ttf-ubuntu + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 4102 + timestamp: 1566932280397 +- kind: conda + name: fonttools + version: 4.54.1 + build: py312h178313f_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.54.1-py312h178313f_1.conda + sha256: 45f405d6d1ef528226c20b681373db0bdb79cc70fec1e495003247b0d3d00140 + md5: bbbf5fa5cab622c33907bc8d7eeea9f7 + depends: + - __glibc >=2.17,<3.0.a0 + - brotli + - libgcc >=13 + - munkres + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - unicodedata2 >=15.1.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/fonttools?source=hash-mapping + size: 2827447 + timestamp: 1729530553018 +- kind: conda + name: freetype + version: 2.12.1 + build: h267a509_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda + sha256: b2e3c449ec9d907dd4656cb0dc93e140f447175b125a3824b31368b06c666bb6 + md5: 9ae35c3d96db2c94ce0cef86efdfa2cb + depends: + - libgcc-ng >=12 + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 + license: GPL-2.0-only OR FTL + purls: [] + size: 634972 + timestamp: 1694615932610 +- kind: conda + name: fribidi + version: 1.0.10 + build: h36c2ea0_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2 + sha256: 5d7b6c0ee7743ba41399e9e05a58ccc1cfc903942e49ff6f677f6e423ea7a627 + md5: ac7bc6a654f8f41b352b38f4051135f8 + depends: + - libgcc-ng >=7.5.0 + license: LGPL-2.1 + purls: [] + size: 114383 + timestamp: 1604416621168 +- kind: conda + name: gcc + version: 13.3.0 + build: h9576a4e_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/gcc-13.3.0-h9576a4e_1.conda + sha256: d0161362430183cbdbc3db9cf95f9a1af1793027f3ab8755b3d3586deb28bf84 + md5: 606924335b5bcdf90e9aed9a2f5d22ed + depends: + - gcc_impl_linux-64 13.3.0.* + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 53864 + timestamp: 1724801360210 +- kind: conda + name: gcc_impl_linux-64 + version: 13.3.0 + build: hfea6d02_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-13.3.0-hfea6d02_1.conda + sha256: 998ade1d487e93fc8a7a16b90e2af69ebb227355bf4646488661f7ae5887873c + md5: 0d043dbc126b64f79d915a0e96d3a1d5 + depends: + - binutils_impl_linux-64 >=2.40 + - libgcc >=13.3.0 + - libgcc-devel_linux-64 13.3.0 h84ea5a7_101 + - libgomp >=13.3.0 + - libsanitizer 13.3.0 heb74ff8_1 + - libstdcxx >=13.3.0 + - sysroot_linux-64 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 67464415 + timestamp: 1724801227937 +- kind: conda + name: gcc_linux-64 + version: 13.3.0 + build: hc28eda2_5 + build_number: 5 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-13.3.0-hc28eda2_5.conda + sha256: 6778f93159cfd967320f60473447b19e320f303378d4c9da0784caa40073fafa + md5: ffbadbbc3345d9a315ba31c8a9188d4c + depends: + - binutils_linux-64 + - gcc_impl_linux-64 13.3.0.* + - sysroot_linux-64 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 31909 + timestamp: 1729281963691 +- kind: conda + name: gdk-pixbuf + version: 2.42.12 + build: hb9ae30d_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.12-hb9ae30d_0.conda + sha256: d5283b95a8d49dcd88d29b360d8b38694aaa905d968d156d72ab71d32b38facb + md5: 201db6c2d9a3c5e46573ac4cb2e92f4f + depends: + - libgcc-ng >=12 + - libglib >=2.80.2,<3.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.43,<1.7.0a0 + - libtiff >=4.6.0,<4.8.0a0 + license: LGPL-2.1-or-later + license_family: LGPL + purls: [] + size: 528149 + timestamp: 1715782983957 +- kind: conda + name: graphite2 + version: 1.3.13 + build: h59595ed_1003 + build_number: 1003 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda + sha256: 0595b009f20f8f60f13a6398e7cdcbd2acea5f986633adcf85f5a2283c992add + md5: f87c7b7c2cb45f323ffbce941c78ab7c + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + size: 96855 + timestamp: 1711634169756 +- kind: conda + name: graphviz + version: 12.0.0 + build: hba01fac_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/graphviz-12.0.0-hba01fac_0.conda + sha256: 2eb794ae1de42b688f89811113ae3dcb63698272ee8f87029abce5f77c742c2a + md5: 953e31ea00d46beb7e64a79fc291ec44 + depends: + - __glibc >=2.17,<3.0.a0 + - cairo >=1.18.0,<2.0a0 + - fonts-conda-ecosystem + - gdk-pixbuf >=2.42.12,<3.0a0 + - gtk2 + - gts >=0.7.6,<0.8.0a0 + - libexpat >=2.6.2,<3.0a0 + - libgcc-ng >=12 + - libgd >=2.3.3,<2.4.0a0 + - libglib >=2.80.3,<3.0a0 + - librsvg >=2.58.2,<3.0a0 + - libstdcxx-ng >=12 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pango >=1.50.14,<2.0a0 + license: EPL-1.0 + license_family: Other + purls: [] + size: 2303111 + timestamp: 1722673717117 +- kind: conda + name: gtk2 + version: 2.24.33 + build: h6470451_5 + build_number: 5 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h6470451_5.conda + sha256: 16644d036321b32635369c183502974c8b989fa516c313bd379f9aa4adcdf642 + md5: 1483ba046164be27df7f6eddbcec3a12 + depends: + - __glibc >=2.17,<3.0.a0 + - atk-1.0 >=2.38.0 + - cairo >=1.18.0,<2.0a0 + - fontconfig >=2.14.2,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - gdk-pixbuf >=2.42.12,<3.0a0 + - harfbuzz >=9.0.0,<10.0a0 + - libgcc-ng >=12 + - libglib >=2.80.3,<3.0a0 + - pango >=1.54.0,<2.0a0 + - xorg-libx11 >=1.8.9,<2.0a0 + - xorg-libxext >=1.3.4,<2.0a0 + - xorg-libxrender >=0.9.11,<0.10.0a0 + license: LGPL-2.1-or-later + purls: [] + size: 6501561 + timestamp: 1721285940408 +- kind: conda + name: gts + version: 0.7.6 + build: h977cf35_4 + build_number: 4 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda + sha256: b5cd16262fefb836f69dc26d879b6508d29f8a5c5948a966c47fe99e2e19c99b + md5: 4d8df0b0db060d33c9a702ada998a8fe + depends: + - libgcc-ng >=12 + - libglib >=2.76.3,<3.0a0 + - libstdcxx-ng >=12 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + size: 318312 + timestamp: 1686545244763 +- kind: conda + name: gxx + version: 13.3.0 + build: h9576a4e_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/gxx-13.3.0-h9576a4e_1.conda + sha256: 5446f5d1d609d996579f706d2020e83ef48e086d943bfeef7ab807ea246888a0 + md5: 209182ca6b20aeff62f442e843961d81 + depends: + - gcc 13.3.0.* + - gxx_impl_linux-64 13.3.0.* + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 53338 + timestamp: 1724801498389 +- kind: conda + name: gxx_impl_linux-64 + version: 13.3.0 + build: hdbfa832_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-13.3.0-hdbfa832_1.conda + sha256: 746dff24bb1efc89ab0ec108838d0711683054e3bbbcb94d042943410a98eca1 + md5: 806367e23a0a6ad21e51875b34c57d7e + depends: + - gcc_impl_linux-64 13.3.0 hfea6d02_1 + - libstdcxx-devel_linux-64 13.3.0 h84ea5a7_101 + - sysroot_linux-64 + - tzdata + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 13337720 + timestamp: 1724801455825 +- kind: conda + name: gxx_linux-64 + version: 13.3.0 + build: h6834431_5 + build_number: 5 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-13.3.0-h6834431_5.conda + sha256: 4ca452f7abc607d9f0ad45a7fa8c7d8436fca05b9cc6715d1ccd239bed90833b + md5: 81ddb2db98fbe3031aa7ebbbf8bb3ffd + depends: + - binutils_linux-64 + - gcc_linux-64 13.3.0 hc28eda2_5 + - gxx_impl_linux-64 13.3.0.* + - sysroot_linux-64 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 30284 + timestamp: 1729281975715 +- kind: conda + name: h5netcdf + version: 1.4.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/h5netcdf-1.4.1-pyhd8ed1ab_0.conda + sha256: e8a3ff94dd511e7f5098f09f75b44487a40241946640a29e14025e8094f0ca6e + md5: 5d0c9dc3425aadc346a969de5f2acc89 + depends: + - h5py + - packaging + - python >=3.9 + license: BSD-3-Clause + purls: + - pkg:pypi/h5netcdf?source=hash-mapping + size: 47177 + timestamp: 1731517710280 +- kind: conda + name: h5py + version: 3.12.1 + build: nompi_py312hedeef09_102 + build_number: 102 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.12.1-nompi_py312hedeef09_102.conda + sha256: 5acc7c221e792c7aa9bbb2c57d5e0104d7a6e81c2cd29a47a77d574552cd4fd0 + md5: ee52559d324594141ce369c527d6d029 + depends: + - __glibc >=2.17,<3.0.a0 + - cached-property + - hdf5 >=1.14.3,<1.14.4.0a0 + - libgcc >=13 + - numpy >=1.19,<3 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/h5py?source=hash-mapping + size: 1380838 + timestamp: 1729617970564 +- kind: conda + name: harfbuzz + version: 9.0.0 + build: hda332d3_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-9.0.0-hda332d3_1.conda + sha256: 973afa37840b4e55e2540018902255cfb0d953aaed6353bb83a4d120f5256767 + md5: 76b32dcf243444aea9c6b804bcfa40b8 + depends: + - __glibc >=2.17,<3.0.a0 + - cairo >=1.18.0,<2.0a0 + - freetype >=2.12.1,<3.0a0 + - graphite2 + - icu >=75.1,<76.0a0 + - libgcc-ng >=12 + - libglib >=2.80.3,<3.0a0 + - libstdcxx-ng >=12 + license: MIT + license_family: MIT + purls: [] + size: 1603653 + timestamp: 1721186240105 +- kind: conda + name: hdf5 + version: 1.14.3 + build: nompi_hdf9ad27_105 + build_number: 105 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda + sha256: 2278fa07da6f96e807d402cd55480624d67d2dee202191aaaf278ce5ab23605a + md5: 7e1729554e209627636a0f6fabcdd115 + depends: + - libaec >=1.1.3,<2.0a0 + - libcurl >=8.8.0,<9.0a0 + - libgcc-ng >=12 + - libgfortran-ng + - libgfortran5 >=12.3.0 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0a0 + - openssl >=3.3.1,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 3911675 + timestamp: 1717587866574 +- kind: conda + name: icu + version: '75.1' + build: he02047a_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e + md5: 8b189310083baabfb622af68fd9d3ae3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: MIT + license_family: MIT + purls: [] + size: 12129203 + timestamp: 1720853576813 +- kind: conda + name: importlib-metadata + version: 8.5.0 + build: pyha770c72_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda + sha256: 7194700ce1a5ad2621fd68e894dd8c1ceaff9a38723e6e0e5298fdef13017b1c + md5: 54198435fce4d64d8a89af22573012a8 + depends: + - python >=3.8 + - zipp >=0.5 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/importlib-metadata?source=hash-mapping + size: 28646 + timestamp: 1726082927916 +- kind: conda + name: iniconfig + version: 2.0.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda + sha256: 38740c939b668b36a50ef455b077e8015b8c9cf89860d421b3fff86048f49666 + md5: f800d2da156d08e289b14e87e43c1ae5 + depends: + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/iniconfig?source=hash-mapping + size: 11101 + timestamp: 1673103208955 +- kind: conda + name: jax + version: 0.4.34 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jax-0.4.34-pyhd8ed1ab_0.conda + sha256: da3880afc35042b92e0ad214beee372e41162da374dfaa8b1164db1dcee671b2 + md5: f0d3c57355acf3f06d93672e57c0c1e8 + depends: + - importlib-metadata >=4.6 + - jaxlib >=0.4.34,<=0.4.34 + - ml_dtypes >=0.2.0 + - numpy >=1.26 + - opt-einsum + - python >=3.10 + - scipy >=1.11.1 + constrains: + - cudnn >=9.2.1.18 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/jax?source=hash-mapping + size: 1421248 + timestamp: 1729336456855 +- kind: conda + name: jaxlib + version: 0.4.34 + build: cpu_py312haec0345_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/jaxlib-0.4.34-cpu_py312haec0345_0.conda + sha256: 8e2dce1d39ccb4e6883444f71b7155168c0612d9d086b58616578448aeb33afe + md5: 08f587f0f6505671c7715163e18b6f3a + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libgrpc >=1.65.5,<1.66.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - ml_dtypes >=0.2.0 + - numpy >=1.19,<3 + - openssl >=3.3.2,<4.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - scipy >=1.9 + constrains: + - jax >=0.4.34 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/jaxlib?source=hash-mapping + size: 57258872 + timestamp: 1729096396952 +- kind: pypi + name: jaxtyping + version: 0.2.34 + url: https://files.pythonhosted.org/packages/56/ae/220537f80eb82ae43a299de31edb2a91a28b8c5fb8046e9ff853ec7763cd/jaxtyping-0.2.34-py3-none-any.whl + sha256: 2f81fb6d1586e497a6ea2d28c06dcab37b108a096cbb36ea3fe4fa2e1c1f32e5 + requires_dist: + - typeguard==2.13.3 + requires_python: ~=3.9 +- kind: conda + name: kernel-headers_linux-64 + version: 3.10.0 + build: he073ed8_18 + build_number: 18 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-he073ed8_18.conda + sha256: a922841ad80bd7b222502e65c07ecb67e4176c4fa5b03678a005f39fcc98be4b + md5: ad8527bf134a90e1c9ed35fa0b64318c + constrains: + - sysroot_linux-64 ==2.17 + license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later AND MPL-2.0 + license_family: GPL + purls: [] + size: 943486 + timestamp: 1729794504440 +- kind: conda + name: keyutils + version: 1.6.1 + build: h166bdaf_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb + md5: 30186d27e2c9fa62b45fb1476b7200e3 + depends: + - libgcc-ng >=10.3.0 + license: LGPL-2.1-or-later + purls: [] + size: 117831 + timestamp: 1646151697040 +- kind: conda + name: kiwisolver + version: 1.4.7 + build: py312h68727a3_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py312h68727a3_0.conda + sha256: d752c53071ee5d712baa9742dd1629e60388c5ce4ab11d4e73a1690443e41769 + md5: 444266743652a4f1538145e9362f6d3b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/kiwisolver?source=hash-mapping + size: 70922 + timestamp: 1725459412788 +- kind: conda + name: krb5 + version: 1.21.3 + build: h659f571_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 1370023 + timestamp: 1719463201255 +- kind: conda + name: lcms2 + version: '2.16' + build: hb7c19ff_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda + sha256: 5c878d104b461b7ef922abe6320711c0d01772f4cd55de18b674f88547870041 + md5: 51bb7010fc86f70eee639b4bb7a894f5 + depends: + - libgcc-ng >=12 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.6.0,<4.8.0a0 + license: MIT + license_family: MIT + purls: [] + size: 245247 + timestamp: 1701647787198 +- kind: conda + name: ld_impl_linux-64 + version: '2.43' + build: h712a8e2_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda + sha256: 7c91cea91b13f4314d125d1bedb9d03a29ebbd5080ccdea70260363424646dbe + md5: 048b02e3962f066da18efe3a21b77672 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.43 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 669211 + timestamp: 1729655358674 +- kind: conda + name: lerc + version: 4.0.0 + build: h27087fc_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 + sha256: cb55f36dcd898203927133280ae1dc643368af041a48bcf7c026acb7c47b0c12 + md5: 76bbff344f0134279f225174e9064c8f + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 281798 + timestamp: 1657977462600 +- kind: conda + name: libabseil + version: '20240722.0' + build: cxx17_h5888daf_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_h5888daf_1.conda + sha256: 8f91429091183c26950f1e7ffa730e8632f0627ba35d2fccd71df31628c9b4e5 + md5: e1f604644fe8d78e22660e2fec6756bc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1310521 + timestamp: 1727295454064 +- kind: conda + name: libaec + version: 1.1.3 + build: h59595ed_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda + sha256: 2ef420a655528bca9d269086cf33b7e90d2f54ad941b437fb1ed5eca87cee017 + md5: 5e97e271911b8b2001a8b71860c32faa + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 35446 + timestamp: 1711021212685 +- kind: conda + name: libblas + version: 3.9.0 + build: 25_linux64_openblas + build_number: 25 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-25_linux64_openblas.conda + sha256: d6d12dc437d060f838820e9e61bf73baab651f91935ac594cf10beb9ef1b4450 + md5: 8ea26d42ca88ec5258802715fe1ee10b + depends: + - libopenblas >=0.3.28,<0.3.29.0a0 + - libopenblas >=0.3.28,<1.0a0 + constrains: + - liblapack 3.9.0 25_linux64_openblas + - libcblas 3.9.0 25_linux64_openblas + - blas * openblas + - liblapacke 3.9.0 25_linux64_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 15677 + timestamp: 1729642900350 +- kind: conda + name: libbrotlicommon + version: 1.1.0 + build: hb9d3cd8_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda + sha256: d9db2de60ea917298e658143354a530e9ca5f9c63471c65cf47ab39fd2f429e3 + md5: 41b599ed2b02abcfdd84302bff174b23 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 68851 + timestamp: 1725267660471 +- kind: conda + name: libbrotlidec + version: 1.1.0 + build: hb9d3cd8_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda + sha256: 2892d512cad096cb03f1b66361deeab58b64e15ba525d6592bb6d609e7045edf + md5: 9566f0bd264fbd463002e759b8a82401 + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.1.0 hb9d3cd8_2 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 32696 + timestamp: 1725267669305 +- kind: conda + name: libbrotlienc + version: 1.1.0 + build: hb9d3cd8_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda + sha256: 779f58174e99de3600e939fa46eddb453ec5d3c60bb46cdaa8b4c127224dbf29 + md5: 06f70867945ea6a84d35836af780f1de + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.1.0 hb9d3cd8_2 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 281750 + timestamp: 1725267679782 +- kind: conda + name: libcblas + version: 3.9.0 + build: 25_linux64_openblas + build_number: 25 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-25_linux64_openblas.conda + sha256: ab87b0477078837c91d9cda62a9faca18fba7c57cc77aa779ae24b3ac783b5dd + md5: 5dbd1b0fc0d01ec5e0e1fbe667281a11 + depends: + - libblas 3.9.0 25_linux64_openblas + constrains: + - liblapack 3.9.0 25_linux64_openblas + - blas * openblas + - liblapacke 3.9.0 25_linux64_openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 15613 + timestamp: 1729642905619 +- kind: conda + name: libcurl + version: 8.10.1 + build: hbbe4b11_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.10.1-hbbe4b11_0.conda + sha256: 54e6114dfce566c3a22ad3b7b309657e3600cdb668398e95f1301360d5d52c99 + md5: 6e801c50a40301f6978c53976917b277 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libnghttp2 >=1.58.0,<2.0a0 + - libssh2 >=1.11.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + - zstd >=1.5.6,<1.6.0a0 + license: curl + license_family: MIT + purls: [] + size: 424900 + timestamp: 1726659794676 +- kind: conda + name: libdeflate + version: '1.22' + build: hb9d3cd8_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.22-hb9d3cd8_0.conda + sha256: 780f0530a3adfc1497ba49d626931c6afc978c540e1abfde6ccd57128ded6ad6 + md5: b422943d5d772b7cc858b36ad2a92db5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 72242 + timestamp: 1728177071251 +- kind: conda + name: libedit + version: 3.1.20191231 + build: he28a2e2_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 + sha256: a57d37c236d8f7c886e01656f4949d9dcca131d2a0728609c6f7fa338b65f1cf + md5: 4d331e44109e3f0e19b4cb8f9b82f3e1 + depends: + - libgcc-ng >=7.5.0 + - ncurses >=6.2,<7.0.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 123878 + timestamp: 1597616541093 +- kind: conda + name: libev + version: '4.33' + build: hd590300_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4 + md5: 172bf1cd1ff8629f2b1179945ed45055 + depends: + - libgcc-ng >=12 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 112766 + timestamp: 1702146165126 +- kind: conda + name: libexpat + version: 2.6.4 + build: h5888daf_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda + sha256: 56541b98447b58e52d824bd59d6382d609e11de1f8adf20b23143e353d2b8d26 + md5: db833e03127376d461e1e13e76f09b6c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - expat 2.6.4.* + license: MIT + license_family: MIT + purls: [] + size: 73304 + timestamp: 1730967041968 +- kind: conda + name: libffi + version: 3.4.2 + build: h7f98852_5 + build_number: 5 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + sha256: ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e + md5: d645c6d2ac96843a2bfaccd2d62b3ac3 + depends: + - libgcc-ng >=9.4.0 + license: MIT + license_family: MIT + purls: [] + size: 58292 + timestamp: 1636488182923 +- kind: conda + name: libgcc + version: 14.2.0 + build: h77fa898_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda + sha256: 53eb8a79365e58849e7b1a068d31f4f9e718dc938d6f2c03e960345739a03569 + md5: 3cb76c3f10d3bc7f1105b2fc9db984df + depends: + - _libgcc_mutex 0.1 conda_forge + - _openmp_mutex >=4.5 + constrains: + - libgomp 14.2.0 h77fa898_1 + - libgcc-ng ==14.2.0=*_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 848745 + timestamp: 1729027721139 +- kind: conda + name: libgcc-devel_linux-64 + version: 13.3.0 + build: h84ea5a7_101 + build_number: 101 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-13.3.0-h84ea5a7_101.conda + sha256: 027cfb011328a108bc44f512a2dec6d954db85709e0b79b748c3392f85de0c64 + md5: 0ce69d40c142915ac9734bc6134e514a + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 2598313 + timestamp: 1724801050802 +- kind: conda + name: libgcc-ng + version: 14.2.0 + build: h69a702a_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda + sha256: 3a76969c80e9af8b6e7a55090088bc41da4cffcde9e2c71b17f44d37b7cb87f7 + md5: e39480b9ca41323497b05492a63bc35b + depends: + - libgcc 14.2.0 h77fa898_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 54142 + timestamp: 1729027726517 +- kind: conda + name: libgd + version: 2.3.3 + build: hd3e95f3_10 + build_number: 10 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-hd3e95f3_10.conda + sha256: b0fa27d4d09fb24750c04e89dbd0aee898dc028bde99e62621065a9bde43efe8 + md5: 30ee3a29c84cf7b842a8c5828c4b7c13 + depends: + - __glibc >=2.17,<3.0.a0 + - fontconfig >=2.14.2,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - icu >=75.1,<76.0a0 + - libexpat >=2.6.2,<3.0a0 + - libgcc-ng >=12 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.43,<1.7.0a0 + - libtiff >=4.6.0,<4.8.0a0 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + license: GD + license_family: BSD + purls: [] + size: 225113 + timestamp: 1722928278395 +- kind: conda + name: libgfortran + version: 14.2.0 + build: h69a702a_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda + sha256: fc9e7f22a17faf74da904ebfc4d88699013d2992e55505e4aa0eb01770290977 + md5: f1fd30127802683586f768875127a987 + depends: + - libgfortran5 14.2.0 hd5240d6_1 + constrains: + - libgfortran-ng ==14.2.0=*_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 53997 + timestamp: 1729027752995 +- kind: conda + name: libgfortran-ng + version: 14.2.0 + build: h69a702a_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_1.conda + sha256: 423f1e2403f0c665748e42d335e421e53fd03c08d457cfb6f360d329d9459851 + md5: 0a7f4cd238267c88e5d69f7826a407eb + depends: + - libgfortran 14.2.0 h69a702a_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 54106 + timestamp: 1729027945817 +- kind: conda + name: libgfortran5 + version: 14.2.0 + build: hd5240d6_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda + sha256: d149a37ca73611e425041f33b9d8dbed6e52ec506fe8cc1fc0ee054bddeb6d5d + md5: 9822b874ea29af082e5d36098d25427d + depends: + - libgcc >=14.2.0 + constrains: + - libgfortran 14.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 1462645 + timestamp: 1729027735353 +- kind: conda + name: libglib + version: 2.82.2 + build: h2ff4ddf_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_0.conda + sha256: 49ee9401d483a76423461c50dcd37f91d070efaec7e4dc2828d8cdd2ce694231 + md5: 13e8e54035ddd2b91875ba399f0f7c04 + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - libiconv >=1.17,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pcre2 >=10.44,<10.45.0a0 + constrains: + - glib 2.82.2 *_0 + license: LGPL-2.1-or-later + purls: [] + size: 3931898 + timestamp: 1729191404130 +- kind: conda + name: libgomp + version: 14.2.0 + build: h77fa898_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda + sha256: 1911c29975ec99b6b906904040c855772ccb265a1c79d5d75c8ceec4ed89cd63 + md5: cc3573974587f12dda90d96e3e55a702 + depends: + - _libgcc_mutex 0.1 conda_forge + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 460992 + timestamp: 1729027639220 +- kind: conda + name: libgrpc + version: 1.65.5 + build: hf5c653b_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.65.5-hf5c653b_0.conda + sha256: d279abd46262e817c7a00aeb4df9b5ed4de38130130b248e2c50875e982f30fa + md5: 3b0048cabc6815a4d8874a0240519d32 + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.32.3,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libprotobuf >=5.27.5,<5.27.6.0a0 + - libre2-11 >=2023.9.1 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.65.5 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 7229891 + timestamp: 1727200905306 +- kind: conda + name: libhwloc + version: 2.11.1 + build: default_hecaa2ac_1000 + build_number: 1000 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.1-default_hecaa2ac_1000.conda + sha256: 8473a300e10b79557ce0ac81602506b47146aff3df4cc3568147a7dd07f480a2 + md5: f54aeebefb5c5ff84eca4fb05ca8aa3a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libxml2 >=2.12.7,<3.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2417964 + timestamp: 1720460562447 +- kind: conda + name: libiconv + version: '1.17' + build: hd590300_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda + sha256: 8ac2f6a9f186e76539439e50505d98581472fedb347a20e7d1f36429849f05c9 + md5: d66573916ffcf376178462f1b61c941e + depends: + - libgcc-ng >=12 + license: LGPL-2.1-only + purls: [] + size: 705775 + timestamp: 1702682170569 +- kind: conda + name: libjpeg-turbo + version: 3.0.0 + build: hd590300_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda + sha256: b954e09b7e49c2f2433d6f3bb73868eda5e378278b0f8c1dd10a7ef090e14f2f + md5: ea25936bb4080d843790b586850f82b8 + depends: + - libgcc-ng >=12 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + purls: [] + size: 618575 + timestamp: 1694474974816 +- kind: conda + name: liblapack + version: 3.9.0 + build: 25_linux64_openblas + build_number: 25 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-25_linux64_openblas.conda + sha256: 9d1ff017714edb2d84868f0f931a4a0e7c289a971062b2ac66cfc8145df7e20e + md5: 4dc03a53fc69371a6158d0ed37214cd3 + depends: + - libblas 3.9.0 25_linux64_openblas + constrains: + - liblapacke 3.9.0 25_linux64_openblas + - libcblas 3.9.0 25_linux64_openblas + - blas * openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 15608 + timestamp: 1729642910812 +- kind: conda + name: liblapacke + version: 3.9.0 + build: 25_linux64_openblas + build_number: 25 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-25_linux64_openblas.conda + sha256: f8bc6fe22126ca0bf204c27f829d1e0006069cc98776a33122bf8d0548940b3c + md5: 8f5ead31b3a168aedd488b8a87736c41 + depends: + - libblas 3.9.0 25_linux64_openblas + - libcblas 3.9.0 25_linux64_openblas + - liblapack 3.9.0 25_linux64_openblas + constrains: + - blas * openblas + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 15609 + timestamp: 1729642916038 +- kind: conda + name: libllvm14 + version: 14.0.6 + build: hcd5def8_4 + build_number: 4 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libllvm14-14.0.6-hcd5def8_4.conda + sha256: 225cc7c3b20ac1db1bdb37fa18c95bf8aecef4388e984ab2f7540a9f4382106a + md5: 73301c133ded2bf71906aa2104edae8b + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 31484415 + timestamp: 1690557554081 +- kind: conda + name: libnghttp2 + version: 1.64.0 + build: h161d5f1_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda + sha256: b0f2b3695b13a989f75d8fd7f4778e1c7aabe3b36db83f0fe80b2cd812c0e975 + md5: 19e57602824042dfd0446292ef90488b + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.32.3,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 647599 + timestamp: 1729571887612 +- kind: conda + name: libnsl + version: 2.0.1 + build: hd590300_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 + md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + depends: + - libgcc-ng >=12 + license: LGPL-2.1-only + license_family: GPL + purls: [] + size: 33408 + timestamp: 1697359010159 +- kind: conda + name: libopenblas + version: 0.3.28 + build: pthreads_h94d23a6_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda + sha256: 99ba271d8a80a1af2723f2e124ffd91d850074c0389c067e6d96d72a2dbfeabe + md5: 62857b389e42b36b686331bec0922050 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.2.0 + constrains: + - openblas >=0.3.28,<0.3.29.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 5578513 + timestamp: 1730772671118 +- kind: conda + name: libpng + version: 1.6.44 + build: hadc24fc_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda + sha256: e5b14f7a01c2db4362d8591f42f82f336ed48d5e4079e4d1f65d0c2a3637ea78 + md5: f4cc49d7aa68316213e4b12be35308d1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + license: zlib-acknowledgement + purls: [] + size: 290661 + timestamp: 1726234747153 +- kind: conda + name: libprotobuf + version: 5.27.5 + build: h5b01275_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.27.5-h5b01275_2.conda + sha256: 79ac9726cd0a1cb1ba335f7fc7ccac5f679a66d71d9553ca88a805b8787d55ce + md5: 66ed3107adbdfc25ba70454ba11e6d1e + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2940269 + timestamp: 1727424395109 +- kind: conda + name: libre2-11 + version: 2024.07.02 + build: hbbce691_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_1.conda + sha256: f8ad6a4f6d4fd54ebe3e5e712a01e663222fc57f49d16b6b8b10c30990dafb8f + md5: 2124de47357b7a516c0a3efd8f88c143 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - re2 2024.07.02.* + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 211096 + timestamp: 1728778964655 +- kind: conda + name: librsvg + version: 2.58.4 + build: hc0ffecb_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.4-hc0ffecb_0.conda + sha256: fda3197ffb24512e719d55defa02f9f70286038e56cad8c1d580ed6460f417fa + md5: 83f045969988f5c7a65f3950b95a8b35 + depends: + - __glibc >=2.17,<3.0.a0 + - cairo >=1.18.0,<2.0a0 + - freetype >=2.12.1,<3.0a0 + - gdk-pixbuf >=2.42.12,<3.0a0 + - harfbuzz >=9.0.0,<10.0a0 + - libgcc >=13 + - libglib >=2.80.3,<3.0a0 + - libpng >=1.6.43,<1.7.0a0 + - libxml2 >=2.12.7,<3.0a0 + - pango >=1.54.0,<2.0a0 + constrains: + - __glibc >=2.17 + license: LGPL-2.1-or-later + purls: [] + size: 6390511 + timestamp: 1726227212382 +- kind: conda + name: libsanitizer + version: 13.3.0 + build: heb74ff8_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-13.3.0-heb74ff8_1.conda + sha256: c86d130f0a3099e46ff51aa7ffaab73cb44fc420d27a96076aab3b9a326fc137 + md5: c4cb22f270f501f5c59a122dc2adf20a + depends: + - libgcc >=13.3.0 + - libstdcxx >=13.3.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 4133922 + timestamp: 1724801171589 +- kind: conda + name: libsqlite + version: 3.47.0 + build: hadc24fc_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_1.conda + sha256: 8a9aadf996a2399f65b679c6e7f29139d5059f699c63e6d7b50e20db10c00508 + md5: b6f02b52a174e612e89548f4663ce56a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + license: Unlicense + purls: [] + size: 875349 + timestamp: 1730208050020 +- kind: conda + name: libssh2 + version: 1.11.0 + build: h0841786_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda + sha256: 50e47fd9c4f7bf841a11647ae7486f65220cfc988ec422a4475fe8d5a823824d + md5: 1f5a58e686b13bcfde88b93f547d23fe + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + - openssl >=3.1.1,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 271133 + timestamp: 1685837707056 +- kind: conda + name: libstdcxx + version: 14.2.0 + build: hc0a3c3a_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda + sha256: 4661af0eb9bdcbb5fb33e5d0023b001ad4be828fccdcc56500059d56f9869462 + md5: 234a5554c53625688d51062645337328 + depends: + - libgcc 14.2.0 h77fa898_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 3893695 + timestamp: 1729027746910 +- kind: conda + name: libstdcxx-devel_linux-64 + version: 13.3.0 + build: h84ea5a7_101 + build_number: 101 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-13.3.0-h84ea5a7_101.conda + sha256: 0a9226c1b994f996229ffb54fa40d608cd4e4b48e8dc73a66134bea8ce949412 + md5: 29b5a4ed4613fa81a07c21045e3f5bf6 + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 14074676 + timestamp: 1724801075448 +- kind: conda + name: libstdcxx-ng + version: 14.2.0 + build: h4852527_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda + sha256: 25bb30b827d4f6d6f0522cc0579e431695503822f144043b93c50237017fffd8 + md5: 8371ac6457591af2cf6159439c1fd051 + depends: + - libstdcxx 14.2.0 hc0a3c3a_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 54105 + timestamp: 1729027780628 +- kind: conda + name: libtiff + version: 4.7.0 + build: he137b08_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-he137b08_1.conda + sha256: 9890121db85f6ef463fe12eb04ef1471176e3ef3b5e2d62e8d6dac713df00df4 + md5: 63872517c98aa305da58a757c443698e + depends: + - __glibc >=2.17,<3.0.a0 + - lerc >=4.0.0,<5.0a0 + - libdeflate >=1.22,<1.23.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libstdcxx >=13 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - xz >=5.2.6,<6.0a0 + - zstd >=1.5.6,<1.6.0a0 + license: HPND + purls: [] + size: 428156 + timestamp: 1728232228989 +- kind: conda + name: libuuid + version: 2.38.1 + build: h0b41bf4_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 33601 + timestamp: 1680112270483 +- kind: conda + name: libwebp-base + version: 1.4.0 + build: hd590300_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda + sha256: 49bc5f6b1e11cb2babf2a2a731d1a680a5e08a858280876a779dbda06c78c35f + md5: b26e8aa824079e1be0294e7152ca4559 + depends: + - libgcc-ng >=12 + constrains: + - libwebp 1.4.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 438953 + timestamp: 1713199854503 +- kind: conda + name: libxcb + version: 1.17.0 + build: h8a09558_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa + md5: 92ed62436b625154323d40d5f2f11dd7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + license: MIT + license_family: MIT + purls: [] + size: 395888 + timestamp: 1727278577118 +- kind: conda + name: libxcrypt + version: 4.4.36 + build: hd590300_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + license: LGPL-2.1-or-later + purls: [] + size: 100393 + timestamp: 1702724383534 +- kind: conda + name: libxml2 + version: 2.13.5 + build: hb346dea_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.5-hb346dea_0.conda + sha256: 8c9d6a3a421ac5bf965af495d1b0a08c6fb2245ba156550bc064a7b4f8fc7bd8 + md5: c81a9f1118541aaa418ccb22190c817e + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc >=13 + - libiconv >=1.17,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - xz >=5.2.6,<6.0a0 + license: MIT + license_family: MIT + purls: [] + size: 689626 + timestamp: 1731489608971 +- kind: conda + name: libzlib + version: 1.3.1 + build: hb9d3cd8_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 60963 + timestamp: 1727963148474 +- kind: conda + name: llvm-openmp + version: 19.1.3 + build: h024ca30_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-19.1.3-h024ca30_0.conda + sha256: aede34c8e218c539ccd4593e4a60b55293b9c3e8870df42f2e2d6ab9e7550927 + md5: d36687dc90337917a84a96a45111ad59 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - openmp 19.1.3|19.1.3.* + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + size: 3192137 + timestamp: 1730363910114 +- kind: conda + name: llvmlite + version: 0.43.0 + build: py312h374181b_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.43.0-py312h374181b_1.conda + sha256: b260285b29834f9b003e2928d778c19b8ed0ca1aff5aa8aa7ec8f21f9b23c2e4 + md5: ed6ead7e9ab9469629c6cfb363b5c6e2 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libllvm14 >=14.0.6,<14.1.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/llvmlite?source=hash-mapping + size: 3442782 + timestamp: 1725305160474 +- kind: conda + name: logical-unification + version: 0.4.6 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/logical-unification-0.4.6-pyhd8ed1ab_0.conda + sha256: 2b70aa838779516e05f93158f9f5b15671fc080cec20d05ca0e3a992e391a6e9 + md5: bd04410bd092c8f62f23a3aea41f47eb + depends: + - multipledispatch + - python >=3.6 + - toolz + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/logical-unification?source=hash-mapping + size: 18160 + timestamp: 1683416555508 +- kind: conda + name: markdown-it-py + version: 3.0.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + sha256: c041b0eaf7a6af3344d5dd452815cdc148d6284fec25a4fa3f4263b3a021e962 + md5: 93a8e71256479c62074356ef6ebf501b + depends: + - mdurl >=0.1,<1 + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/markdown-it-py?source=hash-mapping + size: 64356 + timestamp: 1686175179621 +- kind: conda + name: matplotlib-base + version: 3.9.2 + build: py312hd3ec401_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py312hd3ec401_2.conda + sha256: f199be5149f45a14c88d465d9cb83cfba5efe17c45a0233354ef62cdcb7eab9e + md5: 2380c9ba933ffaac9ad16d8eac8e3318 + depends: + - __glibc >=2.17,<3.0.a0 + - certifi >=2020.06.20 + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.22.0 + - freetype >=2.12.1,<3.0a0 + - kiwisolver >=1.3.1 + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - numpy >=1.23 + - packaging >=20.0 + - pillow >=8 + - pyparsing >=2.3.1 + - python >=3.12,<3.13.0a0 + - python-dateutil >=2.7 + - python_abi 3.12.* *_cp312 + - qhull >=2020.2,<2020.3.0a0 + - tk >=8.6.13,<8.7.0a0 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/matplotlib?source=hash-mapping + size: 7965171 + timestamp: 1731025360821 +- kind: conda + name: maturin + version: 1.7.4 + build: py312h6ab59e4_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/maturin-1.7.4-py312h6ab59e4_0.conda + sha256: 7cd382f2cf76f1f83c6d324cfd1cd238769aad6f4650892d4a3f1f4fb20f750e + md5: 082a5a7a1de682a2aa1cc1f7c86cd51a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - openssl >=3.3.2,<4.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tomli >=1.1.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/maturin?source=hash-mapping + size: 6259502 + timestamp: 1727350499582 +- kind: conda + name: mdurl + version: 0.1.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + sha256: 64073dfb6bb429d52fff30891877b48c7ec0f89625b1bf844905b66a81cce6e1 + md5: 776a8dd9e824f77abac30e6ef43a8f7a + depends: + - python >=3.6 + license: MIT + license_family: MIT + purls: + - pkg:pypi/mdurl?source=hash-mapping + size: 14680 + timestamp: 1704317789138 +- kind: conda + name: minikanren + version: 1.0.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/minikanren-1.0.3-pyhd8ed1ab_0.tar.bz2 + sha256: f0873262d9ea246dabc7e9c17190b9b04c1f973df1fd26426e14208c4ca62236 + md5: 0726bd0e32c2edfa48dfbf744579520e + depends: + - cons >=0.4.0 + - etuples >=0.3.1 + - logical-unification >=0.4.1 + - multipledispatch + - python >=3.6 + - toolz + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/minikanren?source=hash-mapping + size: 23617 + timestamp: 1642650983911 +- kind: conda + name: mkl + version: 2024.2.2 + build: ha957f24_16 + build_number: 16 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda + sha256: 77906b0acead8f86b489da46f53916e624897338770dbf70b04b8f673c9273c1 + md5: 1459379c79dda834673426504d52b319 + depends: + - _openmp_mutex * *_llvm + - _openmp_mutex >=4.5 + - llvm-openmp >=19.1.2 + - tbb 2021.* + license: LicenseRef-IntelSimplifiedSoftwareOct2022 + license_family: Proprietary + purls: [] + size: 124718448 + timestamp: 1730231808335 +- kind: conda + name: mkl-service + version: 2.4.2 + build: py312hf224ee7_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/mkl-service-2.4.2-py312hf224ee7_0.conda + sha256: 405d9f30aca24feb034c0474899613dade19adb52be39efd164d99030c9d3b84 + md5: 7874d7976d44512eaccba994989017e3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - mkl >=2024.2.2,<2025.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/mkl-service?source=hash-mapping + size: 73420 + timestamp: 1728843500808 +- kind: conda + name: ml_dtypes + version: 0.5.0 + build: py312hf9745cd_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/ml_dtypes-0.5.0-py312hf9745cd_0.conda + sha256: 559c14640ce8e3f2270da6130ba50ae624f3db56176fad29a5436b2dec3fc3b2 + md5: 8ca779f3f30b00181aeee820fe8b22d5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: MPL-2.0 AND Apache-2.0 + purls: + - pkg:pypi/ml-dtypes?source=hash-mapping + size: 290054 + timestamp: 1726376440408 +- kind: conda + name: multipledispatch + version: 0.6.0 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/multipledispatch-0.6.0-pyhd8ed1ab_1.conda + sha256: c6216a21154373b340c64f321f22fec51db4ee6156c2e642fa58368103ac5d09 + md5: 121a57fce7fff0857ec70fa03200962f + depends: + - python >=3.6 + - six + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/multipledispatch?source=hash-mapping + size: 17254 + timestamp: 1721907640382 +- kind: conda + name: munkres + version: 1.1.4 + build: pyh9f0ad1d_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 + sha256: f86fb22b58e93d04b6f25e0d811b56797689d598788b59dcb47f59045b568306 + md5: 2ba8498c1018c1e9c61eb99b973dfe19 + depends: + - python + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/munkres?source=hash-mapping + size: 12452 + timestamp: 1600387789153 +- kind: conda + name: ncurses + version: '6.5' + build: he02047a_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda + sha256: 6a1d5d8634c1a07913f1c525db6455918cbc589d745fac46d9d6e30340c8731a + md5: 70caf8bb6cf39a0b6b7efc885f51c0fe + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + license: X11 AND BSD-3-Clause + purls: [] + size: 889086 + timestamp: 1724658547447 +- kind: conda + name: numba + version: 0.60.0 + build: py312h83e6fd3_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/numba-0.60.0-py312h83e6fd3_0.conda + sha256: af31c1989ddf1cd46f073f32a8150274c606fdc9fced0e4f5aaf0571b97bd09f + md5: e064ca33edf91ac117236c4b5dee207a + depends: + - _openmp_mutex >=4.5 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - llvmlite >=0.43.0,<0.44.0a0 + - numpy >=1.19,<3 + - numpy >=1.22.3,<2.1 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - cuda-version >=11.2 + - tbb >=2021.6.0 + - cuda-python >=11.6 + - scipy >=1.0 + - libopenblas !=0.3.6 + - cudatoolkit >=11.2 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/numba?source=hash-mapping + size: 5695278 + timestamp: 1718888170104 +- kind: conda + name: numpy + version: 1.26.4 + build: py312heda63a1_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + sha256: fe3459c75cf84dcef6ef14efcc4adb0ade66038ddd27cadb894f34f4797687d8 + md5: d8285bea2a350f63fab23bf460221f3f + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/numpy?source=hash-mapping + size: 7484186 + timestamp: 1707225809722 +- kind: conda + name: openblas + version: 0.3.28 + build: pthreads_h6ec200e_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.28-pthreads_h6ec200e_1.conda + sha256: c558f49a262f43b0c5b6f9feb75b631d0b1eeba53579fd2bbce0df37f1884ef0 + md5: 8fe5d50db07e92519cc639cb0aef9b1b + depends: + - libopenblas 0.3.28 pthreads_h94d23a6_1 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 5727592 + timestamp: 1730772687576 +- kind: conda + name: openjpeg + version: 2.5.2 + build: h488ebb8_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda + sha256: 5600a0b82df042bd27d01e4e687187411561dfc11cc05143a08ce29b64bf2af2 + md5: 7f2e286780f072ed750df46dc2631138 + depends: + - libgcc-ng >=12 + - libpng >=1.6.43,<1.7.0a0 + - libstdcxx-ng >=12 + - libtiff >=4.6.0,<4.8.0a0 + - libzlib >=1.2.13,<2.0.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 341592 + timestamp: 1709159244431 +- kind: conda + name: openssl + version: 3.4.0 + build: hb9d3cd8_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda + sha256: 814b9dff1847b132c676ee6cc1a8cb2d427320779b93e1b6d76552275c128705 + md5: 23cc74f77eb99315c0360ec3533147a9 + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=13 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2947466 + timestamp: 1731377666602 +- kind: conda + name: opt-einsum + version: 3.4.0 + build: hd8ed1ab_0 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/opt-einsum-3.4.0-hd8ed1ab_0.conda + sha256: 583cb8748a9821e301a404806da0de62e8ba01607feecf12c0ef06d8bc77077e + md5: 73d0b1d98a9030bdefe712648af583a0 + depends: + - opt_einsum >=3.4.0,<3.4.1.0a0 + license: MIT + license_family: MIT + purls: [] + size: 6470 + timestamp: 1727392480705 +- kind: conda + name: opt_einsum + version: 3.4.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_0.conda + sha256: 69e979dfea8b8d82e51684f77d189e1d00cdcbc5c85868415b879719882e2df4 + md5: ff80afedd76f436acddbd1e14f5c2909 + depends: + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/opt-einsum?source=hash-mapping + size: 62487 + timestamp: 1727392477628 +- kind: pypi + name: optax + version: 0.2.4 + url: https://files.pythonhosted.org/packages/5c/24/28d0bb21600a78e46754947333ec9a297044af884d360092eb8561575fe9/optax-0.2.4-py3-none-any.whl + sha256: db35c04e50b52596662efb002334de08c2a0a74971e4da33f467e84fac08886a + requires_dist: + - absl-py>=0.7.1 + - chex>=0.1.87 + - jax>=0.4.27 + - jaxlib>=0.4.27 + - numpy>=1.18.0 + - etils[epy] + - sphinx>=6.0.0 ; extra == 'docs' + - sphinx-book-theme>=1.0.1 ; extra == 'docs' + - sphinxcontrib-katex ; extra == 'docs' + - sphinx-autodoc-typehints ; extra == 'docs' + - ipython>=8.8.0 ; extra == 'docs' + - myst-nb>=1.0.0 ; extra == 'docs' + - matplotlib>=3.5.0 ; extra == 'docs' + - sphinx-gallery>=0.14.0 ; extra == 'docs' + - sphinx-collections>=0.0.1 ; extra == 'docs' + - tensorflow>=2.4.0 ; extra == 'docs' + - tensorflow-datasets>=4.2.0 ; extra == 'docs' + - flax ; extra == 'docs' + - sphinx-contributors ; extra == 'docs' + - absl-py>=1.0.0 ; extra == 'dp-accounting' + - attrs>=21.4.0 ; extra == 'dp-accounting' + - mpmath>=1.2.1 ; extra == 'dp-accounting' + - numpy>=1.21.4 ; extra == 'dp-accounting' + - scipy>=1.7.1 ; extra == 'dp-accounting' + - tensorflow-datasets>=4.2.0 ; extra == 'examples' + - tensorflow>=2.4.0 ; extra == 'examples' + - dp-accounting>=0.4 ; extra == 'examples' + - ipywidgets ; extra == 'examples' + - flax ; extra == 'examples' + - dm-tree>=0.1.7 ; extra == 'test' + - flax>=0.5.3 ; extra == 'test' + - scipy>=1.7.1 ; extra == 'test' + - scikit-learn ; extra == 'test' + requires_python: '>=3.9' +- kind: conda + name: packaging + version: '24.2' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_0.conda + sha256: 0f8273bf66c2a5c1de72312a509deae07f163bb0ae8de8273c52e6fe945a0850 + md5: c16469afe1ec91aaafcf4bea966c0465 + depends: + - python >=3.8 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/packaging?source=hash-mapping + size: 60345 + timestamp: 1731457074006 +- kind: conda + name: pandas + version: 2.2.3 + build: py312hf9745cd_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py312hf9745cd_1.conda + sha256: ad275a83bfebfa8a8fee9b0569aaf6f513ada6a246b2f5d5b85903d8ca61887e + md5: 8bce4f6caaf8c5448c7ac86d87e26b4b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - numpy >=1.19,<3 + - numpy >=1.22.4 + - python >=3.12,<3.13.0a0 + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.12.* *_cp312 + - pytz >=2020.1,<2024.2 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pandas?source=hash-mapping + size: 15436913 + timestamp: 1726879054912 +- kind: conda + name: pango + version: 1.54.0 + build: h4c5309f_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pango-1.54.0-h4c5309f_1.conda + sha256: d362237be82d5a0d532fe66ec8d68018c3b2a9705bad6d73c2b63dae2970da02 + md5: 7df02e445367703cd87a574046e3a6f0 + depends: + - cairo >=1.18.0,<2.0a0 + - fontconfig >=2.14.2,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - fribidi >=1.0.10,<2.0a0 + - harfbuzz >=9.0.0,<10.0a0 + - libgcc-ng >=12 + - libglib >=2.80.2,<3.0a0 + - libpng >=1.6.43,<1.7.0a0 + license: LGPL-2.1-or-later + purls: [] + size: 447117 + timestamp: 1719839527713 +- kind: pypi + name: paramax + version: 0.0.0 + url: https://files.pythonhosted.org/packages/20/f8/7b1f5b84f84e43face7349ac2df23f0f75d36b5b4a1c1c0305edce82bcc8/paramax-0.0.0-py3-none-any.whl + sha256: 02d0120e626de300680a1661b138feeba14b418031d6e976fd679db5fd03509a + requires_dist: + - equinox + - jax + - jaxtyping + - beartype ; extra == 'dev' + - pytest ; extra == 'dev' + - ruff ; extra == 'dev' + - sphinx ; extra == 'dev' + - sphinx-autodoc-typehints ; extra == 'dev' + - sphinx-book-theme ; extra == 'dev' + - sphinx-copybutton ; extra == 'dev' + requires_python: '>=3.10' +- kind: conda + name: pcre2 + version: '10.44' + build: hba22ea6_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda + sha256: 1087716b399dab91cc9511d6499036ccdc53eb29a288bebcb19cf465c51d7c0d + md5: df359c09c41cd186fffb93a2d87aa6f5 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - libgcc-ng >=12 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 952308 + timestamp: 1723488734144 +- kind: conda + name: pillow + version: 11.0.0 + build: py312h7b63e92_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.0.0-py312h7b63e92_0.conda + sha256: 13a464bea02c0df0199c20ef6bad24a6bc336aaf55bf8d6a133d0fe664463224 + md5: 385f46a4df6f97892503a841121a9acf + depends: + - __glibc >=2.17,<3.0.a0 + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.4.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.2,<3.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + license: HPND + purls: + - pkg:pypi/pillow?source=hash-mapping + size: 41948418 + timestamp: 1729065846594 +- kind: conda + name: pip + version: 24.3.1 + build: pyh8b19718_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda + sha256: 499313e72e20225f84c2e9690bbaf5b952c8d7e0bf34b728278538f766b81628 + md5: 5dd546fe99b44fda83963d15f84263b7 + depends: + - python >=3.8,<3.13.0a0 + - setuptools + - wheel + license: MIT + license_family: MIT + purls: + - pkg:pypi/pip?source=hash-mapping + size: 1243168 + timestamp: 1730203795600 +- kind: conda + name: pixman + version: 0.43.2 + build: h59595ed_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda + sha256: 366d28e2a0a191d6c535e234741e0cd1d94d713f76073d8af4a5ccb2a266121e + md5: 71004cbf7924e19c02746ccde9fd7123 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: MIT + license_family: MIT + purls: [] + size: 386826 + timestamp: 1706549500138 +- kind: conda + name: pluggy + version: 1.5.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda + sha256: 33eaa3359948a260ebccf9cdc2fd862cea5a6029783289e13602d8e634cd9a26 + md5: d3483c8fc2dc2cc3f5cf43e26d60cabf + depends: + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pluggy?source=hash-mapping + size: 23815 + timestamp: 1713667175451 +- kind: conda + name: pthread-stubs + version: '0.4' + build: hb9d3cd8_1002 + build_number: 1002 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 + md5: b3c17d95b5a10c6e64a21fa17573e70e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 8252 + timestamp: 1726802366959 +- kind: conda + name: pygments + version: 2.18.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda + sha256: 78267adf4e76d0d64ea2ffab008c501156c108bb08fecb703816fb63e279780b + md5: b7f5c092b8f9800150d998a71b76d5a1 + depends: + - python >=3.8 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/pygments?source=hash-mapping + size: 879295 + timestamp: 1714846885370 +- kind: conda + name: pymc + version: 5.18.0 + build: hd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pymc-5.18.0-hd8ed1ab_0.conda + sha256: e267c5030bf0a973df42229d7a19541c107a2c4ab268078272e9638bf5509ed5 + md5: 60850870f8a9d2ab816b07bb5af11993 + depends: + - pymc-base 5.18.0 pyhd8ed1ab_0 + - pytensor + - python-graphviz + license: Apache-2.0 + license_family: Apache + purls: [] + size: 11587 + timestamp: 1730727968012 +- kind: conda + name: pymc-base + version: 5.18.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pymc-base-5.18.0-pyhd8ed1ab_0.conda + sha256: 5d4f41413ac24698b64a78fd65dfe29562d9bebec4570cd1e69fdbe85a7b8615 + md5: 0aa547a4010d7984d0cac353bde62e97 + depends: + - arviz >=0.13.0 + - cachetools >=4.2.1 + - cloudpickle + - numpy >=1.15.0 + - pandas >=0.24.0 + - pytensor-base >=2.25.1,<2.26 + - python >=3.10 + - rich >=13.7.1 + - scipy >=1.4.1 + - threadpoolctl >=3.1.0,<4.0.0 + - typing-extensions >=3.7.4 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/pymc?source=hash-mapping + size: 333757 + timestamp: 1730727964625 +- kind: conda + name: pyparsing + version: 3.2.0 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.0-pyhd8ed1ab_1.conda + sha256: b846e3965cd106438cf0b9dc0de8d519670ac065f822a7d66862e9423e0229cb + md5: 035c17fbf099f50ff60bf2eb303b0a83 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyparsing?source=hash-mapping + size: 92444 + timestamp: 1728880549923 +- kind: conda + name: pytensor + version: 2.25.5 + build: py312h97902ae_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pytensor-2.25.5-py312h97902ae_0.conda + sha256: 83a4750986bd6dab77ed1ac81e802047f46013afb8e9019d6624de4eae85b7dc + md5: 217442cd88537f0e8f4a6819f1823b0c + depends: + - blas + - gcc_linux-64 13.* + - gxx + - gxx_linux-64 13.* + - mkl-service + - pytensor-base 2.25.5 py312h25a0e75_0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - sysroot_linux-64 2.17.* + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 9118 + timestamp: 1727981016362 +- kind: conda + name: pytensor-base + version: 2.25.5 + build: py312h25a0e75_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pytensor-base-2.25.5-py312h25a0e75_0.conda + sha256: 3b4287dd0d9358ee76e0c55db596fe6d256ec48b1301c46984e62b7e0806aca3 + md5: 86ae2da8b1a044ee7f6a7d2ce0eba762 + depends: + - __glibc >=2.17,<3.0.a0 + - cons + - etuples + - filelock >=3.15 + - libgcc >=13 + - libstdcxx >=13 + - logical-unification + - minikanren + - numpy >=1.26.4,<2.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - scipy >=1,<2 + - setuptools >=59.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pytensor?source=hash-mapping + size: 2312179 + timestamp: 1727981002120 +- kind: conda + name: pytest + version: 8.3.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda + sha256: e99376d0068455712109d233f5790458ff861aeceb458bfda74e353338e4d815 + md5: c03d61f31f38fdb9facf70c29958bf7a + depends: + - colorama + - exceptiongroup >=1.0.0rc8 + - iniconfig + - packaging + - pluggy <2,>=1.5 + - python >=3.8 + - tomli >=1 + constrains: + - pytest-faulthandler >=2 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytest?source=hash-mapping + size: 258293 + timestamp: 1725977334143 +- kind: conda + name: python + version: 3.12.7 + build: hc5c86c4_0_cpython + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.7-hc5c86c4_0_cpython.conda + sha256: 674be31ff152d9f0e0fe16959a45e3803a730fc4f54d87df6a9ac4e6a698c41d + md5: 0515111a9cdf69f83278f7c197db9807 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.6.3,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.46.1,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.3.2,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - xz >=5.2.6,<6.0a0 + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + purls: [] + size: 31574780 + timestamp: 1728059777603 +- kind: conda + name: python-dateutil + version: 2.9.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda + sha256: f3ceef02ac164a8d3a080d0d32f8e2ebe10dd29e3a685d240e38b3599e146320 + md5: 2cf4264fffb9e6eff6031c5b6884d61c + depends: + - python >=3.7 + - six >=1.5 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/python-dateutil?source=hash-mapping + size: 222742 + timestamp: 1709299922152 +- kind: conda + name: python-graphviz + version: 0.20.3 + build: pyhe28f650_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.20.3-pyhe28f650_1.conda + sha256: 0eca3595a52dd7ad83ebca1ee738af50bf21dbd70d623583b0185d84074e21af + md5: 881be78ca9f3f2f5f6aa45d9b38a799f + depends: + - graphviz >=2.46.1 + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/graphviz?source=hash-mapping + size: 38168 + timestamp: 1727718740290 +- kind: conda + name: python-tzdata + version: '2024.2' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.2-pyhd8ed1ab_0.conda + sha256: fe3f62ce2bc714bdaa222ab3f0344a2815ad9e853c6df38d15c9f25de8a3a6d4 + md5: 986287f89929b2d629bd6ef6497dc307 + depends: + - python >=3.6 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/tzdata?source=hash-mapping + size: 142527 + timestamp: 1727140688093 +- kind: conda + name: python_abi + version: '3.12' + build: 5_cp312 + build_number: 5 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + sha256: d10e93d759931ffb6372b45d65ff34d95c6000c61a07e298d162a3bc2accebb0 + md5: 0424ae29b104430108f5218a66db7260 + constrains: + - python 3.12.* *_cpython + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6238 + timestamp: 1723823388266 +- kind: conda + name: pytz + version: '2024.1' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + sha256: 1a7d6b233f7e6e3bbcbad054c8fd51e690a67b129a899a056a5e45dd9f00cb41 + md5: 3eeeeb9e4827ace8c0c1419c85d590ad + depends: + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pytz?source=hash-mapping + size: 188538 + timestamp: 1706886944988 +- kind: conda + name: qhull + version: '2020.2' + build: h434a139_5 + build_number: 5 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + sha256: 776363493bad83308ba30bcb88c2552632581b143e8ee25b1982c8c743e73abc + md5: 353823361b1d27eb3960efb076dfcaf6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: LicenseRef-Qhull + purls: [] + size: 552937 + timestamp: 1720813982144 +- kind: conda + name: re2 + version: 2024.07.02 + build: h77b4e00_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h77b4e00_1.conda + sha256: c1721cb80f7201652fc9801f49c214c88aee835d957f2376e301bd40a8415742 + md5: 01093ff37c1b5e6bf9f17c0116747d11 + depends: + - libre2-11 2024.07.02 hbbce691_1 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 26665 + timestamp: 1728778975855 +- kind: conda + name: readline + version: '8.2' + build: h8228510_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + sha256: 5435cf39d039387fbdc977b0a762357ea909a7694d9528ab40f005e9208744d7 + md5: 47d31b792659ce70f470b5c82fdfb7a4 + depends: + - libgcc-ng >=12 + - ncurses >=6.3,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 281456 + timestamp: 1679532220005 +- kind: conda + name: rich + version: 13.9.4 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_0.conda + sha256: c009488fc07fd5557434c9c1ad32ab1dd50241d6a766e4b2b4125cd6498585a8 + md5: bcf8cc8924b5d20ead3d122130b8320b + depends: + - markdown-it-py >=2.2.0 + - pygments >=2.13.0,<3.0.0 + - python >=3.8 + - typing_extensions >=4.0.0,<5.0.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/rich?source=hash-mapping + size: 185481 + timestamp: 1730592349978 +- kind: conda + name: scipy + version: 1.14.1 + build: py312h62794b6_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py312h62794b6_1.conda + sha256: d069a64edade554261672d8febf4756aeb56a6cb44bd91844eaa944e5d9f4eb9 + md5: b43233a9e2f62fb94affe5607ea79473 + depends: + - __glibc >=2.17,<3.0.a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc >=13 + - libgfortran + - libgfortran5 >=13.3.0 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx >=13 + - numpy <2.3 + - numpy >=1.19,<3 + - numpy >=1.23.5 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/scipy?source=hash-mapping + size: 17622722 + timestamp: 1729481826601 +- kind: conda + name: setuptools + version: 75.3.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.3.0-pyhd8ed1ab_0.conda + sha256: a36d020b9f32fc3f1a6488a1c4a9c13988c6468faf6895bf30ca69521a61230e + md5: 2ce9825396daf72baabaade36cee16da + depends: + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/setuptools?source=hash-mapping + size: 779561 + timestamp: 1730382173961 +- kind: conda + name: six + version: 1.16.0 + build: pyh6c4a22f_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + sha256: a85c38227b446f42c5b90d9b642f2c0567880c15d72492d8da074a59c8f91dd6 + md5: e5f25f8dbc060e9a8d912e432202afc2 + depends: + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/six?source=hash-mapping + size: 14259 + timestamp: 1620240338595 +- kind: conda + name: sysroot_linux-64 + version: '2.17' + build: h4a8ded7_18 + build_number: 18 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h4a8ded7_18.conda + sha256: 23c7ab371c1b74d01a187e05aa7240e3f5654599e364a9adff7f0b02e26f471f + md5: 0ea96f90a10838f58412aa84fdd9df09 + depends: + - kernel-headers_linux-64 3.10.0 he073ed8_18 + - tzdata + license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later AND MPL-2.0 + license_family: GPL + purls: [] + size: 15500960 + timestamp: 1729794510631 +- kind: conda + name: tbb + version: 2021.13.0 + build: h84d6215_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-h84d6215_0.conda + sha256: 7d4d3ad608dc6ae5a7e0f431f784985398a18bcde2ba3ce19cc32f61e2defd98 + md5: ee6f7fd1e76061ef1fa307d41fa86a96 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libhwloc >=2.11.1,<2.11.2.0a0 + - libstdcxx >=13 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 175779 + timestamp: 1725532539822 +- kind: conda + name: threadpoolctl + version: 3.5.0 + build: pyhc1e730c_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda + sha256: 45e402941f6bed094022c5726a2ca494e6224b85180d2367fb6ddd9aea68079d + md5: df68d78237980a159bd7149f33c0e8fd + depends: + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/threadpoolctl?source=hash-mapping + size: 23548 + timestamp: 1714400228771 +- kind: conda + name: tk + version: 8.6.13 + build: noxft_h4845f30_101 + build_number: 101 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3318875 + timestamp: 1699202167581 +- kind: conda + name: tomli + version: 2.1.0 + build: pyhff2d567_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/tomli-2.1.0-pyhff2d567_0.conda + sha256: 354b8a64d4f3311179d85aefc529ca201a36afc1af090d0010c46be7b79f9a47 + md5: 3fa1089b4722df3a900135925f4519d9 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/tomli?source=hash-mapping + size: 18741 + timestamp: 1731426862834 +- kind: conda + name: toolz + version: 1.0.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_0.conda + sha256: 6371cf3cf8292f2abdcc2bf783d6e70203d72f8ff0c1625f55a486711e276c75 + md5: 34feccdd4177f2d3d53c73fc44fd9a37 + depends: + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/toolz?source=hash-mapping + size: 52623 + timestamp: 1728059623353 +- kind: pypi + name: tqdm + version: 4.67.0 + url: https://files.pythonhosted.org/packages/2b/78/57043611a16c655c8350b4c01b8d6abfb38cc2acb475238b62c2146186d7/tqdm-4.67.0-py3-none-any.whl + sha256: 0cd8af9d56911acab92182e88d763100d4788bdf421d251616040cc4d44863be + requires_dist: + - colorama ; platform_system == 'Windows' + - pytest>=6 ; extra == 'dev' + - pytest-cov ; extra == 'dev' + - pytest-timeout ; extra == 'dev' + - pytest-xdist ; extra == 'dev' + - requests ; extra == 'discord' + - ipywidgets>=6 ; extra == 'notebook' + - slack-sdk ; extra == 'slack' + - requests ; extra == 'telegram' + requires_python: '>=3.7' +- kind: pypi + name: typeguard + version: 2.13.3 + url: https://files.pythonhosted.org/packages/9a/bb/d43e5c75054e53efce310e79d63df0ac3f25e34c926be5dffb7d283fb2a8/typeguard-2.13.3-py3-none-any.whl + sha256: 5e3e3be01e887e7eafae5af63d1f36c849aaa94e3a0112097312aabfa16284f1 + requires_dist: + - sphinx-rtd-theme ; extra == 'doc' + - sphinx-autodoc-typehints>=1.2.0 ; extra == 'doc' + - pytest ; extra == 'test' + - typing-extensions ; extra == 'test' + - mypy ; platform_python_implementation != 'PyPy' and extra == 'test' + requires_python: '>=3.5.3' +- kind: conda + name: typing-extensions + version: 4.12.2 + build: hd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda + sha256: d3b9a8ed6da7c9f9553c5fd8a4fca9c3e0ab712fa5f497859f82337d67533b73 + md5: 52d648bd608f5737b123f510bb5514b5 + depends: + - typing_extensions 4.12.2 pyha770c72_0 + license: PSF-2.0 + license_family: PSF + purls: [] + size: 10097 + timestamp: 1717802659025 +- kind: conda + name: typing_extensions + version: 4.12.2 + build: pyha770c72_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda + sha256: 0fce54f8ec3e59f5ef3bb7641863be4e1bf1279623e5af3d3fa726e8f7628ddb + md5: ebe6952715e1d5eb567eeebf25250fa7 + depends: + - python >=3.8 + license: PSF-2.0 + license_family: PSF + purls: + - pkg:pypi/typing-extensions?source=hash-mapping + size: 39888 + timestamp: 1717802653893 +- kind: conda + name: tzdata + version: 2024b + build: hc8b5060_0 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + sha256: 4fde5c3008bf5d2db82f2b50204464314cc3c91c1d953652f7bd01d9e52aefdf + md5: 8ac3367aafb1cc0a068483c580af8015 + license: LicenseRef-Public-Domain + purls: [] + size: 122354 + timestamp: 1728047496079 +- kind: conda + name: unicodedata2 + version: 15.1.0 + build: py312h66e93f0_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py312h66e93f0_1.conda + sha256: 1fcba6d363d901d9a06381e1aee2d5634f82389965dd7a339f19b3ae81ce6da0 + md5: 588486a61153f94c7c13816f7069e440 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/unicodedata2?source=hash-mapping + size: 368550 + timestamp: 1729704685856 +- kind: conda + name: wheel + version: 0.45.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.0-pyhd8ed1ab_0.conda + sha256: 8a51067f8e1a2cb0b5e89672dbcc0369e344a92e869c38b2946584aa09ab7088 + md5: f9751d7c71df27b2d29f5cab3378982e + depends: + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/wheel?source=hash-mapping + size: 62755 + timestamp: 1731120002488 +- kind: conda + name: xarray + version: 2024.10.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/xarray-2024.10.0-pyhd8ed1ab_0.conda + sha256: a35c8291de55f96ecc9121d1ebd4995977ea2f51d9e529e97749abc108afb0e4 + md5: 53e365732dfa053c4d19fc6b927392c4 + depends: + - numpy >=1.24 + - packaging >=23.1 + - pandas >=2.1 + - python >=3.10 + constrains: + - matplotlib-base >=3.7 + - netcdf4 >=1.6.0 + - numba >=0.57 + - hdf5 >=1.12 + - sparse >=0.14 + - cftime >=1.6 + - zarr >=2.16 + - flox >=0.7 + - pint >=0.22 + - toolz >=0.12 + - scipy >=1.11 + - seaborn-base >=0.12 + - distributed >=2023.9 + - iris >=3.7 + - cartopy >=0.22 + - bottleneck >=1.3 + - dask-core >=2023.9 + - h5py >=3.8 + - h5netcdf >=1.2 + - nc-time-axis >=1.4 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/xarray?source=hash-mapping + size: 813754 + timestamp: 1729867978934 +- kind: conda + name: xarray-einstats + version: 0.8.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/xarray-einstats-0.8.0-pyhd8ed1ab_0.conda + sha256: 8cb41b361184ee06515829e729184716e252c6f661590898242e93c3e87dd415 + md5: 729ecac2a5d024cce0837c25cf28f695 + depends: + - numpy >=1.23 + - python >=3.10 + - scipy >=1.9 + - xarray >=2022.09.0 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/xarray-einstats?source=hash-mapping + size: 33815 + timestamp: 1726758642806 +- kind: conda + name: xorg-libice + version: 1.1.1 + build: hb9d3cd8_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hb9d3cd8_1.conda + sha256: ec276da68d1c4a3d34a63195b35ca5b248d4aff0812464dcd843d74649b5cec4 + md5: 19608a9656912805b2b9a2f6bd257b04 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 58159 + timestamp: 1727531850109 +- kind: conda + name: xorg-libsm + version: 1.2.4 + build: he73a12e_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-he73a12e_1.conda + sha256: 70e903370977d44c9120a5641ab563887bd48446e9ef6fc2a3f5f60531c2cd6c + md5: 05a8ea5f446de33006171a7afe6ae857 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libuuid >=2.38.1,<3.0a0 + - xorg-libice >=1.1.1,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 27516 + timestamp: 1727634669421 +- kind: conda + name: xorg-libx11 + version: 1.8.10 + build: h4f16b4b_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_0.conda + sha256: c4650634607864630fb03696474a0535f6fce5fda7d81a6462346e071b53dfa7 + md5: 0b666058a179b744a622d0a4a0c56353 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libxcb >=1.17.0,<2.0a0 + - xorg-xorgproto + license: MIT + license_family: MIT + purls: [] + size: 838308 + timestamp: 1727356837875 +- kind: conda + name: xorg-libxau + version: 1.0.11 + build: hb9d3cd8_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hb9d3cd8_1.conda + sha256: 532a046fee0b3a402db867b6ec55c84ba4cdedb91d817147c8feeae9766be3d6 + md5: 77cbc488235ebbaab2b6e912d3934bae + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 14679 + timestamp: 1727034741045 +- kind: conda + name: xorg-libxdmcp + version: 1.1.5 + build: hb9d3cd8_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + sha256: 6b250f3e59db07c2514057944a3ea2044d6a8cdde8a47b6497c254520fade1ee + md5: 8035c64cb77ed555e3f150b7b3972480 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 19901 + timestamp: 1727794976192 +- kind: conda + name: xorg-libxext + version: 1.3.6 + build: hb9d3cd8_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda + sha256: da5dc921c017c05f38a38bd75245017463104457b63a1ce633ed41f214159c14 + md5: febbab7d15033c913d53c7a2c102309d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + license: MIT + license_family: MIT + purls: [] + size: 50060 + timestamp: 1727752228921 +- kind: conda + name: xorg-libxrender + version: 0.9.11 + build: hb9d3cd8_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hb9d3cd8_1.conda + sha256: f1217e902c0b1d8bc5d3ce65e483ebf38b049c823c9117b7198cfb16bd2b9143 + md5: a7a49a8b85122b49214798321e2e96b4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-xorgproto + license: MIT + license_family: MIT + purls: [] + size: 37780 + timestamp: 1727529943015 +- kind: conda + name: xorg-xorgproto + version: '2024.1' + build: hb9d3cd8_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2024.1-hb9d3cd8_1.conda + sha256: 1316680be6edddee0156b86ec1102fc8286f51c1a5440366ed1db596a2dc3731 + md5: 7c21106b851ec72c037b162c216d8f05 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 565425 + timestamp: 1726846388217 +- kind: conda + name: xz + version: 5.2.6 + build: h166bdaf_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 + sha256: 03a6d28ded42af8a347345f82f3eebdd6807a08526d47899a42d62d319609162 + md5: 2161070d867d1b1204ea749c8eec4ef0 + depends: + - libgcc-ng >=12 + license: LGPL-2.1 and GPL-2.0 + purls: [] + size: 418368 + timestamp: 1660346797927 +- kind: conda + name: zipp + version: 3.21.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_0.conda + sha256: 232a30e4b0045c9de5e168dda0328dc0e28df9439cdecdfb97dd79c1c82c4cec + md5: fee389bf8a4843bd7a2248ce11b7f188 + depends: + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/zipp?source=hash-mapping + size: 21702 + timestamp: 1731262194278 +- kind: conda + name: zlib + version: 1.3.1 + build: hb9d3cd8_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + sha256: 5d7c0e5f0005f74112a34a7425179f4eb6e73c92f5d109e6af4ddeca407c92ab + md5: c9f075ab2f33b3bbee9e62d4ad0a6cd8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib 1.3.1 hb9d3cd8_2 + license: Zlib + license_family: Other + purls: [] + size: 92286 + timestamp: 1727963153079 +- kind: conda + name: zstd + version: 1.5.6 + build: ha6fb4c9_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + sha256: c558b9cc01d9c1444031bd1ce4b9cff86f9085765f17627a6cd85fc623c8a02b + md5: 4d056880988120e29d75bfff282e0f45 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 554846 + timestamp: 1714722996770 diff --git a/pixi.toml b/pixi.toml new file mode 100644 index 0000000..67b350d --- /dev/null +++ b/pixi.toml @@ -0,0 +1,24 @@ +[project] +authors = ["Adrian Seyboldt "] +channels = ["conda-forge"] +description = "Add a short description here" +name = "nuts-py" +platforms = ["linux-64"] +version = "0.1.0" + +[tasks] +test = "pytest" +develop = "maturin develop --release" + +[dependencies] +python = ">=3.12.7,<3.13" +pymc = ">=5.18.0,<5.19" +numba = ">=0.60.0,<0.61" +pytest = ">=8.3.3,<9" +maturin = ">=1.7.4,<2" +pip = ">=24.3.1,<25" +jax = ">=0.4.34,<0.5" + +[pypi-dependencies] +bridgestan = ">=2.5.0, <3" +flowjax = { git = "https://github.com/aseyboldt/flowjax.git", rev = "1c282f2ded78e81c7ce6a96f61523a9f18bf8edc" } From 2abcb05a7358869447c23ca6012777b54bc963ac Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Fri, 15 Nov 2024 13:32:16 +0100 Subject: [PATCH 15/55] Expose batch size --- pixi.lock | 1141 +++++++++++++++++++++------- pixi.toml | 12 +- python/nutpie/transform_adapter.py | 6 +- 3 files changed, 903 insertions(+), 256 deletions(-) diff --git a/pixi.lock b/pixi.lock index 745d684..0190177 100644 --- a/pixi.lock +++ b/pixi.lock @@ -10,6 +10,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/arviz-0.20.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-2.4.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.43-h4bf12b8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.43-h4852527_2.conda @@ -27,11 +28,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cons-0.4.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py312h68727a3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.8-py312h2ec8cdc_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/etuples-0.3.9-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 @@ -40,7 +45,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.54.1-py312h178313f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.55.0-py312h178313f_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-13.3.0-h9576a4e_1.conda @@ -61,8 +66,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jax-0.4.34-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/jaxlib-0.4.34-cpu_py312haec0345_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-8.29.0-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-he073ed8_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py312h68727a3_0.conda @@ -70,7 +78,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-25_linux64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda @@ -92,7 +99,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.65.5-hf5c653b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.1-default_hecaa2ac_1000.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda @@ -103,10 +109,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.27.5-h5b01275_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.4-hc0ffecb_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-13.3.0-heb74ff8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda @@ -124,37 +129,45 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/logical-unification-0.4.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py312hd3ec401_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/maturin-1.7.4-py312h6ab59e4_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/minikanren-1.0.3-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-service-2.4.2-py312hf224ee7_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ml_dtypes-0.5.0-py312hf9745cd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/multipledispatch-0.6.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numba-0.60.0-py312h83e6fd3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.28-pthreads_h6ec200e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opt-einsum-3.4.0-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py312hf9745cd_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.54.0-h4c5309f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.1-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-py_1003.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.0.0-py312h7b63e92_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.48-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.0-py312h66e93f0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pymc-5.18.0-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pymc-base-5.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pymc-5.18.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pymc-base-5.18.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytensor-2.25.5-py312h97902ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytensor-base-2.25.5-py312h25a0e75_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytensor-2.26.2-py312h97902ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytensor-base-2.26.2-py312h25a0e75_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.7-hc5c86c4_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda @@ -162,23 +175,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.0-py312hbf22597_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h77b4e00_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py312h62794b6_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.4-py312hc0a28a1_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h4a8ded7_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-h84d6215_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.1.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py312h66e93f0_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py312h66e93f0_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2024.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-einstats-0.8.0-pyhd8ed1ab_0.conda @@ -191,21 +211,43 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2024.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda - pypi: https://files.pythonhosted.org/packages/a2/ad/e0d3c824784ff121c03cc031f944bc7e139a8f1870ffd2845cc2dd76f6c4/absl_py-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/02/c8/542c1f9513136b431b101d06fb547e94d3ebc1d33740c3024315b55d4ada/bridgestan-2.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/16/92/92a76dc2ff3a12e69ba94e7e05168d37d0345fa08c87e1fe24d0c2a42223/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/46/dd/c1ff2eb8fbf95a8ca804abb1cc3ce70b283ee7b4bc653c3abac245670400/chex-0.1.87-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/59/f189b03d743364a350c972b89fe08a6db5bbbdc5f1ea6b604b3eee0a7967/dllist-1.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/15/9f/3be7f03bf66c8d7d2956b727d984595e4af899f3c15ef2c653029008bf3b/equinox-0.11.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1f/e4/0826dfde2db3fb3a34954323a84d0e6b6fdbc7eb5278c84159c6d43290ac/etils-1.10.0-py3-none-any.whl - pypi: git+https://github.com/aseyboldt/flowjax.git@1c282f2ded78e81c7ce6a96f61523a9f18bf8edc + - pypi: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/62/20/6c57c50c0ccc645fea1895950f1e5cd02f961ee44b3ffe83617fa46b0c1d/jax-0.4.35-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/aa/f15ea857ad9bcff7a0c942dc570ca718b026cc0cc5c513525bb08cacf3c0/jax_cuda12_pjrt-0.4.35-py3-none-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/23/a1/781f98da41b9abf63a1468c5babbafa7b1bdb766c081386644a4034fbdef/jax_cuda12_plugin-0.4.35-cp312-cp312-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e7/0d/4faf839e3c8ce2a5b615df64427be3e870899c72c0ebfb5859348150aba1/jaxlib-0.4.34-cp312-cp312-manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/56/ae/220537f80eb82ae43a299de31edb2a91a28b8c5fb8046e9ff853ec7763cd/jaxtyping-0.2.34-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6f/d3/1321715a95e856d4ef4fba24e4351cf5e4c89d459ad132a8cba5fe257d72/ml_dtypes-0.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f3/e7/c186a31c234fce776436753bfef4807df7f9b4cb3eeff358fcfcbf64b547/nvidia_cublas_cu12-12.6.3.3-py3-none-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a5/24/120ee57b218d9952c379d1e026c4479c9ece9997a4fb46303611ee48f038/nvidia_cuda_cupti_cu12-12.6.80-py3-none-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/62/8f/cd3032281ba7bb531fe3159337af00c5c805fd6a31dc700f0715c8748c8c/nvidia_cuda_nvcc_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f0/62/65c05e161eeddbafeca24dc461f47de550d9fa8a7e04eb213e32b55cfd99/nvidia_cuda_runtime_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/2a/78/4535c9c7f859a64781e43c969a3a7e84c54634e319a996d43ef32ce46f83/nvidia_cudnn_cu12-9.5.1.17-py3-none-manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/60/de/99ec247a07ea40c969d904fc14f3a356b3e2a704121675b75c366b694ee1/nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9f/81/baba53585da791d043c10084cf9553e074548408e04ae884cfe9193bd484/nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/43/ac/64c4316ba163e8217a99680c7605f779accffc6a4bcd0c778c12948d3707/nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ed/1f/6482380ec8dcec4894e7503490fc536d846b0d59694acad9cf99f27d0e7d/nvidia_nccl_cu12-2.23.4-py3-none-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/fe/e4/486de766851d58699bcfeb3ba6a3beb4d89c3809f75b9d423b9508a8760f/nvidia_nvjitlink_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/24/28d0bb21600a78e46754947333ec9a297044af884d360092eb8561575fe9/optax-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/f8/7b1f5b84f84e43face7349ac2df23f0f75d36b5b4a1c1c0305edce82bcc8/paramax-0.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8f/4d/b72e0782abec07f3d8dabf24cf12673d26b173af2046eb4e67365c776ccf/posteriordb-0.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2b/78/57043611a16c655c8350b4c01b8d6abfb38cc2acb475238b62c2146186d7/tqdm-4.67.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9a/bb/d43e5c75054e53efce310e79d63df0ac3f25e34c926be5dffb7d283fb2a8/typeguard-2.13.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl packages: - kind: conda name: _libgcc_mutex @@ -269,6 +311,24 @@ packages: - pkg:pypi/arviz?source=hash-mapping size: 1473292 timestamp: 1727611803479 +- kind: conda + name: asttokens + version: 2.4.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/asttokens-2.4.1-pyhd8ed1ab_0.conda + sha256: 708168f026df19a0344983754d27d1f7b28bb21afc7b97a82f02c4798a3d2111 + md5: 5f25798dcefd8252ce5f9dc494d5f571 + depends: + - python >=3.5 + - six >=1.12.0 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/asttokens?source=hash-mapping + size: 28922 + timestamp: 1698341257884 - kind: conda name: atk-1.0 version: 2.38.0 @@ -565,6 +625,12 @@ packages: - pkg:pypi/certifi?source=hash-mapping size: 163752 timestamp: 1725278204397 +- kind: pypi + name: charset-normalizer + version: 3.4.0 + url: https://files.pythonhosted.org/packages/16/92/92a76dc2ff3a12e69ba94e7e05168d37d0345fa08c87e1fe24d0c2a42223/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15 + requires_python: '>=3.7.0' - kind: pypi name: chex version: 0.1.87 @@ -614,6 +680,24 @@ packages: - pkg:pypi/colorama?source=hash-mapping size: 25170 timestamp: 1666700778190 +- kind: conda + name: comm + version: 0.2.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_0.conda + sha256: e923acf02708a8a0b591f3bce4bdc11c8e63b73198b99b35fe6cd96bfb6a0dbe + md5: 948d84721b578d426294e17a02e24cbb + depends: + - python >=3.6 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/comm?source=hash-mapping + size: 12134 + timestamp: 1710320435158 - kind: conda name: cons version: 0.4.6 @@ -670,6 +754,43 @@ packages: - pkg:pypi/cycler?source=hash-mapping size: 13458 timestamp: 1696677888423 +- kind: conda + name: debugpy + version: 1.8.8 + build: py312h2ec8cdc_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.8-py312h2ec8cdc_0.conda + sha256: 9ffdc284d4c67ba9ab88d400fc55890aafba6a559268f2dc3ca5a1c58d1a7ab9 + md5: eb182854d81037c9cfd95b06aba22c06 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/debugpy?source=hash-mapping + size: 2661121 + timestamp: 1731045067784 +- kind: conda + name: decorator + version: 5.1.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_0.tar.bz2 + sha256: 328a6a379f9bdfd0230e51de291ce858e6479411ea4b0545fb377c71662ef3e2 + md5: 43afe5ab04e35e17ba28649471dd7364 + depends: + - python >=3.5 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/decorator?source=hash-mapping + size: 12072 + timestamp: 1641555714315 - kind: pypi name: dllist version: 1.2.0 @@ -797,6 +918,23 @@ packages: - pkg:pypi/exceptiongroup?source=hash-mapping size: 20418 timestamp: 1720869435725 +- kind: conda + name: executing + version: 2.1.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_0.conda + sha256: a52d7516e2e11d3eb10908e10d3eb3f8ef267fea99ed9b09d52d96c4db3441b8 + md5: d0441db20c827c11721889a241df1220 + depends: + - python >=2.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/executing?source=hash-mapping + size: 28337 + timestamp: 1725214501850 - kind: conda name: filelock version: 3.16.1 @@ -950,13 +1088,12 @@ packages: timestamp: 1566932280397 - kind: conda name: fonttools - version: 4.54.1 - build: py312h178313f_1 - build_number: 1 + version: 4.55.0 + build: py312h178313f_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.54.1-py312h178313f_1.conda - sha256: 45f405d6d1ef528226c20b681373db0bdb79cc70fec1e495003247b0d3d00140 - md5: bbbf5fa5cab622c33907bc8d7eeea9f7 + url: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.55.0-py312h178313f_0.conda + sha256: 2a8d4fe8968828584057f8b07f3e102e326d8ec08d0e30e4ecc21f35031239a0 + md5: f404f4fb99ccaea68b00c1cc64fc1e68 depends: - __glibc >=2.17,<3.0.a0 - brotli @@ -969,8 +1106,8 @@ packages: license_family: MIT purls: - pkg:pypi/fonttools?source=hash-mapping - size: 2827447 - timestamp: 1729530553018 + size: 2843090 + timestamp: 1731643626471 - kind: conda name: freetype version: 2.12.1 @@ -1238,6 +1375,7 @@ packages: - packaging - python >=3.9 license: BSD-3-Clause + license_family: BSD purls: - pkg:pypi/h5netcdf?source=hash-mapping size: 47177 @@ -1328,6 +1466,17 @@ packages: purls: [] size: 12129203 timestamp: 1720853576813 +- kind: pypi + name: idna + version: '3.10' + url: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl + sha256: 946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3 + requires_dist: + - ruff>=0.6.2 ; extra == 'all' + - mypy>=1.11.2 ; extra == 'all' + - pytest>=8.3.2 ; extra == 'all' + - flake8>=7.1.1 ; extra == 'all' + requires_python: '>=3.6' - kind: conda name: importlib-metadata version: 8.5.0 @@ -1364,60 +1513,127 @@ packages: size: 11101 timestamp: 1673103208955 - kind: conda - name: jax - version: 0.4.34 - build: pyhd8ed1ab_0 + name: ipykernel + version: 6.29.5 + build: pyh3099207_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda + sha256: 33cfd339bb4efac56edf93474b37ddc049e08b1b4930cf036c893cc1f5a1f32a + md5: b40131ab6a36ac2c09b7c57d4d3fbf99 + depends: + - __linux + - comm >=0.1.1 + - debugpy >=1.6.5 + - ipython >=7.23.1 + - jupyter_client >=6.1.12 + - jupyter_core >=4.12,!=5.0.* + - matplotlib-inline >=0.1 + - nest-asyncio + - packaging + - psutil + - python >=3.8 + - pyzmq >=24 + - tornado >=6.1 + - traitlets >=5.4.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/ipykernel?source=hash-mapping + size: 119084 + timestamp: 1719845605084 +- kind: conda + name: ipython + version: 8.29.0 + build: pyh707e725_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/jax-0.4.34-pyhd8ed1ab_0.conda - sha256: da3880afc35042b92e0ad214beee372e41162da374dfaa8b1164db1dcee671b2 - md5: f0d3c57355acf3f06d93672e57c0c1e8 + url: https://conda.anaconda.org/conda-forge/noarch/ipython-8.29.0-pyh707e725_0.conda + sha256: 606723272a208cca1036852e04fbb61741b78451784746e75edd1becb70347d2 + md5: 56db21d7d51410fcfbfeca3d1a6b4269 depends: - - importlib-metadata >=4.6 - - jaxlib >=0.4.34,<=0.4.34 - - ml_dtypes >=0.2.0 - - numpy >=1.26 - - opt-einsum + - __unix + - decorator + - exceptiongroup + - jedi >=0.16 + - matplotlib-inline + - pexpect >4.3 + - pickleshare + - prompt-toolkit >=3.0.41,<3.1.0 + - pygments >=2.4.0 - python >=3.10 - - scipy >=1.11.1 - constrains: - - cudnn >=9.2.1.18 - license: Apache-2.0 - license_family: APACHE + - stack_data + - traitlets >=5.13.0 + - typing_extensions >=4.6 + license: BSD-3-Clause + license_family: BSD purls: - - pkg:pypi/jax?source=hash-mapping - size: 1421248 - timestamp: 1729336456855 -- kind: conda + - pkg:pypi/ipython?source=compressed-mapping + size: 599356 + timestamp: 1729866495921 +- kind: pypi + name: jax + version: 0.4.35 + url: https://files.pythonhosted.org/packages/62/20/6c57c50c0ccc645fea1895950f1e5cd02f961ee44b3ffe83617fa46b0c1d/jax-0.4.35-py3-none-any.whl + sha256: fa99e909a31424abfec750019a6dd36f6acc18a6e7d40e2c0086b932cc351325 + requires_dist: + - jaxlib>=0.4.34,<=0.4.35 + - ml-dtypes>=0.4.0 + - numpy>=1.24 + - opt-einsum + - scipy>=1.10 + - numpy>=1.26.0 ; python_full_version >= '3.12' + - scipy>=1.11.1 ; python_full_version >= '3.12' + - jaxlib==0.4.34 ; extra == 'ci' + - jaxlib==0.4.34 ; extra == 'cuda' + - jax-cuda12-plugin[with-cuda]>=0.4.34,<=0.4.35 ; extra == 'cuda' + - jaxlib==0.4.34 ; extra == 'cuda12' + - jax-cuda12-plugin[with-cuda]>=0.4.34,<=0.4.35 ; extra == 'cuda12' + - jaxlib==0.4.34 ; extra == 'cuda12-local' + - jax-cuda12-plugin==0.4.34 ; extra == 'cuda12-local' + - jaxlib==0.4.34 ; extra == 'cuda12-pip' + - jax-cuda12-plugin[with-cuda]>=0.4.34,<=0.4.35 ; extra == 'cuda12-pip' + - kubernetes ; extra == 'k8s' + - jaxlib==0.4.34 ; extra == 'minimum-jaxlib' + - jaxlib>=0.4.34,<=0.4.35 ; extra == 'tpu' + - libtpu-nightly==0.1.dev20241010+nightly.cleanup ; extra == 'tpu' + - libtpu==0.0.2 ; extra == 'tpu' + - requests ; extra == 'tpu' + requires_python: '>=3.10' +- kind: pypi + name: jax-cuda12-pjrt + version: 0.4.35 + url: https://files.pythonhosted.org/packages/d7/aa/f15ea857ad9bcff7a0c942dc570ca718b026cc0cc5c513525bb08cacf3c0/jax_cuda12_pjrt-0.4.35-py3-none-manylinux2014_x86_64.whl + sha256: 0ffe7e1ba65659bd5738c2cc5addaf0a56205d2188eec5da194b63c068e1fdd2 +- kind: pypi + name: jax-cuda12-plugin + version: 0.4.35 + url: https://files.pythonhosted.org/packages/23/a1/781f98da41b9abf63a1468c5babbafa7b1bdb766c081386644a4034fbdef/jax_cuda12_plugin-0.4.35-cp312-cp312-manylinux2014_x86_64.whl + sha256: 80aa5e628e8e9dd4f89b767f73900152033c3bf6d5f49dc2081e93f9bac1c9dc + requires_dist: + - jax-cuda12-pjrt==0.4.35 + - nvidia-cublas-cu12>=12.1.3.1 ; extra == 'with-cuda' + - nvidia-cuda-cupti-cu12>=12.1.105 ; extra == 'with-cuda' + - nvidia-cuda-nvcc-cu12>=12.1.105 ; extra == 'with-cuda' + - nvidia-cuda-runtime-cu12>=12.1.105 ; extra == 'with-cuda' + - nvidia-cudnn-cu12>=9.1,<10.0 ; extra == 'with-cuda' + - nvidia-cufft-cu12>=11.0.2.54 ; extra == 'with-cuda' + - nvidia-cusolver-cu12>=11.4.5.107 ; extra == 'with-cuda' + - nvidia-cusparse-cu12>=12.1.0.106 ; extra == 'with-cuda' + - nvidia-nccl-cu12>=2.18.1 ; extra == 'with-cuda' + - nvidia-nvjitlink-cu12>=12.1.105 ; extra == 'with-cuda' + requires_python: '>=3.10' +- kind: pypi name: jaxlib version: 0.4.34 - build: cpu_py312haec0345_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/jaxlib-0.4.34-cpu_py312haec0345_0.conda - sha256: 8e2dce1d39ccb4e6883444f71b7155168c0612d9d086b58616578448aeb33afe - md5: 08f587f0f6505671c7715163e18b6f3a - depends: - - __glibc >=2.17,<3.0.a0 - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libgcc >=13 - - libgrpc >=1.65.5,<1.66.0a0 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - - ml_dtypes >=0.2.0 - - numpy >=1.19,<3 - - openssl >=3.3.2,<4.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - scipy >=1.9 - constrains: - - jax >=0.4.34 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/jaxlib?source=hash-mapping - size: 57258872 - timestamp: 1729096396952 + url: https://files.pythonhosted.org/packages/e7/0d/4faf839e3c8ce2a5b615df64427be3e870899c72c0ebfb5859348150aba1/jaxlib-0.4.34-cp312-cp312-manylinux2014_x86_64.whl + sha256: 48272e9034ff868d4328cf0055a07882fd2be93f59dfb6283af7de491f9d1290 + requires_dist: + - scipy>=1.10 + - numpy>=1.24 + - ml-dtypes>=0.2.0 + - scipy>=1.11.1 ; python_full_version >= '3.12' + requires_python: '>=3.10' - kind: pypi name: jaxtyping version: 0.2.34 @@ -1426,6 +1642,67 @@ packages: requires_dist: - typeguard==2.13.3 requires_python: ~=3.9 +- kind: conda + name: jedi + version: 0.19.2 + build: pyhff2d567_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhff2d567_0.conda + sha256: d37dad14c00d06d33bfb99c378d0abd7645224a9491c433af5028f24863341ab + md5: 11ead81b00e0f7cc901fceb7ccfb92c1 + depends: + - parso >=0.8.3,<0.9.0 + - python >=3.9 + license: Apache-2.0 AND MIT + purls: + - pkg:pypi/jedi?source=hash-mapping + size: 842916 + timestamp: 1731317305873 +- kind: conda + name: jupyter_client + version: 8.6.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_0.conda + sha256: 4419c85e209a715f551a5c9bead746f29ee9d0fc41e772a76db3868622795671 + md5: a14218cfb29662b4a19ceb04e93e298e + depends: + - importlib-metadata >=4.8.3 + - jupyter_core >=4.12,!=5.0.* + - python >=3.8 + - python-dateutil >=2.8.2 + - pyzmq >=23.0 + - tornado >=6.2 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-client?source=hash-mapping + size: 106055 + timestamp: 1726610805505 +- kind: conda + name: jupyter_core + version: 5.7.2 + build: pyh31011fe_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + sha256: 732b1e8536bc22a5a174baa79842d79db2f4956d90293dd82dc1b3f6099bcccd + md5: 0a2980dada0dd7fd0998f0342308b1b1 + depends: + - __unix + - platformdirs >=2.5 + - python >=3.8 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyter-core?source=hash-mapping + size: 57671 + timestamp: 1727163547058 - kind: conda name: kernel-headers_linux-64 version: 3.10.0 @@ -1548,27 +1825,6 @@ packages: purls: [] size: 281798 timestamp: 1657977462600 -- kind: conda - name: libabseil - version: '20240722.0' - build: cxx17_h5888daf_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240722.0-cxx17_h5888daf_1.conda - sha256: 8f91429091183c26950f1e7ffa730e8632f0627ba35d2fccd71df31628c9b4e5 - md5: e1f604644fe8d78e22660e2fec6756bc - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libstdcxx >=13 - constrains: - - libabseil-static =20240722.0=cxx17* - - abseil-cpp =20240722.0 - license: Apache-2.0 - license_family: Apache - purls: [] - size: 1310521 - timestamp: 1727295454064 - kind: conda name: libaec version: 1.1.3 @@ -1954,33 +2210,6 @@ packages: purls: [] size: 460992 timestamp: 1729027639220 -- kind: conda - name: libgrpc - version: 1.65.5 - build: hf5c653b_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.65.5-hf5c653b_0.conda - sha256: d279abd46262e817c7a00aeb4df9b5ed4de38130130b248e2c50875e982f30fa - md5: 3b0048cabc6815a4d8874a0240519d32 - depends: - - __glibc >=2.17,<3.0.a0 - - c-ares >=1.32.3,<2.0a0 - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libgcc >=13 - - libprotobuf >=5.27.5,<5.27.6.0a0 - - libre2-11 >=2023.9.1 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.3.2,<4.0a0 - - re2 - constrains: - - grpc-cpp =1.65.5 - license: Apache-2.0 - license_family: APACHE - purls: [] - size: 7229891 - timestamp: 1727200905306 - kind: conda name: libhwloc version: 2.11.1 @@ -2164,49 +2393,6 @@ packages: purls: [] size: 290661 timestamp: 1726234747153 -- kind: conda - name: libprotobuf - version: 5.27.5 - build: h5b01275_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-5.27.5-h5b01275_2.conda - sha256: 79ac9726cd0a1cb1ba335f7fc7ccac5f679a66d71d9553ca88a805b8787d55ce - md5: 66ed3107adbdfc25ba70454ba11e6d1e - depends: - - __glibc >=2.17,<3.0.a0 - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libgcc >=13 - - libstdcxx >=13 - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 2940269 - timestamp: 1727424395109 -- kind: conda - name: libre2-11 - version: 2024.07.02 - build: hbbce691_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2024.07.02-hbbce691_1.conda - sha256: f8ad6a4f6d4fd54ebe3e5e712a01e663222fc57f49d16b6b8b10c30990dafb8f - md5: 2124de47357b7a516c0a3efd8f88c143 - depends: - - __glibc >=2.17,<3.0.a0 - - libabseil * cxx17* - - libabseil >=20240722.0,<20240723.0a0 - - libgcc >=13 - - libstdcxx >=13 - constrains: - - re2 2024.07.02.* - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 211096 - timestamp: 1728778964655 - kind: conda name: librsvg version: 2.58.4 @@ -2249,6 +2435,20 @@ packages: purls: [] size: 4133922 timestamp: 1724801171589 +- kind: conda + name: libsodium + version: 1.0.20 + build: h4ab18f5_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 + md5: a587892d3c13b6621a6091be690dbca2 + depends: + - libgcc-ng >=12 + license: ISC + purls: [] + size: 205978 + timestamp: 1716828628198 - kind: conda name: libsqlite version: 3.47.0 @@ -2573,6 +2773,24 @@ packages: - pkg:pypi/matplotlib?source=hash-mapping size: 7965171 timestamp: 1731025360821 +- kind: conda + name: matplotlib-inline + version: 0.1.7 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_0.conda + sha256: 7ea68676ea35fbb095420bbcc1c82c4767b8be7bb56abb6989b7f89d957a3bab + md5: 779345c95648be40d22aaa89de7d4254 + depends: + - python >=3.6 + - traitlets + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/matplotlib-inline?source=hash-mapping + size: 14599 + timestamp: 1713250613726 - kind: conda name: maturin version: 1.7.4 @@ -2672,26 +2890,23 @@ packages: - pkg:pypi/mkl-service?source=hash-mapping size: 73420 timestamp: 1728843500808 -- kind: conda - name: ml_dtypes +- kind: pypi + name: ml-dtypes version: 0.5.0 - build: py312hf9745cd_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ml_dtypes-0.5.0-py312hf9745cd_0.conda - sha256: 559c14640ce8e3f2270da6130ba50ae624f3db56176fad29a5436b2dec3fc3b2 - md5: 8ca779f3f30b00181aeee820fe8b22d5 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libstdcxx >=13 - - numpy >=1.19,<3 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: MPL-2.0 AND Apache-2.0 - purls: - - pkg:pypi/ml-dtypes?source=hash-mapping - size: 290054 - timestamp: 1726376440408 + url: https://files.pythonhosted.org/packages/6f/d3/1321715a95e856d4ef4fba24e4351cf5e4c89d459ad132a8cba5fe257d72/ml_dtypes-0.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: a38df8df61194aeaae1ab7579075779b4ad32cd1cffd012c28be227fa7f2a70a + requires_dist: + - numpy>=1.21 + - numpy>=1.21.2 ; python_full_version >= '3.10' + - numpy>=1.23.3 ; python_full_version >= '3.11' + - numpy>=1.26.0 ; python_full_version >= '3.12' + - numpy>=2.1.0 ; python_full_version >= '3.13' + - absl-py ; extra == 'dev' + - pytest ; extra == 'dev' + - pytest-xdist ; extra == 'dev' + - pylint>=2.6.0 ; extra == 'dev' + - pyink ; extra == 'dev' + requires_python: '>=3.9' - kind: conda name: multipledispatch version: 0.6.0 @@ -2744,6 +2959,23 @@ packages: purls: [] size: 889086 timestamp: 1724658547447 +- kind: conda + name: nest-asyncio + version: 1.6.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_0.conda + sha256: 30db21d1f7e59b3408b831a7e0417b83b53ee6223afae56482c5f26da3ceb49a + md5: 6598c056f64dc8800d40add25e4e2c34 + depends: + - python >=3.5 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/nest-asyncio?source=hash-mapping + size: 11638 + timestamp: 1705850780510 - kind: conda name: numba version: 0.60.0 @@ -2798,6 +3030,76 @@ packages: - pkg:pypi/numpy?source=hash-mapping size: 7484186 timestamp: 1707225809722 +- kind: pypi + name: nvidia-cublas-cu12 + version: 12.6.3.3 + url: https://files.pythonhosted.org/packages/f3/e7/c186a31c234fce776436753bfef4807df7f9b4cb3eeff358fcfcbf64b547/nvidia_cublas_cu12-12.6.3.3-py3-none-manylinux2014_x86_64.whl + sha256: f33fb68e101d99470c82d17f92a0dd9f74de2a21685c217f4716cdd63b1316eb + requires_python: '>=3' +- kind: pypi + name: nvidia-cuda-cupti-cu12 + version: 12.6.80 + url: https://files.pythonhosted.org/packages/a5/24/120ee57b218d9952c379d1e026c4479c9ece9997a4fb46303611ee48f038/nvidia_cuda_cupti_cu12-12.6.80-py3-none-manylinux2014_x86_64.whl + sha256: a3eff6cdfcc6a4c35db968a06fcadb061cbc7d6dde548609a941ff8701b98b73 + requires_python: '>=3' +- kind: pypi + name: nvidia-cuda-nvcc-cu12 + version: 12.6.77 + url: https://files.pythonhosted.org/packages/62/8f/cd3032281ba7bb531fe3159337af00c5c805fd6a31dc700f0715c8748c8c/nvidia_cuda_nvcc_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl + sha256: b66bb5dd6b8ae62262586691977d3b4a425e91db61b4b9bc2f6b42bcd4154b96 + requires_python: '>=3' +- kind: pypi + name: nvidia-cuda-runtime-cu12 + version: 12.6.77 + url: https://files.pythonhosted.org/packages/f0/62/65c05e161eeddbafeca24dc461f47de550d9fa8a7e04eb213e32b55cfd99/nvidia_cuda_runtime_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl + sha256: a84d15d5e1da416dd4774cb42edf5e954a3e60cc945698dc1d5be02321c44dc8 + requires_python: '>=3' +- kind: pypi + name: nvidia-cudnn-cu12 + version: 9.5.1.17 + url: https://files.pythonhosted.org/packages/2a/78/4535c9c7f859a64781e43c969a3a7e84c54634e319a996d43ef32ce46f83/nvidia_cudnn_cu12-9.5.1.17-py3-none-manylinux_2_28_x86_64.whl + sha256: 30ac3869f6db17d170e0e556dd6cc5eee02647abc31ca856634d5a40f82c15b2 + requires_dist: + - nvidia-cublas-cu12 + requires_python: '>=3' +- kind: pypi + name: nvidia-cufft-cu12 + version: 11.3.0.4 + url: https://files.pythonhosted.org/packages/60/de/99ec247a07ea40c969d904fc14f3a356b3e2a704121675b75c366b694ee1/nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_x86_64.whl + sha256: 768160ac89f6f7b459bee747e8d175dbf53619cfe74b2a5636264163138013ca + requires_dist: + - nvidia-nvjitlink-cu12 + requires_python: '>=3' +- kind: pypi + name: nvidia-cusolver-cu12 + version: 11.7.1.2 + url: https://files.pythonhosted.org/packages/9f/81/baba53585da791d043c10084cf9553e074548408e04ae884cfe9193bd484/nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux2014_x86_64.whl + sha256: 6cf28f17f64107a0c4d7802be5ff5537b2130bfc112f25d5a30df227058ca0e6 + requires_dist: + - nvidia-cublas-cu12 + - nvidia-nvjitlink-cu12 + - nvidia-cusparse-cu12 + requires_python: '>=3' +- kind: pypi + name: nvidia-cusparse-cu12 + version: 12.5.4.2 + url: https://files.pythonhosted.org/packages/43/ac/64c4316ba163e8217a99680c7605f779accffc6a4bcd0c778c12948d3707/nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_x86_64.whl + sha256: 23749a6571191a215cb74d1cdbff4a86e7b19f1200c071b3fcf844a5bea23a2f + requires_dist: + - nvidia-nvjitlink-cu12 + requires_python: '>=3' +- kind: pypi + name: nvidia-nccl-cu12 + version: 2.23.4 + url: https://files.pythonhosted.org/packages/ed/1f/6482380ec8dcec4894e7503490fc536d846b0d59694acad9cf99f27d0e7d/nvidia_nccl_cu12-2.23.4-py3-none-manylinux2014_x86_64.whl + sha256: b097258d9aab2fa9f686e33c6fe40ae57b27df60cedbd15d139701bb5509e0c1 + requires_python: '>=3' +- kind: pypi + name: nvidia-nvjitlink-cu12 + version: 12.6.77 + url: https://files.pythonhosted.org/packages/fe/e4/486de766851d58699bcfeb3ba6a3beb4d89c3809f75b9d423b9508a8760f/nvidia_nvjitlink_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl + sha256: 9ae346d16203ae4ea513be416495167a0101d33d2d14935aa9c1829a3fb45142 + requires_python: '>=3' - kind: conda name: openblas version: 0.3.28 @@ -2850,39 +3152,12 @@ packages: purls: [] size: 2947466 timestamp: 1731377666602 -- kind: conda +- kind: pypi name: opt-einsum version: 3.4.0 - build: hd8ed1ab_0 - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/opt-einsum-3.4.0-hd8ed1ab_0.conda - sha256: 583cb8748a9821e301a404806da0de62e8ba01607feecf12c0ef06d8bc77077e - md5: 73d0b1d98a9030bdefe712648af583a0 - depends: - - opt_einsum >=3.4.0,<3.4.1.0a0 - license: MIT - license_family: MIT - purls: [] - size: 6470 - timestamp: 1727392480705 -- kind: conda - name: opt_einsum - version: 3.4.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/opt_einsum-3.4.0-pyhd8ed1ab_0.conda - sha256: 69e979dfea8b8d82e51684f77d189e1d00cdcbc5c85868415b879719882e2df4 - md5: ff80afedd76f436acddbd1e14f5c2909 - depends: - - python >=3.8 - license: MIT - license_family: MIT - purls: - - pkg:pypi/opt-einsum?source=hash-mapping - size: 62487 - timestamp: 1727392477628 + url: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl + sha256: 69bb92469f86a1565195ece4ac0323943e83477171b91d24c35afe028a90d7cd + requires_python: '>=3.8' - kind: pypi name: optax version: 0.2.4 @@ -3006,6 +3281,41 @@ packages: - sphinx-book-theme ; extra == 'dev' - sphinx-copybutton ; extra == 'dev' requires_python: '>=3.10' +- kind: conda + name: parso + version: 0.8.4 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_0.conda + sha256: bfe404eebb930cc41782d34f8fc04c0388ea692eeebe2c5fc28df8ec8d4d61ae + md5: 81534b420deb77da8833f2289b8d47ac + depends: + - python >=3.6 + license: MIT + license_family: MIT + purls: + - pkg:pypi/parso?source=hash-mapping + size: 75191 + timestamp: 1712320447201 +- kind: conda + name: patsy + version: 1.0.1 + build: pyhff2d567_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.1-pyhff2d567_0.conda + sha256: f1ec4bb1e70f18518f70df64728b162d0d5ef3c0ed68296d913c27f5bab7a84b + md5: a97b9c7586cedcf4a0a158ef3479975c + depends: + - numpy >=1.4.0 + - python >=3.9 + license: BSD-2-Clause AND PSF-2.0 + license_family: BSD + purls: + - pkg:pypi/patsy?source=hash-mapping + size: 186599 + timestamp: 1731432296481 - kind: conda name: pcre2 version: '10.44' @@ -3025,6 +3335,41 @@ packages: purls: [] size: 952308 timestamp: 1723488734144 +- kind: conda + name: pexpect + version: 4.9.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda + sha256: 90a09d134a4a43911b716d4d6eb9d169238aff2349056f7323d9db613812667e + md5: 629f3203c99b32e0988910c93e77f3b6 + depends: + - ptyprocess >=0.5 + - python >=3.7 + license: ISC + purls: + - pkg:pypi/pexpect?source=hash-mapping + size: 53600 + timestamp: 1706113273252 +- kind: conda + name: pickleshare + version: 0.7.5 + build: py_1003 + build_number: 1003 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-py_1003.tar.bz2 + sha256: a1ed1a094dd0d1b94a09ed85c283a0eb28943f2e6f22161fb45e128d35229738 + md5: 415f0ebb6198cc2801c73438a9fb5761 + depends: + - python >=3 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pickleshare?source=hash-mapping + size: 9332 + timestamp: 1602536313357 - kind: conda name: pillow version: 11.0.0 @@ -3087,6 +3432,23 @@ packages: purls: [] size: 386826 timestamp: 1706549500138 +- kind: conda + name: platformdirs + version: 4.3.6 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda + sha256: c81bdeadc4adcda216b2c7b373f0335f5c78cc480d1d55d10f21823590d7e46f + md5: fd8f2b18b65bbf62e8f653100690c8d2 + depends: + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/platformdirs?source=hash-mapping + size: 20625 + timestamp: 1726613611845 - kind: conda name: pluggy version: 1.5.0 @@ -3104,6 +3466,52 @@ packages: - pkg:pypi/pluggy?source=hash-mapping size: 23815 timestamp: 1713667175451 +- kind: pypi + name: posteriordb + version: 0.2.0 + url: https://files.pythonhosted.org/packages/8f/4d/b72e0782abec07f3d8dabf24cf12673d26b173af2046eb4e67365c776ccf/posteriordb-0.2.0-py3-none-any.whl + sha256: b6d6f3a349d34db6d4a68da899c818a95e5824c5e23824fc0ebe422f4bd6bac1 + requires_dist: + - requests +- kind: conda + name: prompt-toolkit + version: 3.0.48 + build: pyha770c72_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.48-pyha770c72_0.conda + sha256: 44e4e6108d425a666856a52d1523e5d70890256a8920bb0dcd3d55cc750f3207 + md5: 4c05134c48b6a74f33bbb9938e4a115e + depends: + - python >=3.7 + - wcwidth + constrains: + - prompt_toolkit 3.0.48 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/prompt-toolkit?source=hash-mapping + size: 270271 + timestamp: 1727341744544 +- kind: conda + name: psutil + version: 6.1.0 + build: py312h66e93f0_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.0-py312h66e93f0_0.conda + sha256: 0f309b435174e037d5cfe5ed26c1c5ad8152c68cfe61af17709ec31ec3d9f096 + md5: 0524eb91d3d78d76d671c6e3cd7cee82 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/psutil?source=hash-mapping + size: 488462 + timestamp: 1729847159916 - kind: conda name: pthread-stubs version: '0.4' @@ -3121,6 +3529,39 @@ packages: purls: [] size: 8252 timestamp: 1726802366959 +- kind: conda + name: ptyprocess + version: 0.7.0 + build: pyhd3deb0d_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2 + sha256: fb31e006a25eb2e18f3440eb8d17be44c8ccfae559499199f73584566d0a444a + md5: 359eeb6536da0e687af562ed265ec263 + depends: + - python + license: ISC + purls: + - pkg:pypi/ptyprocess?source=hash-mapping + size: 16546 + timestamp: 1609419417991 +- kind: conda + name: pure_eval + version: 0.2.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_0.conda + sha256: dcfcb3cee1ae0a89729601582cc3edea20ba13c9493967a03a693c67567af0c8 + md5: 0f051f09d992e0d08941706ad519ee0e + depends: + - python >=3.5 + license: MIT + license_family: MIT + purls: + - pkg:pypi/pure-eval?source=hash-mapping + size: 16551 + timestamp: 1721585805256 - kind: conda name: pygments version: 2.18.0 @@ -3140,38 +3581,38 @@ packages: timestamp: 1714846885370 - kind: conda name: pymc - version: 5.18.0 + version: 5.18.1 build: hd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pymc-5.18.0-hd8ed1ab_0.conda - sha256: e267c5030bf0a973df42229d7a19541c107a2c4ab268078272e9638bf5509ed5 - md5: 60850870f8a9d2ab816b07bb5af11993 + url: https://conda.anaconda.org/conda-forge/noarch/pymc-5.18.1-hd8ed1ab_0.conda + sha256: 8f2906c978c820975f6840979758bbc90a331374ab2de03df3d19443b36b5c21 + md5: a1b8f92315733a0f3b4e64c6e9aa8396 depends: - - pymc-base 5.18.0 pyhd8ed1ab_0 + - pymc-base 5.18.1 pyhd8ed1ab_0 - pytensor - python-graphviz license: Apache-2.0 license_family: Apache purls: [] - size: 11587 - timestamp: 1730727968012 + size: 11601 + timestamp: 1731621750738 - kind: conda name: pymc-base - version: 5.18.0 + version: 5.18.1 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pymc-base-5.18.0-pyhd8ed1ab_0.conda - sha256: 5d4f41413ac24698b64a78fd65dfe29562d9bebec4570cd1e69fdbe85a7b8615 - md5: 0aa547a4010d7984d0cac353bde62e97 + url: https://conda.anaconda.org/conda-forge/noarch/pymc-base-5.18.1-pyhd8ed1ab_0.conda + sha256: df3d631671512750a13efdff69a44c15cc8320c60da0b1db5ff10a6f23b894b5 + md5: a25c15d03dd8cd876e468bb6484c20f9 depends: - arviz >=0.13.0 - cachetools >=4.2.1 - cloudpickle - numpy >=1.15.0 - pandas >=0.24.0 - - pytensor-base >=2.25.1,<2.26 + - pytensor-base >=2.26.1,<2.27 - python >=3.10 - rich >=13.7.1 - scipy >=1.4.1 @@ -3181,8 +3622,8 @@ packages: license_family: Apache purls: - pkg:pypi/pymc?source=hash-mapping - size: 333757 - timestamp: 1730727964625 + size: 334447 + timestamp: 1731621747231 - kind: conda name: pyparsing version: 3.2.0 @@ -3203,35 +3644,35 @@ packages: timestamp: 1728880549923 - kind: conda name: pytensor - version: 2.25.5 + version: 2.26.2 build: py312h97902ae_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pytensor-2.25.5-py312h97902ae_0.conda - sha256: 83a4750986bd6dab77ed1ac81e802047f46013afb8e9019d6624de4eae85b7dc - md5: 217442cd88537f0e8f4a6819f1823b0c + url: https://conda.anaconda.org/conda-forge/linux-64/pytensor-2.26.2-py312h97902ae_0.conda + sha256: 71e64be9e99bccab87ce38f1c1e3b36a58469e769a339cb36f2c099a82cb5554 + md5: 94864a4cad4702d26a93b78c1ef94246 depends: - blas - gcc_linux-64 13.* - gxx - gxx_linux-64 13.* - mkl-service - - pytensor-base 2.25.5 py312h25a0e75_0 + - pytensor-base 2.26.2 py312h25a0e75_0 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - sysroot_linux-64 2.17.* license: BSD-3-Clause license_family: BSD purls: [] - size: 9118 - timestamp: 1727981016362 + size: 9052 + timestamp: 1731337121115 - kind: conda name: pytensor-base - version: 2.25.5 + version: 2.26.2 build: py312h25a0e75_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pytensor-base-2.25.5-py312h25a0e75_0.conda - sha256: 3b4287dd0d9358ee76e0c55db596fe6d256ec48b1301c46984e62b7e0806aca3 - md5: 86ae2da8b1a044ee7f6a7d2ce0eba762 + url: https://conda.anaconda.org/conda-forge/linux-64/pytensor-base-2.26.2-py312h25a0e75_0.conda + sha256: 24a909310e051bdfec08375f34f4677db63e1de78f4a7502616483ec9076fe3a + md5: 469a1729bda15ace5ef46e22cb153796 depends: - __glibc >=2.17,<3.0.a0 - cons @@ -3250,8 +3691,8 @@ packages: license_family: BSD purls: - pkg:pypi/pytensor?source=hash-mapping - size: 2312179 - timestamp: 1727981002120 + size: 2313749 + timestamp: 1731337108392 - kind: conda name: pytest version: 8.3.3 @@ -3396,6 +3837,29 @@ packages: - pkg:pypi/pytz?source=hash-mapping size: 188538 timestamp: 1706886944988 +- kind: conda + name: pyzmq + version: 26.2.0 + build: py312hbf22597_3 + build_number: 3 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.0-py312hbf22597_3.conda + sha256: bc303f9b11e04a515f79cd5ad3bfa0e84b9dfec76552626d6263b38789fe6678 + md5: 746ce19f0829ec3e19c93007b1a224d3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zeromq >=4.3.5,<4.4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pyzmq?source=hash-mapping + size: 378126 + timestamp: 1728642454632 - kind: conda name: qhull version: '2020.2' @@ -3413,22 +3877,6 @@ packages: purls: [] size: 552937 timestamp: 1720813982144 -- kind: conda - name: re2 - version: 2024.07.02 - build: h77b4e00_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/re2-2024.07.02-h77b4e00_1.conda - sha256: c1721cb80f7201652fc9801f49c214c88aee835d957f2376e301bd40a8415742 - md5: 01093ff37c1b5e6bf9f17c0116747d11 - depends: - - libre2-11 2024.07.02 hbbce691_1 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 26665 - timestamp: 1728778975855 - kind: conda name: readline version: '8.2' @@ -3446,6 +3894,19 @@ packages: purls: [] size: 281456 timestamp: 1679532220005 +- kind: pypi + name: requests + version: 2.32.3 + url: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl + sha256: 70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 + requires_dist: + - charset-normalizer>=2,<4 + - idna>=2.5,<4 + - urllib3>=1.21.1,<3 + - certifi>=2017.4.17 + - pysocks>=1.5.6,!=1.5.7 ; extra == 'socks' + - chardet>=3.0.2,<6 ; extra == 'use-chardet-on-py3' + requires_python: '>=3.8' - kind: conda name: rich version: 13.9.4 @@ -3495,6 +3956,48 @@ packages: - pkg:pypi/scipy?source=hash-mapping size: 17622722 timestamp: 1729481826601 +- kind: conda + name: seaborn + version: 0.13.2 + build: hd8ed1ab_2 + build_number: 2 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_2.conda + sha256: 79943fbbf1fafbf969257989a7d88638c0c3e7b89a81a75c9347c28768dd6141 + md5: a79d8797f62715255308d92d3a91ef2e + depends: + - seaborn-base 0.13.2 pyhd8ed1ab_2 + - statsmodels >=0.12 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6996 + timestamp: 1714494772218 +- kind: conda + name: seaborn-base + version: 0.13.2 + build: pyhd8ed1ab_2 + build_number: 2 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_2.conda + sha256: 5de8b9e88a0f2daf58b07e3f144da26f894e9a20071304fa37329664eb2a29a7 + md5: b713b116feaf98acdba93ad4d7f90ca1 + depends: + - matplotlib-base >=3.4,!=3.6.1 + - numpy >=1.20,!=1.24.0 + - pandas >=1.2 + - python >=3.8 + - scipy >=1.7 + constrains: + - seaborn =0.13.2=*_2 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/seaborn?source=hash-mapping + size: 234550 + timestamp: 1714494767378 - kind: conda name: setuptools version: 75.3.0 @@ -3529,6 +4032,51 @@ packages: - pkg:pypi/six?source=hash-mapping size: 14259 timestamp: 1620240338595 +- kind: conda + name: stack_data + version: 0.6.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda + sha256: a58433e75229bec39f3be50c02efbe9b7083e53a1f31d8ee247564f370191eec + md5: e7df0fdd404616638df5ece6e69ba7af + depends: + - asttokens + - executing + - pure_eval + - python >=3.5 + license: MIT + license_family: MIT + purls: + - pkg:pypi/stack-data?source=hash-mapping + size: 26205 + timestamp: 1669632203115 +- kind: conda + name: statsmodels + version: 0.14.4 + build: py312hc0a28a1_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.4-py312hc0a28a1_0.conda + sha256: 6cc65ba902b32207e8a697b0e0408a28d6cc166be04f1882c40739a86a253d22 + md5: 97dc960f3d9911964d73c2cf240baea5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - numpy <3,>=1.22.3 + - numpy >=1.19,<3 + - packaging >=21.3 + - pandas !=2.1.0,>=1.4 + - patsy >=0.5.6 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - scipy !=1.9.2,>=1.8 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/statsmodels?source=hash-mapping + size: 12103203 + timestamp: 1727987129263 - kind: conda name: sysroot_linux-64 version: '2.17' @@ -3633,6 +4181,26 @@ packages: - pkg:pypi/toolz?source=hash-mapping size: 52623 timestamp: 1728059623353 +- kind: conda + name: tornado + version: 6.4.1 + build: py312h66e93f0_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py312h66e93f0_1.conda + sha256: c0c9cc7834e8f43702956afaa5af7b0639c4835c285108a43e6b91687ce53ab8 + md5: af648b62462794649066366af4ecd5b0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/tornado?source=hash-mapping + size: 837665 + timestamp: 1724956252424 - kind: pypi name: tqdm version: 4.67.0 @@ -3649,6 +4217,23 @@ packages: - slack-sdk ; extra == 'slack' - requests ; extra == 'telegram' requires_python: '>=3.7' +- kind: conda + name: traitlets + version: 5.14.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda + sha256: 8a64fa0f19022828513667c2c7176cfd125001f3f4b9bc00d33732e627dd2592 + md5: 3df84416a021220d8b5700c613af2dc5 + depends: + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/traitlets?source=hash-mapping + size: 110187 + timestamp: 1713535244513 - kind: pypi name: typeguard version: 2.13.3 @@ -3727,6 +4312,35 @@ packages: - pkg:pypi/unicodedata2?source=hash-mapping size: 368550 timestamp: 1729704685856 +- kind: pypi + name: urllib3 + version: 2.2.3 + url: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl + sha256: ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac + requires_dist: + - brotli>=1.0.9 ; platform_python_implementation == 'CPython' and extra == 'brotli' + - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'brotli' + - h2>=4,<5 ; extra == 'h2' + - pysocks>=1.5.6,!=1.5.7,<2.0 ; extra == 'socks' + - zstandard>=0.18.0 ; extra == 'zstd' + requires_python: '>=3.8' +- kind: conda + name: wcwidth + version: 0.2.13 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_0.conda + sha256: b6cd2fee7e728e620ec736d8dfee29c6c9e2adbd4e695a31f1d8f834a83e57e3 + md5: 68f0738df502a14213624b288c60c9ad + depends: + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/wcwidth?source=hash-mapping + size: 32709 + timestamp: 1704731373922 - kind: conda name: wheel version: 0.45.0 @@ -3959,6 +4573,25 @@ packages: purls: [] size: 418368 timestamp: 1660346797927 +- kind: conda + name: zeromq + version: 4.3.5 + build: h3b0a872_7 + build_number: 7 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + sha256: a4dc72c96848f764bb5a5176aa93dd1e9b9e52804137b99daeebba277b31ea10 + md5: 3947a35e916fcc6b9825449affbf4214 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.21.3,<1.22.0a0 + - libgcc >=13 + - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=13 + license: MPL-2.0 + purls: [] + size: 335400 + timestamp: 1731585026517 - kind: conda name: zipp version: 3.21.0 diff --git a/pixi.toml b/pixi.toml index 67b350d..21b62f6 100644 --- a/pixi.toml +++ b/pixi.toml @@ -17,8 +17,18 @@ numba = ">=0.60.0,<0.61" pytest = ">=8.3.3,<9" maturin = ">=1.7.4,<2" pip = ">=24.3.1,<25" -jax = ">=0.4.34,<0.5" +#jax = ">=0.4.34,<0.5" +ipykernel = ">=6.29.5,<7" +seaborn = ">=0.13.2,<0.14" +threadpoolctl = ">=3.5.0,<4" +# The jaxlib cuda build seems to be broken around version 0.4.34 +#jaxlib = { version = "*", build = "*cuda12*" } [pypi-dependencies] bridgestan = ">=2.5.0, <3" flowjax = { git = "https://github.com/aseyboldt/flowjax.git", rev = "1c282f2ded78e81c7ce6a96f61523a9f18bf8edc" } +posteriordb = ">=0.2.0, <0.3" +jax = { version = "==0.4.35", extras = ["cuda12"] } + +[system-requirements] +#cuda = "12" diff --git a/python/nutpie/transform_adapter.py b/python/nutpie/transform_adapter.py index e0e601b..dc0721c 100644 --- a/python/nutpie/transform_adapter.py +++ b/python/nutpie/transform_adapter.py @@ -11,6 +11,7 @@ def make_transform_adapter( scale_layer=False, untransformed_dim=None, zero_init=True, + batch_size=128, ): import traceback from functools import partial @@ -271,6 +272,7 @@ def __init__( learning_rate=1e-3, zero_init=True, untransformed_dim=None, + batch_size=128, ): self._logp_fn = logp_fn self._make_flow_fn = make_flow_fn @@ -283,6 +285,7 @@ def __init__( self._num_diag_windows = num_diag_windows self._zero_init = zero_init self._untransformed_dim = untransformed_dim + self._batch_size = batch_size try: self._bijection = make_flow_fn(seed, [position], [gradient], n_layers=0) except Exception as e: @@ -375,7 +378,7 @@ def update(self, seed, positions, gradients): points, show_progress=self._show_progress, optimizer=self._optimizer, - batch_size=128, + batch_size=self._batch_size, ) flow = flowjax.flows.Transformed( @@ -526,4 +529,5 @@ def inv_transform(self, position, gradient): learning_rate=learning_rate, zero_init=zero_init, untransformed_dim=untransformed_dim, + batch_size=batch_size, ) From 6f4c78424590846ef6f89a052eae2043f5649baf Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Wed, 20 Nov 2024 10:41:00 +0100 Subject: [PATCH 16/55] fix: Add lock around init_func --- src/pyfunc.rs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/pyfunc.rs b/src/pyfunc.rs index a6220a2..778b68e 100644 --- a/src/pyfunc.rs +++ b/src/pyfunc.rs @@ -1,4 +1,4 @@ -use std::sync::Arc; +use std::sync::{Arc, Mutex}; use anyhow::{anyhow, bail, Context, Result}; use arrow::{ @@ -76,7 +76,7 @@ impl PyVariable { pub struct PyModel { make_logp_func: Arc>, make_expand_func: Arc>, - init_point_func: Option>>, + init_point_func: Option>>>, variables: Arc>, transform_adapter: Option, ndim: usize, @@ -97,7 +97,7 @@ impl PyModel { Self { make_logp_func: Arc::new(make_logp_func), make_expand_func: Arc::new(make_expand_func), - init_point_func: init_point_func.map(|x| x.into()), + init_point_func: init_point_func.map(|x| Mutex::new(x).into()), variables: Arc::new(variables), ndim, transform_adapter: transform_adapter.map(PyTransformAdapt::new), @@ -619,6 +619,11 @@ impl Model for PyModel { let seed = rng.next_u64(); + // Acquire the init_func lock before we wait for the GIL + let init_func = init_func + .lock() + .expect("Could not acquire lock for init func"); + Python::with_gil(|py| { let init_point = init_func .call1(py, (seed,)) From bbed6386921365c56bc5f4a295fde3c7bb5fc20f Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Wed, 20 Nov 2024 16:29:25 +0100 Subject: [PATCH 17/55] Work on default normalizing flow --- python/nutpie/transform_adapter.py | 145 +++++++++++++++++++++++------ 1 file changed, 114 insertions(+), 31 deletions(-) diff --git a/python/nutpie/transform_adapter.py b/python/nutpie/transform_adapter.py index dc0721c..de3876b 100644 --- a/python/nutpie/transform_adapter.py +++ b/python/nutpie/transform_adapter.py @@ -8,10 +8,14 @@ def make_transform_adapter( num_layers=8, num_diag_windows=10, learning_rate=1e-3, - scale_layer=False, untransformed_dim=None, zero_init=True, batch_size=128, + reuse_opt_state=True, + max_patience=5, + householder_layer=True, + dct_layer=True, + gamma=None, ): import traceback from functools import partial @@ -27,6 +31,9 @@ def make_transform_adapter( from paramax import Parameterize, unwrap class FisherLoss: + def __init__(self, gamma=None): + self._gamma = gamma + @eqx.filter_jit def __call__( self, @@ -40,10 +47,15 @@ def __call__( flow = unwrap(eqx.combine(params, static, is_leaf=eqx.is_inexact_array)) def compute_loss(bijection, draw, grad): - draw, grad, _ = bijection.inverse_gradient_and_val( + draw, grad, logp = bijection.inverse_gradient_and_val( draw, grad, jnp.array(0.0) ) - return ((draw + grad) ** 2).sum() + cost = ((draw + grad) ** 2).sum() + if self._gamma is not None: + normal_logp = -draw @ draw / 2 + cost = cost + self._gamma * (logp - normal_logp).sum() + + return cost assert x.shape[1] == 2 draws = x[:, 0, :] @@ -72,9 +84,10 @@ def fit_flow(key, bijection, loss_fn, points, **kwargs): dist=flow, x=points, loss_fn=loss_fn, + max_epochs=500, **kwargs, ) - return fit.bijection, losses + return fit.bijection, losses, losses["opt_state"] def make_flow( seed, @@ -82,20 +95,23 @@ def make_flow( gradients, *, zero_init=False, - scale_layer=False, - untransformed_dim=None, + householder_layer=False, + dct_layer=False, + untransformed_dim: int | list[int] | None = None, n_layers, ): positions = np.array(positions) gradients = np.array(gradients) + if len(positions) == 0: + return + n_draws, n_dim = positions.shape if n_dim < 2: n_layers = 0 assert positions.shape == gradients.shape - assert n_draws > 0 if n_draws == 0: raise ValueError("No draws") @@ -119,7 +135,12 @@ def make_flow( if n_layers == 0: return flowjax.flows.Chain(flows) - def make_layer(key, is_last=False): + if untransformed_dim is None: + untransformed_dim = n_dim // 2 + + untransformed_dim = cast(list[int] | int, untransformed_dim) + + def make_layer(key, untransformed_dim, is_last=False): key, key_couple, key_permute = jax.random.split(key, 3) scale = Parameterize( @@ -138,15 +159,10 @@ def make_layer(key, is_last=False): else: width = nn_width - if untransformed_dim is None: - untrans_dim = n_dim // 2 - else: - untrans_dim = untransformed_dim - coupling = flowjax.bijections.coupling.Coupling( key_couple, transformer=affine, - untransformed_dim=untrans_dim, + untransformed_dim=untransformed_dim, dim=n_dim, nn_activation=jax.nn.gelu, nn_width=width, @@ -163,27 +179,67 @@ def make_layer(key, is_last=False): else: flow = flowjax.flows._add_default_permute(coupling, n_dim, key_permute) - if scale_layer: - from flowjax.bijections import mvscale - + if householder_layer: bijections = list(flow.bijections) - bijections.append(mvscale.MvScale4(jnp.ones(n_dim) * 1e-5)) - # bijections.append(mvscale.MvScale3(jnp.ones(n_dim) * 1e-5)) + params = jnp.ones(n_dim) * 1e-5 + params = params.at[0].set(0.) + bijections.append(flowjax.bijections.Householder(params)) flow = flowjax.bijections.Chain(bijections) return flow if n_layers == 1: - bijection = make_layer(key, is_last=True) + num_untrafo = ( + untransformed_dim + if isinstance(untransformed_dim, int) + else untransformed_dim[-1] + ) + bijection = make_layer( + key, + untransformed_dim=num_untrafo, + is_last=True, + ) else: keys = jax.random.split(key, n_layers - 1) - layers = eqx.filter_vmap(make_layer)(keys) - bijection = flowjax.bijections.Scan(layers) - key, key_layer = jax.random.split(key) - last = make_layer(key_layer, is_last=True) + if isinstance(untransformed_dim, int): + make_layers = eqx.filter_vmap(make_layer) + layers = make_layers(keys, untransformed_dim) + bijection = flowjax.bijections.Scan(layers) - bijection = flowjax.bijections.Chain([bijection, last]) + key, key_layer = jax.random.split(key) + last = make_layer(key_layer, untransformed_dim, is_last=True) + + bijection = flowjax.bijections.Chain([bijection, last]) + else: + layers = [] + for i, (key, num_untrafo) in enumerate(zip(keys[:-1], untransformed_dim[:1])): + + if i % 2 == 0 or not dct_layer: + layers.append(make_layer(key, num_untrafo)) + else: + inner = make_layer(key, num_untrafo) + outer = flowjax.bijections.DCT(inner.shape) + + layers.append(flowjax.bijections.Sandwich(outer, inner)) + + scale_val = jnp.ones(n_dim) + scale = Parameterize( + lambda x: x + jnp.sqrt(1 + x**2), + jnp.zeros(n_dim), + ) + mean = jnp.zeros(n_dim) + inner = eqx.tree_at( + where=lambda aff: aff.scale, + pytree=flowjax.bijections.Affine(mean, scale_val), + replace=scale, + ) + outer = flowjax.bijections.DCT(inner.shape) + layers.append(flowjax.bijections.Sandwich(outer, inner)) + + layers.append(make_layer(keys[-1], untransformed_dim[-1], is_last=True)) + + bijection = flowjax.bijections.Chain(layers) return flowjax.bijections.Chain([bijection, *flows]) @@ -273,6 +329,9 @@ def __init__( zero_init=True, untransformed_dim=None, batch_size=128, + reuse_opt_state=True, + max_patience=5, + gamma=None, ): self._logp_fn = logp_fn self._make_flow_fn = make_flow_fn @@ -280,12 +339,16 @@ def __init__( self._verbose = verbose self._window_size = window_size self._optimizer = optax.apply_if_finite(optax.adabelief(learning_rate), 50) - self._loss_fn = FisherLoss() + self._loss_fn = FisherLoss(gamma) self._show_progress = show_progress self._num_diag_windows = num_diag_windows self._zero_init = zero_init self._untransformed_dim = untransformed_dim self._batch_size = batch_size + self._reuse_opt_state = reuse_opt_state + self._opt_state = None + self._max_patience = max_patience + self._count_trace = [] try: self._bijection = make_flow_fn(seed, [position], [gradient], n_layers=0) except Exception as e: @@ -303,13 +366,19 @@ def update(self, seed, positions, gradients): if self._verbose: print(f"Chain {self._chain}: Total available points: {len(positions)}") n_draws = len(positions) + self._count_trace.append(n_draws) if n_draws == 0: return try: if self.index <= self._num_diag_windows: size = len(positions) - positions = positions[-size // 5 + 3 :] - gradients = gradients[-size // 5 + 3 :] + lower_idx = -size // 5 + 3 + positions_slice = positions[-size // 5 + 3 :] + gradients_slice = gradients[-size // 5 + 3 :] + + if len(positions_slice) > 0: + positions = positions_slice + gradients = gradients_slice fit = self._make_flow_fn(seed, positions, gradients, n_layers=0) points = jnp.transpose(jnp.array([positions, gradients]), [1, 0, 2]) @@ -320,10 +389,12 @@ def update(self, seed, positions, gradients): params, static = eqx.partition(flow, eqx.is_inexact_array) new_loss = self._loss_fn(params, static, points) - print("loss from diag:", new_loss) + if self._verbose: + print("loss from diag:", new_loss) if np.isfinite(new_loss): self._bijection = fit + self._opt_state = None return @@ -369,9 +440,10 @@ def update(self, seed, positions, gradients): # make_flow might still only return a single trafo for 1d problems if len(base.bijections) == 1: self._bijection = base + self._opt_state = None return - fit, _ = fit_flow( + fit, _, opt_state = fit_flow( key, base, self._loss_fn, @@ -379,6 +451,8 @@ def update(self, seed, positions, gradients): show_progress=self._show_progress, optimizer=self._optimizer, batch_size=self._batch_size, + opt_state=self._opt_state if self._reuse_opt_state else None, + max_patience=self._max_patience, ) flow = flowjax.flows.Transformed( @@ -426,6 +500,7 @@ def update(self, seed, positions, gradients): self._bijection = self._make_flow_fn( seed, positions, gradients, n_layers=0 ) + self._opt_state = None return if not np.isfinite(new_loss): @@ -435,6 +510,7 @@ def update(self, seed, positions, gradients): return self._bijection = fit + self._opt_state = opt_state except Exception as e: print("update error:", e) @@ -523,11 +599,18 @@ def inv_transform(self, position, gradient): TransformAdapter, verbose=verbose, window_size=window_size, - make_flow_fn=partial(make_flow, scale_layer=scale_layer), + make_flow_fn=partial( + make_flow, + householder_layer=householder_layer, + dct_layer=dct_layer, + ), show_progress=show_progress, num_diag_windows=num_diag_windows, learning_rate=learning_rate, zero_init=zero_init, untransformed_dim=untransformed_dim, batch_size=batch_size, + reuse_opt_state=reuse_opt_state, + max_patience=max_patience, + gamma=gamma, ) From 3439de849301807a3cdd572d56d1561bd9102a7f Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Wed, 20 Nov 2024 17:39:44 +0100 Subject: [PATCH 18/55] Update deps --- pixi.lock | 163 +++++++++++++++++++++++++++++++++++++++++++++++++++++- pixi.toml | 7 ++- 2 files changed, 167 insertions(+), 3 deletions(-) diff --git a/pixi.lock b/pixi.lock index 0190177..fb67443 100644 --- a/pixi.lock +++ b/pixi.lock @@ -10,6 +10,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/arviz-0.20.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asciitree-0.3.3-py_2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-2.4.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.43-h4bf12b8_2.conda @@ -37,6 +38,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/etuples-0.3.9-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fasteners-0.17.3-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 @@ -135,11 +137,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/minikanren-1.0.3-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-service-2.4.2-py312hf224ee7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.0-py312h68727a3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/multipledispatch-0.6.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numba-0.60.0-py312h83e6fd3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.14.0-py312hf9745cd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.28-pthreads_h6ec200e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda @@ -157,6 +161,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/polars-1.12.0-py312hfe7c9be_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.48-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.0-py312h66e93f0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda @@ -211,6 +216,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2024.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-2.18.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda @@ -222,7 +228,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/e9/59/f189b03d743364a350c972b89fe08a6db5bbbdc5f1ea6b604b3eee0a7967/dllist-1.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/15/9f/3be7f03bf66c8d7d2956b727d984595e4af899f3c15ef2c653029008bf3b/equinox-0.11.8-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1f/e4/0826dfde2db3fb3a34954323a84d0e6b6fdbc7eb5278c84159c6d43290ac/etils-1.10.0-py3-none-any.whl - - pypi: git+https://github.com/aseyboldt/flowjax.git@1c282f2ded78e81c7ce6a96f61523a9f18bf8edc - pypi: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/20/6c57c50c0ccc645fea1895950f1e5cd02f961ee44b3ffe83617fa46b0c1d/jax-0.4.35-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/aa/f15ea857ad9bcff7a0c942dc570ca718b026cc0cc5c513525bb08cacf3c0/jax_cuda12_pjrt-0.4.35-py3-none-manylinux2014_x86_64.whl @@ -248,6 +253,9 @@ environments: - pypi: https://files.pythonhosted.org/packages/2b/78/57043611a16c655c8350b4c01b8d6abfb38cc2acb475238b62c2146186d7/tqdm-4.67.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9a/bb/d43e5c75054e53efce310e79d63df0ac3f25e34c926be5dffb7d283fb2a8/typeguard-2.13.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c3/ac/1847959031ce09eb65a70b16d0f07633d7ddaf8a97752cc924f9a8cbe253/watermark-2.5.0-py2.py3-none-any.whl + - pypi: ../flowjax/ + - pypi: ../pymc-labs/benchmark-pymc packages: - kind: conda name: _libgcc_mutex @@ -311,6 +319,24 @@ packages: - pkg:pypi/arviz?source=hash-mapping size: 1473292 timestamp: 1727611803479 +- kind: conda + name: asciitree + version: 0.3.3 + build: py_2 + build_number: 2 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/asciitree-0.3.3-py_2.tar.bz2 + sha256: b3e9369529fe7d721b66f18680ff4b561e20dbf6507e209e1f60eac277c97560 + md5: c0481c9de49f040272556e2cedf42816 + depends: + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/asciitree?source=hash-mapping + size: 6164 + timestamp: 1531050741142 - kind: conda name: asttokens version: 2.4.1 @@ -935,6 +961,23 @@ packages: - pkg:pypi/executing?source=hash-mapping size: 28337 timestamp: 1725214501850 +- kind: conda + name: fasteners + version: 0.17.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/fasteners-0.17.3-pyhd8ed1ab_0.tar.bz2 + sha256: 42be6ac8478051b26751d778490d6a71de12e5c6443e145ff3eddbc577d9bcda + md5: 348e27e78a5e39090031448c72f66d5e + depends: + - python >=3.6 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/fasteners?source=hash-mapping + size: 19975 + timestamp: 1643971626978 - kind: conda name: filelock version: 3.16.1 @@ -954,7 +997,8 @@ packages: - kind: pypi name: flowjax version: 16.0.0 - url: git+https://github.com/aseyboldt/flowjax.git@1c282f2ded78e81c7ce6a96f61523a9f18bf8edc + path: ../flowjax/ + sha256: 44c0d14eacfee77e1254f841f2f2b6d169c5d3a34360240d4b9fcf252b9b951c requires_dist: - jax>=0.4.16 - equinox>=0.10 @@ -973,6 +1017,7 @@ packages: - ipython ; extra == 'dev' - numpyro ; extra == 'dev' requires_python: '>=3.10' + editable: true - kind: conda name: font-ttf-dejavu-sans-mono version: '2.37' @@ -2907,6 +2952,26 @@ packages: - pylint>=2.6.0 ; extra == 'dev' - pyink ; extra == 'dev' requires_python: '>=3.9' +- kind: conda + name: msgpack-python + version: 1.1.0 + build: py312h68727a3_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.0-py312h68727a3_0.conda + sha256: 4bc53333774dea1330643b7e23aa34fd6880275737fc2e07491795872d3af8dd + md5: 5c9b020a3f86799cdc6115e55df06146 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/msgpack?source=hash-mapping + size: 105271 + timestamp: 1725975182669 - kind: conda name: multipledispatch version: 0.6.0 @@ -3006,6 +3071,29 @@ packages: - pkg:pypi/numba?source=hash-mapping size: 5695278 timestamp: 1718888170104 +- kind: conda + name: numcodecs + version: 0.14.0 + build: py312hf9745cd_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.14.0-py312hf9745cd_0.conda + sha256: 447f1d54b5e46d6d8ada792a086b04c71ccfd253a3aea5c32cdbc4ccdeda17f7 + md5: a27a76178d062667f3f01d6f70d2d4a3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - msgpack-python + - numpy >=1.19,<3 + - numpy >=1.24 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/numcodecs?source=hash-mapping + size: 847070 + timestamp: 1731918955687 - kind: conda name: numpy version: 1.26.4 @@ -3466,6 +3554,30 @@ packages: - pkg:pypi/pluggy?source=hash-mapping size: 23815 timestamp: 1713667175451 +- kind: conda + name: polars + version: 1.12.0 + build: py312hfe7c9be_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/polars-1.12.0-py312hfe7c9be_1.conda + sha256: 8aa15e19d3446bba7a245beed39f5a856a841008861d0ed35e0a6988e99c1adc + md5: 0c0e15ac8645e65b7f5afa55046a7c48 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - numpy >=1.16.0 + - packaging + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + purls: + - pkg:pypi/polars?source=hash-mapping + size: 22824172 + timestamp: 1731964142746 - kind: pypi name: posteriordb version: 0.2.0 @@ -3927,6 +4039,17 @@ packages: - pkg:pypi/rich?source=hash-mapping size: 185481 timestamp: 1730592349978 +- kind: pypi + name: samplerlab + version: '0.1' + path: ../pymc-labs/benchmark-pymc + sha256: 3229a0e9de6c13db630469c1501ae97625ca85287d2f955280a154dbadd900cd + requires_dist: + - numpy + - arviz + - pymc + requires_python: '>=3.11' + editable: true - kind: conda name: scipy version: 1.14.1 @@ -4324,6 +4447,17 @@ packages: - pysocks>=1.5.6,!=1.5.7,<2.0 ; extra == 'socks' - zstandard>=0.18.0 ; extra == 'zstd' requires_python: '>=3.8' +- kind: pypi + name: watermark + version: 2.5.0 + url: https://files.pythonhosted.org/packages/c3/ac/1847959031ce09eb65a70b16d0f07633d7ddaf8a97752cc924f9a8cbe253/watermark-2.5.0-py2.py3-none-any.whl + sha256: d775afa075f5ea15152ad9f4c82dfc95bffb9d0cb4341c9b62073b627191464d + requires_dist: + - ipython>=6.0 + - importlib-metadata>=1.4 + - setuptools + - py3nvml>=0.2 ; extra == 'gpu' + requires_python: '>=3.7' - kind: conda name: wcwidth version: 0.2.13 @@ -4573,6 +4707,31 @@ packages: purls: [] size: 418368 timestamp: 1660346797927 +- kind: conda + name: zarr + version: 2.18.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/zarr-2.18.3-pyhd8ed1ab_0.conda + sha256: 0fd9bf7ba90088115c52dad7b9d44fbffeabe34cb35299b2c38d5f17851fda36 + md5: 41abde21508578e02e3fd492e82a05cd + depends: + - asciitree + - fasteners + - numcodecs >=0.10.0 + - numpy >=1.24,<3.0 + - python >=3.10 + constrains: + - ipywidgets >=8.0.0 + - notebook + - ipytree >=0.2.2 + license: MIT + license_family: MIT + purls: + - pkg:pypi/zarr?source=hash-mapping + size: 159273 + timestamp: 1725539879186 - kind: conda name: zeromq version: 4.3.5 diff --git a/pixi.toml b/pixi.toml index 21b62f6..9315e61 100644 --- a/pixi.toml +++ b/pixi.toml @@ -21,14 +21,19 @@ pip = ">=24.3.1,<25" ipykernel = ">=6.29.5,<7" seaborn = ">=0.13.2,<0.14" threadpoolctl = ">=3.5.0,<4" +zarr = ">=2.18.3,<3" +polars = ">=1.12.0,<2" # The jaxlib cuda build seems to be broken around version 0.4.34 #jaxlib = { version = "*", build = "*cuda12*" } [pypi-dependencies] bridgestan = ">=2.5.0, <3" -flowjax = { git = "https://github.com/aseyboldt/flowjax.git", rev = "1c282f2ded78e81c7ce6a96f61523a9f18bf8edc" } +#flowjax = { git = "https://github.com/aseyboldt/flowjax.git", rev = "1c282f2ded78e81c7ce6a96f61523a9f18bf8edc" } +flowjax = { path = "../flowjax/", editable = true } +samplerlab = { path = "../pymc-labs/benchmark-pymc", editable = true } posteriordb = ">=0.2.0, <0.3" jax = { version = "==0.4.35", extras = ["cuda12"] } +watermark = ">=2.5.0, <3" [system-requirements] #cuda = "12" From d6fda12175dafb45afed6fdceec03f14ec714ef9 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Thu, 12 Dec 2024 10:46:15 +0100 Subject: [PATCH 19/55] feat: Change default number of draws to None to let the sampler decide --- python/nutpie/sample.py | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/python/nutpie/sample.py b/python/nutpie/sample.py index 097a824..356b8d0 100644 --- a/python/nutpie/sample.py +++ b/python/nutpie/sample.py @@ -398,6 +398,8 @@ def _extract(self, results): dims["divergence_start_gradient"] = ["unconstrained_parameter"] dims["divergence_end"] = ["unconstrained_parameter"] dims["divergence_momentum"] = ["unconstrained_parameter"] + dims["transformed_gradient"] = ["unconstrained_parameter"] + dims["transformed_position"] = ["unconstrained_parameter"] if self._return_raw_trace: return results @@ -453,8 +455,8 @@ def _repr_html_(self): def sample( compiled_model: CompiledModel, *, - draws: int, - tune: int, + draws: int | None, + tune: int | None, chains: int, cores: Optional[int], seed: Optional[int], @@ -473,8 +475,8 @@ def sample( def sample( compiled_model: CompiledModel, *, - draws: int, - tune: int, + draws: int | None, + tune: int | None, chains: int, cores: Optional[int], seed: Optional[int], @@ -492,8 +494,8 @@ def sample( def sample( compiled_model: CompiledModel, *, - draws: int = 1000, - tune: int = 300, + draws: int | None = None, + tune: int | None = None, chains: int = 6, cores: Optional[int] = None, seed: Optional[int] = None, @@ -513,9 +515,9 @@ def sample( Parameters ---------- - draws: int + draws: int | None The number of draws after tuning in each chain. - tune: int + tune: int | None The number of tuning (warmup) draws in each chain. chains: int The number of chains to sample. @@ -612,8 +614,10 @@ def sample( else: settings = _lib.PyNutsSettings.Diag(seed) - settings.num_tune = tune - settings.num_draws = draws + if tune is not None: + settings.num_tune = tune + if draws is not None: + settings.num_draws = draws settings.num_chains = chains for name, val in kwargs.items(): From e1acc6c7bbe9af61247ee3b45c26f1c6c9d9b89c Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Thu, 12 Dec 2024 10:47:09 +0100 Subject: [PATCH 20/55] feat: allow dynamic extensions of normalizing flows --- python/nutpie/transform_adapter.py | 704 ++++++++++++++++++++++++----- 1 file changed, 595 insertions(+), 109 deletions(-) diff --git a/python/nutpie/transform_adapter.py b/python/nutpie/transform_adapter.py index de3876b..a5e9338 100644 --- a/python/nutpie/transform_adapter.py +++ b/python/nutpie/transform_adapter.py @@ -1,21 +1,33 @@ +from typing import cast + +_BIJECTION_TRACE = [] + def make_transform_adapter( *, verbose=False, - window_size=2000, + window_size=600, show_progress=False, nn_depth=1, - nn_width=None, - num_layers=8, + nn_width=16, + num_layers=3, num_diag_windows=10, learning_rate=1e-3, - untransformed_dim=None, + untransformed_dim=[1, None, -1], zero_init=True, batch_size=128, - reuse_opt_state=True, - max_patience=5, + reuse_opt_state=False, + max_patience=60, householder_layer=True, - dct_layer=True, + dct_layer=False, gamma=None, + log_inside_batch=False, + initial_skip=120, + extension_windows=[16, 20, 24], + extend_dct=False, + extension_var_count=4, + extension_var_trafo_count=2, + debug_save_bijection=False, + make_optimizer=None, ): import traceback from functools import partial @@ -31,48 +43,75 @@ def make_transform_adapter( from paramax import Parameterize, unwrap class FisherLoss: - def __init__(self, gamma=None): + def __init__(self, gamma=None, log_inside_batch=False): self._gamma = gamma + self._log_inside_batch = log_inside_batch @eqx.filter_jit def __call__( self, params, static, - x, + draws, + grads, + logps, condition=None, key=None, return_all_costs=False, + return_elemwise_costs=False, ): flow = unwrap(eqx.combine(params, static, is_leaf=eqx.is_inexact_array)) - def compute_loss(bijection, draw, grad): - draw, grad, logp = bijection.inverse_gradient_and_val( - draw, grad, jnp.array(0.0) + if return_elemwise_costs: + def compute_loss(bijection, draw, grad, logp): + if True: + draw, grad, logp = bijection.inverse_gradient_and_val( + draw, grad, logp + ) + else: + draw, grad, logp = flowjax.bijections.AbstractBijection.inverse_gradient_and_val( + bijection, draw, grad, logp + ) + cost = (draw + grad) ** 2 + return cost + + costs = jax.vmap(compute_loss, [None, 0, 0, 0])( + flow.bijection, draws, grads, logps, ) - cost = ((draw + grad) ** 2).sum() - if self._gamma is not None: - normal_logp = -draw @ draw / 2 - cost = cost + self._gamma * (logp - normal_logp).sum() + return costs.mean(0) - return cost - assert x.shape[1] == 2 - draws = x[:, 0, :] - grads = x[:, 1, :] + if self._gamma is None: + def compute_loss(bijection, draw, grad, logp): + draw, grad, logp = bijection.inverse_gradient_and_val( + draw, grad, logp + ) + cost = ((draw + grad) ** 2).sum() + return cost - if return_all_costs: - return jax.vmap(compute_loss, [None, 0, 0])( - flow.bijection, draws, grads + costs = jax.vmap(compute_loss, [None, 0, 0, 0])( + flow.bijection, draws, grads, logps, ) - return jnp.log( - jax.vmap(compute_loss, [None, 0, 0])( - flow.bijection, draws, grads - ).mean() - ) + if return_all_costs: + return costs + + if self._log_inside_batch: + return jnp.log(costs).mean() + else: + return jnp.log(costs.mean()) + + else: + def transform(draw, grad, logp): + return flow.bijection.inverse_gradient_and_val(draw, grad, logp) + + draws, grads, logps = jax.vmap(transform, [0, 0, 0], (0, 0, 0))(draws, grads, logps) + fisher_loss = ((draws + grads) ** 2).sum(1).mean(0) + normal_logps = -(draws * draws).sum(1) / 2 + var_loss = (logps - normal_logps).var() + return jnp.log(fisher_loss + self._gamma * var_loss) - def fit_flow(key, bijection, loss_fn, points, **kwargs): + def fit_flow(key, bijection, loss_fn, draws, grads, logps, **kwargs): flow = flowjax.flows.Transformed( flowjax.distributions.StandardNormal(bijection.shape), bijection ) @@ -82,9 +121,10 @@ def fit_flow(key, bijection, loss_fn, points, **kwargs): fit, losses = flowjax.train.fit_to_data( key=train_key, dist=flow, - x=points, + x=(draws, grads, logps), loss_fn=loss_fn, - max_epochs=500, + max_epochs=1000, + return_best=True, **kwargs, ) return fit.bijection, losses, losses["opt_state"] @@ -97,9 +137,11 @@ def make_flow( zero_init=False, householder_layer=False, dct_layer=False, - untransformed_dim: int | list[int] | None = None, + untransformed_dim: int | list[int | None] | None = None, n_layers, ): + from flowjax import bijections + positions = np.array(positions) gradients = np.array(gradients) @@ -128,25 +170,59 @@ def make_flow( key = jax.random.PRNGKey(seed % (2**63)) + diag_param = Parameterize( + lambda x: x + jnp.sqrt(1 + x ** 2), + (diag ** 2 - 1) / (2 * diag), + ) + + diag_affine = eqx.tree_at( + where=lambda aff: aff.scale, + pytree=bijections.Affine(mean, diag), + replace=diag_param, + ) + flows = [ - flowjax.flows.Affine(loc=mean, scale=diag), + #flowjax.flows.Affine(loc=mean, scale=diag), + diag_affine, ] if n_layers == 0: return flowjax.flows.Chain(flows) + scale = Parameterize( + lambda x: x + jnp.sqrt(1 + x**2), + jnp.zeros(n_dim), + ) + affine = eqx.tree_at( + where=lambda aff: aff.scale, + pytree=flowjax.bijections.Affine(jnp.zeros(n_dim), jnp.ones(n_dim)), + replace=scale, + ) + params = jnp.ones(n_dim) * 1e-5 + params = params.at[-1].set(1.) + + hh = flowjax.bijections.Householder(params) + flows.append( + bijections.Sandwich( + bijections.Chain([ + bijections.Vmap(bijections.SoftPlusX(), axis_size=n_dim), + hh, + ]), + affine, + ) + ) + if untransformed_dim is None: untransformed_dim = n_dim // 2 - untransformed_dim = cast(list[int] | int, untransformed_dim) + untransformed_dim = cast(list[int | None] | int, untransformed_dim) - def make_layer(key, untransformed_dim, is_last=False): + def make_layer(key, untransformed_dim: int | None): key, key_couple, key_permute = jax.random.split(key, 3) scale = Parameterize( lambda x: x + jnp.sqrt(1 + x**2), jnp.array(0.0), - # lambda x: jnp.exp(jnp.arcsinh(x)), jnp.array(0.0), ) affine = eqx.tree_at( where=lambda aff: aff.scale, @@ -159,6 +235,12 @@ def make_layer(key, untransformed_dim, is_last=False): else: width = nn_width + if untransformed_dim is None: + untransformed_dim = n_dim // 2 + + if untransformed_dim < 0: + untransformed_dim = n_dim + untransformed_dim + coupling = flowjax.bijections.coupling.Coupling( key_couple, transformer=affine, @@ -174,74 +256,404 @@ def make_layer(key, untransformed_dim, is_last=False): coupling, ) - if is_last: - flow = flowjax.bijections.Chain([coupling]) - else: - flow = flowjax.flows._add_default_permute(coupling, n_dim, key_permute) + def add_default_permute(bijection, dim, key): + if dim == 1: + return bijection + if dim == 2: + outer = flowjax.bijections.Flip((dim,)) + else: + outer = flowjax.bijections.Permute(jax.random.permutation(key, jnp.arange(dim))) + + return flowjax.bijections.Sandwich(outer, bijection) + + flow = add_default_permute(coupling, n_dim, key_permute) if householder_layer: - bijections = list(flow.bijections) params = jnp.ones(n_dim) * 1e-5 - params = params.at[0].set(0.) - bijections.append(flowjax.bijections.Householder(params)) - flow = flowjax.bijections.Chain(bijections) + params = params.at[0].set(1.) + + outer = flowjax.bijections.Householder(params) + flow = flowjax.bijections.Sandwich(outer, flow) + scale = Parameterize( + lambda x: x + jnp.sqrt(1 + x**2), + jnp.zeros(n_dim), + ) + affine = eqx.tree_at( + where=lambda aff: aff.scale, + pytree=flowjax.bijections.Affine(jnp.zeros(n_dim), jnp.ones(n_dim)), + replace=scale, + ) + params = jnp.ones(n_dim) * 1e-5 + params = params.at[-1].set(1.) + + hh = flowjax.bijections.Householder(params) + flow = bijections.Chain([ + bijections.Sandwich( + bijections.Chain([ + bijections.Vmap(bijections.SoftPlusX(), axis_size=n_dim), + hh, + ]), + affine, + ), + flow + ]) return flow - if n_layers == 1: - num_untrafo = ( - untransformed_dim - if isinstance(untransformed_dim, int) - else untransformed_dim[-1] + keys = jax.random.split(key, n_layers) + + if isinstance(untransformed_dim, int): + make_layers = eqx.filter_vmap(make_layer) + layers = make_layers(keys, untransformed_dim) + bijection = flowjax.bijections.Scan(layers) + else: + layers = [] + for i, (key, num_untrafo) in enumerate(zip(keys, untransformed_dim)): + + if i % 2 == 0 or not dct_layer: + layers.append(make_layer(key, num_untrafo)) + else: + inner = make_layer(key, num_untrafo) + outer = flowjax.bijections.DCT(inner.shape) + + layers.append(flowjax.bijections.Sandwich(outer, inner)) + + scale_val = jnp.ones(n_dim) + scale = Parameterize( + lambda x: x + jnp.sqrt(1 + x**2), + jnp.zeros(n_dim), + ) + mean = jnp.zeros(n_dim) + inner = eqx.tree_at( + where=lambda aff: aff.scale, + pytree=flowjax.bijections.Affine(mean, scale_val), + replace=scale, + ) + outer = flowjax.bijections.DCT(inner.shape) + layers.append(flowjax.bijections.Sandwich(outer, inner)) + + bijection = flowjax.bijections.Chain(layers) + + return flowjax.bijections.Chain([bijection, *flows]) + + def extend_flow( + key, + base, + loss_fn, + positions, + gradients, + logps, + layer: int, + *, + extension_var_count=4, + zero_init=False, + householder_layer=False, + untransformed_dim: int | list[int | None] | None = None, + dct: bool = False, + extension_var_trafo_count=2, + verbose: bool = False, + ): + from flowjax import bijections + + n_draws, n_dim = positions.shape + + if n_dim < 2: + return base + + if n_dim <= extension_var_count: + extension_var_count = n_dim - 1 + extension_var_trafo_count = 1 + + if dct: + flow = flowjax.flows.Transformed( + flowjax.distributions.StandardNormal(base.shape), + bijections.Chain( + [bijections.DCT(shape=(n_dim,)), base] + ), ) - bijection = make_layer( + else: + flow = flowjax.flows.Transformed( + flowjax.distributions.StandardNormal(base.shape), + base + ) + + params, static = eqx.partition(flow, eqx.is_inexact_array) + costs = loss_fn( + params, + static, + positions, + gradients, + logps, + return_elemwise_costs=True, + ) + + if verbose: + print(max(costs), costs) + print("dct:", dct) + idxs = np.argsort(costs) + + permute = bijections.Permute(idxs) + + if False: + identity = bijections.Identity(shape=(n_dim - extension_var_count,)) + print(costs[idxs]) + + scale = Parameterize( + lambda x: x + jnp.sqrt(1 + x**2), + jnp.array(0.0), + ) + affine = eqx.tree_at( + where=lambda aff: aff.scale, + pytree=flowjax.bijections.Affine(), + replace=scale, + ) + scale = Parameterize( + lambda x: x + jnp.sqrt(1 + x**2), + jnp.array(0.0), + ) + affine2 = eqx.tree_at( + where=lambda aff: aff.scale, + pytree=flowjax.bijections.Affine(), + replace=scale, + ) + + pre = [] + if layer % 2 == 0: + pre.append(bijections.Neg(shape=(n_dim,))) + + nonlin_affine = bijections.Chain([ + bijections.Sandwich( + bijections.Chain([ + *pre, + bijections.Vmap(bijections.SoftPlusX(), axis_size=n_dim), + ]), + affine, + ), + affine2, + ]) + + if nn_width is None: + width = extension_var_count * 16 + else: + width = nn_width * 16 + + if untransformed_dim is None: + untransformed_dim = extension_var_count // 2 + + coupling = flowjax.bijections.coupling.Coupling( key, - untransformed_dim=num_untrafo, - is_last=True, + transformer=nonlin_affine, + #transformer=affine, + untransformed_dim=untransformed_dim, + dim=extension_var_count, + nn_activation=jax.nn.gelu, + nn_width=width, + nn_depth=nn_depth + 1, + ) + if zero_init: + coupling = jax.tree_util.tree_map( + lambda x: x * 1e-3 if eqx.is_inexact_array(x) else x, + coupling, + ) + + params = jnp.ones(extension_var_count) * 1e-5 + params = params.at[-1].set(1.) + + hh = flowjax.bijections.Householder(params) + inner_permute = flowjax.bijections.Permute( + jax.random.permutation(key, jnp.arange(extension_var_count)) + ) + coupling = flowjax.bijections.Sandwich( + inner_permute, + flowjax.bijections.Sandwich(hh, coupling), ) + + inner = bijections.Concatenate([identity, coupling]) else: - keys = jax.random.split(key, n_layers - 1) + scale = Parameterize( + lambda x: x + jnp.sqrt(1 + x**2), + jnp.array(0.0), + ) + affine = eqx.tree_at( + where=lambda aff: aff.scale, + pytree=flowjax.bijections.Affine(), + replace=scale, + ) - if isinstance(untransformed_dim, int): - make_layers = eqx.filter_vmap(make_layer) - layers = make_layers(keys, untransformed_dim) - bijection = flowjax.bijections.Scan(layers) + """ + scale = Parameterize( + lambda x: x + jnp.sqrt(1 + x**2), + jnp.array(0.0), + ) + affine2 = eqx.tree_at( + where=lambda aff: aff.scale, + pytree=flowjax.bijections.Affine(), + replace=scale, + ) + pre = [] + if layer % 2 == 0: + pre.append(bijections.Neg(shape=())) + + nonlin_affine = bijections.Chain([ + bijections.Sandwich( + bijections.Chain([ + *pre, + bijections.SoftPlusX(), + ]), + affine, + ), + affine2, + ]) + """ + + do_flip = layer % 2 == 0 - key, key_layer = jax.random.split(key) - last = make_layer(key_layer, untransformed_dim, is_last=True) + if nn_width is None: + width = 16 + else: + width = nn_width + + #if untransformed_dim is None: + # untransformed_dim = extension_var_count // 2 + + if do_flip: + coupling = flowjax.bijections.coupling.Coupling( + key, + transformer=affine, + untransformed_dim=n_dim - extension_var_trafo_count, + dim=n_dim, + nn_activation=jax.nn.gelu, + nn_width=width, + nn_depth=nn_depth, + ) - bijection = flowjax.bijections.Chain([bijection, last]) + inner_permute = flowjax.bijections.Permute( + jnp.concatenate([ + jnp.arange(n_dim - extension_var_count), + jax.random.permutation(key, jnp.arange(n_dim - extension_var_count, n_dim)), + ]) + ) else: - layers = [] - for i, (key, num_untrafo) in enumerate(zip(keys[:-1], untransformed_dim[:1])): + coupling = flowjax.bijections.coupling.Coupling( + key, + transformer=affine, + untransformed_dim=extension_var_trafo_count, + dim=n_dim, + nn_activation=jax.nn.gelu, + nn_width=width, + nn_depth=nn_depth, + ) - if i % 2 == 0 or not dct_layer: - layers.append(make_layer(key, num_untrafo)) - else: - inner = make_layer(key, num_untrafo) - outer = flowjax.bijections.DCT(inner.shape) + inner_permute = flowjax.bijections.Permute( + jnp.concatenate([ + jax.random.permutation(key, jnp.arange(n_dim - extension_var_count, n_dim)), + jnp.arange(n_dim - extension_var_count), + ]) + ) - layers.append(flowjax.bijections.Sandwich(outer, inner)) + if zero_init: + coupling = jax.tree_util.tree_map( + lambda x: x * 1e-3 if eqx.is_inexact_array(x) else x, + coupling, + ) - scale_val = jnp.ones(n_dim) - scale = Parameterize( - lambda x: x + jnp.sqrt(1 + x**2), - jnp.zeros(n_dim), - ) - mean = jnp.zeros(n_dim) - inner = eqx.tree_at( - where=lambda aff: aff.scale, - pytree=flowjax.bijections.Affine(mean, scale_val), - replace=scale, - ) - outer = flowjax.bijections.DCT(inner.shape) - layers.append(flowjax.bijections.Sandwich(outer, inner)) + inner = bijections.Sandwich(inner_permute, coupling) + + if False: + scale = Parameterize( + lambda x: x + jnp.sqrt(1 + x**2), + jnp.array(0.0), + ) + affine = eqx.tree_at( + where=lambda aff: aff.scale, + pytree=flowjax.bijections.Affine(), + replace=scale, + ) - layers.append(make_layer(keys[-1], untransformed_dim[-1], is_last=True)) + if nn_width is None: + width = 16 + else: + width = nn_width - bijection = flowjax.bijections.Chain(layers) + #if untransformed_dim is None: + # untransformed_dim = extension_var_count // 2 + + coupling = flowjax.bijections.coupling.Coupling( + key, + transformer=affine, + untransformed_dim=extension_var_trafo_count, + dim=n_dim, + nn_activation=jax.nn.gelu, + nn_width=width, + nn_depth=nn_depth, + ) + + if zero_init: + coupling = jax.tree_util.tree_map( + lambda x: x * 1e-3 if eqx.is_inexact_array(x) else x, + coupling, + ) + + if verbose: + print(costs[permute.permutation][inner.outer.permutation]) + + """ + params = jnp.ones(n_dim) * 1e-5 + params = params.at[-1].set(0.) + + hh = flowjax.bijections.Householder(params) + + coupling = bijections.Sandwich(hh, coupling) + """ + + inner = bijections.Sandwich( + inner.outer, + bijections.Chain([ + bijections.Sandwich(bijections.Flip(shape=(n_dim,)), coupling), + inner.inner, + ]), + ) + + if dct: + new_layer = bijections.Sandwich( + bijections.DCT(shape=(n_dim,)), + bijections.Sandwich(permute, inner), + ) + else: + new_layer = bijections.Sandwich(permute, inner) + + scale = Parameterize( + lambda x: x + jnp.sqrt(1 + x**2), + jnp.zeros(n_dim), + ) + affine = eqx.tree_at( + where=lambda aff: aff.scale, + pytree=flowjax.bijections.Affine(jnp.zeros(n_dim), jnp.ones(n_dim)), + replace=scale, + ) + + pre = [] + if layer % 2 == 0: + pre.append(bijections.Neg(shape=(n_dim,))) + + nonlin_layer = bijections.Sandwich( + bijections.Chain([ + *pre, + bijections.Vmap(bijections.SoftPlusX(), axis_size=n_dim), + ]), + affine, + ) + scale = Parameterize( + lambda x: x + jnp.sqrt(1 + x**2), + jnp.zeros(n_dim), + ) + affine = eqx.tree_at( + where=lambda aff: aff.scale, + pytree=flowjax.bijections.Affine(jnp.zeros(n_dim), jnp.ones(n_dim)), + replace=scale, + ) + return bijections.Chain([new_layer, nonlin_layer, affine, base]) - return flowjax.bijections.Chain([bijection, *flows]) @eqx.filter_jit def _init_from_transformed_position(logp_fn, bijection, transformed_position): @@ -332,14 +744,27 @@ def __init__( reuse_opt_state=True, max_patience=5, gamma=None, + log_inside_batch=False, + initial_skip=500, + extension_windows=None, + extend_dct=False, + extension_var_count=6, + extension_var_trafo_count=4, + debug_save_bijection=False, + make_optimizer=None, ): self._logp_fn = logp_fn self._make_flow_fn = make_flow_fn self._chain = chain self._verbose = verbose self._window_size = window_size - self._optimizer = optax.apply_if_finite(optax.adabelief(learning_rate), 50) - self._loss_fn = FisherLoss(gamma) + self._initial_skip = initial_skip + if make_optimizer is None: + self._make_optimizer = lambda: optax.apply_if_finite(optax.adabelief(learning_rate), 50) + else: + self._make_optimizer = make_optimizer + self._optimizer = self._make_optimizer() + self._loss_fn = FisherLoss(gamma, log_inside_batch) self._show_progress = show_progress self._num_diag_windows = num_diag_windows self._zero_init = zero_init @@ -349,6 +774,18 @@ def __init__( self._opt_state = None self._max_patience = max_patience self._count_trace = [] + self._last_extend_dct = True + self._extend_dct = extend_dct + self._extension_var_count = extension_var_count + self._extension_var_trafo_count = extension_var_trafo_count + self._debug_save_bijection = debug_save_bijection + self._layers = 0 + + if extension_windows is None: + self._extension_windows = [] + else: + self._extension_windows = extension_windows + try: self._bijection = make_flow_fn(seed, [position], [gradient], n_layers=0) except Exception as e: @@ -361,11 +798,14 @@ def __init__( def transformation_id(self): return self.index - def update(self, seed, positions, gradients): + def update(self, seed, positions, gradients, logps): self.index += 1 if self._verbose: print(f"Chain {self._chain}: Total available points: {len(positions)}") n_draws = len(positions) + assert n_draws == len(positions) + assert n_draws == len(gradients) + assert n_draws == len(logps) self._count_trace.append(n_draws) if n_draws == 0: return @@ -373,21 +813,26 @@ def update(self, seed, positions, gradients): if self.index <= self._num_diag_windows: size = len(positions) lower_idx = -size // 5 + 3 - positions_slice = positions[-size // 5 + 3 :] - gradients_slice = gradients[-size // 5 + 3 :] + positions_slice = positions[lower_idx:] + gradients_slice = gradients[lower_idx:] + logp_slice = logps[lower_idx:] if len(positions_slice) > 0: positions = positions_slice gradients = gradients_slice + logps = logp_slice + + positions = np.array(positions) + gradients = np.array(gradients) + logps = np.array(logps) fit = self._make_flow_fn(seed, positions, gradients, n_layers=0) - points = jnp.transpose(jnp.array([positions, gradients]), [1, 0, 2]) flow = flowjax.flows.Transformed( flowjax.distributions.StandardNormal(fit.shape), fit ) params, static = eqx.partition(flow, eqx.is_inexact_array) - new_loss = self._loss_fn(params, static, points) + new_loss = self._loss_fn(params, static, positions, gradients, logps) if self._verbose: print("loss from diag:", new_loss) @@ -398,23 +843,24 @@ def update(self, seed, positions, gradients): return - positions = np.array(positions[500:][-self._window_size :]) - gradients = np.array(gradients[500:][-self._window_size :]) + positions = np.array(positions[self._initial_skip:][-self._window_size :]) + gradients = np.array(gradients[self._initial_skip:][-self._window_size :]) + logps = np.array(logps[self._initial_skip:][-self._window_size:]) - if len(positions) == 0: + if len(positions) < 10: return - if not np.isfinite(gradients).all(): + if self._verbose and not np.isfinite(gradients).all(): print(gradients) print(gradients.shape) print((~np.isfinite(gradients)).nonzero()) assert np.isfinite(positions).all() assert np.isfinite(gradients).all() + assert np.isfinite(logps).all() # TODO don't reuse seed key = jax.random.PRNGKey(seed % (2**63)) - points = jnp.transpose(jnp.array([positions, gradients]), [1, 0, 2]) if len(self._bijection.bijections) == 1: base = self._make_flow_fn( @@ -432,22 +878,58 @@ def update(self, seed, positions, gradients): if self._verbose: print( "loss before optimization: ", - self._loss_fn(params, static, points[-500:]), + self._loss_fn(params, static, positions[-500:], gradients[-500:], logps[-500:]), ) else: base = self._bijection - # make_flow might still only return a single trafo for 1d problems + if self.index in self._extension_windows: + if self._verbose: + print("Extending flow...") + self._last_extend_dct = not self._last_extend_dct + dct = self._last_extend_dct and self._extend_dct + base = extend_flow( + key, + base, + self._loss_fn, + positions, + gradients, + logps, + self._layers, + dct=dct, + extension_var_count=self._extension_var_count, + extension_var_trafo_count=self._extension_var_trafo_count, + verbose=self._verbose, + ) + self._optimizer = self._make_optimizer() + self._opt_state = None + self._layers += 1 + + # make_flow might still onreturn a single trafo for 1d problems if len(base.bijections) == 1: self._bijection = base self._opt_state = None return + flow = flowjax.flows.Transformed( + flowjax.distributions.StandardNormal(self._bijection.shape), + self._bijection, + ) + params, static = eqx.partition(flow, eqx.is_inexact_array) + old_loss = self._loss_fn(params, static, positions[-100:], gradients[-100:], logps[-100:]) + + if np.isfinite(old_loss) and old_loss < -5 and self.index > 10: + if self._verbose: + print(f"Loss is low ({old_loss}), skipping training") + return + fit, _, opt_state = fit_flow( key, base, self._loss_fn, - points, + positions, + gradients, + logps, show_progress=self._show_progress, optimizer=self._optimizer, batch_size=self._batch_size, @@ -459,14 +941,7 @@ def update(self, seed, positions, gradients): flowjax.distributions.StandardNormal(fit.shape), fit ) params, static = eqx.partition(flow, eqx.is_inexact_array) - new_loss = self._loss_fn(params, static, points[-500:]) - - flow = flowjax.flows.Transformed( - flowjax.distributions.StandardNormal(self._bijection.shape), - self._bijection, - ) - params, static = eqx.partition(flow, eqx.is_inexact_array) - old_loss = self._loss_fn(params, static, points[-500:]) + new_loss = self._loss_fn(params, static, positions[-100:], gradients[-100:], logps[-100:]) if self._verbose: print( @@ -481,7 +956,7 @@ def update(self, seed, positions, gradients): params, static = eqx.partition(flow, eqx.is_inexact_array) print( self._loss_fn( - params, static, points[-500:], return_all_costs=True + params, static, positions[-100:], gradients[-100:], logps[-100:], return_all_costs=True ) ) @@ -492,7 +967,7 @@ def update(self, seed, positions, gradients): params, static = eqx.partition(flow, eqx.is_inexact_array) print( self._loss_fn( - params, static, points[-500:], return_all_costs=True + params, static, positions[-100:], gradients[-100:], logps[-100:], return_all_costs=True ) ) @@ -512,6 +987,9 @@ def update(self, seed, positions, gradients): self._bijection = fit self._opt_state = opt_state + if self._debug_save_bijection: + _BIJECTION_TRACE.append((self.index, fit, (positions, gradients, logps))) + except Exception as e: print("update error:", e) print(traceback.format_exc()) @@ -613,4 +1091,12 @@ def inv_transform(self, position, gradient): reuse_opt_state=reuse_opt_state, max_patience=max_patience, gamma=gamma, + log_inside_batch=log_inside_batch, + initial_skip=initial_skip, + extension_windows=extension_windows, + extend_dct=extend_dct, + extension_var_count=extension_var_count, + extension_var_trafo_count=extension_var_trafo_count, + debug_save_bijection=debug_save_bijection, + make_optimizer=make_optimizer, ) From 4797c04908193a2c556a4f43b8d255d19b0f0244 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Thu, 12 Dec 2024 10:48:28 +0100 Subject: [PATCH 21/55] chore: Adapt to new nuts-rs transform code --- src/pyfunc.rs | 13 +++++-------- src/stan.rs | 2 ++ src/wrapper.rs | 31 ++++++++++++++++++++++++++++++- 3 files changed, 37 insertions(+), 9 deletions(-) diff --git a/src/pyfunc.rs b/src/pyfunc.rs index 778b68e..c097f71 100644 --- a/src/pyfunc.rs +++ b/src/pyfunc.rs @@ -1,4 +1,4 @@ -use std::sync::{Arc, Mutex}; +use std::sync::Arc; use anyhow::{anyhow, bail, Context, Result}; use arrow::{ @@ -76,7 +76,7 @@ impl PyVariable { pub struct PyModel { make_logp_func: Arc>, make_expand_func: Arc>, - init_point_func: Option>>>, + init_point_func: Option>>, variables: Arc>, transform_adapter: Option, ndim: usize, @@ -97,7 +97,7 @@ impl PyModel { Self { make_logp_func: Arc::new(make_logp_func), make_expand_func: Arc::new(make_expand_func), - init_point_func: init_point_func.map(|x| Mutex::new(x).into()), + init_point_func: init_point_func.map(|x| x.into()), variables: Arc::new(variables), ndim, transform_adapter: transform_adapter.map(PyTransformAdapt::new), @@ -265,6 +265,7 @@ impl CpuLogpFunc for PyDensity { rng: &mut R, untransformed_positions: impl ExactSizeIterator, untransformed_gradients: impl ExactSizeIterator, + untransformed_logp: impl ExactSizeIterator, params: &'a mut Py, ) -> std::result::Result<(), Self::LogpError> { self.transform_adapter @@ -274,6 +275,7 @@ impl CpuLogpFunc for PyDensity { rng, untransformed_positions, untransformed_gradients, + untransformed_logp, params, )?; Ok(()) @@ -619,11 +621,6 @@ impl Model for PyModel { let seed = rng.next_u64(); - // Acquire the init_func lock before we wait for the GIL - let init_func = init_func - .lock() - .expect("Could not acquire lock for init func"); - Python::with_gil(|py| { let init_point = init_func .call1(py, (seed,)) diff --git a/src/stan.rs b/src/stan.rs index ab7c3dc..e25ca65 100644 --- a/src/stan.rs +++ b/src/stan.rs @@ -345,6 +345,7 @@ impl<'model> CpuLogpFunc for StanDensity<'model> { rng: &mut R, untransformed_positions: impl ExactSizeIterator, untransformed_gradients: impl ExactSizeIterator, + untransformed_logp: impl ExactSizeIterator, params: &'a mut Py, ) -> std::result::Result<(), Self::LogpError> { self.transform_adapter @@ -354,6 +355,7 @@ impl<'model> CpuLogpFunc for StanDensity<'model> { rng, untransformed_positions, untransformed_gradients, + untransformed_logp, params, ) .context("Failed to update the transformation")?; diff --git a/src/wrapper.rs b/src/wrapper.rs index 7b50341..e4bc33c 100644 --- a/src/wrapper.rs +++ b/src/wrapper.rs @@ -601,6 +601,33 @@ impl PyNutsSettings { } Ok(()) } + + #[getter] + fn train_on_orbit(&self) -> Result { + match &self.inner { + Settings::LowRank(_) => { + bail!("gamma not available for low rank mass matrix adaptation"); + } + Settings::Diag(_) => { + bail!("gamma not available for diag mass matrix adaptation"); + } + Settings::Transforming(inner) => Ok(inner.adapt_options.use_orbit_for_training), + } + } + + #[setter(train_on_orbit)] + fn set_train_on_orbit(&mut self, val: bool) -> Result<()> { + match &mut self.inner { + Settings::LowRank(_) => { + bail!("gamma not available for low rank mass matrix adaptation"); + } + Settings::Diag(_) => { + bail!("gamma not available for diag mass matrix adaptation"); + } + Settings::Transforming(inner) => inner.adapt_options.use_orbit_for_training = val, + } + Ok(()) + } } pub(crate) enum SamplerState { @@ -1135,6 +1162,7 @@ impl PyTransformAdapt { rng: &mut R, untransformed_positions: impl ExactSizeIterator, untransformed_gradients: impl ExactSizeIterator, + untransformed_logp: impl ExactSizeIterator, params: &'a mut Py, ) -> Result<()> { Python::with_gil(|py| { @@ -1147,11 +1175,12 @@ impl PyTransformAdapt { untransformed_gradients.map(|grad| PyArray1::from_slice_bound(py, grad)), ); + let logps = PyArray1::from_iter_bound(py, untransformed_logp.copied()); let seed = rng.next_u64(); params .getattr(py, intern!(py, "update"))? - .call1(py, (seed, positions, gradients))?; + .call1(py, (seed, positions, gradients, logps))?; Ok(()) }) } From cf3e92180e349120b472e2e196f60cee4ce321d2 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Thu, 12 Dec 2024 11:18:18 +0100 Subject: [PATCH 22/55] chore: update to pyo3 0.23 --- Cargo.toml | 4 +- src/pyfunc.rs | 6 +-- src/stan.rs | 13 +++-- src/wrapper.rs | 126 +++++++++++++++++++++++++++++-------------------- 4 files changed, 89 insertions(+), 60 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 22bed6a..911b3c8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,7 +23,7 @@ crate-type = ["cdylib"] [dependencies] nuts-rs = "0.13.0" -numpy = "0.22.0" +numpy = "0.23.0" rand = "0.8.5" thiserror = "2.0.3" rand_chacha = "0.3.1" @@ -41,7 +41,7 @@ indicatif = "0.17.8" tch = { version = "0.18.0", optional = true } [dependencies.pyo3] -version = "0.22.5" +version = "0.23.3" features = ["extension-module", "anyhow"] [dev-dependencies] diff --git a/src/pyfunc.rs b/src/pyfunc.rs index c097f71..827f038 100644 --- a/src/pyfunc.rs +++ b/src/pyfunc.rs @@ -124,7 +124,7 @@ impl LogpError for PyLogpError { match self { Self::BadLogp(_) => true, Self::PyError(err) => Python::with_gil(|py| { - let Ok(attr) = err.value_bound(py).getattr("is_recoverable") else { + let Ok(attr) = err.value(py).getattr("is_recoverable") else { return false; }; return attr @@ -166,7 +166,7 @@ impl CpuLogpFunc for PyDensity { fn logp(&mut self, position: &[f64], grad: &mut [f64]) -> Result { Python::with_gil(|py| { - let pos_array = PyArray1::from_slice_bound(py, position); + let pos_array = PyArray1::from_slice(py, position); let result = self.logp.call1(py, (pos_array,)); match result { Ok(val) => { @@ -451,7 +451,7 @@ impl ExpandDtype { impl DrawStorage for PyTrace { fn append_value(&mut self, point: &[f64]) -> Result<()> { Python::with_gil(|py| { - let point = PyArray1::from_slice_bound(py, point); + let point = PyArray1::from_slice(py, point); let full_point = self .expand .call1(py, (point,)) diff --git a/src/stan.rs b/src/stan.rs index e25ca65..52e6694 100644 --- a/src/stan.rs +++ b/src/stan.rs @@ -56,8 +56,8 @@ impl StanVariable { } #[getter] - fn shape<'py>(&self, py: Python<'py>) -> Bound<'py, PyTuple> { - PyTuple::new_bound(py, self.0.shape.iter()) + fn shape<'py>(&self, py: Python<'py>) -> PyResult> { + PyTuple::new(py, self.0.shape.iter()) } #[getter] @@ -165,11 +165,16 @@ impl StanModel { } pub fn variables<'py>(&self, py: Python<'py>) -> PyResult> { - let out = PyDict::new_bound(py); + let out = PyDict::new(py); let results: Result, _> = self .variables .iter() - .map(|var| out.set_item(var.name.clone(), StanVariable(var.clone()).into_py(py))) + .map(|var| { + out.set_item( + var.name.clone(), + StanVariable(var.clone()).into_pyobject(py)?, + ) + }) .collect(); results?; Ok(out) diff --git a/src/wrapper.rs b/src/wrapper.rs index e4bc33c..55472e7 100644 --- a/src/wrapper.rs +++ b/src/wrapper.rs @@ -1,6 +1,7 @@ use std::{ fmt::Debug, - sync::Arc, + ops::{Deref, DerefMut}, + sync::{Arc, Mutex}, time::{Duration, Instant}, }; @@ -703,7 +704,7 @@ impl ProgressType { } #[pyclass] -struct PySampler(SamplerState); +struct PySampler(Mutex); #[pymethods] impl PySampler { @@ -718,15 +719,15 @@ impl PySampler { match settings.inner { Settings::LowRank(settings) => { let sampler = Sampler::new(model, settings, cores, callback)?; - Ok(PySampler(SamplerState::Running(sampler))) + Ok(PySampler(SamplerState::Running(sampler).into())) } Settings::Diag(settings) => { let sampler = Sampler::new(model, settings, cores, callback)?; - Ok(PySampler(SamplerState::Running(sampler))) + Ok(PySampler(SamplerState::Running(sampler).into())) } Settings::Transforming(settings) => { let sampler = Sampler::new(model, settings, cores, callback)?; - Ok(PySampler(SamplerState::Running(sampler))) + Ok(PySampler(SamplerState::Running(sampler).into())) } } } @@ -742,15 +743,15 @@ impl PySampler { match settings.inner { Settings::LowRank(settings) => { let sampler = Sampler::new(model, settings, cores, callback)?; - Ok(PySampler(SamplerState::Running(sampler))) + Ok(PySampler(SamplerState::Running(sampler).into())) } Settings::Diag(settings) => { let sampler = Sampler::new(model, settings, cores, callback)?; - Ok(PySampler(SamplerState::Running(sampler))) + Ok(PySampler(SamplerState::Running(sampler).into())) } Settings::Transforming(settings) => { let sampler = Sampler::new(model, settings, cores, callback)?; - Ok(PySampler(SamplerState::Running(sampler))) + Ok(PySampler(SamplerState::Running(sampler).into())) } } } @@ -766,39 +767,42 @@ impl PySampler { match settings.inner { Settings::LowRank(settings) => { let sampler = Sampler::new(model, settings, cores, callback)?; - Ok(PySampler(SamplerState::Running(sampler))) + Ok(PySampler(SamplerState::Running(sampler).into())) } Settings::Diag(settings) => { let sampler = Sampler::new(model, settings, cores, callback)?; - Ok(PySampler(SamplerState::Running(sampler))) + Ok(PySampler(SamplerState::Running(sampler).into())) } Settings::Transforming(settings) => { let sampler = Sampler::new(model, settings, cores, callback)?; - Ok(PySampler(SamplerState::Running(sampler))) + Ok(PySampler(SamplerState::Running(sampler).into())) } } } fn is_finished(&mut self, py: Python<'_>) -> PyResult { py.allow_threads(|| { - let state = std::mem::replace(&mut self.0, SamplerState::Empty); + let guard = &mut self.0.lock().expect("Poisond sampler state mutex"); + let slot = guard.deref_mut(); + + let state = std::mem::replace(slot, SamplerState::Empty); let SamplerState::Running(sampler) = state else { - let _ = std::mem::replace(&mut self.0, state); + let _ = std::mem::replace(slot, state); return Ok(true); }; match sampler.wait_timeout(Duration::from_millis(1)) { SamplerWaitResult::Trace(trace) => { - let _ = std::mem::replace(&mut self.0, SamplerState::Finished(Some(trace))); + let _ = std::mem::replace(slot, SamplerState::Finished(Some(trace))); Ok(true) } SamplerWaitResult::Timeout(sampler) => { - let _ = std::mem::replace(&mut self.0, SamplerState::Running(sampler)); + let _ = std::mem::replace(slot, SamplerState::Running(sampler)); Ok(false) } SamplerWaitResult::Err(err, trace) => { - let _ = std::mem::replace(&mut self.0, SamplerState::Finished(trace)); + let _ = std::mem::replace(slot, SamplerState::Finished(trace)); Err(err.into()) } } @@ -807,7 +811,12 @@ impl PySampler { fn pause(&mut self, py: Python<'_>) -> PyResult<()> { py.allow_threads(|| { - if let SamplerState::Running(ref mut control) = self.0 { + if let SamplerState::Running(ref mut control) = self + .0 + .lock() + .expect("Poised sampler state mutex") + .deref_mut() + { control.pause()? } Ok(()) @@ -816,7 +825,12 @@ impl PySampler { fn resume(&mut self, py: Python<'_>) -> PyResult<()> { py.allow_threads(|| { - if let SamplerState::Running(ref mut control) = self.0 { + if let SamplerState::Running(ref mut control) = self + .0 + .lock() + .expect("Poisond sampler state mutex") + .deref_mut() + { control.resume()? } Ok(()) @@ -826,15 +840,18 @@ impl PySampler { #[pyo3(signature = (timeout_seconds=None))] fn wait(&mut self, py: Python<'_>, timeout_seconds: Option) -> PyResult<()> { py.allow_threads(|| { + let guard = &mut self.0.lock().expect("Poisond sampler state mutex"); + let slot = guard.deref_mut(); + let timeout = match timeout_seconds { Some(val) => Some(Duration::try_from_secs_f64(val).context("Invalid timeout")?), None => None, }; - let state = std::mem::replace(&mut self.0, SamplerState::Empty); + let state = std::mem::replace(slot, SamplerState::Empty); let SamplerState::Running(mut control) = state else { - let _ = std::mem::replace(&mut self.0, state); + let _ = std::mem::replace(slot, state); return Ok(()); }; @@ -875,32 +892,38 @@ impl PySampler { } }; - let _ = std::mem::replace(&mut self.0, final_state); + let _ = std::mem::replace(slot, final_state); retval }) } fn abort(&mut self, py: Python<'_>) -> PyResult<()> { py.allow_threads(|| { - let state = std::mem::replace(&mut self.0, SamplerState::Empty); + let guard = &mut self.0.lock().expect("Poisond sampler state mutex"); + let slot = guard.deref_mut(); + + let state = std::mem::replace(slot, SamplerState::Empty); let SamplerState::Running(control) = state else { - let _ = std::mem::replace(&mut self.0, state); + let _ = std::mem::replace(slot, state); return Ok(()); }; let (result, trace) = control.abort(); - let _ = std::mem::replace(&mut self.0, SamplerState::Finished(trace)); + let _ = std::mem::replace(slot, SamplerState::Finished(trace)); result?; Ok(()) }) } fn extract_results<'py>(&mut self, py: Python<'py>) -> PyResult> { - let state = std::mem::replace(&mut self.0, SamplerState::Empty); + let guard = &mut self.0.lock().expect("Poisond sampler state mutex"); + let slot = guard.deref_mut(); + + let state = std::mem::replace(slot, SamplerState::Empty); let SamplerState::Finished(trace) = state else { - let _ = std::mem::replace(&mut self.0, state); + let _ = std::mem::replace(slot, state); return Err(anyhow::anyhow!("Sampler is not finished"))?; }; @@ -914,7 +937,7 @@ impl PySampler { } fn is_empty(&self) -> bool { - match self.0 { + match self.0.lock().expect("Poisoned sampler state lock").deref() { SamplerState::Running(_) => false, SamplerState::Finished(_) => false, SamplerState::Empty => true, @@ -923,7 +946,8 @@ impl PySampler { fn inspect<'py>(&mut self, py: Python<'py>) -> PyResult> { let trace = py.allow_threads(|| { - let SamplerState::Running(ref mut sampler) = self.0 else { + let mut guard = self.0.lock().unwrap(); + let SamplerState::Running(ref mut sampler) = guard.deref_mut() else { return Err(anyhow::anyhow!("Sampler is not running"))?; }; @@ -934,28 +958,28 @@ impl PySampler { } fn trace_to_list(trace: Trace, py: Python<'_>) -> PyResult> { - let list = PyList::new_bound( + let list = PyList::new( py, trace .chains .into_iter() .map(|chain| { - Ok(PyTuple::new_bound( + Ok(PyTuple::new( py, [ export_array(py, chain.draws)?, export_array(py, chain.stats)?, ] .into_iter(), - )) + )?) }) .collect::>>()?, - ); + )?; Ok(list) } fn export_array(py: Python<'_>, data: Arc) -> PyResult { - let pa = py.import_bound("pyarrow")?; + let pa = py.import("pyarrow")?; let array = pa.getattr("Array")?; let data = data.into_data(); @@ -966,12 +990,12 @@ fn export_array(py: Python<'_>, data: Arc) -> PyResult { .call_method1( "_import_from_c", ( - (&data as *const _ as Py_uintptr_t).into_py(py), - (&schema as *const _ as Py_uintptr_t).into_py(py), + (&data as *const _ as Py_uintptr_t).into_pyobject(py)?, + (&schema as *const _ as Py_uintptr_t).into_pyobject(py)?, ), ) .context("Could not import arrow trace in python")?; - Ok(data.into_py(py)) + Ok(data.unbind()) } #[pyclass] @@ -996,8 +1020,8 @@ impl PyTransformAdapt { transformed_gradient: &mut [f64], ) -> Result { Python::with_gil(|py| { - let untransformed_position = PyArray1::from_slice_bound(py, untransformed_position); - let untransformed_gradient = PyArray1::from_slice_bound(py, untransformed_gradient); + let untransformed_position = PyArray1::from_slice(py, untransformed_position); + let untransformed_gradient = PyArray1::from_slice(py, untransformed_gradient); let output = params .getattr(py, intern!(py, "inv_transform")) @@ -1051,7 +1075,7 @@ impl PyTransformAdapt { transformed_gradient: &mut [f64], ) -> Result<(f64, f64)> { Python::with_gil(|py| { - let transformed_position = PyArray1::from_slice_bound(py, transformed_position); + let transformed_position = PyArray1::from_slice(py, transformed_position); let output = params .getattr(py, intern!(py, "init_from_transformed_position"))? @@ -1084,7 +1108,7 @@ impl PyTransformAdapt { transformed_position: &[f64], ) -> Result> { Python::with_gil(|py| { - let transformed_position = PyArray1::from_slice_bound(py, transformed_position); + let transformed_position = PyArray1::from_slice(py, transformed_position); let output = params .getattr(py, intern!(py, "init_from_transformed_position_part1"))? @@ -1105,7 +1129,7 @@ impl PyTransformAdapt { transformed_gradient: &mut [f64], ) -> Result { Python::with_gil(|py| { - let untransformed_gradient = PyArray1::from_slice_bound(py, untransformed_gradient); + let untransformed_gradient = PyArray1::from_slice(py, untransformed_gradient); let output = params .getattr(py, intern!(py, "init_from_transformed_position_part2"))? @@ -1127,7 +1151,7 @@ impl PyTransformAdapt { transformed_gradient: &mut [f64], ) -> Result<(f64, f64)> { Python::with_gil(|py| { - let untransformed_position = PyArray1::from_slice_bound(py, untransformed_position); + let untransformed_position = PyArray1::from_slice(py, untransformed_position); let output = params .getattr(py, intern!(py, "init_from_untransformed_position")) @@ -1166,16 +1190,16 @@ impl PyTransformAdapt { params: &'a mut Py, ) -> Result<()> { Python::with_gil(|py| { - let positions = PyList::new_bound( + let positions = PyList::new( py, - untransformed_positions.map(|pos| PyArray1::from_slice_bound(py, pos)), - ); - let gradients = PyList::new_bound( + untransformed_positions.map(|pos| PyArray1::from_slice(py, pos)), + )?; + let gradients = PyList::new( py, - untransformed_gradients.map(|grad| PyArray1::from_slice_bound(py, grad)), - ); + untransformed_gradients.map(|grad| PyArray1::from_slice(py, grad)), + )?; - let logps = PyArray1::from_iter_bound(py, untransformed_logp.copied()); + let logps = PyArray1::from_iter(py, untransformed_logp.copied()); let seed = rng.next_u64(); params @@ -1193,8 +1217,8 @@ impl PyTransformAdapt { chain: u64, ) -> Result> { Python::with_gil(|py| { - let position = PyArray1::from_slice_bound(py, untransformed_position); - let gradient = PyArray1::from_slice_bound(py, untransformed_gradient); + let position = PyArray1::from_slice(py, untransformed_position); + let gradient = PyArray1::from_slice(py, untransformed_gradient); let seed = rng.next_u64(); From 329a8b4bc5417b88ff9e30f6f322ab4ac95339d1 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Thu, 12 Dec 2024 14:41:03 +0100 Subject: [PATCH 23/55] style: Reformat some code --- src/pyfunc.rs | 45 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/src/pyfunc.rs b/src/pyfunc.rs index 827f038..94a102b 100644 --- a/src/pyfunc.rs +++ b/src/pyfunc.rs @@ -477,36 +477,51 @@ impl DrawStorage for PyTrace { self.builder.field_builder(i).context( "Builder has incorrect type", )?; - builder.append_value(value.extract().expect("Return value from expand function could not be converted to boolean")) + let value = value + .extract() + .expect("Return value from expand function could not be converted to boolean"); + builder.append_value(value) }, ExpandDtype::Float64 {} => { let builder: &mut Float64Builder = self.builder.field_builder(i).context( "Builder has incorrect type", )?; - builder.append_value(value.extract().expect("Return value from expand function could not be converted to float64")) + builder.append_value( + value + .extract() + .expect("Return value from expand function could not be converted to float64") + ) }, ExpandDtype::Float32 {} => { let builder: &mut Float32Builder = self.builder.field_builder(i).context( "Builder has incorrect type", )?; - builder.append_value(value.extract().expect("Return value from expand function could not be converted to float32")) - + builder.append_value( + value + .extract() + .expect("Return value from expand function could not be converted to float32") + ) }, ExpandDtype::Int64 {} => { let builder: &mut Int64Builder = self.builder.field_builder(i).context( "Builder has incorrect type", )?; - builder.append_value(value.extract().expect("Return value from expand function could not be converted to int64")) + let value = value.extract().expect("Return value from expand function could not be converted to int64"); + builder.append_value(value) }, ExpandDtype::BooleanArray { tensor_type} => { let builder: &mut FixedSizeListBuilder> = self.builder.field_builder(i).context( "Builder has incorrect type", )?; - let value_builder = builder.values().as_any_mut().downcast_mut::().context("Could not downcast builder to boolean type")?; + let value_builder = builder + .values() + .as_any_mut() + .downcast_mut::() + .context("Could not downcast builder to boolean type")?; let values: PyReadonlyArray1 = value.extract().context("Could not convert object to array")?; if values.len()? != tensor_type.size() { bail!("Extracted array has incorrect shape"); @@ -520,7 +535,11 @@ impl DrawStorage for PyTrace { self.builder.field_builder(i).context( "Builder has incorrect type", )?; - let value_builder = builder.values().as_any_mut().downcast_mut::>().context("Could not downcast builder to float64 type")?; + let value_builder = builder + .values() + .as_any_mut() + .downcast_mut::>() + .context("Could not downcast builder to float64 type")?; let values: PyReadonlyArray1 = value.extract().context("Could not convert object to array")?; if values.len()? != tensor_type.size() { bail!("Extracted array has incorrect shape"); @@ -533,7 +552,11 @@ impl DrawStorage for PyTrace { self.builder.field_builder(i).context( "Builder has incorrect type", )?; - let value_builder = builder.values().as_any_mut().downcast_mut::>().context("Could not downcast builder to float32 type")?; + let value_builder = builder + .values() + .as_any_mut() + .downcast_mut::>() + .context("Could not downcast builder to float32 type")?; let values: PyReadonlyArray1 = value.extract().context("Could not convert object to array")?; if values.len()? != tensor_type.size() { bail!("Extracted array has incorrect shape"); @@ -546,7 +569,11 @@ impl DrawStorage for PyTrace { self.builder.field_builder(i).context( "Builder has incorrect type", )?; - let value_builder = builder.values().as_any_mut().downcast_mut::>().context("Could not downcast builder to i64 type")?; + let value_builder = builder + .values() + .as_any_mut() + .downcast_mut::>() + .context("Could not downcast builder to i64 type")?; let values: PyReadonlyArray1 = value.extract().context("Could not convert object to array")?; if values.len()? != tensor_type.size() { bail!("Extracted array has incorrect shape"); From fd57509fb7b7fc1f46fa5e334a9d578e8a67c8bf Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Thu, 12 Dec 2024 14:41:24 +0100 Subject: [PATCH 24/55] chore: improve gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index f0721f7..2d1f0df 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,6 @@ perf.data* wheels .vscode/ *~ +.zed +.cargo +*traces* From b02088371f952fad23906ac62c51035949edf588 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Thu, 12 Dec 2024 14:42:36 +0100 Subject: [PATCH 25/55] chore: Update pixi dependencies --- Cargo.lock | 315 ++--- pixi.lock | 3388 +++++++++++++++++++--------------------------------- pixi.toml | 14 +- 3 files changed, 1382 insertions(+), 2335 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2c09233..4693433 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -71,15 +71,15 @@ checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anyhow" -version = "1.0.93" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" +checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" [[package]] name = "arrow" -version = "53.2.0" +version = "53.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4caf25cdc4a985f91df42ed9e9308e1adbcd341a31a72605c697033fcef163e3" +checksum = "c91839b07e474b3995035fd8ac33ee54f9c9ccbbb1ea33d9909c71bffdf1259d" dependencies = [ "arrow-arith", "arrow-array", @@ -95,9 +95,9 @@ dependencies = [ [[package]] name = "arrow-arith" -version = "53.2.0" +version = "53.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91f2dfd1a7ec0aca967dfaa616096aec49779adc8eccec005e2f5e4111b1192a" +checksum = "855c57c4efd26722b044dcd3e348252560e3e0333087fb9f6479dc0bf744054f" dependencies = [ "arrow-array", "arrow-buffer", @@ -110,9 +110,9 @@ dependencies = [ [[package]] name = "arrow-array" -version = "53.2.0" +version = "53.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d39387ca628be747394890a6e47f138ceac1aa912eab64f02519fed24b637af8" +checksum = "bd03279cea46569acf9295f6224fbc370c5df184b4d2ecfe97ccb131d5615a7f" dependencies = [ "ahash", "arrow-buffer", @@ -126,9 +126,9 @@ dependencies = [ [[package]] name = "arrow-buffer" -version = "53.2.0" +version = "53.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e51e05228852ffe3eb391ce7178a0f97d2cf80cc6ef91d3c4a6b3cb688049ec" +checksum = "9e4a9b9b1d6d7117f6138e13bc4dd5daa7f94e671b70e8c9c4dc37b4f5ecfc16" dependencies = [ "bytes", "half", @@ -137,9 +137,9 @@ dependencies = [ [[package]] name = "arrow-cast" -version = "53.2.0" +version = "53.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d09aea56ec9fa267f3f3f6cdab67d8a9974cbba90b3aa38c8fe9d0bb071bd8c1" +checksum = "bc70e39916e60c5b7af7a8e2719e3ae589326039e1e863675a008bee5ffe90fd" dependencies = [ "arrow-array", "arrow-buffer", @@ -157,9 +157,9 @@ dependencies = [ [[package]] name = "arrow-data" -version = "53.2.0" +version = "53.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98ae0af50890b494cebd7d6b04b35e896205c1d1df7b29a6272c5d0d0249ef5" +checksum = "e4e75edf21ffd53744a9b8e3ed11101f610e7ceb1a29860432824f1834a1f623" dependencies = [ "arrow-buffer", "arrow-schema", @@ -169,9 +169,9 @@ dependencies = [ [[package]] name = "arrow-ord" -version = "53.2.0" +version = "53.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2883d7035e0b600fb4c30ce1e50e66e53d8656aa729f2bfa4b51d359cf3ded52" +checksum = "ece7b5bc1180e6d82d1a60e1688c199829e8842e38497563c3ab6ea813e527fd" dependencies = [ "arrow-array", "arrow-buffer", @@ -184,9 +184,9 @@ dependencies = [ [[package]] name = "arrow-row" -version = "53.2.0" +version = "53.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "552907e8e587a6fde4f8843fd7a27a576a260f65dab6c065741ea79f633fc5be" +checksum = "745c114c8f0e8ce211c83389270de6fbe96a9088a7b32c2a041258a443fe83ff" dependencies = [ "ahash", "arrow-array", @@ -198,18 +198,18 @@ dependencies = [ [[package]] name = "arrow-schema" -version = "53.2.0" +version = "53.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "539ada65246b949bd99ffa0881a9a15a4a529448af1a07a9838dd78617dafab1" +checksum = "b95513080e728e4cec37f1ff5af4f12c9688d47795d17cda80b6ec2cf74d4678" dependencies = [ "bitflags 2.6.0", ] [[package]] name = "arrow-select" -version = "53.2.0" +version = "53.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6259e566b752da6dceab91766ed8b2e67bf6270eb9ad8a6e07a33c1bede2b125" +checksum = "8e415279094ea70323c032c6e739c48ad8d80e78a09bef7117b8718ad5bf3722" dependencies = [ "ahash", "arrow-array", @@ -221,9 +221,9 @@ dependencies = [ [[package]] name = "arrow-string" -version = "53.2.0" +version = "53.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3179ccbd18ebf04277a095ba7321b93fd1f774f18816bd5f6b3ce2f594edb6c" +checksum = "11d956cae7002eb8d83a27dbd34daaea1cf5b75852f0b84deb4d93a276e92bbf" dependencies = [ "arrow-array", "arrow-buffer", @@ -280,9 +280,9 @@ dependencies = [ "proc-macro2", "quote", "regex", - "rustc-hash", + "rustc-hash 1.1.0", "shlex", - "syn 2.0.87", + "syn", "which", ] @@ -328,9 +328,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" +checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a" dependencies = [ "bytemuck_derive", ] @@ -343,7 +343,7 @@ checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -354,9 +354,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" [[package]] name = "bzip2" @@ -387,9 +387,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.1" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd9de9f2205d5ef3fd67e685b0df337994ddd4495e2a28d185500d0e1edfea47" +checksum = "27f657647bcff5394bf56c7317665bbf790a137a50eaaa5c6bfbb9e27a518f2d" dependencies = [ "jobserver", "libc", @@ -413,9 +413,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" dependencies = [ "android-tzdata", "iana-time-zone", @@ -473,18 +473,18 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.21" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb3b4b9e5a7c7514dfa52869339ee98b3156b0bfb4e8a77c4ff4babb64b1604f" +checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.5.21" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b17a95aa67cc7b5ebd32aa5370189aa0d79069ef1c64ce893bd30fb24bff20ec" +checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" dependencies = [ "anstyle", "clap_lex", @@ -492,9 +492,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afb84c814227b90d6895e01398aee0d8033c00e7466aca416fb6a8e0eb19d8a7" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "coe-rs" @@ -549,9 +549,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ca741a962e1b0bff6d724a1a0958b686406e853bb14061f218562e1896f95e6" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" dependencies = [ "libc", ] @@ -699,7 +699,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -728,7 +728,7 @@ checksum = "3bf679796c0322556351f287a51b49e48f7c4986e727b5dd78c972d30e2e16cc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -739,17 +739,17 @@ checksum = "5322a90066ddae2b705096eb9e10c465c0498ae93bf9bdd6437415327c88e3bb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] name = "errno" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -786,7 +786,7 @@ dependencies = [ "libm", "num-complex", "num-traits", - "pulp", + "pulp 0.18.22", "reborrow", ] @@ -863,7 +863,7 @@ dependencies = [ "num-traits", "once_cell", "paste", - "pulp", + "pulp 0.18.22", "raw-cpuid", "seq-macro", "sysctl", @@ -957,9 +957,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.5" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" [[package]] name = "heck" @@ -1082,9 +1082,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "jobserver" @@ -1097,10 +1097,11 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -1118,9 +1119,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "lexical-core" -version = "1.0.2" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0431c65b318a590c1de6b8fd6e72798c92291d27762d94c9e6c37ed7a73d8458" +checksum = "b765c31809609075565a70b4b71402281283aeda7ecaf4818ac14a7b2ade8958" dependencies = [ "lexical-parse-float", "lexical-parse-integer", @@ -1131,9 +1132,9 @@ dependencies = [ [[package]] name = "lexical-parse-float" -version = "1.0.2" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb17a4bdb9b418051aa59d41d65b1c9be5affab314a872e5ad7f06231fb3b4e0" +checksum = "de6f9cb01fb0b08060209a057c048fcbab8717b4c1ecd2eac66ebfe39a65b0f2" dependencies = [ "lexical-parse-integer", "lexical-util", @@ -1142,9 +1143,9 @@ dependencies = [ [[package]] name = "lexical-parse-integer" -version = "1.0.2" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5df98f4a4ab53bf8b175b363a34c7af608fe31f93cc1fb1bf07130622ca4ef61" +checksum = "72207aae22fc0a121ba7b6d479e42cbfea549af1479c3f3a4f12c70dd66df12e" dependencies = [ "lexical-util", "static_assertions", @@ -1152,18 +1153,18 @@ dependencies = [ [[package]] name = "lexical-util" -version = "1.0.3" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85314db53332e5c192b6bca611fb10c114a80d1b831ddac0af1e9be1b9232ca0" +checksum = "5a82e24bf537fd24c177ffbbdc6ebcc8d54732c35b50a3f28cc3f4e4c949a0b3" dependencies = [ "static_assertions", ] [[package]] name = "lexical-write-float" -version = "1.0.2" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e7c3ad4e37db81c1cbe7cf34610340adc09c322871972f74877a712abc6c809" +checksum = "c5afc668a27f460fb45a81a757b6bf2f43c2d7e30cb5a2dcd3abf294c78d62bd" dependencies = [ "lexical-util", "lexical-write-integer", @@ -1172,9 +1173,9 @@ dependencies = [ [[package]] name = "lexical-write-integer" -version = "1.0.2" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb89e9f6958b83258afa3deed90b5de9ef68eef090ad5086c791cd2345610162" +checksum = "629ddff1a914a836fb245616a7888b62903aae58fa771e1d83943035efa0f978" dependencies = [ "lexical-util", "static_assertions", @@ -1182,15 +1183,15 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.162" +version = "0.2.168" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" +checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" [[package]] name = "libloading" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", "windows-targets", @@ -1272,9 +1273,9 @@ dependencies = [ [[package]] name = "multiversion" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4851161a11d3ad0bf9402d90ffc3967bf231768bfd7aeb61755ad06dbf1a142" +checksum = "7edb7f0ff51249dfda9ab96b5823695e15a052dc15074c9dbf3d118afaf2c201" dependencies = [ "multiversion-macros", "target-features", @@ -1282,13 +1283,13 @@ dependencies = [ [[package]] name = "multiversion-macros" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79a74ddee9e0c27d2578323c13905793e91622148f138ba29738f9dddb835e90" +checksum = "b093064383341eb3271f42e381cb8f10a01459478446953953c75d24bd339fc0" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn", "target-features", ] @@ -1489,9 +1490,9 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] name = "numpy" -version = "0.22.1" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edb929bc0da91a4d85ed6c0a84deaa53d411abfb387fc271124f91bf6b89f14e" +checksum = "b94caae805f998a07d33af06e6a3891e38556051b8045c615470a71590e13e78" dependencies = [ "libc", "ndarray 0.16.1", @@ -1499,7 +1500,7 @@ dependencies = [ "num-integer", "num-traits", "pyo3", - "rustc-hash", + "rustc-hash 2.1.0", ] [[package]] @@ -1521,7 +1522,7 @@ dependencies = [ "rayon", "smallvec", "tch", - "thiserror 2.0.3", + "thiserror 2.0.6", "time-humanize", "upon", ] @@ -1529,20 +1530,18 @@ dependencies = [ [[package]] name = "nuts-rs" version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55fad6cdecd2d51675b7f167657817304ac421a18d0efff93914e295935ef4c0" dependencies = [ "anyhow", "arrow", "faer", "itertools 0.13.0", "multiversion", - "pulp", + "pulp 0.20.1", "rand", "rand_chacha", "rand_distr", "rayon", - "thiserror 1.0.69", + "thiserror 2.0.6", ] [[package]] @@ -1640,15 +1639,15 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" +checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" [[package]] name = "portable-atomic-util" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90a7d5beecc52a491b54d6dd05c7a45ba1801666a5baad9fdbfc6fef8d2d206c" +checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" dependencies = [ "portable-atomic", ] @@ -1675,14 +1674,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" dependencies = [ "proc-macro2", - "syn 2.0.87", + "syn", ] [[package]] name = "proc-macro2" -version = "1.0.89" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] @@ -1699,11 +1698,23 @@ dependencies = [ "reborrow", ] +[[package]] +name = "pulp" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e3f19bdeda2e49d16c8ae90f9615adc2298ee16974bb250d0afb705e33043f" +dependencies = [ + "bytemuck", + "libm", + "num-complex", + "reborrow", +] + [[package]] name = "pyo3" -version = "0.22.6" +version = "0.23.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f402062616ab18202ae8319da13fa4279883a2b8a9d9f83f20dbade813ce1884" +checksum = "e484fd2c8b4cb67ab05a318f1fd6fa8f199fcc30819f08f07d200809dba26c15" dependencies = [ "anyhow", "cfg-if", @@ -1720,9 +1731,9 @@ dependencies = [ [[package]] name = "pyo3-build-config" -version = "0.22.6" +version = "0.23.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b14b5775b5ff446dd1056212d778012cbe8a0fbffd368029fd9e25b514479c38" +checksum = "dc0e0469a84f208e20044b98965e1561028180219e35352a2afaf2b942beff3b" dependencies = [ "once_cell", "target-lexicon", @@ -1730,9 +1741,9 @@ dependencies = [ [[package]] name = "pyo3-ffi" -version = "0.22.6" +version = "0.23.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ab5bcf04a2cdcbb50c7d6105de943f543f9ed92af55818fd17b660390fc8636" +checksum = "eb1547a7f9966f6f1a0f0227564a9945fe36b90da5a93b3933fc3dc03fae372d" dependencies = [ "libc", "pyo3-build-config", @@ -1740,27 +1751,27 @@ dependencies = [ [[package]] name = "pyo3-macros" -version = "0.22.6" +version = "0.23.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fd24d897903a9e6d80b968368a34e1525aeb719d568dba8b3d4bfa5dc67d453" +checksum = "fdb6da8ec6fa5cedd1626c886fc8749bdcbb09424a86461eb8cdf096b7c33257" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", - "syn 2.0.87", + "syn", ] [[package]] name = "pyo3-macros-backend" -version = "0.22.6" +version = "0.23.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c011a03ba1e50152b4b394b479826cad97e7a21eb52df179cd91ac411cbfbe" +checksum = "38a385202ff5a92791168b1136afae5059d3ac118457bb7bc304c197c2d33e7d" dependencies = [ "heck", "proc-macro2", "pyo3-build-config", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -1888,17 +1899,23 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc-hash" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" + [[package]] name = "rustix" -version = "0.38.40" +version = "0.38.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99e4ea3e1cdc4b559b8e5650f9c8e5998e3e5c1343b4eaf034565f32318d63c0" +checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" dependencies = [ "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1934,29 +1951,29 @@ checksum = "a3f0bf26fd526d2a95683cd0f87bf103b8539e2ca1ef48ce002d67aad59aa0b4" [[package]] name = "serde" -version = "1.0.215" +version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" +checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.215" +version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" +checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.133" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" dependencies = [ "itoa", "memchr", @@ -2012,20 +2029,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "1.0.109" +version = "2.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" +checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" dependencies = [ "proc-macro2", "quote", @@ -2086,11 +2092,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.3" +version = "2.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c006c85c7651b3cf2ada4584faa36773bd07bac24acfb39f3c431b36d7e667aa" +checksum = "8fec2a1820ebd077e2b90c4df007bebf344cd394098a13c563957d0afc83ea47" dependencies = [ - "thiserror-impl 2.0.3", + "thiserror-impl 2.0.6", ] [[package]] @@ -2101,25 +2107,25 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] name = "thiserror-impl" -version = "2.0.3" +version = "2.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f077553d607adc1caf65430528a576c757a71ed73944b66ebb58ef2bbd243568" +checksum = "d65750cab40f4ff1929fb1ba509e9914eb756131cef4210da8d5d700d26f6312" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] name = "time" -version = "0.3.36" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ "deranged", "num-conv", @@ -2179,9 +2185,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "unicode-width" @@ -2231,9 +2237,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" dependencies = [ "cfg-if", "once_cell", @@ -2242,24 +2248,23 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.87", + "syn", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2267,28 +2272,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" dependencies = [ "js-sys", "wasm-bindgen", @@ -2434,7 +2439,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] diff --git a/pixi.lock b/pixi.lock index fb67443..4216fdc 100644 --- a/pixi.lock +++ b/pixi.lock @@ -1,4 +1,4 @@ -version: 5 +version: 6 environments: default: channels: @@ -11,7 +11,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/arviz-0.20.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/asciitree-0.3.3-py_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-2.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.43-h4bf12b8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.43-h4852527_2.conda @@ -20,26 +20,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.3-heb4867d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.3-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-hebfffa5_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.2-h3394656_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cons-0.4.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py312h68727a3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.8-py312h2ec8cdc_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.10-py312h2ec8cdc_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/etuples-0.3.9-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fasteners-0.17.3-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -47,12 +47,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.55.0-py312h178313f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.55.3-py312h178313f_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-13.3.0-h9576a4e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-13.3.0-hfea6d02_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-13.3.0-hc28eda2_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-13.3.0-hc28eda2_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.12-hb9ae30d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-12.0.0-hba01fac_0.conda @@ -60,19 +60,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-13.3.0-h9576a4e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-13.3.0-hdbfa832_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-13.3.0-h6834431_5.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h5netcdf-1.4.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-13.3.0-h6834431_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h5netcdf-1.4.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.12.1-nompi_py312hedeef09_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-9.0.0-hda332d3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h2d575fe_108.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-8.29.0-pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-8.30.0-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.5-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.13-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-he073ed8_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py312h68727a3_0.conda @@ -86,7 +88,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-25_linux64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.10.1-hbbe4b11_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.11.1-h332b0f4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.22-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda @@ -97,16 +99,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-hd3e95f3_10.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.1-default_hecaa2ac_1000.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-25_linux64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-25_linux64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm14-14.0.6-hcd5def8_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.3-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda @@ -114,26 +116,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.4-hc0ffecb_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-13.3.0-heb74ff8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.2-hee588c1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-13.3.0-h84ea5a7_101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-he137b08_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hc4654cb_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.5-hb346dea_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.5-h8d12d68_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-19.1.3-h024ca30_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-19.1.5-h024ca30_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.43.0-py312h374181b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/logical-unification-0.4.6-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py312hd3ec401_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/maturin-1.7.4-py312h6ab59e4_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.3-py312hd3ec401_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/maturin-1.7.8-py312h6ab59e4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/minikanren-1.0.3-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-service-2.4.2-py312hf224ee7_0.conda @@ -141,164 +143,151 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/multipledispatch-0.6.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numba-0.60.0-py312h83e6fd3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.14.0-py312hf9745cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.14.1-py312hf9745cd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/objprint-0.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.28-pthreads_h6ec200e_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orjson-3.10.12-py312h12e396e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py312hf9745cd_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.54.0-h4c5309f_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.1-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.54.0-h3a902e7_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-py_1003.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.0.0-py312h7b63e92_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/polars-1.12.0-py312hfe7c9be_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.48-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.44.2-h29eaf8c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/polars-1.17.1-py312hda0fa55_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.48-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.0-py312h66e93f0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pymc-5.18.1-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pymc-base-5.18.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytensor-2.26.2-py312h97902ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytensor-base-2.26.2-py312h25a0e75_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.7-hc5c86c4_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.20.3-pyhe28f650_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pymc-5.19.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pymc-base-5.19.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytensor-2.26.4-py312h97902ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytensor-base-2.26.4-py312h25a0e75_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.8-h9e4cc4f_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.20.3-pyh91182bf_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.0-py312hbf22597_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py312h62794b6_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py312h62794b6_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.6.0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.4-py312hc0a28a1_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h4a8ded7_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-h84d6215_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.1.0-pyhff2d567_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py312h66e93f0_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py312h66e93f0_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2024.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/viztracer-1.0.0-py312h3a80f7f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2024.11.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-einstats-0.8.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-he73a12e_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2024.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-2.18.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-2.18.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda - pypi: https://files.pythonhosted.org/packages/a2/ad/e0d3c824784ff121c03cc031f944bc7e139a8f1870ffd2845cc2dd76f6c4/absl_py-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/02/c8/542c1f9513136b431b101d06fb547e94d3ebc1d33740c3024315b55d4ada/bridgestan-2.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/92/92a76dc2ff3a12e69ba94e7e05168d37d0345fa08c87e1fe24d0c2a42223/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/46/dd/c1ff2eb8fbf95a8ca804abb1cc3ce70b283ee7b4bc653c3abac245670400/chex-0.1.87-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/58/a0/e4bebe76bdd0a68077030f1b5e48b545597473ae1b773c84150311152efc/chex-0.1.88-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/59/f189b03d743364a350c972b89fe08a6db5bbbdc5f1ea6b604b3eee0a7967/dllist-1.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/15/9f/3be7f03bf66c8d7d2956b727d984595e4af899f3c15ef2c653029008bf3b/equinox-0.11.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1f/e4/0826dfde2db3fb3a34954323a84d0e6b6fdbc7eb5278c84159c6d43290ac/etils-1.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3a/af/411e94c165229882eb2d0a329114826aa52c7c61ef3108d0d3d8ad7189ed/equinox-0.11.10-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4f/4a/ff8aa2c57300613b69905308c5afe92c5b01112d766c25a305fd6796170a/etils-1.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/20/6c57c50c0ccc645fea1895950f1e5cd02f961ee44b3ffe83617fa46b0c1d/jax-0.4.35-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d7/aa/f15ea857ad9bcff7a0c942dc570ca718b026cc0cc5c513525bb08cacf3c0/jax_cuda12_pjrt-0.4.35-py3-none-manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/23/a1/781f98da41b9abf63a1468c5babbafa7b1bdb766c081386644a4034fbdef/jax_cuda12_plugin-0.4.35-cp312-cp312-manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/e7/0d/4faf839e3c8ce2a5b615df64427be3e870899c72c0ebfb5859348150aba1/jaxlib-0.4.34-cp312-cp312-manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/56/ae/220537f80eb82ae43a299de31edb2a91a28b8c5fb8046e9ff853ec7763cd/jaxtyping-0.2.34-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5f/3f/6c5553baaa7faa3fa8bae8279b1e46cb54c7ce52360139eae53498786ea5/jax-0.4.37-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/04/31/8fd189998732d1c5ecacf6a68b6c9aeaafa300b0eaa85b8c678238edba7c/jax_cuda12_pjrt-0.4.36-py3-none-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/4b/b9/aaf71a9878ef3f4e4997dabf8458765cd8085c37f65865631980bfb83d53/jax_cuda12_plugin-0.4.36-cp312-cp312-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/fe/f2/7624a304426daa7b135b85caf1b8eccf879e7cb10bc074656ce628309cb0/jaxlib-0.4.36-cp312-cp312-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/94/99/c83c6a97f4382caf1c9bfeeeca935d3eb1f479f711665aeadf4408048107/jaxtyping-0.2.36-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6f/d3/1321715a95e856d4ef4fba24e4351cf5e4c89d459ad132a8cba5fe257d72/ml_dtypes-0.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/f3/e7/c186a31c234fce776436753bfef4807df7f9b4cb3eeff358fcfcbf64b547/nvidia_cublas_cu12-12.6.3.3-py3-none-manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/a5/24/120ee57b218d9952c379d1e026c4479c9ece9997a4fb46303611ee48f038/nvidia_cuda_cupti_cu12-12.6.80-py3-none-manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/62/8f/cd3032281ba7bb531fe3159337af00c5c805fd6a31dc700f0715c8748c8c/nvidia_cuda_nvcc_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/f0/62/65c05e161eeddbafeca24dc461f47de550d9fa8a7e04eb213e32b55cfd99/nvidia_cuda_runtime_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/2a/78/4535c9c7f859a64781e43c969a3a7e84c54634e319a996d43ef32ce46f83/nvidia_cudnn_cu12-9.5.1.17-py3-none-manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/60/de/99ec247a07ea40c969d904fc14f3a356b3e2a704121675b75c366b694ee1/nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/9f/81/baba53585da791d043c10084cf9553e074548408e04ae884cfe9193bd484/nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/43/ac/64c4316ba163e8217a99680c7605f779accffc6a4bcd0c778c12948d3707/nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/af/eb/ff4b8c503fa1f1796679dce648854d58751982426e4e4b37d6fce49d259c/nvidia_cublas_cu12-12.6.4.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/49/60/7b6497946d74bcf1de852a21824d63baad12cd417db4195fc1bfe59db953/nvidia_cuda_cupti_cu12-12.6.80-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/25/1f/faf9b791027ebd6354be68700da3c3d8a3b3db3bdcf2f8070f2e6871a7f1/nvidia_cuda_nvcc_cu12-12.6.85-py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e1/23/e717c5ac26d26cf39a27fbc076240fad2e3b817e5889d671b67f4f9f49c5/nvidia_cuda_runtime_cu12-12.6.77-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/67/4c/0f18ddce75f2c17cf028d16e067c07f11c421c981b8c2a45c99bc6169af6/nvidia_cudnn_cu12-9.6.0.74-py3-none-manylinux_2_27_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/8f/16/73727675941ab8e6ffd86ca3a4b7b47065edcca7a997920b831f8147c99d/nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f0/6e/c2cf12c9ff8b872e92b4a5740701e51ff17689c4d726fca91875b07f655d/nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/06/1e/b8b7c2f4099a37b96af5c9bb158632ea9e5d9d27d7391d7eb8fc45236674/nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - pypi: https://files.pythonhosted.org/packages/ed/1f/6482380ec8dcec4894e7503490fc536d846b0d59694acad9cf99f27d0e7d/nvidia_nccl_cu12-2.23.4-py3-none-manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/fe/e4/486de766851d58699bcfeb3ba6a3beb4d89c3809f75b9d423b9508a8760f/nvidia_nvjitlink_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9d/d7/c5383e47c7e9bf1c99d5bd2a8c935af2b6d705ad831a7ec5c97db4d82f4f/nvidia_nvjitlink_cu12-12.6.85-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/24/28d0bb21600a78e46754947333ec9a297044af884d360092eb8561575fe9/optax-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/f8/7b1f5b84f84e43face7349ac2df23f0f75d36b5b4a1c1c0305edce82bcc8/paramax-0.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/4d/b72e0782abec07f3d8dabf24cf12673d26b173af2046eb4e67365c776ccf/posteriordb-0.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/2b/78/57043611a16c655c8350b4c01b8d6abfb38cc2acb475238b62c2146186d7/tqdm-4.67.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/bb/d43e5c75054e53efce310e79d63df0ac3f25e34c926be5dffb7d283fb2a8/typeguard-2.13.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c3/ac/1847959031ce09eb65a70b16d0f07633d7ddaf8a97752cc924f9a8cbe253/watermark-2.5.0-py2.py3-none-any.whl - pypi: ../flowjax/ - pypi: ../pymc-labs/benchmark-pymc packages: -- kind: conda - name: _libgcc_mutex - version: '0.1' - build: conda_forge - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 md5: d7c89558ba9fa0495403155b64376d81 + arch: x86_64 + platform: linux license: None purls: [] size: 2562 timestamp: 1578324546067 -- kind: conda - name: _openmp_mutex - version: '4.5' - build: 2_kmp_llvm +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 sha256: 84a66275da3a66e3f3e70e9d8f10496d807d01a9e4ec16cd2274cc5e28c478fc md5: 562b26ba2e19059551a811e72ab7f793 depends: - _libgcc_mutex 0.1 conda_forge - llvm-openmp >=9.0.1 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] size: 5744 timestamp: 1650742457817 -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/a2/ad/e0d3c824784ff121c03cc031f944bc7e139a8f1870ffd2845cc2dd76f6c4/absl_py-2.1.0-py3-none-any.whl name: absl-py version: 2.1.0 - url: https://files.pythonhosted.org/packages/a2/ad/e0d3c824784ff121c03cc031f944bc7e139a8f1870ffd2845cc2dd76f6c4/absl_py-2.1.0-py3-none-any.whl sha256: 526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308 requires_python: '>=3.7' -- kind: conda - name: arviz - version: 0.20.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/arviz-0.20.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/arviz-0.20.0-pyhd8ed1ab_0.conda sha256: 2e86300d089555741c8f81a73e72aa90f90cda35b494329e1b940e2d31845936 md5: 7e13efee221dc6ad25fcc2e4d65df7e3 depends: @@ -319,14 +308,7 @@ packages: - pkg:pypi/arviz?source=hash-mapping size: 1473292 timestamp: 1727611803479 -- kind: conda - name: asciitree - version: 0.3.3 - build: py_2 - build_number: 2 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/asciitree-0.3.3-py_2.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/asciitree-0.3.3-py_2.tar.bz2 sha256: b3e9369529fe7d721b66f18680ff4b561e20dbf6507e209e1f60eac277c97560 md5: c0481c9de49f040272556e2cedf42816 depends: @@ -337,31 +319,20 @@ packages: - pkg:pypi/asciitree?source=hash-mapping size: 6164 timestamp: 1531050741142 -- kind: conda - name: asttokens - version: 2.4.1 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/asttokens-2.4.1-pyhd8ed1ab_0.conda - sha256: 708168f026df19a0344983754d27d1f7b28bb21afc7b97a82f02c4798a3d2111 - md5: 5f25798dcefd8252ce5f9dc494d5f571 +- conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda + sha256: 93b14414b3b3ed91e286e1cbe4e7a60c4e1b1c730b0814d1e452a8ac4b9af593 + md5: 8f587de4bcf981e26228f268df374a9b depends: - - python >=3.5 - - six >=1.12.0 + - python >=3.9 + constrains: + - astroid >=2,<4 license: Apache-2.0 license_family: Apache purls: - pkg:pypi/asttokens?source=hash-mapping - size: 28922 - timestamp: 1698341257884 -- kind: conda - name: atk-1.0 - version: 2.38.0 - build: h04ea711_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda + size: 28206 + timestamp: 1733250564754 +- conda: https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda sha256: df682395d05050cd1222740a42a551281210726a67447e5258968dd55854302e md5: f730d54ba9cd543666d7220c9f7ed563 depends: @@ -370,51 +341,40 @@ packages: - libstdcxx-ng >=12 constrains: - atk-1.0 2.38.0 + arch: x86_64 + platform: linux license: LGPL-2.0-or-later license_family: LGPL purls: [] size: 355900 timestamp: 1713896169874 -- kind: conda - name: binutils_impl_linux-64 - version: '2.43' - build: h4bf12b8_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.43-h4bf12b8_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.43-h4bf12b8_2.conda sha256: 267e78990247369b13234bda270f31beb56a600b4851a8244e31dd9ad85b3b17 md5: cf0c5521ac2a20dfa6c662a4009eeef6 depends: - ld_impl_linux-64 2.43 h712a8e2_2 - sysroot_linux-64 + arch: x86_64 + platform: linux license: GPL-3.0-only license_family: GPL purls: [] size: 5682777 timestamp: 1729655371045 -- kind: conda - name: binutils_linux-64 - version: '2.43' - build: h4852527_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.43-h4852527_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.43-h4852527_2.conda sha256: df52bd8b8b2a20a0c529d9ad08aaf66093ac318aa8a33d270f18274341a77062 md5: 18aba879ddf1f8f28145ca6fcb873d8c depends: - binutils_impl_linux-64 2.43 h4bf12b8_2 + arch: x86_64 + platform: linux license: GPL-3.0-only license_family: GPL purls: [] size: 34945 timestamp: 1729655404893 -- kind: conda - name: blas - version: '2.125' - build: openblas +- conda: https://conda.anaconda.org/conda-forge/linux-64/blas-2.125-openblas.conda build_number: 25 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/blas-2.125-openblas.conda sha256: 23498a320b65c514c132c2b01bdedc2e08ffc9dfd8c7fd46609ac16ff4bc8a90 md5: 0c46b8a31a587738befc587dd8e52558 depends: @@ -430,18 +390,15 @@ packages: - liblapack 3.9.0 25_linux64_openblas - liblapacke 3.9.0 25_linux64_openblas - llvm-openmp >=19.1.2 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] size: 15793 timestamp: 1729642984458 -- kind: conda - name: blas-devel - version: 3.9.0 - build: 25_linux64_openblas +- conda: https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-25_linux64_openblas.conda build_number: 25 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-25_linux64_openblas.conda sha256: 69483b31161b62716ee529f206f7614bcb45fd230fc9bf47f2fb1840ed406b6f md5: 02c516384c77f5a7b4d03ed6c0412c57 depends: @@ -450,15 +407,16 @@ packages: - liblapack 3.9.0 25_linux64_openblas - liblapacke 3.9.0 25_linux64_openblas - openblas 0.3.28.* + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] size: 15609 timestamp: 1729642921261 -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/02/c8/542c1f9513136b431b101d06fb547e94d3ebc1d33740c3024315b55d4ada/bridgestan-2.5.0-py3-none-any.whl name: bridgestan version: 2.5.0 - url: https://files.pythonhosted.org/packages/02/c8/542c1f9513136b431b101d06fb547e94d3ebc1d33740c3024315b55d4ada/bridgestan-2.5.0-py3-none-any.whl sha256: f417836f35258688759ad46351621d8bb03440d84965f778c82ee702be93f300 requires_dist: - numpy @@ -467,13 +425,7 @@ packages: - pytest ; extra == 'test' - pytest-cov ; extra == 'test' requires_python: '>=3.9' -- kind: conda - name: brotli - version: 1.1.0 - build: hb9d3cd8_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda sha256: fcb0b5b28ba7492093e54f3184435144e074dfceab27ac8e6a9457e736565b0b md5: 98514fe74548d768907ce7a13f680e8f depends: @@ -482,18 +434,14 @@ packages: - libbrotlidec 1.1.0 hb9d3cd8_2 - libbrotlienc 1.1.0 hb9d3cd8_2 - libgcc >=13 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] size: 19264 timestamp: 1725267697072 -- kind: conda - name: brotli-bin - version: 1.1.0 - build: hb9d3cd8_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda sha256: 261364d7445513b9a4debc345650fad13c627029bfc800655a266bf1e375bc65 md5: c63b5e52939e795ba8d26e35d767a843 depends: @@ -501,64 +449,50 @@ packages: - libbrotlidec 1.1.0 hb9d3cd8_2 - libbrotlienc 1.1.0 hb9d3cd8_2 - libgcc >=13 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] size: 18881 timestamp: 1725267688731 -- kind: conda - name: bzip2 - version: 1.0.8 - build: h4bc722e_7 - build_number: 7 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d md5: 62ee74e96c5ebb0af99386de58cf9553 depends: - __glibc >=2.17,<3.0.a0 - libgcc-ng >=12 + arch: x86_64 + platform: linux license: bzip2-1.0.6 license_family: BSD purls: [] size: 252783 timestamp: 1720974456583 -- kind: conda - name: c-ares - version: 1.34.3 - build: heb4867d_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.3-heb4867d_0.conda - sha256: 1015d731c05ef7de298834833d680b08dea58980b907f644345bd457f9498c99 - md5: 09a6c610d002e54e18353c06ef61a253 - depends: - - __glibc >=2.28,<3.0.a0 +- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.3-hb9d3cd8_1.conda + sha256: 732571ba6286dbccbf4c6450078a581b7a5620204faf876ff0ef282d77a6bfa8 + md5: ee228789a85f961d14567252a03e725f + depends: + - __glibc >=2.17,<3.0.a0 - libgcc >=13 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] - size: 205575 - timestamp: 1731181837907 -- kind: conda - name: ca-certificates - version: 2024.8.30 - build: hbcca054_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda + size: 204857 + timestamp: 1732447031823 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda sha256: afee721baa6d988e27fef1832f68d6f32ac8cc99cdf6015732224c2841a09cea md5: c27d1c142233b5bc9ca570c6e2e0c244 + arch: x86_64 + platform: linux license: ISC purls: [] size: 159003 timestamp: 1725018903918 -- kind: conda - name: cached-property - version: 1.5.2 - build: hd8ed1ab_1 - build_number: 1 - subdir: noarch +- conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 sha256: 561e6660f26c35d137ee150187d89767c988413c978e1b712d53f27ddf70ea17 md5: 9b347a7ec10940d3f7941ff6c460b551 depends: @@ -568,14 +502,7 @@ packages: purls: [] size: 4134 timestamp: 1615209571450 -- kind: conda - name: cached_property - version: 1.5.2 - build: pyha770c72_1 - build_number: 1 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 sha256: 6dbf7a5070cc43d90a1e4c2ec0c541c69d8e30a0e25f50ce9f6e4a432e42c5d7 md5: 576d629e47797577ab0f1b351297ef4a depends: @@ -586,62 +513,46 @@ packages: - pkg:pypi/cached-property?source=hash-mapping size: 11065 timestamp: 1615209567874 -- kind: conda - name: cachetools - version: 5.5.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.0-pyhd8ed1ab_0.conda - sha256: 0abdbbfc2e9c21079a943f42a2dcd950b1a8093ec474fc017e83da0ec4e6cbf4 - md5: 5bad039db72bd8f134a5cff3ebaa190d +- conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.0-pyhd8ed1ab_1.conda + sha256: d67d8683b34d7074bf99683aa1d71b2e42cee44da70ccd02a2863fb2c3df005b + md5: 0a99af03ccbd19113c1de1c7f16a53d2 depends: - - python >=3.7 + - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/cachetools?source=hash-mapping - size: 14727 - timestamp: 1724028288793 -- kind: conda - name: cairo - version: 1.18.0 - build: hebfffa5_3 - build_number: 3 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-hebfffa5_3.conda - sha256: aee5b9e6ef71cdfb2aee9beae3ea91910ca761c01c0ef32052e3f94a252fa173 - md5: fceaedf1cdbcb02df9699a0d9b005292 + size: 14846 + timestamp: 1733624331838 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.2-h3394656_1.conda + sha256: de7d0d094e53decc005cb13e527be2635b8f604978da497d4c0d282c7dc08385 + md5: b34c2833a1f56db610aeb27f206d800d depends: - __glibc >=2.17,<3.0.a0 - - fontconfig >=2.14.2,<3.0a0 + - fontconfig >=2.15.0,<3.0a0 - fonts-conda-ecosystem - freetype >=2.12.1,<3.0a0 - icu >=75.1,<76.0a0 - - libgcc-ng >=12 - - libglib >=2.80.3,<3.0a0 - - libpng >=1.6.43,<1.7.0a0 - - libstdcxx-ng >=12 - - libxcb >=1.16,<2.0.0a0 + - libexpat >=2.6.4,<3.0a0 + - libgcc >=13 + - libglib >=2.82.2,<3.0a0 + - libpng >=1.6.44,<1.7.0a0 + - libstdcxx >=13 + - libxcb >=1.17.0,<2.0a0 - libzlib >=1.3.1,<2.0a0 - - pixman >=0.43.2,<1.0a0 + - pixman >=0.44.2,<1.0a0 - xorg-libice >=1.1.1,<2.0a0 - xorg-libsm >=1.2.4,<2.0a0 - - xorg-libx11 >=1.8.9,<2.0a0 - - xorg-libxext >=1.3.4,<2.0a0 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 - xorg-libxrender >=0.9.11,<0.10.0a0 - - zlib + arch: x86_64 + platform: linux license: LGPL-2.1-only or MPL-1.1 purls: [] - size: 983604 - timestamp: 1721138900054 -- kind: conda - name: certifi - version: 2024.8.30 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda + size: 978868 + timestamp: 1733790976384 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda sha256: 7020770df338c45ac6b560185956c32f0a5abf4b76179c037f115fc7d687819f md5: 12f7d00853807b0531775e9be891cb11 depends: @@ -651,34 +562,25 @@ packages: - pkg:pypi/certifi?source=hash-mapping size: 163752 timestamp: 1725278204397 -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/16/92/92a76dc2ff3a12e69ba94e7e05168d37d0345fa08c87e1fe24d0c2a42223/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl name: charset-normalizer version: 3.4.0 - url: https://files.pythonhosted.org/packages/16/92/92a76dc2ff3a12e69ba94e7e05168d37d0345fa08c87e1fe24d0c2a42223/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl sha256: 8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15 requires_python: '>=3.7.0' -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/58/a0/e4bebe76bdd0a68077030f1b5e48b545597473ae1b773c84150311152efc/chex-0.1.88-py3-none-any.whl name: chex - version: 0.1.87 - url: https://files.pythonhosted.org/packages/46/dd/c1ff2eb8fbf95a8ca804abb1cc3ce70b283ee7b4bc653c3abac245670400/chex-0.1.87-py3-none-any.whl - sha256: ce536475661fd96d21be0c1728ecdbedd03f8ff950c662dfc338c92ea782cb16 + version: 0.1.88 + sha256: 234b61a5baa8132802e4b9c5657167d6c8a911d90a59a0bec47d537567e41b75 requires_dist: - absl-py>=0.9.0 - typing-extensions>=4.2.0 - jax>=0.4.27 - jaxlib>=0.4.27 - numpy>=1.24.1 - - toolz>=0.9.0 - setuptools ; python_full_version >= '3.12' + - toolz>=0.9.0 requires_python: '>=3.9' -- kind: conda - name: cloudpickle - version: 3.1.0 - build: pyhd8ed1ab_1 - build_number: 1 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.0-pyhd8ed1ab_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.0-pyhd8ed1ab_1.conda sha256: 5a33d0d3ef33121c546eaf78b3dac2141fc4d30bbaeb3959bbc66fcd5e99ced6 md5: c88ca2bb7099167912e3b26463fff079 depends: @@ -689,48 +591,30 @@ packages: - pkg:pypi/cloudpickle?source=hash-mapping size: 25952 timestamp: 1729059365471 -- kind: conda - name: colorama - version: 0.4.6 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - sha256: 2c1b2e9755ce3102bca8d69e8f26e4f087ece73f50418186aee7c74bef8e1698 - md5: 3faab06a954c2a04039983f2c4a50d99 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 depends: - - python >=3.7 + - python >=3.9 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/colorama?source=hash-mapping - size: 25170 - timestamp: 1666700778190 -- kind: conda - name: comm - version: 0.2.2 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_0.conda - sha256: e923acf02708a8a0b591f3bce4bdc11c8e63b73198b99b35fe6cd96bfb6a0dbe - md5: 948d84721b578d426294e17a02e24cbb + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda + sha256: 7e87ef7c91574d9fac19faedaaee328a70f718c9b4ddadfdc0ba9ac021bd64af + md5: 74673132601ec2b7fc592755605f4c1b depends: - - python >=3.6 + - python >=3.9 - traitlets >=5.3 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/comm?source=hash-mapping - size: 12134 - timestamp: 1710320435158 -- kind: conda - name: cons - version: 0.4.6 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/cons-0.4.6-pyhd8ed1ab_0.conda + size: 12103 + timestamp: 1733503053903 +- conda: https://conda.anaconda.org/conda-forge/noarch/cons-0.4.6-pyhd8ed1ab_0.conda sha256: d814c65f7f9c9f48658a4499b93fcb99a6f468768751912e79b7af8283c841c9 md5: 38c162ffeb9a31493d0ef33c09a5ba9f depends: @@ -742,12 +626,7 @@ packages: - pkg:pypi/cons?source=hash-mapping size: 14401 timestamp: 1687647866301 -- kind: conda - name: contourpy - version: 1.3.1 - build: py312h68727a3_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py312h68727a3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py312h68727a3_0.conda sha256: e977af50b844b5b8cfec358131a4e923f0aa718e8334321cf8d84f5093576259 md5: f5fbba0394ee45e9a64a73c2a994126a depends: @@ -757,90 +636,74 @@ packages: - numpy >=1.23 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/contourpy?source=hash-mapping size: 276332 timestamp: 1731428454756 -- kind: conda - name: cycler - version: 0.12.1 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda - sha256: f221233f21b1d06971792d491445fd548224641af9443739b4b7b6d5d72954a8 - md5: 5cd86562580f274031ede6aa6aa24441 +- conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda + sha256: 9827efa891e507a91a8a2acf64e210d2aff394e1cde432ad08e1f8c66b12293c + md5: 44600c4667a319d67dbe0681fc0bc833 depends: - - python >=3.8 + - python >=3.9 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/cycler?source=hash-mapping - size: 13458 - timestamp: 1696677888423 -- kind: conda - name: debugpy - version: 1.8.8 - build: py312h2ec8cdc_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.8-py312h2ec8cdc_0.conda - sha256: 9ffdc284d4c67ba9ab88d400fc55890aafba6a559268f2dc3ca5a1c58d1a7ab9 - md5: eb182854d81037c9cfd95b06aba22c06 + size: 13399 + timestamp: 1733332563512 +- conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.10-py312h2ec8cdc_0.conda + sha256: 534a57b12b92b7af802d48633d96610564e9b41229869d4334d5e776a8f3ee08 + md5: ec2f6e5f137d0767686f7348e6003d78 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libstdcxx >=13 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: - pkg:pypi/debugpy?source=hash-mapping - size: 2661121 - timestamp: 1731045067784 -- kind: conda - name: decorator - version: 5.1.1 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_0.tar.bz2 - sha256: 328a6a379f9bdfd0230e51de291ce858e6479411ea4b0545fb377c71662ef3e2 - md5: 43afe5ab04e35e17ba28649471dd7364 + size: 2622505 + timestamp: 1733945377151 +- conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_1.conda + sha256: 84e5120c97502a3785e8c3241c3bf51f64b4d445f13b4d2445db00d9816fe479 + md5: d622d8d7ee8868870f9cbe259f381181 depends: - - python >=3.5 + - python >=3.9 license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/decorator?source=hash-mapping - size: 12072 - timestamp: 1641555714315 -- kind: pypi + size: 14068 + timestamp: 1733236549190 +- pypi: https://files.pythonhosted.org/packages/e9/59/f189b03d743364a350c972b89fe08a6db5bbbdc5f1ea6b604b3eee0a7967/dllist-1.2.0-py3-none-any.whl name: dllist version: 1.2.0 - url: https://files.pythonhosted.org/packages/e9/59/f189b03d743364a350c972b89fe08a6db5bbbdc5f1ea6b604b3eee0a7967/dllist-1.2.0-py3-none-any.whl sha256: f2ca5fd60d12161b6a472bc340bbae5de53ddd40c5923d9df84e85170b9a8629 requires_dist: - pytest ; extra == 'test' - pytest-cov ; extra == 'test' requires_python: '>=3.8' -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/3a/af/411e94c165229882eb2d0a329114826aa52c7c61ef3108d0d3d8ad7189ed/equinox-0.11.10-py3-none-any.whl name: equinox - version: 0.11.8 - url: https://files.pythonhosted.org/packages/15/9f/3be7f03bf66c8d7d2956b727d984595e4af899f3c15ef2c653029008bf3b/equinox-0.11.8-py3-none-any.whl - sha256: 552292b473956693e8e8973bdae9b58aaec54fd48e192921beb82995e3a9c995 + version: 0.11.10 + sha256: ee6809e31664b92487b247f811fca48a2107f7ec958084b2294af2ee8a750e3b requires_dist: - jax>=0.4.13,!=0.4.27 - jaxtyping>=0.2.20 - typing-extensions>=4.5.0 requires_python: '>=3.9' -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/4f/4a/ff8aa2c57300613b69905308c5afe92c5b01112d766c25a305fd6796170a/etils-1.11.0-py3-none-any.whl name: etils - version: 1.10.0 - url: https://files.pythonhosted.org/packages/1f/e4/0826dfde2db3fb3a34954323a84d0e6b6fdbc7eb5278c84159c6d43290ac/etils-1.10.0-py3-none-any.whl - sha256: 0777fe60a234b4c65ca53470fc64f2dd2d0c6bca7fcc623fdaa8d7fa5a317098 + version: 1.11.0 + sha256: a394cf3476bcec51c221426a70c39cd1006e889456ba41e4d7f12fd6814be7a5 requires_dist: - etils[array-types] ; extra == 'all' - etils[eapp] ; extra == 'all' @@ -909,13 +772,7 @@ packages: - etils[etree] ; extra == 'etree-tf' - etils[ecolab] ; extra == 'lazy-imports' requires_python: '>=3.10' -- kind: conda - name: etuples - version: 0.3.9 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/etuples-0.3.9-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/etuples-0.3.9-pyhd8ed1ab_0.conda sha256: 7e0742833d2348f4b0607575c98b9d05e3fa323d265bb57f787d410e6970111d md5: bc1fc711e8ec404bd6109ab4eb0e4a67 depends: @@ -928,46 +785,28 @@ packages: - pkg:pypi/etuples?source=hash-mapping size: 17451 timestamp: 1684304361743 -- kind: conda - name: exceptiongroup - version: 1.2.2 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda - sha256: e0edd30c4b7144406bb4da975e6bb97d6bc9c0e999aa4efe66ae108cada5d5b5 - md5: d02ae936e42063ca46af6cdad2dbd1e0 +- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda + sha256: cbde2c64ec317118fc06b223c5fd87c8a680255e7348dd60e7b292d2e103e701 + md5: a16662747cdeb9abbac74d0057cc976e depends: - - python >=3.7 + - python >=3.9 license: MIT and PSF-2.0 purls: - pkg:pypi/exceptiongroup?source=hash-mapping - size: 20418 - timestamp: 1720869435725 -- kind: conda - name: executing - version: 2.1.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_0.conda - sha256: a52d7516e2e11d3eb10908e10d3eb3f8ef267fea99ed9b09d52d96c4db3441b8 - md5: d0441db20c827c11721889a241df1220 + size: 20486 + timestamp: 1733208916977 +- conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda + sha256: 28d25ea375ebab4bf7479228f8430db20986187b04999136ff5c722ebd32eb60 + md5: ef8b5fca76806159fc25b4f48d8737eb depends: - - python >=2.7 + - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/executing?source=hash-mapping - size: 28337 - timestamp: 1725214501850 -- kind: conda - name: fasteners - version: 0.17.3 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/fasteners-0.17.3-pyhd8ed1ab_0.tar.bz2 + size: 28348 + timestamp: 1733569440265 +- conda: https://conda.anaconda.org/conda-forge/noarch/fasteners-0.17.3-pyhd8ed1ab_0.tar.bz2 sha256: 42be6ac8478051b26751d778490d6a71de12e5c6443e145ff3eddbc577d9bcda md5: 348e27e78a5e39090031448c72f66d5e depends: @@ -978,26 +817,19 @@ packages: - pkg:pypi/fasteners?source=hash-mapping size: 19975 timestamp: 1643971626978 -- kind: conda - name: filelock - version: 3.16.1 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda - sha256: 1da766da9dba05091af87977922fe60dc7464091a9ccffb3765d403189d39be4 - md5: 916f8ec5dd4128cd5f207a3c4c07b2c6 +- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_1.conda + sha256: 18dca6e2194732df7ebf824abaefe999e4765ebe8e8a061269406ab88fc418b9 + md5: d692e9ba6f92dc51484bf3477e36ce7c depends: - - python >=3.7 + - python >=3.9 license: Unlicense purls: - pkg:pypi/filelock?source=hash-mapping - size: 17357 - timestamp: 1726613593584 -- kind: pypi + size: 17441 + timestamp: 1733240909987 +- pypi: ../flowjax/ name: flowjax version: 16.0.0 - path: ../flowjax/ sha256: 44c0d14eacfee77e1254f841f2f2b6d169c5d3a34360240d4b9fcf252b9b951c requires_dist: - jax>=0.4.16 @@ -1018,13 +850,7 @@ packages: - numpyro ; extra == 'dev' requires_python: '>=3.10' editable: true -- kind: conda - name: font-ttf-dejavu-sans-mono - version: '2.37' - build: hab24e00_0 - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b md5: 0c96522c6bdaed4b1566d11387caaf45 license: BSD-3-Clause @@ -1032,13 +858,7 @@ packages: purls: [] size: 397370 timestamp: 1566932522327 -- kind: conda - name: font-ttf-inconsolata - version: '3.000' - build: h77eed37_0 - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c md5: 34893075a5c9e55cdafac56607368fc6 license: OFL-1.1 @@ -1046,13 +866,7 @@ packages: purls: [] size: 96530 timestamp: 1620479909603 -- kind: conda - name: font-ttf-source-code-pro - version: '2.038' - build: h77eed37_0 - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 md5: 4d59c254e01d9cde7957100457e2d5fb license: OFL-1.1 @@ -1060,14 +874,7 @@ packages: purls: [] size: 700814 timestamp: 1620479612257 -- kind: conda - name: font-ttf-ubuntu - version: '0.83' - build: h77eed37_3 - build_number: 3 - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 md5: 49023d73832ef61042f6a237cb2687e7 license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 @@ -1075,13 +882,7 @@ packages: purls: [] size: 1620504 timestamp: 1727511233259 -- kind: conda - name: fontconfig - version: 2.15.0 - build: h7e30c49_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda sha256: 7093aa19d6df5ccb6ca50329ef8510c6acb6b0d8001191909397368b65b02113 md5: 8f5b0b297b59e1ac160ad4beec99dbee depends: @@ -1091,18 +892,14 @@ packages: - libgcc >=13 - libuuid >=2.38.1,<3.0a0 - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] size: 265599 timestamp: 1730283881107 -- kind: conda - name: fonts-conda-ecosystem - version: '1' - build: '0' - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 md5: fee5683a3f04bd15cbd8318b096a27ab depends: @@ -1112,13 +909,7 @@ packages: purls: [] size: 3667 timestamp: 1566974674465 -- kind: conda - name: fonts-conda-forge - version: '1' - build: '0' - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 sha256: 53f23a3319466053818540bcdf2091f253cbdbab1e0e9ae7b9e509dcaa2a5e38 md5: f766549260d6815b0c52253f1fb1bb29 depends: @@ -1131,14 +922,9 @@ packages: purls: [] size: 4102 timestamp: 1566932280397 -- kind: conda - name: fonttools - version: 4.55.0 - build: py312h178313f_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.55.0-py312h178313f_0.conda - sha256: 2a8d4fe8968828584057f8b07f3e102e326d8ec08d0e30e4ecc21f35031239a0 - md5: f404f4fb99ccaea68b00c1cc64fc1e68 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.55.3-py312h178313f_0.conda + sha256: a5d26a5311fecbf8546a2fd056c7f4c350fa54da998e223b7d5cc74eab3971e1 + md5: 968104bfe69e21fadeb30edd9c3785f9 depends: - __glibc >=2.17,<3.0.a0 - brotli @@ -1147,66 +933,51 @@ packages: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - unicodedata2 >=15.1.0 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: - pkg:pypi/fonttools?source=hash-mapping - size: 2843090 - timestamp: 1731643626471 -- kind: conda - name: freetype - version: 2.12.1 - build: h267a509_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda + size: 2860392 + timestamp: 1733909107861 +- conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda sha256: b2e3c449ec9d907dd4656cb0dc93e140f447175b125a3824b31368b06c666bb6 md5: 9ae35c3d96db2c94ce0cef86efdfa2cb depends: - libgcc-ng >=12 - libpng >=1.6.39,<1.7.0a0 - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux license: GPL-2.0-only OR FTL purls: [] size: 634972 timestamp: 1694615932610 -- kind: conda - name: fribidi - version: 1.0.10 - build: h36c2ea0_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2 sha256: 5d7b6c0ee7743ba41399e9e05a58ccc1cfc903942e49ff6f677f6e423ea7a627 md5: ac7bc6a654f8f41b352b38f4051135f8 depends: - libgcc-ng >=7.5.0 + arch: x86_64 + platform: linux license: LGPL-2.1 purls: [] size: 114383 timestamp: 1604416621168 -- kind: conda - name: gcc - version: 13.3.0 - build: h9576a4e_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/gcc-13.3.0-h9576a4e_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-13.3.0-h9576a4e_1.conda sha256: d0161362430183cbdbc3db9cf95f9a1af1793027f3ab8755b3d3586deb28bf84 md5: 606924335b5bcdf90e9aed9a2f5d22ed depends: - gcc_impl_linux-64 13.3.0.* + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] size: 53864 timestamp: 1724801360210 -- kind: conda - name: gcc_impl_linux-64 - version: 13.3.0 - build: hfea6d02_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-13.3.0-hfea6d02_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-13.3.0-hfea6d02_1.conda sha256: 998ade1d487e93fc8a7a16b90e2af69ebb227355bf4646488661f7ae5887873c md5: 0d043dbc126b64f79d915a0e96d3a1d5 depends: @@ -1217,35 +988,28 @@ packages: - libsanitizer 13.3.0 heb74ff8_1 - libstdcxx >=13.3.0 - sysroot_linux-64 + arch: x86_64 + platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] size: 67464415 timestamp: 1724801227937 -- kind: conda - name: gcc_linux-64 - version: 13.3.0 - build: hc28eda2_5 - build_number: 5 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-13.3.0-hc28eda2_5.conda - sha256: 6778f93159cfd967320f60473447b19e320f303378d4c9da0784caa40073fafa - md5: ffbadbbc3345d9a315ba31c8a9188d4c +- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-13.3.0-hc28eda2_7.conda + sha256: 1e5ac50580a68fdc7d2f5722abcf1a87898c24b1ab6eb5ecd322634742d93645 + md5: ac23afbf5805389eb771e2ad3b476f75 depends: - binutils_linux-64 - gcc_impl_linux-64 13.3.0.* - sysroot_linux-64 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] - size: 31909 - timestamp: 1729281963691 -- kind: conda - name: gdk-pixbuf - version: 2.42.12 - build: hb9ae30d_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.12-hb9ae30d_0.conda + size: 32005 + timestamp: 1731939593317 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.12-hb9ae30d_0.conda sha256: d5283b95a8d49dcd88d29b360d8b38694aaa905d968d156d72ab71d32b38facb md5: 201db6c2d9a3c5e46573ac4cb2e92f4f depends: @@ -1254,34 +1018,27 @@ packages: - libjpeg-turbo >=3.0.0,<4.0a0 - libpng >=1.6.43,<1.7.0a0 - libtiff >=4.6.0,<4.8.0a0 + arch: x86_64 + platform: linux license: LGPL-2.1-or-later license_family: LGPL purls: [] size: 528149 timestamp: 1715782983957 -- kind: conda - name: graphite2 - version: 1.3.13 - build: h59595ed_1003 - build_number: 1003 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda sha256: 0595b009f20f8f60f13a6398e7cdcbd2acea5f986633adcf85f5a2283c992add md5: f87c7b7c2cb45f323ffbce941c78ab7c depends: - libgcc-ng >=12 - libstdcxx-ng >=12 + arch: x86_64 + platform: linux license: LGPL-2.0-or-later license_family: LGPL purls: [] size: 96855 timestamp: 1711634169756 -- kind: conda - name: graphviz - version: 12.0.0 - build: hba01fac_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/graphviz-12.0.0-hba01fac_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-12.0.0-hba01fac_0.conda sha256: 2eb794ae1de42b688f89811113ae3dcb63698272ee8f87029abce5f77c742c2a md5: 953e31ea00d46beb7e64a79fc291ec44 depends: @@ -1300,18 +1057,14 @@ packages: - libwebp-base >=1.4.0,<2.0a0 - libzlib >=1.3.1,<2.0a0 - pango >=1.50.14,<2.0a0 + arch: x86_64 + platform: linux license: EPL-1.0 license_family: Other purls: [] size: 2303111 timestamp: 1722673717117 -- kind: conda - name: gtk2 - version: 2.24.33 - build: h6470451_5 - build_number: 5 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h6470451_5.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h6470451_5.conda sha256: 16644d036321b32635369c183502974c8b989fa516c313bd379f9aa4adcdf642 md5: 1483ba046164be27df7f6eddbcec3a12 depends: @@ -1329,52 +1082,40 @@ packages: - xorg-libx11 >=1.8.9,<2.0a0 - xorg-libxext >=1.3.4,<2.0a0 - xorg-libxrender >=0.9.11,<0.10.0a0 + arch: x86_64 + platform: linux license: LGPL-2.1-or-later purls: [] size: 6501561 timestamp: 1721285940408 -- kind: conda - name: gts - version: 0.7.6 - build: h977cf35_4 - build_number: 4 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda sha256: b5cd16262fefb836f69dc26d879b6508d29f8a5c5948a966c47fe99e2e19c99b md5: 4d8df0b0db060d33c9a702ada998a8fe depends: - libgcc-ng >=12 - libglib >=2.76.3,<3.0a0 - libstdcxx-ng >=12 + arch: x86_64 + platform: linux license: LGPL-2.0-or-later license_family: LGPL purls: [] size: 318312 timestamp: 1686545244763 -- kind: conda - name: gxx - version: 13.3.0 - build: h9576a4e_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/gxx-13.3.0-h9576a4e_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-13.3.0-h9576a4e_1.conda sha256: 5446f5d1d609d996579f706d2020e83ef48e086d943bfeef7ab807ea246888a0 md5: 209182ca6b20aeff62f442e843961d81 depends: - gcc 13.3.0.* - gxx_impl_linux-64 13.3.0.* + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] size: 53338 timestamp: 1724801498389 -- kind: conda - name: gxx_impl_linux-64 - version: 13.3.0 - build: hdbfa832_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-13.3.0-hdbfa832_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-13.3.0-hdbfa832_1.conda sha256: 746dff24bb1efc89ab0ec108838d0711683054e3bbbcb94d042943410a98eca1 md5: 806367e23a0a6ad21e51875b34c57d7e depends: @@ -1382,39 +1123,31 @@ packages: - libstdcxx-devel_linux-64 13.3.0 h84ea5a7_101 - sysroot_linux-64 - tzdata + arch: x86_64 + platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] size: 13337720 timestamp: 1724801455825 -- kind: conda - name: gxx_linux-64 - version: 13.3.0 - build: h6834431_5 - build_number: 5 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-13.3.0-h6834431_5.conda - sha256: 4ca452f7abc607d9f0ad45a7fa8c7d8436fca05b9cc6715d1ccd239bed90833b - md5: 81ddb2db98fbe3031aa7ebbbf8bb3ffd +- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-13.3.0-h6834431_7.conda + sha256: a9b1ffea76f2cc5aedeead4793fcded7a687cce9d5e3f4fe93629f1b1d5043a6 + md5: 7c82ca9bda609b6f72f670e4219d3787 depends: - binutils_linux-64 - - gcc_linux-64 13.3.0 hc28eda2_5 + - gcc_linux-64 13.3.0 hc28eda2_7 - gxx_impl_linux-64 13.3.0.* - sysroot_linux-64 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] - size: 30284 - timestamp: 1729281975715 -- kind: conda - name: h5netcdf - version: 1.4.1 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/h5netcdf-1.4.1-pyhd8ed1ab_0.conda - sha256: e8a3ff94dd511e7f5098f09f75b44487a40241946640a29e14025e8094f0ca6e - md5: 5d0c9dc3425aadc346a969de5f2acc89 + size: 30356 + timestamp: 1731939612705 +- conda: https://conda.anaconda.org/conda-forge/noarch/h5netcdf-1.4.1-pyhd8ed1ab_1.conda + sha256: 1201924ea11ef5bdb0f9fc8793dea1befebef6903536af1f9159202ae8796ea7 + md5: 413d6a08f8fe17af2c6cd1142ba8dccf depends: - h5py - packaging @@ -1423,15 +1156,9 @@ packages: license_family: BSD purls: - pkg:pypi/h5netcdf?source=hash-mapping - size: 47177 - timestamp: 1731517710280 -- kind: conda - name: h5py - version: 3.12.1 - build: nompi_py312hedeef09_102 - build_number: 102 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.12.1-nompi_py312hedeef09_102.conda + size: 47573 + timestamp: 1733807542899 +- conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.12.1-nompi_py312hedeef09_102.conda sha256: 5acc7c221e792c7aa9bbb2c57d5e0104d7a6e81c2cd29a47a77d574552cd4fd0 md5: ee52559d324594141ce369c527d6d029 depends: @@ -1442,19 +1169,15 @@ packages: - numpy >=1.19,<3 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/h5py?source=hash-mapping size: 1380838 timestamp: 1729617970564 -- kind: conda - name: harfbuzz - version: 9.0.0 - build: hda332d3_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-9.0.0-hda332d3_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-9.0.0-hda332d3_1.conda sha256: 973afa37840b4e55e2540018902255cfb0d953aaed6353bb83a4d120f5256767 md5: 76b32dcf243444aea9c6b804bcfa40b8 depends: @@ -1466,55 +1189,50 @@ packages: - libgcc-ng >=12 - libglib >=2.80.3,<3.0a0 - libstdcxx-ng >=12 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] size: 1603653 timestamp: 1721186240105 -- kind: conda - name: hdf5 - version: 1.14.3 - build: nompi_hdf9ad27_105 - build_number: 105 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda - sha256: 2278fa07da6f96e807d402cd55480624d67d2dee202191aaaf278ce5ab23605a - md5: 7e1729554e209627636a0f6fabcdd115 +- conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h2d575fe_108.conda + sha256: 340b997d57eb89c058d8f2e80d426e4716661a51efcd1d857afb2b29f59177a4 + md5: b74598031529dafb2a66f9e90f26f2dc depends: + - __glibc >=2.17,<3.0.a0 - libaec >=1.1.3,<2.0a0 - - libcurl >=8.8.0,<9.0a0 - - libgcc-ng >=12 - - libgfortran-ng - - libgfortran5 >=12.3.0 - - libstdcxx-ng >=12 - - libzlib >=1.2.13,<2.0a0 - - openssl >=3.3.1,<4.0a0 + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libgfortran + - libgfortran5 >=13.3.0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] - size: 3911675 - timestamp: 1717587866574 -- kind: conda - name: icu - version: '75.1' - build: he02047a_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + size: 3899869 + timestamp: 1733668584836 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e md5: 8b189310083baabfb622af68fd9d3ae3 depends: - __glibc >=2.17,<3.0.a0 - libgcc-ng >=12 - libstdcxx-ng >=12 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] size: 12129203 timestamp: 1720853576813 -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl name: idna version: '3.10' - url: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl sha256: 946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3 requires_dist: - ruff>=0.6.2 ; extra == 'all' @@ -1522,48 +1240,30 @@ packages: - pytest>=8.3.2 ; extra == 'all' - flake8>=7.1.1 ; extra == 'all' requires_python: '>=3.6' -- kind: conda - name: importlib-metadata - version: 8.5.0 - build: pyha770c72_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda - sha256: 7194700ce1a5ad2621fd68e894dd8c1ceaff9a38723e6e0e5298fdef13017b1c - md5: 54198435fce4d64d8a89af22573012a8 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda + sha256: 13766b88fc5b23581530d3a0287c0c58ad82f60401afefab283bf158d2be55a9 + md5: 315607a3030ad5d5227e76e0733798ff depends: - - python >=3.8 + - python >=3.9 - zipp >=0.5 license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/importlib-metadata?source=hash-mapping - size: 28646 - timestamp: 1726082927916 -- kind: conda - name: iniconfig - version: 2.0.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - sha256: 38740c939b668b36a50ef455b077e8015b8c9cf89860d421b3fff86048f49666 - md5: f800d2da156d08e289b14e87e43c1ae5 + - pkg:pypi/importlib-metadata?source=compressed-mapping + size: 28623 + timestamp: 1733223207185 +- conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda + sha256: 0ec8f4d02053cd03b0f3e63168316530949484f80e16f5e2fb199a1d117a89ca + md5: 6837f3eff7dcea42ecd714ce1ac2b108 depends: - - python >=3.7 + - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/iniconfig?source=hash-mapping - size: 11101 - timestamp: 1673103208955 -- kind: conda - name: ipykernel - version: 6.29.5 - build: pyh3099207_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda + size: 11474 + timestamp: 1733223232820 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda sha256: 33cfd339bb4efac56edf93474b37ddc049e08b1b4930cf036c893cc1f5a1f32a md5: b40131ab6a36ac2c09b7c57d4d3fbf99 depends: @@ -1587,15 +1287,9 @@ packages: - pkg:pypi/ipykernel?source=hash-mapping size: 119084 timestamp: 1719845605084 -- kind: conda - name: ipython - version: 8.29.0 - build: pyh707e725_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/ipython-8.29.0-pyh707e725_0.conda - sha256: 606723272a208cca1036852e04fbb61741b78451784746e75edd1becb70347d2 - md5: 56db21d7d51410fcfbfeca3d1a6b4269 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-8.30.0-pyh707e725_0.conda + sha256: 65cdc105e5effea2943d3979cc1592590c923a589009b484d07672faaf047af1 + md5: 5d6e5cb3a4b820f61b2073f0ad5431f1 depends: - __unix - decorator @@ -1613,53 +1307,66 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/ipython?source=compressed-mapping - size: 599356 - timestamp: 1729866495921 -- kind: pypi + - pkg:pypi/ipython?source=hash-mapping + size: 600248 + timestamp: 1732897026255 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.5-pyhd8ed1ab_1.conda + sha256: f419657566e3d9bea85b288a0ce3a8e42d76cd82ac1697c6917891df3ae149ab + md5: bb19ad65196475ab6d0bb3532d7f8d96 + depends: + - comm >=0.1.3 + - ipython >=6.1.0 + - jupyterlab_widgets >=3.0.13,<3.1.0 + - python >=3.9 + - traitlets >=4.3.1 + - widgetsnbextension >=4.0.13,<4.1.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/ipywidgets?source=hash-mapping + size: 113982 + timestamp: 1733493669268 +- pypi: https://files.pythonhosted.org/packages/5f/3f/6c5553baaa7faa3fa8bae8279b1e46cb54c7ce52360139eae53498786ea5/jax-0.4.37-py3-none-any.whl name: jax - version: 0.4.35 - url: https://files.pythonhosted.org/packages/62/20/6c57c50c0ccc645fea1895950f1e5cd02f961ee44b3ffe83617fa46b0c1d/jax-0.4.35-py3-none-any.whl - sha256: fa99e909a31424abfec750019a6dd36f6acc18a6e7d40e2c0086b932cc351325 + version: 0.4.37 + sha256: bdc0686d7e5a944e2d38026eae632214d98dd2d91869cbcedbf1c11298ae3e3e requires_dist: - - jaxlib>=0.4.34,<=0.4.35 + - jaxlib>=0.4.36,<=0.4.37 - ml-dtypes>=0.4.0 - numpy>=1.24 + - numpy>=1.26.0 ; python_full_version >= '3.12' - opt-einsum - scipy>=1.10 - - numpy>=1.26.0 ; python_full_version >= '3.12' - scipy>=1.11.1 ; python_full_version >= '3.12' - - jaxlib==0.4.34 ; extra == 'ci' - - jaxlib==0.4.34 ; extra == 'cuda' - - jax-cuda12-plugin[with-cuda]>=0.4.34,<=0.4.35 ; extra == 'cuda' - - jaxlib==0.4.34 ; extra == 'cuda12' - - jax-cuda12-plugin[with-cuda]>=0.4.34,<=0.4.35 ; extra == 'cuda12' - - jaxlib==0.4.34 ; extra == 'cuda12-local' - - jax-cuda12-plugin==0.4.34 ; extra == 'cuda12-local' - - jaxlib==0.4.34 ; extra == 'cuda12-pip' - - jax-cuda12-plugin[with-cuda]>=0.4.34,<=0.4.35 ; extra == 'cuda12-pip' - - kubernetes ; extra == 'k8s' - - jaxlib==0.4.34 ; extra == 'minimum-jaxlib' - - jaxlib>=0.4.34,<=0.4.35 ; extra == 'tpu' + - jaxlib==0.4.36 ; extra == 'minimum-jaxlib' + - jaxlib==0.4.35 ; extra == 'ci' + - jaxlib>=0.4.36,<=0.4.37 ; extra == 'tpu' - libtpu-nightly==0.1.dev20241010+nightly.cleanup ; extra == 'tpu' - - libtpu==0.0.2 ; extra == 'tpu' + - libtpu==0.0.6 ; extra == 'tpu' - requests ; extra == 'tpu' + - jaxlib==0.4.36 ; extra == 'cuda' + - jax-cuda12-plugin[with-cuda]>=0.4.36,<=0.4.37 ; extra == 'cuda' + - jaxlib==0.4.36 ; extra == 'cuda12' + - jax-cuda12-plugin[with-cuda]>=0.4.36,<=0.4.37 ; extra == 'cuda12' + - jaxlib==0.4.36 ; extra == 'cuda12-pip' + - jax-cuda12-plugin[with-cuda]>=0.4.36,<=0.4.37 ; extra == 'cuda12-pip' + - jaxlib==0.4.36 ; extra == 'cuda12-local' + - jax-cuda12-plugin==0.4.36 ; extra == 'cuda12-local' + - kubernetes ; extra == 'k8s' requires_python: '>=3.10' -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/04/31/8fd189998732d1c5ecacf6a68b6c9aeaafa300b0eaa85b8c678238edba7c/jax_cuda12_pjrt-0.4.36-py3-none-manylinux2014_x86_64.whl name: jax-cuda12-pjrt - version: 0.4.35 - url: https://files.pythonhosted.org/packages/d7/aa/f15ea857ad9bcff7a0c942dc570ca718b026cc0cc5c513525bb08cacf3c0/jax_cuda12_pjrt-0.4.35-py3-none-manylinux2014_x86_64.whl - sha256: 0ffe7e1ba65659bd5738c2cc5addaf0a56205d2188eec5da194b63c068e1fdd2 -- kind: pypi + version: 0.4.36 + sha256: e3c3705d8db7d63da9abfaebf06f5cd0667f5acb0748a5c5eb00d80041e922ed +- pypi: https://files.pythonhosted.org/packages/4b/b9/aaf71a9878ef3f4e4997dabf8458765cd8085c37f65865631980bfb83d53/jax_cuda12_plugin-0.4.36-cp312-cp312-manylinux2014_x86_64.whl name: jax-cuda12-plugin - version: 0.4.35 - url: https://files.pythonhosted.org/packages/23/a1/781f98da41b9abf63a1468c5babbafa7b1bdb766c081386644a4034fbdef/jax_cuda12_plugin-0.4.35-cp312-cp312-manylinux2014_x86_64.whl - sha256: 80aa5e628e8e9dd4f89b767f73900152033c3bf6d5f49dc2081e93f9bac1c9dc + version: 0.4.36 + sha256: 5d4727fb519fedc06a9a984d5a0714804d81ef126a2cb60cefd5cbc4a3ea2627 requires_dist: - - jax-cuda12-pjrt==0.4.35 + - jax-cuda12-pjrt==0.4.36 - nvidia-cublas-cu12>=12.1.3.1 ; extra == 'with-cuda' - nvidia-cuda-cupti-cu12>=12.1.105 ; extra == 'with-cuda' - - nvidia-cuda-nvcc-cu12>=12.1.105 ; extra == 'with-cuda' + - nvidia-cuda-nvcc-cu12>=12.6.85 ; extra == 'with-cuda' - nvidia-cuda-runtime-cu12>=12.1.105 ; extra == 'with-cuda' - nvidia-cudnn-cu12>=9.1,<10.0 ; extra == 'with-cuda' - nvidia-cufft-cu12>=11.0.2.54 ; extra == 'with-cuda' @@ -1668,55 +1375,41 @@ packages: - nvidia-nccl-cu12>=2.18.1 ; extra == 'with-cuda' - nvidia-nvjitlink-cu12>=12.1.105 ; extra == 'with-cuda' requires_python: '>=3.10' -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/fe/f2/7624a304426daa7b135b85caf1b8eccf879e7cb10bc074656ce628309cb0/jaxlib-0.4.36-cp312-cp312-manylinux2014_x86_64.whl name: jaxlib - version: 0.4.34 - url: https://files.pythonhosted.org/packages/e7/0d/4faf839e3c8ce2a5b615df64427be3e870899c72c0ebfb5859348150aba1/jaxlib-0.4.34-cp312-cp312-manylinux2014_x86_64.whl - sha256: 48272e9034ff868d4328cf0055a07882fd2be93f59dfb6283af7de491f9d1290 + version: 0.4.36 + sha256: be295abc209c980817db0488f21f1fbc0644f87326522895e2b9b64729106357 requires_dist: - scipy>=1.10 - numpy>=1.24 - ml-dtypes>=0.2.0 - scipy>=1.11.1 ; python_full_version >= '3.12' requires_python: '>=3.10' -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/94/99/c83c6a97f4382caf1c9bfeeeca935d3eb1f479f711665aeadf4408048107/jaxtyping-0.2.36-py3-none-any.whl name: jaxtyping - version: 0.2.34 - url: https://files.pythonhosted.org/packages/56/ae/220537f80eb82ae43a299de31edb2a91a28b8c5fb8046e9ff853ec7763cd/jaxtyping-0.2.34-py3-none-any.whl - sha256: 2f81fb6d1586e497a6ea2d28c06dcab37b108a096cbb36ea3fe4fa2e1c1f32e5 + version: 0.2.36 + sha256: b19bcbd4009df8734602203402483a4066ad2eb3382904432e370588e9c9707d requires_dist: - - typeguard==2.13.3 - requires_python: ~=3.9 -- kind: conda - name: jedi - version: 0.19.2 - build: pyhff2d567_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhff2d567_0.conda - sha256: d37dad14c00d06d33bfb99c378d0abd7645224a9491c433af5028f24863341ab - md5: 11ead81b00e0f7cc901fceb7ccfb92c1 + - typing-extensions ; python_full_version < '3.10' + requires_python: '>=3.9' +- conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda + sha256: 92c4d217e2dc68983f724aa983cca5464dcb929c566627b26a2511159667dba8 + md5: a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 depends: - parso >=0.8.3,<0.9.0 - python >=3.9 license: Apache-2.0 AND MIT purls: - pkg:pypi/jedi?source=hash-mapping - size: 842916 - timestamp: 1731317305873 -- kind: conda - name: jupyter_client - version: 8.6.3 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_0.conda - sha256: 4419c85e209a715f551a5c9bead746f29ee9d0fc41e772a76db3868622795671 - md5: a14218cfb29662b4a19ceb04e93e298e + size: 843646 + timestamp: 1733300981994 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda + sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a + md5: 4ebae00eae9705b0c3d6d1018a81d047 depends: - importlib-metadata >=4.8.3 - jupyter_core >=4.12,!=5.0.* - - python >=3.8 + - python >=3.9 - python-dateutil >=2.8.2 - pyzmq >=23.0 - tornado >=6.2 @@ -1725,16 +1418,9 @@ packages: license_family: BSD purls: - pkg:pypi/jupyter-client?source=hash-mapping - size: 106055 - timestamp: 1726610805505 -- kind: conda - name: jupyter_core - version: 5.7.2 - build: pyh31011fe_1 - build_number: 1 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda + size: 106342 + timestamp: 1733441040958 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda sha256: 732b1e8536bc22a5a174baa79842d79db2f4956d90293dd82dc1b3f6099bcccd md5: 0a2980dada0dd7fd0998f0342308b1b1 depends: @@ -1748,14 +1434,20 @@ packages: - pkg:pypi/jupyter-core?source=hash-mapping size: 57671 timestamp: 1727163547058 -- kind: conda - name: kernel-headers_linux-64 - version: 3.10.0 - build: he073ed8_18 - build_number: 18 - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-he073ed8_18.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.13-pyhd8ed1ab_1.conda + sha256: 206489e417408d2ffc2a7b245008b4735a8beb59df6c9109d4f77e7bc5969d5d + md5: b26e487434032d7f486277beb0cead3a + depends: + - python >=3.9 + constrains: + - jupyterlab >=3,<5 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/jupyterlab-widgets?source=hash-mapping + size: 186358 + timestamp: 1733428156991 +- conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-he073ed8_18.conda sha256: a922841ad80bd7b222502e65c07ecb67e4176c4fa5b03678a005f39fcc98be4b md5: ad8527bf134a90e1c9ed35fa0b64318c constrains: @@ -1765,26 +1457,18 @@ packages: purls: [] size: 943486 timestamp: 1729794504440 -- kind: conda - name: keyutils - version: 1.6.1 - build: h166bdaf_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb md5: 30186d27e2c9fa62b45fb1476b7200e3 depends: - libgcc-ng >=10.3.0 + arch: x86_64 + platform: linux license: LGPL-2.1-or-later purls: [] size: 117831 timestamp: 1646151697040 -- kind: conda - name: kiwisolver - version: 1.4.7 - build: py312h68727a3_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py312h68727a3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py312h68727a3_0.conda sha256: d752c53071ee5d712baa9742dd1629e60388c5ce4ab11d4e73a1690443e41769 md5: 444266743652a4f1538145e9362f6d3b depends: @@ -1793,18 +1477,15 @@ packages: - libstdcxx >=13 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/kiwisolver?source=hash-mapping size: 70922 timestamp: 1725459412788 -- kind: conda - name: krb5 - version: 1.21.3 - build: h659f571_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 md5: 3f43953b7d3fb3aaa1d0d0723d91e368 depends: @@ -1814,85 +1495,69 @@ packages: - libgcc-ng >=12 - libstdcxx-ng >=12 - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] size: 1370023 timestamp: 1719463201255 -- kind: conda - name: lcms2 - version: '2.16' - build: hb7c19ff_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda sha256: 5c878d104b461b7ef922abe6320711c0d01772f4cd55de18b674f88547870041 md5: 51bb7010fc86f70eee639b4bb7a894f5 depends: - libgcc-ng >=12 - libjpeg-turbo >=3.0.0,<4.0a0 - libtiff >=4.6.0,<4.8.0a0 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] size: 245247 timestamp: 1701647787198 -- kind: conda - name: ld_impl_linux-64 - version: '2.43' - build: h712a8e2_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda sha256: 7c91cea91b13f4314d125d1bedb9d03a29ebbd5080ccdea70260363424646dbe md5: 048b02e3962f066da18efe3a21b77672 depends: - __glibc >=2.17,<3.0.a0 constrains: - binutils_impl_linux-64 2.43 + arch: x86_64 + platform: linux license: GPL-3.0-only license_family: GPL purls: [] size: 669211 timestamp: 1729655358674 -- kind: conda - name: lerc - version: 4.0.0 - build: h27087fc_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 sha256: cb55f36dcd898203927133280ae1dc643368af041a48bcf7c026acb7c47b0c12 md5: 76bbff344f0134279f225174e9064c8f depends: - libgcc-ng >=12 - libstdcxx-ng >=12 + arch: x86_64 + platform: linux license: Apache-2.0 license_family: Apache purls: [] size: 281798 timestamp: 1657977462600 -- kind: conda - name: libaec - version: 1.1.3 - build: h59595ed_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda sha256: 2ef420a655528bca9d269086cf33b7e90d2f54ad941b437fb1ed5eca87cee017 md5: 5e97e271911b8b2001a8b71860c32faa depends: - libgcc-ng >=12 - libstdcxx-ng >=12 + arch: x86_64 + platform: linux license: BSD-2-Clause license_family: BSD purls: [] size: 35446 timestamp: 1711021212685 -- kind: conda - name: libblas - version: 3.9.0 - build: 25_linux64_openblas +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-25_linux64_openblas.conda build_number: 25 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-25_linux64_openblas.conda sha256: d6d12dc437d060f838820e9e61bf73baab651f91935ac594cf10beb9ef1b4450 md5: 8ea26d42ca88ec5258802715fe1ee10b depends: @@ -1903,71 +1568,56 @@ packages: - libcblas 3.9.0 25_linux64_openblas - blas * openblas - liblapacke 3.9.0 25_linux64_openblas + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] size: 15677 timestamp: 1729642900350 -- kind: conda - name: libbrotlicommon - version: 1.1.0 - build: hb9d3cd8_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda sha256: d9db2de60ea917298e658143354a530e9ca5f9c63471c65cf47ab39fd2f429e3 md5: 41b599ed2b02abcfdd84302bff174b23 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] size: 68851 timestamp: 1725267660471 -- kind: conda - name: libbrotlidec - version: 1.1.0 - build: hb9d3cd8_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda sha256: 2892d512cad096cb03f1b66361deeab58b64e15ba525d6592bb6d609e7045edf md5: 9566f0bd264fbd463002e759b8a82401 depends: - __glibc >=2.17,<3.0.a0 - libbrotlicommon 1.1.0 hb9d3cd8_2 - libgcc >=13 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] size: 32696 timestamp: 1725267669305 -- kind: conda - name: libbrotlienc - version: 1.1.0 - build: hb9d3cd8_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda sha256: 779f58174e99de3600e939fa46eddb453ec5d3c60bb46cdaa8b4c127224dbf29 md5: 06f70867945ea6a84d35836af780f1de depends: - __glibc >=2.17,<3.0.a0 - libbrotlicommon 1.1.0 hb9d3cd8_2 - libgcc >=13 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] size: 281750 timestamp: 1725267679782 -- kind: conda - name: libcblas - version: 3.9.0 - build: 25_linux64_openblas +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-25_linux64_openblas.conda build_number: 25 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-25_linux64_openblas.conda sha256: ab87b0477078837c91d9cda62a9faca18fba7c57cc77aa779ae24b3ac783b5dd md5: 5dbd1b0fc0d01ec5e0e1fbe667281a11 depends: @@ -1976,88 +1626,71 @@ packages: - liblapack 3.9.0 25_linux64_openblas - blas * openblas - liblapacke 3.9.0 25_linux64_openblas + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] size: 15613 timestamp: 1729642905619 -- kind: conda - name: libcurl - version: 8.10.1 - build: hbbe4b11_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.10.1-hbbe4b11_0.conda - sha256: 54e6114dfce566c3a22ad3b7b309657e3600cdb668398e95f1301360d5d52c99 - md5: 6e801c50a40301f6978c53976917b277 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.11.1-h332b0f4_0.conda + sha256: 3cd4075b2a7b5562e46c8ec626f6f9ca57aeecaa94ff7df57eca26daa94c9906 + md5: 2b3e0081006dc21e8bf53a91c83a055c depends: - __glibc >=2.17,<3.0.a0 - krb5 >=1.21.3,<1.22.0a0 - libgcc >=13 - - libnghttp2 >=1.58.0,<2.0a0 - - libssh2 >=1.11.0,<2.0a0 + - libnghttp2 >=1.64.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 - libzlib >=1.3.1,<2.0a0 - - openssl >=3.3.2,<4.0a0 + - openssl >=3.4.0,<4.0a0 - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux license: curl license_family: MIT purls: [] - size: 424900 - timestamp: 1726659794676 -- kind: conda - name: libdeflate - version: '1.22' - build: hb9d3cd8_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.22-hb9d3cd8_0.conda + size: 423011 + timestamp: 1733999897624 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.22-hb9d3cd8_0.conda sha256: 780f0530a3adfc1497ba49d626931c6afc978c540e1abfde6ccd57128ded6ad6 md5: b422943d5d772b7cc858b36ad2a92db5 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] size: 72242 timestamp: 1728177071251 -- kind: conda - name: libedit - version: 3.1.20191231 - build: he28a2e2_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 sha256: a57d37c236d8f7c886e01656f4949d9dcca131d2a0728609c6f7fa338b65f1cf md5: 4d331e44109e3f0e19b4cb8f9b82f3e1 depends: - libgcc-ng >=7.5.0 - ncurses >=6.2,<7.0.0a0 + arch: x86_64 + platform: linux license: BSD-2-Clause license_family: BSD purls: [] size: 123878 timestamp: 1597616541093 -- kind: conda - name: libev - version: '4.33' - build: hd590300_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4 md5: 172bf1cd1ff8629f2b1179945ed45055 depends: - libgcc-ng >=12 + arch: x86_64 + platform: linux license: BSD-2-Clause license_family: BSD purls: [] size: 112766 timestamp: 1702146165126 -- kind: conda - name: libexpat - version: 2.6.4 - build: h5888daf_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda sha256: 56541b98447b58e52d824bd59d6382d609e11de1f8adf20b23143e353d2b8d26 md5: db833e03127376d461e1e13e76f09b6c depends: @@ -2065,34 +1698,26 @@ packages: - libgcc >=13 constrains: - expat 2.6.4.* + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] size: 73304 timestamp: 1730967041968 -- kind: conda - name: libffi - version: 3.4.2 - build: h7f98852_5 - build_number: 5 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 sha256: ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e md5: d645c6d2ac96843a2bfaccd2d62b3ac3 depends: - libgcc-ng >=9.4.0 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] size: 58292 timestamp: 1636488182923 -- kind: conda - name: libgcc - version: 14.2.0 - build: h77fa898_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda sha256: 53eb8a79365e58849e7b1a068d31f4f9e718dc938d6f2c03e960345739a03569 md5: 3cb76c3f10d3bc7f1105b2fc9db984df depends: @@ -2101,19 +1726,14 @@ packages: constrains: - libgomp 14.2.0 h77fa898_1 - libgcc-ng ==14.2.0=*_1 + arch: x86_64 + platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] size: 848745 timestamp: 1729027721139 -- kind: conda - name: libgcc-devel_linux-64 - version: 13.3.0 - build: h84ea5a7_101 - build_number: 101 - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-13.3.0-h84ea5a7_101.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-13.3.0-h84ea5a7_101.conda sha256: 027cfb011328a108bc44f512a2dec6d954db85709e0b79b748c3392f85de0c64 md5: 0ce69d40c142915ac9734bc6134e514a depends: @@ -2123,29 +1743,19 @@ packages: purls: [] size: 2598313 timestamp: 1724801050802 -- kind: conda - name: libgcc-ng - version: 14.2.0 - build: h69a702a_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda sha256: 3a76969c80e9af8b6e7a55090088bc41da4cffcde9e2c71b17f44d37b7cb87f7 md5: e39480b9ca41323497b05492a63bc35b depends: - libgcc 14.2.0 h77fa898_1 + arch: x86_64 + platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] size: 54142 timestamp: 1729027726517 -- kind: conda - name: libgd - version: 2.3.3 - build: hd3e95f3_10 - build_number: 10 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-hd3e95f3_10.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-hd3e95f3_10.conda sha256: b0fa27d4d09fb24750c04e89dbd0aee898dc028bde99e62621065a9bde43efe8 md5: 30ee3a29c84cf7b842a8c5828c4b7c13 depends: @@ -2161,69 +1771,42 @@ packages: - libtiff >=4.6.0,<4.8.0a0 - libwebp-base >=1.4.0,<2.0a0 - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux license: GD license_family: BSD purls: [] size: 225113 timestamp: 1722928278395 -- kind: conda - name: libgfortran - version: 14.2.0 - build: h69a702a_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda sha256: fc9e7f22a17faf74da904ebfc4d88699013d2992e55505e4aa0eb01770290977 md5: f1fd30127802683586f768875127a987 depends: - libgfortran5 14.2.0 hd5240d6_1 constrains: - libgfortran-ng ==14.2.0=*_1 + arch: x86_64 + platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] size: 53997 timestamp: 1729027752995 -- kind: conda - name: libgfortran-ng - version: 14.2.0 - build: h69a702a_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.2.0-h69a702a_1.conda - sha256: 423f1e2403f0c665748e42d335e421e53fd03c08d457cfb6f360d329d9459851 - md5: 0a7f4cd238267c88e5d69f7826a407eb - depends: - - libgfortran 14.2.0 h69a702a_1 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 54106 - timestamp: 1729027945817 -- kind: conda - name: libgfortran5 - version: 14.2.0 - build: hd5240d6_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda sha256: d149a37ca73611e425041f33b9d8dbed6e52ec506fe8cc1fc0ee054bddeb6d5d md5: 9822b874ea29af082e5d36098d25427d depends: - libgcc >=14.2.0 constrains: - libgfortran 14.2.0 + arch: x86_64 + platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] size: 1462645 timestamp: 1729027735353 -- kind: conda - name: libglib - version: 2.82.2 - build: h2ff4ddf_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_0.conda sha256: 49ee9401d483a76423461c50dcd37f91d070efaec7e4dc2828d8cdd2ce694231 md5: 13e8e54035ddd2b91875ba399f0f7c04 depends: @@ -2235,84 +1818,65 @@ packages: - pcre2 >=10.44,<10.45.0a0 constrains: - glib 2.82.2 *_0 + arch: x86_64 + platform: linux license: LGPL-2.1-or-later purls: [] size: 3931898 timestamp: 1729191404130 -- kind: conda - name: libgomp - version: 14.2.0 - build: h77fa898_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda sha256: 1911c29975ec99b6b906904040c855772ccb265a1c79d5d75c8ceec4ed89cd63 md5: cc3573974587f12dda90d96e3e55a702 depends: - _libgcc_mutex 0.1 conda_forge + arch: x86_64 + platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] size: 460992 timestamp: 1729027639220 -- kind: conda - name: libhwloc - version: 2.11.1 - build: default_hecaa2ac_1000 - build_number: 1000 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.1-default_hecaa2ac_1000.conda - sha256: 8473a300e10b79557ce0ac81602506b47146aff3df4cc3568147a7dd07f480a2 - md5: f54aeebefb5c5ff84eca4fb05ca8aa3a +- conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda + sha256: d14c016482e1409ae1c50109a9ff933460a50940d2682e745ab1c172b5282a69 + md5: 804ca9e91bcaea0824a341d55b1684f2 depends: - __glibc >=2.17,<3.0.a0 - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - libxml2 >=2.12.7,<3.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libxml2 >=2.13.4,<3.0a0 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] - size: 2417964 - timestamp: 1720460562447 -- kind: conda - name: libiconv - version: '1.17' - build: hd590300_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda + size: 2423200 + timestamp: 1731374922090 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda sha256: 8ac2f6a9f186e76539439e50505d98581472fedb347a20e7d1f36429849f05c9 md5: d66573916ffcf376178462f1b61c941e depends: - libgcc-ng >=12 + arch: x86_64 + platform: linux license: LGPL-2.1-only purls: [] size: 705775 timestamp: 1702682170569 -- kind: conda - name: libjpeg-turbo - version: 3.0.0 - build: hd590300_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda sha256: b954e09b7e49c2f2433d6f3bb73868eda5e378278b0f8c1dd10a7ef090e14f2f md5: ea25936bb4080d843790b586850f82b8 depends: - libgcc-ng >=12 constrains: - jpeg <0.0.0a + arch: x86_64 + platform: linux license: IJG AND BSD-3-Clause AND Zlib purls: [] size: 618575 timestamp: 1694474974816 -- kind: conda - name: liblapack - version: 3.9.0 - build: 25_linux64_openblas +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-25_linux64_openblas.conda build_number: 25 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-25_linux64_openblas.conda sha256: 9d1ff017714edb2d84868f0f931a4a0e7c289a971062b2ac66cfc8145df7e20e md5: 4dc03a53fc69371a6158d0ed37214cd3 depends: @@ -2321,18 +1885,15 @@ packages: - liblapacke 3.9.0 25_linux64_openblas - libcblas 3.9.0 25_linux64_openblas - blas * openblas + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] size: 15608 timestamp: 1729642910812 -- kind: conda - name: liblapacke - version: 3.9.0 - build: 25_linux64_openblas +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-25_linux64_openblas.conda build_number: 25 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-25_linux64_openblas.conda sha256: f8bc6fe22126ca0bf204c27f829d1e0006069cc98776a33122bf8d0548940b3c md5: 8f5ead31b3a168aedd488b8a87736c41 depends: @@ -2341,35 +1902,40 @@ packages: - liblapack 3.9.0 25_linux64_openblas constrains: - blas * openblas + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] size: 15609 timestamp: 1729642916038 -- kind: conda - name: libllvm14 - version: 14.0.6 - build: hcd5def8_4 - build_number: 4 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libllvm14-14.0.6-hcd5def8_4.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm14-14.0.6-hcd5def8_4.conda sha256: 225cc7c3b20ac1db1bdb37fa18c95bf8aecef4388e984ab2f7540a9f4382106a md5: 73301c133ded2bf71906aa2104edae8b depends: - libgcc-ng >=12 - libstdcxx-ng >=12 - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux license: Apache-2.0 WITH LLVM-exception license_family: Apache purls: [] size: 31484415 timestamp: 1690557554081 -- kind: conda - name: libnghttp2 - version: 1.64.0 - build: h161d5f1_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.3-hb9d3cd8_1.conda + sha256: e6e425252f3839e2756e4af1ea2074dffd3396c161bf460629f9dfd6a65f15c6 + md5: 2ecf2f1c7e4e21fcfe6423a51a992d84 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: 0BSD + purls: [] + size: 111132 + timestamp: 1733407410083 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda sha256: b0f2b3695b13a989f75d8fd7f4778e1c7aabe3b36db83f0fe80b2cd812c0e975 md5: 19e57602824042dfd0446292ef90488b depends: @@ -2381,33 +1947,26 @@ packages: - libstdcxx >=13 - libzlib >=1.3.1,<2.0a0 - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] size: 647599 timestamp: 1729571887612 -- kind: conda - name: libnsl - version: 2.0.1 - build: hd590300_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 depends: - libgcc-ng >=12 + arch: x86_64 + platform: linux license: LGPL-2.1-only license_family: GPL purls: [] size: 33408 timestamp: 1697359010159 -- kind: conda - name: libopenblas - version: 0.3.28 - build: pthreads_h94d23a6_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda sha256: 99ba271d8a80a1af2723f2e124ffd91d850074c0389c067e6d96d72a2dbfeabe md5: 62857b389e42b36b686331bec0922050 depends: @@ -2417,33 +1976,27 @@ packages: - libgfortran5 >=14.2.0 constrains: - openblas >=0.3.28,<0.3.29.0a0 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] size: 5578513 timestamp: 1730772671118 -- kind: conda - name: libpng - version: 1.6.44 - build: hadc24fc_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda sha256: e5b14f7a01c2db4362d8591f42f82f336ed48d5e4079e4d1f65d0c2a3637ea78 md5: f4cc49d7aa68316213e4b12be35308d1 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux license: zlib-acknowledgement purls: [] size: 290661 timestamp: 1726234747153 -- kind: conda - name: librsvg - version: 2.58.4 - build: hc0ffecb_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.4-hc0ffecb_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.4-hc0ffecb_0.conda sha256: fda3197ffb24512e719d55defa02f9f70286038e56cad8c1d580ed6460f417fa md5: 83f045969988f5c7a65f3950b95a8b35 depends: @@ -2459,99 +2012,77 @@ packages: - pango >=1.54.0,<2.0a0 constrains: - __glibc >=2.17 + arch: x86_64 + platform: linux license: LGPL-2.1-or-later purls: [] size: 6390511 timestamp: 1726227212382 -- kind: conda - name: libsanitizer - version: 13.3.0 - build: heb74ff8_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-13.3.0-heb74ff8_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-13.3.0-heb74ff8_1.conda sha256: c86d130f0a3099e46ff51aa7ffaab73cb44fc420d27a96076aab3b9a326fc137 md5: c4cb22f270f501f5c59a122dc2adf20a depends: - libgcc >=13.3.0 - libstdcxx >=13.3.0 + arch: x86_64 + platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] size: 4133922 timestamp: 1724801171589 -- kind: conda - name: libsodium - version: 1.0.20 - build: h4ab18f5_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 md5: a587892d3c13b6621a6091be690dbca2 depends: - libgcc-ng >=12 + arch: x86_64 + platform: linux license: ISC purls: [] size: 205978 timestamp: 1716828628198 -- kind: conda - name: libsqlite - version: 3.47.0 - build: hadc24fc_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_1.conda - sha256: 8a9aadf996a2399f65b679c6e7f29139d5059f699c63e6d7b50e20db10c00508 - md5: b6f02b52a174e612e89548f4663ce56a +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.2-hee588c1_0.conda + sha256: 48af21ebc2cbf358976f1e0f4a0ab9e91dfc83d0ef337cf3837c6f5bc22fb352 + md5: b58da17db24b6e08bcbf8fed2fb8c915 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux license: Unlicense purls: [] - size: 875349 - timestamp: 1730208050020 -- kind: conda - name: libssh2 - version: 1.11.0 - build: h0841786_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda - sha256: 50e47fd9c4f7bf841a11647ae7486f65220cfc988ec422a4475fe8d5a823824d - md5: 1f5a58e686b13bcfde88b93f547d23fe + size: 873551 + timestamp: 1733761824646 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda + sha256: 0407ac9fda2bb67e11e357066eff144c845801d00b5f664efbc48813af1e7bb9 + md5: be2de152d8073ef1c01b7728475f2fe7 depends: - - libgcc-ng >=12 - - libzlib >=1.2.13,<2.0.0a0 - - openssl >=3.1.1,<4.0a0 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] - size: 271133 - timestamp: 1685837707056 -- kind: conda - name: libstdcxx - version: 14.2.0 - build: hc0a3c3a_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda + size: 304278 + timestamp: 1732349402869 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda sha256: 4661af0eb9bdcbb5fb33e5d0023b001ad4be828fccdcc56500059d56f9869462 md5: 234a5554c53625688d51062645337328 depends: - libgcc 14.2.0 h77fa898_1 + arch: x86_64 + platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] size: 3893695 timestamp: 1729027746910 -- kind: conda - name: libstdcxx-devel_linux-64 - version: 13.3.0 - build: h84ea5a7_101 - build_number: 101 - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-13.3.0-h84ea5a7_101.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-13.3.0-h84ea5a7_101.conda sha256: 0a9226c1b994f996229ffb54fa40d608cd4e4b48e8dc73a66134bea8ce949412 md5: 29b5a4ed4613fa81a07c21045e3f5bf6 depends: @@ -2561,84 +2092,65 @@ packages: purls: [] size: 14074676 timestamp: 1724801075448 -- kind: conda - name: libstdcxx-ng - version: 14.2.0 - build: h4852527_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda sha256: 25bb30b827d4f6d6f0522cc0579e431695503822f144043b93c50237017fffd8 md5: 8371ac6457591af2cf6159439c1fd051 depends: - libstdcxx 14.2.0 hc0a3c3a_1 + arch: x86_64 + platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] size: 54105 timestamp: 1729027780628 -- kind: conda - name: libtiff - version: 4.7.0 - build: he137b08_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-he137b08_1.conda - sha256: 9890121db85f6ef463fe12eb04ef1471176e3ef3b5e2d62e8d6dac713df00df4 - md5: 63872517c98aa305da58a757c443698e +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hc4654cb_2.conda + sha256: 18653b4a5c73e19c5e86ff72dab9bf59f5cc43d7f404a6be705d152dfd5e0660 + md5: be54fb40ea32e8fe9dbaa94d4528b57e depends: - __glibc >=2.17,<3.0.a0 - lerc >=4.0.0,<5.0a0 - libdeflate >=1.22,<1.23.0a0 - libgcc >=13 - libjpeg-turbo >=3.0.0,<4.0a0 + - liblzma >=5.6.3,<6.0a0 - libstdcxx >=13 - libwebp-base >=1.4.0,<2.0a0 - libzlib >=1.3.1,<2.0a0 - - xz >=5.2.6,<6.0a0 - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux license: HPND purls: [] - size: 428156 - timestamp: 1728232228989 -- kind: conda - name: libuuid - version: 2.38.1 - build: h0b41bf4_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + size: 429018 + timestamp: 1733443013288 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 md5: 40b61aab5c7ba9ff276c41cfffe6b80b depends: - libgcc-ng >=12 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] size: 33601 timestamp: 1680112270483 -- kind: conda - name: libwebp-base - version: 1.4.0 - build: hd590300_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda sha256: 49bc5f6b1e11cb2babf2a2a731d1a680a5e08a858280876a779dbda06c78c35f md5: b26e8aa824079e1be0294e7152ca4559 depends: - libgcc-ng >=12 constrains: - libwebp 1.4.0 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] size: 438953 timestamp: 1713199854503 -- kind: conda - name: libxcb - version: 1.17.0 - build: h8a09558_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa md5: 92ed62436b625154323d40d5f2f11dd7 depends: @@ -2647,53 +2159,42 @@ packages: - pthread-stubs - xorg-libxau >=1.0.11,<2.0a0 - xorg-libxdmcp + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] size: 395888 timestamp: 1727278577118 -- kind: conda - name: libxcrypt - version: 4.4.36 - build: hd590300_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c md5: 5aa797f8787fe7a17d1b0821485b5adc depends: - libgcc-ng >=12 + arch: x86_64 + platform: linux license: LGPL-2.1-or-later purls: [] size: 100393 timestamp: 1702724383534 -- kind: conda - name: libxml2 - version: 2.13.5 - build: hb346dea_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.5-hb346dea_0.conda - sha256: 8c9d6a3a421ac5bf965af495d1b0a08c6fb2245ba156550bc064a7b4f8fc7bd8 - md5: c81a9f1118541aaa418ccb22190c817e +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.5-h8d12d68_1.conda + sha256: c3b05bdc40d27a9249f0bb60f3f71718f94104b8bcd200163a6c9d4ade7aa052 + md5: 1a21e49e190d1ffe58531a81b6e400e1 depends: - __glibc >=2.17,<3.0.a0 - icu >=75.1,<76.0a0 - libgcc >=13 - libiconv >=1.17,<2.0a0 + - liblzma >=5.6.3,<6.0a0 - libzlib >=1.3.1,<2.0a0 - - xz >=5.2.6,<6.0a0 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] - size: 689626 - timestamp: 1731489608971 -- kind: conda - name: libzlib - version: 1.3.1 - build: hb9d3cd8_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + size: 690589 + timestamp: 1733443667823 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 md5: edb0dca6bc32e4f4789199455a1dbeb8 depends: @@ -2701,35 +2202,28 @@ packages: - libgcc >=13 constrains: - zlib 1.3.1 *_2 + arch: x86_64 + platform: linux license: Zlib license_family: Other purls: [] size: 60963 timestamp: 1727963148474 -- kind: conda - name: llvm-openmp - version: 19.1.3 - build: h024ca30_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-19.1.3-h024ca30_0.conda - sha256: aede34c8e218c539ccd4593e4a60b55293b9c3e8870df42f2e2d6ab9e7550927 - md5: d36687dc90337917a84a96a45111ad59 +- conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-19.1.5-h024ca30_0.conda + sha256: e319db1e18dabe23ddeb4a1e04ff1ab5e331069a5a558891ffeb60c8b76d5e6a + md5: dc90d15c25a57f641f0b84c271e4761e depends: - __glibc >=2.17,<3.0.a0 constrains: - - openmp 19.1.3|19.1.3.* + - openmp 19.1.5|19.1.5.* + arch: x86_64 + platform: linux license: Apache-2.0 WITH LLVM-exception license_family: APACHE purls: [] - size: 3192137 - timestamp: 1730363910114 -- kind: conda - name: llvmlite - version: 0.43.0 - build: py312h374181b_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.43.0-py312h374181b_1.conda + size: 3191882 + timestamp: 1733375922702 +- conda: https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.43.0-py312h374181b_1.conda sha256: b260285b29834f9b003e2928d778c19b8ed0ca1aff5aa8aa7ec8f21f9b23c2e4 md5: ed6ead7e9ab9469629c6cfb363b5c6e2 depends: @@ -2740,19 +2234,15 @@ packages: - libzlib >=1.3.1,<2.0a0 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/llvmlite?source=hash-mapping size: 3442782 timestamp: 1725305160474 -- kind: conda - name: logical-unification - version: 0.4.6 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/logical-unification-0.4.6-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/logical-unification-0.4.6-pyhd8ed1ab_0.conda sha256: 2b70aa838779516e05f93158f9f5b15671fc080cec20d05ca0e3a992e391a6e9 md5: bd04410bd092c8f62f23a3aea41f47eb depends: @@ -2765,33 +2255,21 @@ packages: - pkg:pypi/logical-unification?source=hash-mapping size: 18160 timestamp: 1683416555508 -- kind: conda - name: markdown-it-py - version: 3.0.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda - sha256: c041b0eaf7a6af3344d5dd452815cdc148d6284fec25a4fa3f4263b3a021e962 - md5: 93a8e71256479c62074356ef6ebf501b +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + sha256: 0fbacdfb31e55964152b24d5567e9a9996e1e7902fb08eb7d91b5fd6ce60803a + md5: fee3164ac23dfca50cfcc8b85ddefb81 depends: - mdurl >=0.1,<1 - - python >=3.8 + - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/markdown-it-py?source=hash-mapping - size: 64356 - timestamp: 1686175179621 -- kind: conda - name: matplotlib-base - version: 3.9.2 - build: py312hd3ec401_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.2-py312hd3ec401_2.conda - sha256: f199be5149f45a14c88d465d9cb83cfba5efe17c45a0233354ef62cdcb7eab9e - md5: 2380c9ba933ffaac9ad16d8eac8e3318 + size: 64430 + timestamp: 1733250550053 +- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.3-py312hd3ec401_0.conda + sha256: 8e8f4e20eccc2473ad14d649609dbaae74354630dbd34e58b53870d8f15d663d + md5: b023c7b33ecc2aa6726232dc3061ac6c depends: - __glibc >=2.17,<3.0.a0 - certifi >=2020.06.20 @@ -2812,75 +2290,56 @@ packages: - python_abi 3.12.* *_cp312 - qhull >=2020.2,<2020.3.0a0 - tk >=8.6.13,<8.7.0a0 + arch: x86_64 + platform: linux license: PSF-2.0 license_family: PSF purls: - pkg:pypi/matplotlib?source=hash-mapping - size: 7965171 - timestamp: 1731025360821 -- kind: conda - name: matplotlib-inline - version: 0.1.7 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_0.conda - sha256: 7ea68676ea35fbb095420bbcc1c82c4767b8be7bb56abb6989b7f89d957a3bab - md5: 779345c95648be40d22aaa89de7d4254 + size: 7923928 + timestamp: 1733176194348 +- conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda + sha256: 69b7dc7131703d3d60da9b0faa6dd8acbf6f6c396224cf6aef3e855b8c0c41c6 + md5: af6ab708897df59bd6e7283ceab1b56b depends: - - python >=3.6 + - python >=3.9 - traitlets license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/matplotlib-inline?source=hash-mapping - size: 14599 - timestamp: 1713250613726 -- kind: conda - name: maturin - version: 1.7.4 - build: py312h6ab59e4_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/maturin-1.7.4-py312h6ab59e4_0.conda - sha256: 7cd382f2cf76f1f83c6d324cfd1cd238769aad6f4650892d4a3f1f4fb20f750e - md5: 082a5a7a1de682a2aa1cc1f7c86cd51a + size: 14467 + timestamp: 1733417051523 +- conda: https://conda.anaconda.org/conda-forge/linux-64/maturin-1.7.8-py312h6ab59e4_0.conda + sha256: 19a8adcb4a1b3db4ba2f45f3b2e302d2b039c4647241e5cfc4fceaf4fd4e3289 + md5: 0a2dbad1854d6ed324d7ea1ea4fb83fe depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - - openssl >=3.3.2,<4.0a0 + - openssl >=3.4.0,<4.0a0 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - tomli >=1.1.0 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: - pkg:pypi/maturin?source=hash-mapping - size: 6259502 - timestamp: 1727350499582 -- kind: conda - name: mdurl - version: 0.1.2 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda - sha256: 64073dfb6bb429d52fff30891877b48c7ec0f89625b1bf844905b66a81cce6e1 - md5: 776a8dd9e824f77abac30e6ef43a8f7a + size: 6425132 + timestamp: 1733434151515 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 + md5: 592132998493b3ff25fd7479396e8351 depends: - - python >=3.6 + - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/mdurl?source=hash-mapping - size: 14680 - timestamp: 1704317789138 -- kind: conda - name: minikanren - version: 1.0.3 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/minikanren-1.0.3-pyhd8ed1ab_0.tar.bz2 + size: 14465 + timestamp: 1733255681319 +- conda: https://conda.anaconda.org/conda-forge/noarch/minikanren-1.0.3-pyhd8ed1ab_0.tar.bz2 sha256: f0873262d9ea246dabc7e9c17190b9b04c1f973df1fd26426e14208c4ca62236 md5: 0726bd0e32c2edfa48dfbf744579520e depends: @@ -2896,13 +2355,7 @@ packages: - pkg:pypi/minikanren?source=hash-mapping size: 23617 timestamp: 1642650983911 -- kind: conda - name: mkl - version: 2024.2.2 - build: ha957f24_16 - build_number: 16 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda sha256: 77906b0acead8f86b489da46f53916e624897338770dbf70b04b8f673c9273c1 md5: 1459379c79dda834673426504d52b319 depends: @@ -2910,17 +2363,14 @@ packages: - _openmp_mutex >=4.5 - llvm-openmp >=19.1.2 - tbb 2021.* + arch: x86_64 + platform: linux license: LicenseRef-IntelSimplifiedSoftwareOct2022 license_family: Proprietary purls: [] size: 124718448 timestamp: 1730231808335 -- kind: conda - name: mkl-service - version: 2.4.2 - build: py312hf224ee7_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/mkl-service-2.4.2-py312hf224ee7_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-service-2.4.2-py312hf224ee7_0.conda sha256: 405d9f30aca24feb034c0474899613dade19adb52be39efd164d99030c9d3b84 md5: 7874d7976d44512eaccba994989017e3 depends: @@ -2929,16 +2379,17 @@ packages: - mkl >=2024.2.2,<2025.0a0 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/mkl-service?source=hash-mapping size: 73420 timestamp: 1728843500808 -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/6f/d3/1321715a95e856d4ef4fba24e4351cf5e4c89d459ad132a8cba5fe257d72/ml_dtypes-0.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl name: ml-dtypes version: 0.5.0 - url: https://files.pythonhosted.org/packages/6f/d3/1321715a95e856d4ef4fba24e4351cf5e4c89d459ad132a8cba5fe257d72/ml_dtypes-0.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl sha256: a38df8df61194aeaae1ab7579075779b4ad32cd1cffd012c28be227fa7f2a70a requires_dist: - numpy>=1.21 @@ -2952,12 +2403,7 @@ packages: - pylint>=2.6.0 ; extra == 'dev' - pyink ; extra == 'dev' requires_python: '>=3.9' -- kind: conda - name: msgpack-python - version: 1.1.0 - build: py312h68727a3_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.0-py312h68727a3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.0-py312h68727a3_0.conda sha256: 4bc53333774dea1330643b7e23aa34fd6880275737fc2e07491795872d3af8dd md5: 5c9b020a3f86799cdc6115e55df06146 depends: @@ -2966,20 +2412,15 @@ packages: - libstdcxx >=13 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux license: Apache-2.0 license_family: Apache purls: - pkg:pypi/msgpack?source=hash-mapping size: 105271 timestamp: 1725975182669 -- kind: conda - name: multipledispatch - version: 0.6.0 - build: pyhd8ed1ab_1 - build_number: 1 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/multipledispatch-0.6.0-pyhd8ed1ab_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/multipledispatch-0.6.0-pyhd8ed1ab_1.conda sha256: c6216a21154373b340c64f321f22fec51db4ee6156c2e642fa58368103ac5d09 md5: 121a57fce7fff0857ec70fa03200962f depends: @@ -2991,13 +2432,7 @@ packages: - pkg:pypi/multipledispatch?source=hash-mapping size: 17254 timestamp: 1721907640382 -- kind: conda - name: munkres - version: 1.1.4 - build: pyh9f0ad1d_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 sha256: f86fb22b58e93d04b6f25e0d811b56797689d598788b59dcb47f59045b568306 md5: 2ba8498c1018c1e9c61eb99b973dfe19 depends: @@ -3008,45 +2443,30 @@ packages: - pkg:pypi/munkres?source=hash-mapping size: 12452 timestamp: 1600387789153 -- kind: conda - name: ncurses - version: '6.5' - build: he02047a_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda sha256: 6a1d5d8634c1a07913f1c525db6455918cbc589d745fac46d9d6e30340c8731a md5: 70caf8bb6cf39a0b6b7efc885f51c0fe depends: - __glibc >=2.17,<3.0.a0 - libgcc-ng >=12 + arch: x86_64 + platform: linux license: X11 AND BSD-3-Clause purls: [] size: 889086 timestamp: 1724658547447 -- kind: conda - name: nest-asyncio - version: 1.6.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_0.conda - sha256: 30db21d1f7e59b3408b831a7e0417b83b53ee6223afae56482c5f26da3ceb49a - md5: 6598c056f64dc8800d40add25e4e2c34 +- conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda + sha256: bb7b21d7fd0445ddc0631f64e66d91a179de4ba920b8381f29b9d006a42788c0 + md5: 598fd7d4d0de2455fb74f56063969a97 depends: - - python >=3.5 + - python >=3.9 license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/nest-asyncio?source=hash-mapping - size: 11638 - timestamp: 1705850780510 -- kind: conda - name: numba - version: 0.60.0 - build: py312h83e6fd3_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/numba-0.60.0-py312h83e6fd3_0.conda + size: 11543 + timestamp: 1733325673691 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numba-0.60.0-py312h83e6fd3_0.conda sha256: af31c1989ddf1cd46f073f32a8150274c606fdc9fced0e4f5aaf0571b97bd09f md5: e064ca33edf91ac117236c4b5dee207a depends: @@ -3065,20 +2485,17 @@ packages: - scipy >=1.0 - libopenblas !=0.3.6 - cudatoolkit >=11.2 + arch: x86_64 + platform: linux license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/numba?source=hash-mapping size: 5695278 timestamp: 1718888170104 -- kind: conda - name: numcodecs - version: 0.14.0 - build: py312hf9745cd_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.14.0-py312hf9745cd_0.conda - sha256: 447f1d54b5e46d6d8ada792a086b04c71ccfd253a3aea5c32cdbc4ccdeda17f7 - md5: a27a76178d062667f3f01d6f70d2d4a3 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.14.1-py312hf9745cd_0.conda + sha256: f31b39d05eb4c99f9611578ee045ebb0764aa1cc9fa700813362899f11161bc2 + md5: eff78da3a99c42c0950cfd25eb996c20 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 @@ -3088,18 +2505,15 @@ packages: - numpy >=1.24 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: - pkg:pypi/numcodecs?source=hash-mapping - size: 847070 - timestamp: 1731918955687 -- kind: conda - name: numpy - version: 1.26.4 - build: py312heda63a1_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda + size: 841354 + timestamp: 1732243783870 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda sha256: fe3459c75cf84dcef6ef14efcc4adb0ade66038ddd27cadb894f34f4797687d8 md5: d8285bea2a350f63fab23bf460221f3f depends: @@ -3112,144 +2526,136 @@ packages: - python_abi 3.12.* *_cp312 constrains: - numpy-base <0a0 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/numpy?source=hash-mapping size: 7484186 timestamp: 1707225809722 -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/af/eb/ff4b8c503fa1f1796679dce648854d58751982426e4e4b37d6fce49d259c/nvidia_cublas_cu12-12.6.4.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl name: nvidia-cublas-cu12 - version: 12.6.3.3 - url: https://files.pythonhosted.org/packages/f3/e7/c186a31c234fce776436753bfef4807df7f9b4cb3eeff358fcfcbf64b547/nvidia_cublas_cu12-12.6.3.3-py3-none-manylinux2014_x86_64.whl - sha256: f33fb68e101d99470c82d17f92a0dd9f74de2a21685c217f4716cdd63b1316eb + version: 12.6.4.1 + sha256: 08ed2686e9875d01b58e3cb379c6896df8e76c75e0d4a7f7dace3d7b6d9ef8eb requires_python: '>=3' -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/49/60/7b6497946d74bcf1de852a21824d63baad12cd417db4195fc1bfe59db953/nvidia_cuda_cupti_cu12-12.6.80-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl name: nvidia-cuda-cupti-cu12 version: 12.6.80 - url: https://files.pythonhosted.org/packages/a5/24/120ee57b218d9952c379d1e026c4479c9ece9997a4fb46303611ee48f038/nvidia_cuda_cupti_cu12-12.6.80-py3-none-manylinux2014_x86_64.whl - sha256: a3eff6cdfcc6a4c35db968a06fcadb061cbc7d6dde548609a941ff8701b98b73 + sha256: 6768bad6cab4f19e8292125e5f1ac8aa7d1718704012a0e3272a6f61c4bce132 requires_python: '>=3' -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/25/1f/faf9b791027ebd6354be68700da3c3d8a3b3db3bdcf2f8070f2e6871a7f1/nvidia_cuda_nvcc_cu12-12.6.85-py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl name: nvidia-cuda-nvcc-cu12 - version: 12.6.77 - url: https://files.pythonhosted.org/packages/62/8f/cd3032281ba7bb531fe3159337af00c5c805fd6a31dc700f0715c8748c8c/nvidia_cuda_nvcc_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl - sha256: b66bb5dd6b8ae62262586691977d3b4a425e91db61b4b9bc2f6b42bcd4154b96 + version: 12.6.85 + sha256: d75d9d74599f4d7c0865df19ed21b739e6cb77a6497a3f73d6f61e8038a765e4 requires_python: '>=3' -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/e1/23/e717c5ac26d26cf39a27fbc076240fad2e3b817e5889d671b67f4f9f49c5/nvidia_cuda_runtime_cu12-12.6.77-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl name: nvidia-cuda-runtime-cu12 version: 12.6.77 - url: https://files.pythonhosted.org/packages/f0/62/65c05e161eeddbafeca24dc461f47de550d9fa8a7e04eb213e32b55cfd99/nvidia_cuda_runtime_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl - sha256: a84d15d5e1da416dd4774cb42edf5e954a3e60cc945698dc1d5be02321c44dc8 + sha256: ba3b56a4f896141e25e19ab287cd71e52a6a0f4b29d0d31609f60e3b4d5219b7 requires_python: '>=3' -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/67/4c/0f18ddce75f2c17cf028d16e067c07f11c421c981b8c2a45c99bc6169af6/nvidia_cudnn_cu12-9.6.0.74-py3-none-manylinux_2_27_x86_64.whl name: nvidia-cudnn-cu12 - version: 9.5.1.17 - url: https://files.pythonhosted.org/packages/2a/78/4535c9c7f859a64781e43c969a3a7e84c54634e319a996d43ef32ce46f83/nvidia_cudnn_cu12-9.5.1.17-py3-none-manylinux_2_28_x86_64.whl - sha256: 30ac3869f6db17d170e0e556dd6cc5eee02647abc31ca856634d5a40f82c15b2 + version: 9.6.0.74 + sha256: cb700ea574ba8ffdbf9381fed2cdfa0b1847852c3811fb5f0d998d8d47a1cf1a requires_dist: - nvidia-cublas-cu12 requires_python: '>=3' -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/8f/16/73727675941ab8e6ffd86ca3a4b7b47065edcca7a997920b831f8147c99d/nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl name: nvidia-cufft-cu12 version: 11.3.0.4 - url: https://files.pythonhosted.org/packages/60/de/99ec247a07ea40c969d904fc14f3a356b3e2a704121675b75c366b694ee1/nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_x86_64.whl - sha256: 768160ac89f6f7b459bee747e8d175dbf53619cfe74b2a5636264163138013ca + sha256: ccba62eb9cef5559abd5e0d54ceed2d9934030f51163df018532142a8ec533e5 requires_dist: - nvidia-nvjitlink-cu12 requires_python: '>=3' -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/f0/6e/c2cf12c9ff8b872e92b4a5740701e51ff17689c4d726fca91875b07f655d/nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl name: nvidia-cusolver-cu12 version: 11.7.1.2 - url: https://files.pythonhosted.org/packages/9f/81/baba53585da791d043c10084cf9553e074548408e04ae884cfe9193bd484/nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux2014_x86_64.whl - sha256: 6cf28f17f64107a0c4d7802be5ff5537b2130bfc112f25d5a30df227058ca0e6 + sha256: e9e49843a7707e42022babb9bcfa33c29857a93b88020c4e4434656a655b698c requires_dist: - nvidia-cublas-cu12 - nvidia-nvjitlink-cu12 - nvidia-cusparse-cu12 requires_python: '>=3' -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/06/1e/b8b7c2f4099a37b96af5c9bb158632ea9e5d9d27d7391d7eb8fc45236674/nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl name: nvidia-cusparse-cu12 version: 12.5.4.2 - url: https://files.pythonhosted.org/packages/43/ac/64c4316ba163e8217a99680c7605f779accffc6a4bcd0c778c12948d3707/nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_x86_64.whl - sha256: 23749a6571191a215cb74d1cdbff4a86e7b19f1200c071b3fcf844a5bea23a2f + sha256: 7556d9eca156e18184b94947ade0fba5bb47d69cec46bf8660fd2c71a4b48b73 requires_dist: - nvidia-nvjitlink-cu12 requires_python: '>=3' -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/ed/1f/6482380ec8dcec4894e7503490fc536d846b0d59694acad9cf99f27d0e7d/nvidia_nccl_cu12-2.23.4-py3-none-manylinux2014_x86_64.whl name: nvidia-nccl-cu12 version: 2.23.4 - url: https://files.pythonhosted.org/packages/ed/1f/6482380ec8dcec4894e7503490fc536d846b0d59694acad9cf99f27d0e7d/nvidia_nccl_cu12-2.23.4-py3-none-manylinux2014_x86_64.whl sha256: b097258d9aab2fa9f686e33c6fe40ae57b27df60cedbd15d139701bb5509e0c1 requires_python: '>=3' -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/9d/d7/c5383e47c7e9bf1c99d5bd2a8c935af2b6d705ad831a7ec5c97db4d82f4f/nvidia_nvjitlink_cu12-12.6.85-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl name: nvidia-nvjitlink-cu12 - version: 12.6.77 - url: https://files.pythonhosted.org/packages/fe/e4/486de766851d58699bcfeb3ba6a3beb4d89c3809f75b9d423b9508a8760f/nvidia_nvjitlink_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl - sha256: 9ae346d16203ae4ea513be416495167a0101d33d2d14935aa9c1829a3fb45142 + version: 12.6.85 + sha256: eedc36df9e88b682efe4309aa16b5b4e78c2407eac59e8c10a6a47535164369a requires_python: '>=3' -- kind: conda - name: openblas - version: 0.3.28 - build: pthreads_h6ec200e_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.28-pthreads_h6ec200e_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/objprint-0.3.0-pyhd8ed1ab_0.conda + sha256: ff58f788e9e8c74a6eb2f194b4c18e5bc39a0000172f0b1ec016afae637961f2 + md5: 8f8399ecb94bd96e0d73e02053525808 + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/objprint?source=hash-mapping + size: 38864 + timestamp: 1731340445369 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.28-pthreads_h6ec200e_1.conda sha256: c558f49a262f43b0c5b6f9feb75b631d0b1eeba53579fd2bbce0df37f1884ef0 md5: 8fe5d50db07e92519cc639cb0aef9b1b depends: - libopenblas 0.3.28 pthreads_h94d23a6_1 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] size: 5727592 timestamp: 1730772687576 -- kind: conda - name: openjpeg - version: 2.5.2 - build: h488ebb8_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda - sha256: 5600a0b82df042bd27d01e4e687187411561dfc11cc05143a08ce29b64bf2af2 - md5: 7f2e286780f072ed750df46dc2631138 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda + sha256: 5bee706ea5ba453ed7fd9da7da8380dd88b865c8d30b5aaec14d2b6dd32dbc39 + md5: 9e5816bc95d285c115a3ebc2f8563564 depends: - - libgcc-ng >=12 - - libpng >=1.6.43,<1.7.0a0 - - libstdcxx-ng >=12 - - libtiff >=4.6.0,<4.8.0a0 - - libzlib >=1.2.13,<2.0.0a0 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libpng >=1.6.44,<1.7.0a0 + - libstdcxx >=13 + - libtiff >=4.7.0,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux license: BSD-2-Clause license_family: BSD purls: [] - size: 341592 - timestamp: 1709159244431 -- kind: conda - name: openssl - version: 3.4.0 - build: hb9d3cd8_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda + size: 342988 + timestamp: 1733816638720 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda sha256: 814b9dff1847b132c676ee6cc1a8cb2d427320779b93e1b6d76552275c128705 md5: 23cc74f77eb99315c0360ec3533147a9 depends: - __glibc >=2.17,<3.0.a0 - ca-certificates - libgcc >=13 + arch: x86_64 + platform: linux license: Apache-2.0 license_family: Apache purls: [] size: 2947466 timestamp: 1731377666602 -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl name: opt-einsum version: 3.4.0 - url: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl sha256: 69bb92469f86a1565195ece4ac0323943e83477171b91d24c35afe028a90d7cd requires_python: '>=3.8' -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/5c/24/28d0bb21600a78e46754947333ec9a297044af884d360092eb8561575fe9/optax-0.2.4-py3-none-any.whl name: optax version: 0.2.4 - url: https://files.pythonhosted.org/packages/5c/24/28d0bb21600a78e46754947333ec9a297044af884d360092eb8561575fe9/optax-0.2.4-py3-none-any.whl sha256: db35c04e50b52596662efb002334de08c2a0a74971e4da33f467e84fac08886a requires_dist: - absl-py>=0.7.1 @@ -3286,30 +2692,36 @@ packages: - scipy>=1.7.1 ; extra == 'test' - scikit-learn ; extra == 'test' requires_python: '>=3.9' -- kind: conda - name: packaging - version: '24.2' - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_0.conda - sha256: 0f8273bf66c2a5c1de72312a509deae07f163bb0ae8de8273c52e6fe945a0850 - md5: c16469afe1ec91aaafcf4bea966c0465 +- conda: https://conda.anaconda.org/conda-forge/linux-64/orjson-3.10.12-py312h12e396e_0.conda + sha256: e765f9c8296fd5fc53bf55b6929f8f8e125c16ef04d6ab350af63ae103549357 + md5: d7472299039651dfc65ba320192fe666 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/orjson?source=hash-mapping + size: 305862 + timestamp: 1732413388776 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + sha256: da157b19bcd398b9804c5c52fc000fcb8ab0525bdb9c70f95beaa0bb42f85af1 + md5: 3bfed7e6228ebf2f7b9eaa47f1b4e2aa depends: - python >=3.8 license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/packaging?source=hash-mapping - size: 60345 - timestamp: 1731457074006 -- kind: conda - name: pandas - version: 2.2.3 - build: py312hf9745cd_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py312hf9745cd_1.conda + size: 60164 + timestamp: 1733203368787 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py312hf9745cd_1.conda sha256: ad275a83bfebfa8a8fee9b0569aaf6f513ada6a246b2f5d5b85903d8ca61887e md5: 8bce4f6caaf8c5448c7ac86d87e26b4b depends: @@ -3323,39 +2735,38 @@ packages: - python-tzdata >=2022a - python_abi 3.12.* *_cp312 - pytz >=2020.1,<2024.2 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/pandas?source=hash-mapping size: 15436913 timestamp: 1726879054912 -- kind: conda - name: pango - version: 1.54.0 - build: h4c5309f_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pango-1.54.0-h4c5309f_1.conda - sha256: d362237be82d5a0d532fe66ec8d68018c3b2a9705bad6d73c2b63dae2970da02 - md5: 7df02e445367703cd87a574046e3a6f0 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.54.0-h3a902e7_3.conda + sha256: b04f43a7968cedb93cc0b52854f2cac21d8b8ac150b40305865d9ff3c3d4da72 + md5: 8c12547e7b143fb70873fb732a4056b9 depends: - - cairo >=1.18.0,<2.0a0 - - fontconfig >=2.14.2,<3.0a0 + - __glibc >=2.17,<3.0.a0 + - cairo >=1.18.2,<2.0a0 + - fontconfig >=2.15.0,<3.0a0 - fonts-conda-ecosystem - freetype >=2.12.1,<3.0a0 - fribidi >=1.0.10,<2.0a0 - harfbuzz >=9.0.0,<10.0a0 - - libgcc-ng >=12 - - libglib >=2.80.2,<3.0a0 - - libpng >=1.6.43,<1.7.0a0 + - libexpat >=2.6.4,<3.0a0 + - libgcc >=13 + - libglib >=2.82.2,<3.0a0 + - libpng >=1.6.44,<1.7.0a0 + arch: x86_64 + platform: linux license: LGPL-2.1-or-later purls: [] - size: 447117 - timestamp: 1719839527713 -- kind: pypi + size: 447446 + timestamp: 1733761801816 +- pypi: https://files.pythonhosted.org/packages/20/f8/7b1f5b84f84e43face7349ac2df23f0f75d36b5b4a1c1c0305edce82bcc8/paramax-0.0.0-py3-none-any.whl name: paramax version: 0.0.0 - url: https://files.pythonhosted.org/packages/20/f8/7b1f5b84f84e43face7349ac2df23f0f75d36b5b4a1c1c0305edce82bcc8/paramax-0.0.0-py3-none-any.whl sha256: 02d0120e626de300680a1661b138feeba14b418031d6e976fd679db5fd03509a requires_dist: - equinox @@ -3369,32 +2780,20 @@ packages: - sphinx-book-theme ; extra == 'dev' - sphinx-copybutton ; extra == 'dev' requires_python: '>=3.10' -- kind: conda - name: parso - version: 0.8.4 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_0.conda - sha256: bfe404eebb930cc41782d34f8fc04c0388ea692eeebe2c5fc28df8ec8d4d61ae - md5: 81534b420deb77da8833f2289b8d47ac +- conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda + sha256: 17131120c10401a99205fc6fe436e7903c0fa092f1b3e80452927ab377239bcc + md5: 5c092057b6badd30f75b06244ecd01c9 depends: - - python >=3.6 + - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/parso?source=hash-mapping - size: 75191 - timestamp: 1712320447201 -- kind: conda - name: patsy - version: 1.0.1 - build: pyhff2d567_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.1-pyhff2d567_0.conda - sha256: f1ec4bb1e70f18518f70df64728b162d0d5ef3c0ed68296d913c27f5bab7a84b - md5: a97b9c7586cedcf4a0a158ef3479975c + size: 75295 + timestamp: 1733271352153 +- conda: https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.1-pyhd8ed1ab_1.conda + sha256: ab52916f056b435757d46d4ce0a93fd73af47df9c11fd72b74cc4b7e1caca563 + md5: ee23fabfd0a8c6b8d6f3729b47b2859d depends: - numpy >=1.4.0 - python >=3.9 @@ -3402,15 +2801,9 @@ packages: license_family: BSD purls: - pkg:pypi/patsy?source=hash-mapping - size: 186599 - timestamp: 1731432296481 -- kind: conda - name: pcre2 - version: '10.44' - build: hba22ea6_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda + size: 186594 + timestamp: 1733792482894 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda sha256: 1087716b399dab91cc9511d6499036ccdc53eb29a288bebcb19cf465c51d7c0d md5: df359c09c41cd186fffb93a2d87aa6f5 depends: @@ -3418,52 +2811,36 @@ packages: - bzip2 >=1.0.8,<2.0a0 - libgcc-ng >=12 - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] size: 952308 timestamp: 1723488734144 -- kind: conda - name: pexpect - version: 4.9.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda - sha256: 90a09d134a4a43911b716d4d6eb9d169238aff2349056f7323d9db613812667e - md5: 629f3203c99b32e0988910c93e77f3b6 +- conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda + sha256: 202af1de83b585d36445dc1fda94266697341994d1a3328fabde4989e1b3d07a + md5: d0d408b1f18883a944376da5cf8101ea depends: - ptyprocess >=0.5 - - python >=3.7 + - python >=3.9 license: ISC purls: - pkg:pypi/pexpect?source=hash-mapping - size: 53600 - timestamp: 1706113273252 -- kind: conda - name: pickleshare - version: 0.7.5 - build: py_1003 - build_number: 1003 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-py_1003.tar.bz2 - sha256: a1ed1a094dd0d1b94a09ed85c283a0eb28943f2e6f22161fb45e128d35229738 - md5: 415f0ebb6198cc2801c73438a9fb5761 + size: 53561 + timestamp: 1733302019362 +- conda: https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda + sha256: e2ac3d66c367dada209fc6da43e645672364b9fd5f9d28b9f016e24b81af475b + md5: 11a9d1d09a3615fc07c3faf79bc0b943 depends: - - python >=3 + - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/pickleshare?source=hash-mapping - size: 9332 - timestamp: 1602536313357 -- kind: conda - name: pillow - version: 11.0.0 - build: py312h7b63e92_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.0.0-py312h7b63e92_0.conda + size: 11748 + timestamp: 1733327448200 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.0.0-py312h7b63e92_0.conda sha256: 13a464bea02c0df0199c20ef6bad24a6bc336aaf55bf8d6a133d0fe664463224 md5: 385f46a4df6f97892503a841121a9acf depends: @@ -3480,18 +2857,14 @@ packages: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - tk >=8.6.13,<8.7.0a0 + arch: x86_64 + platform: linux license: HPND purls: - pkg:pypi/pillow?source=hash-mapping size: 41948418 timestamp: 1729065846594 -- kind: conda - name: pip - version: 24.3.1 - build: pyh8b19718_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda sha256: 499313e72e20225f84c2e9690bbaf5b952c8d7e0bf34b728278538f766b81628 md5: 5dd546fe99b44fda83963d15f84263b7 depends: @@ -3504,65 +2877,45 @@ packages: - pkg:pypi/pip?source=hash-mapping size: 1243168 timestamp: 1730203795600 -- kind: conda - name: pixman - version: 0.43.2 - build: h59595ed_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda - sha256: 366d28e2a0a191d6c535e234741e0cd1d94d713f76073d8af4a5ccb2a266121e - md5: 71004cbf7924e19c02746ccde9fd7123 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.44.2-h29eaf8c_0.conda + sha256: 747c58db800d5583fee78e76240bf89cbaeedf7ab1ef339c2990602332b9c4be + md5: 5e2a7acfa2c24188af39e7944e1b3604 depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] - size: 386826 - timestamp: 1706549500138 -- kind: conda - name: platformdirs - version: 4.3.6 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda - sha256: c81bdeadc4adcda216b2c7b373f0335f5c78cc480d1d55d10f21823590d7e46f - md5: fd8f2b18b65bbf62e8f653100690c8d2 + size: 381072 + timestamp: 1733698987122 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda + sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 + md5: 577852c7e53901ddccc7e6a9959ddebe depends: - - python >=3.8 + - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/platformdirs?source=hash-mapping - size: 20625 - timestamp: 1726613611845 -- kind: conda - name: pluggy - version: 1.5.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - sha256: 33eaa3359948a260ebccf9cdc2fd862cea5a6029783289e13602d8e634cd9a26 - md5: d3483c8fc2dc2cc3f5cf43e26d60cabf + size: 20448 + timestamp: 1733232756001 +- conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda + sha256: 122433fc5318816b8c69283aaf267c73d87aa2d09ce39f64c9805c9a3b264819 + md5: e9dcbce5f45f9ee500e728ae58b605b6 depends: - - python >=3.8 + - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/pluggy?source=hash-mapping - size: 23815 - timestamp: 1713667175451 -- kind: conda - name: polars - version: 1.12.0 - build: py312hfe7c9be_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/polars-1.12.0-py312hfe7c9be_1.conda - sha256: 8aa15e19d3446bba7a245beed39f5a856a841008861d0ed35e0a6988e99c1adc - md5: 0c0e15ac8645e65b7f5afa55046a7c48 + size: 23595 + timestamp: 1733222855563 +- conda: https://conda.anaconda.org/conda-forge/linux-64/polars-1.17.1-py312hda0fa55_0.conda + sha256: 0ffd14a4f73ee1b24b2342a84295f8fb5f1848711865d55676515a1aac66f554 + md5: 7ac74b8f85b43224508108f850617dad depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 @@ -3572,45 +2925,35 @@ packages: - python_abi 3.12.* *_cp312 constrains: - __glibc >=2.17 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: - pkg:pypi/polars?source=hash-mapping - size: 22824172 - timestamp: 1731964142746 -- kind: pypi + size: 25634166 + timestamp: 1733806684601 +- pypi: https://files.pythonhosted.org/packages/8f/4d/b72e0782abec07f3d8dabf24cf12673d26b173af2046eb4e67365c776ccf/posteriordb-0.2.0-py3-none-any.whl name: posteriordb version: 0.2.0 - url: https://files.pythonhosted.org/packages/8f/4d/b72e0782abec07f3d8dabf24cf12673d26b173af2046eb4e67365c776ccf/posteriordb-0.2.0-py3-none-any.whl sha256: b6d6f3a349d34db6d4a68da899c818a95e5824c5e23824fc0ebe422f4bd6bac1 requires_dist: - requests -- kind: conda - name: prompt-toolkit - version: 3.0.48 - build: pyha770c72_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.48-pyha770c72_0.conda - sha256: 44e4e6108d425a666856a52d1523e5d70890256a8920bb0dcd3d55cc750f3207 - md5: 4c05134c48b6a74f33bbb9938e4a115e +- conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.48-pyha770c72_1.conda + sha256: 79fb7d1eeb490d4cc1b79f781bb59fe302ae38cf0a30907ecde75a7d399796cc + md5: 368d4aa48358439e07a97ae237491785 depends: - - python >=3.7 + - python >=3.9 - wcwidth constrains: - prompt_toolkit 3.0.48 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/prompt-toolkit?source=hash-mapping - size: 270271 - timestamp: 1727341744544 -- kind: conda - name: psutil - version: 6.1.0 - build: py312h66e93f0_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.0-py312h66e93f0_0.conda + - pkg:pypi/prompt-toolkit?source=compressed-mapping + size: 269848 + timestamp: 1733302634979 +- conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.0-py312h66e93f0_0.conda sha256: 0f309b435174e037d5cfe5ed26c1c5ad8152c68cfe61af17709ec31ec3d9f096 md5: 0524eb91d3d78d76d671c6e3cd7cee82 depends: @@ -3618,111 +2961,80 @@ packages: - libgcc >=13 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/psutil?source=hash-mapping size: 488462 timestamp: 1729847159916 -- kind: conda - name: pthread-stubs - version: '0.4' - build: hb9d3cd8_1002 - build_number: 1002 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 md5: b3c17d95b5a10c6e64a21fa17573e70e depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] size: 8252 timestamp: 1726802366959 -- kind: conda - name: ptyprocess - version: 0.7.0 - build: pyhd3deb0d_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2 - sha256: fb31e006a25eb2e18f3440eb8d17be44c8ccfae559499199f73584566d0a444a - md5: 359eeb6536da0e687af562ed265ec263 +- conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda + sha256: a7713dfe30faf17508ec359e0bc7e0983f5d94682492469bd462cdaae9c64d83 + md5: 7d9daffbb8d8e0af0f769dbbcd173a54 depends: - - python + - python >=3.9 license: ISC purls: - pkg:pypi/ptyprocess?source=hash-mapping - size: 16546 - timestamp: 1609419417991 -- kind: conda - name: pure_eval - version: 0.2.3 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_0.conda - sha256: dcfcb3cee1ae0a89729601582cc3edea20ba13c9493967a03a693c67567af0c8 - md5: 0f051f09d992e0d08941706ad519ee0e + size: 19457 + timestamp: 1733302371990 +- conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + sha256: 71bd24600d14bb171a6321d523486f6a06f855e75e547fa0cb2a0953b02047f0 + md5: 3bfdfb8dbcdc4af1ae3f9a8eb3948f04 depends: - - python >=3.5 + - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/pure-eval?source=hash-mapping - size: 16551 - timestamp: 1721585805256 -- kind: conda - name: pygments - version: 2.18.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda - sha256: 78267adf4e76d0d64ea2ffab008c501156c108bb08fecb703816fb63e279780b - md5: b7f5c092b8f9800150d998a71b76d5a1 + size: 16668 + timestamp: 1733569518868 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda + sha256: 0d6133545f268b2b89c2617c196fc791f365b538d4057ecd636d658c3b1e885d + md5: b38dc0206e2a530e5c2cf11dc086b31a depends: - - python >=3.8 + - python >=3.9 license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/pygments?source=hash-mapping - size: 879295 - timestamp: 1714846885370 -- kind: conda - name: pymc - version: 5.18.1 - build: hd8ed1ab_0 - subdir: noarch + size: 876700 + timestamp: 1733221731178 +- conda: https://conda.anaconda.org/conda-forge/noarch/pymc-5.19.1-hd8ed1ab_0.conda noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pymc-5.18.1-hd8ed1ab_0.conda - sha256: 8f2906c978c820975f6840979758bbc90a331374ab2de03df3d19443b36b5c21 - md5: a1b8f92315733a0f3b4e64c6e9aa8396 + sha256: 4d157090014b3890a4feb1652ab07c8ef839cd2b063f58bf6cf94c4229735100 + md5: 1759ccce965ff0a1f8f1c82dc3cb0866 depends: - - pymc-base 5.18.1 pyhd8ed1ab_0 + - pymc-base 5.19.1 pyhd8ed1ab_0 - pytensor - python-graphviz license: Apache-2.0 license_family: Apache purls: [] - size: 11601 - timestamp: 1731621750738 -- kind: conda - name: pymc-base - version: 5.18.1 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pymc-base-5.18.1-pyhd8ed1ab_0.conda - sha256: df3d631671512750a13efdff69a44c15cc8320c60da0b1db5ff10a6f23b894b5 - md5: a25c15d03dd8cd876e468bb6484c20f9 + size: 11591 + timestamp: 1733471168016 +- conda: https://conda.anaconda.org/conda-forge/noarch/pymc-base-5.19.1-pyhd8ed1ab_0.conda + sha256: 5591215ad8ac2fa6f4e8612d7ebde34242a84d1778571050a1f014903324b7e0 + md5: e89ef644f56ba52bc6a118f15974dd55 depends: - arviz >=0.13.0 - cachetools >=4.2.1 - cloudpickle - - numpy >=1.15.0 + - numpy >=1.25.0 - pandas >=0.24.0 - pytensor-base >=2.26.1,<2.27 - python >=3.10 @@ -3734,57 +3046,42 @@ packages: license_family: Apache purls: - pkg:pypi/pymc?source=hash-mapping - size: 334447 - timestamp: 1731621747231 -- kind: conda - name: pyparsing - version: 3.2.0 - build: pyhd8ed1ab_1 - build_number: 1 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.0-pyhd8ed1ab_1.conda - sha256: b846e3965cd106438cf0b9dc0de8d519670ac065f822a7d66862e9423e0229cb - md5: 035c17fbf099f50ff60bf2eb303b0a83 + size: 335825 + timestamp: 1733471164844 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.0-pyhd8ed1ab_2.conda + sha256: 09a5484532e24a33649ab612674fd0857bbdcfd6640a79d13a6690fb742a36e1 + md5: 4c05a2bcf87bb495512374143b57cf28 depends: - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/pyparsing?source=hash-mapping - size: 92444 - timestamp: 1728880549923 -- kind: conda - name: pytensor - version: 2.26.2 - build: py312h97902ae_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pytensor-2.26.2-py312h97902ae_0.conda - sha256: 71e64be9e99bccab87ce38f1c1e3b36a58469e769a339cb36f2c099a82cb5554 - md5: 94864a4cad4702d26a93b78c1ef94246 + size: 92319 + timestamp: 1733222687746 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pytensor-2.26.4-py312h97902ae_0.conda + sha256: 134e2dac7ff950b954a4d27243a3378a3cadef25be7ce5c852e48e0be6ea628a + md5: fa443c8e7ef80000b6a361bb0fb9e6c5 depends: - blas - gcc_linux-64 13.* - gxx - gxx_linux-64 13.* - mkl-service - - pytensor-base 2.26.2 py312h25a0e75_0 + - pytensor-base 2.26.4 py312h25a0e75_0 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - sysroot_linux-64 2.17.* + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] - size: 9052 - timestamp: 1731337121115 -- kind: conda - name: pytensor-base - version: 2.26.2 - build: py312h25a0e75_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pytensor-base-2.26.2-py312h25a0e75_0.conda - sha256: 24a909310e051bdfec08375f34f4677db63e1de78f4a7502616483ec9076fe3a - md5: 469a1729bda15ace5ef46e22cb153796 + size: 9085 + timestamp: 1733304394344 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pytensor-base-2.26.4-py312h25a0e75_0.conda + sha256: 503dc12f9fd5758938ff7bb8ff40dc8b84af8d94f4ad7acb187f621474c7e070 + md5: 329130fd52aa66adc1991f62f8a4c8ae depends: - __glibc >=2.17,<3.0.a0 - cons @@ -3799,28 +3096,24 @@ packages: - python_abi 3.12.* *_cp312 - scipy >=1,<2 - setuptools >=59.0.0 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/pytensor?source=hash-mapping - size: 2313749 - timestamp: 1731337108392 -- kind: conda - name: pytest - version: 8.3.3 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - sha256: e99376d0068455712109d233f5790458ff861aeceb458bfda74e353338e4d815 - md5: c03d61f31f38fdb9facf70c29958bf7a + size: 2317596 + timestamp: 1733304380924 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda + sha256: 75245ca9d0cbd6d38bb45ec02430189a9d4c21c055c5259739d738a2298d61b3 + md5: 799ed216dc6af62520f32aa39bc1c2bb depends: - colorama - exceptiongroup >=1.0.0rc8 - iniconfig - packaging - pluggy <2,>=1.5 - - python >=3.8 + - python >=3.9 - tomli >=1 constrains: - pytest-faulthandler >=2 @@ -3828,117 +3121,87 @@ packages: license_family: MIT purls: - pkg:pypi/pytest?source=hash-mapping - size: 258293 - timestamp: 1725977334143 -- kind: conda - name: python - version: 3.12.7 - build: hc5c86c4_0_cpython - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.7-hc5c86c4_0_cpython.conda - sha256: 674be31ff152d9f0e0fe16959a45e3803a730fc4f54d87df6a9ac4e6a698c41d - md5: 0515111a9cdf69f83278f7c197db9807 + size: 259195 + timestamp: 1733217599806 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.8-h9e4cc4f_1_cpython.conda + build_number: 1 + sha256: 3f0e0518c992d8ccfe62b189125721309836fe48a010dc424240583e157f9ff0 + md5: 7fd2fd79436d9b473812f14e86746844 depends: - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 - ld_impl_linux-64 >=2.36.1 - - libexpat >=2.6.3,<3.0a0 + - libexpat >=2.6.4,<3.0a0 - libffi >=3.4,<4.0a0 - libgcc >=13 + - liblzma >=5.6.3,<6.0a0 - libnsl >=2.0.1,<2.1.0a0 - - libsqlite >=3.46.1,<4.0a0 + - libsqlite >=3.47.0,<4.0a0 - libuuid >=2.38.1,<3.0a0 - libxcrypt >=4.4.36 - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - - openssl >=3.3.2,<4.0a0 + - openssl >=3.4.0,<4.0a0 - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata - - xz >=5.2.6,<6.0a0 constrains: - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux license: Python-2.0 purls: [] - size: 31574780 - timestamp: 1728059777603 -- kind: conda - name: python-dateutil - version: 2.9.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda - sha256: f3ceef02ac164a8d3a080d0d32f8e2ebe10dd29e3a685d240e38b3599e146320 - md5: 2cf4264fffb9e6eff6031c5b6884d61c + size: 31565686 + timestamp: 1733410597922 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + sha256: a50052536f1ef8516ed11a844f9413661829aa083304dc624c5925298d078d79 + md5: 5ba79d7c71f03c678c8ead841f347d6e depends: - - python >=3.7 + - python >=3.9 - six >=1.5 license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/python-dateutil?source=hash-mapping - size: 222742 - timestamp: 1709299922152 -- kind: conda - name: python-graphviz - version: 0.20.3 - build: pyhe28f650_1 - build_number: 1 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.20.3-pyhe28f650_1.conda - sha256: 0eca3595a52dd7ad83ebca1ee738af50bf21dbd70d623583b0185d84074e21af - md5: 881be78ca9f3f2f5f6aa45d9b38a799f + size: 222505 + timestamp: 1733215763718 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.20.3-pyh91182bf_2.conda + sha256: c8f5d3d23b5962524217f33549add8d6c5af22fe839b49603f4588771154a51c + md5: f822f0e13849c2283f72ec4aa120eeaa depends: - graphviz >=2.46.1 - - python >=3.8 + - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/graphviz?source=hash-mapping - size: 38168 - timestamp: 1727718740290 -- kind: conda - name: python-tzdata - version: '2024.2' - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.2-pyhd8ed1ab_0.conda - sha256: fe3f62ce2bc714bdaa222ab3f0344a2815ad9e853c6df38d15c9f25de8a3a6d4 - md5: 986287f89929b2d629bd6ef6497dc307 + size: 38220 + timestamp: 1733792086212 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.2-pyhd8ed1ab_1.conda + sha256: 57c9a02ec25926fb48edca59b9ede107823e5d5c473b94a0e05cc0b9a193a642 + md5: c0def296b2f6d2dd7b030c2a7f66bb1f depends: - - python >=3.6 + - python >=3.9 license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/tzdata?source=hash-mapping - size: 142527 - timestamp: 1727140688093 -- kind: conda - name: python_abi - version: '3.12' - build: 5_cp312 + size: 142235 + timestamp: 1733235414217 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda build_number: 5 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda sha256: d10e93d759931ffb6372b45d65ff34d95c6000c61a07e298d162a3bc2accebb0 md5: 0424ae29b104430108f5218a66db7260 constrains: - python 3.12.* *_cpython + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] size: 6238 timestamp: 1723823388266 -- kind: conda - name: pytz - version: '2024.1' - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda sha256: 1a7d6b233f7e6e3bbcbad054c8fd51e690a67b129a899a056a5e45dd9f00cb41 md5: 3eeeeb9e4827ace8c0c1419c85d590ad depends: @@ -3949,13 +3212,7 @@ packages: - pkg:pypi/pytz?source=hash-mapping size: 188538 timestamp: 1706886944988 -- kind: conda - name: pyzmq - version: 26.2.0 - build: py312hbf22597_3 - build_number: 3 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.0-py312hbf22597_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.0-py312hbf22597_3.conda sha256: bc303f9b11e04a515f79cd5ad3bfa0e84b9dfec76552626d6263b38789fe6678 md5: 746ce19f0829ec3e19c93007b1a224d3 depends: @@ -3966,50 +3223,43 @@ packages: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - zeromq >=4.3.5,<4.4.0a0 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/pyzmq?source=hash-mapping size: 378126 timestamp: 1728642454632 -- kind: conda - name: qhull - version: '2020.2' - build: h434a139_5 - build_number: 5 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda sha256: 776363493bad83308ba30bcb88c2552632581b143e8ee25b1982c8c743e73abc md5: 353823361b1d27eb3960efb076dfcaf6 depends: - __glibc >=2.17,<3.0.a0 - libgcc-ng >=12 - libstdcxx-ng >=12 + arch: x86_64 + platform: linux license: LicenseRef-Qhull purls: [] size: 552937 timestamp: 1720813982144 -- kind: conda - name: readline - version: '8.2' - build: h8228510_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda sha256: 5435cf39d039387fbdc977b0a762357ea909a7694d9528ab40f005e9208744d7 md5: 47d31b792659ce70f470b5c82fdfb7a4 depends: - libgcc-ng >=12 - ncurses >=6.3,<7.0a0 + arch: x86_64 + platform: linux license: GPL-3.0-only license_family: GPL purls: [] size: 281456 timestamp: 1679532220005 -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl name: requests version: 2.32.3 - url: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl sha256: 70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 requires_dist: - charset-normalizer>=2,<4 @@ -4019,30 +3269,23 @@ packages: - pysocks>=1.5.6,!=1.5.7 ; extra == 'socks' - chardet>=3.0.2,<6 ; extra == 'use-chardet-on-py3' requires_python: '>=3.8' -- kind: conda - name: rich - version: 13.9.4 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_0.conda - sha256: c009488fc07fd5557434c9c1ad32ab1dd50241d6a766e4b2b4125cd6498585a8 - md5: bcf8cc8924b5d20ead3d122130b8320b +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda + sha256: 06a760c5ae572e72e865d5a87e9fe3cc171e1a9c996e63daf3db52ff1a0b4457 + md5: 7aed65d4ff222bfb7335997aa40b7da5 depends: - markdown-it-py >=2.2.0 - pygments >=2.13.0,<3.0.0 - - python >=3.8 + - python >=3.9 - typing_extensions >=4.0.0,<5.0.0 license: MIT license_family: MIT purls: - pkg:pypi/rich?source=hash-mapping - size: 185481 - timestamp: 1730592349978 -- kind: pypi + size: 185646 + timestamp: 1733342347277 +- pypi: ../pymc-labs/benchmark-pymc name: samplerlab version: '0.1' - path: ../pymc-labs/benchmark-pymc sha256: 3229a0e9de6c13db630469c1501ae97625ca85287d2f955280a154dbadd900cd requires_dist: - numpy @@ -4050,15 +3293,9 @@ packages: - pymc requires_python: '>=3.11' editable: true -- kind: conda - name: scipy - version: 1.14.1 - build: py312h62794b6_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py312h62794b6_1.conda - sha256: d069a64edade554261672d8febf4756aeb56a6cb44bd91844eaa944e5d9f4eb9 - md5: b43233a9e2f62fb94affe5607ea79473 +- conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py312h62794b6_2.conda + sha256: 6e4916d610dc15f9b504517bd6c1f3dbbae019a3c7abf0aeb55f310c452a4474 + md5: 94688dd449f6c092e5f951780235aca1 depends: - __glibc >=2.17,<3.0.a0 - libblas >=3.9.0,<4.0a0 @@ -4073,114 +3310,80 @@ packages: - numpy >=1.23.5 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/scipy?source=hash-mapping - size: 17622722 - timestamp: 1729481826601 -- kind: conda - name: seaborn - version: 0.13.2 - build: hd8ed1ab_2 - build_number: 2 - subdir: noarch + size: 17444442 + timestamp: 1733621582568 +- conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_2.conda - sha256: 79943fbbf1fafbf969257989a7d88638c0c3e7b89a81a75c9347c28768dd6141 - md5: a79d8797f62715255308d92d3a91ef2e + sha256: ea29a69b14dd6be5cdeeaa551bf50d78cafeaf0351e271e358f9b820fcab4cb0 + md5: 62afb877ca2c2b4b6f9ecb37320085b6 depends: - - seaborn-base 0.13.2 pyhd8ed1ab_2 + - seaborn-base 0.13.2 pyhd8ed1ab_3 - statsmodels >=0.12 license: BSD-3-Clause license_family: BSD purls: [] - size: 6996 - timestamp: 1714494772218 -- kind: conda - name: seaborn-base - version: 0.13.2 - build: pyhd8ed1ab_2 - build_number: 2 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_2.conda - sha256: 5de8b9e88a0f2daf58b07e3f144da26f894e9a20071304fa37329664eb2a29a7 - md5: b713b116feaf98acdba93ad4d7f90ca1 + size: 6876 + timestamp: 1733730113224 +- conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_3.conda + sha256: f209c9c18187570b85ec06283c72d64b8738f825b1b82178f194f4866877f8aa + md5: fd96da444e81f9e6fcaac38590f3dd42 depends: - matplotlib-base >=3.4,!=3.6.1 - numpy >=1.20,!=1.24.0 - pandas >=1.2 - - python >=3.8 + - python >=3.9 - scipy >=1.7 constrains: - - seaborn =0.13.2=*_2 + - seaborn =0.13.2=*_3 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/seaborn?source=hash-mapping - size: 234550 - timestamp: 1714494767378 -- kind: conda - name: setuptools - version: 75.3.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.3.0-pyhd8ed1ab_0.conda - sha256: a36d020b9f32fc3f1a6488a1c4a9c13988c6468faf6895bf30ca69521a61230e - md5: 2ce9825396daf72baabaade36cee16da + size: 227843 + timestamp: 1733730112409 +- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.6.0-pyhff2d567_1.conda + sha256: abb12e1dd515b13660aacb5d0fd43835bc2186cab472df25b7716cd65e095111 + md5: fc80f7995e396cbaeabd23cf46c413dc depends: - - python >=3.8 + - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/setuptools?source=hash-mapping - size: 779561 - timestamp: 1730382173961 -- kind: conda - name: six - version: 1.16.0 - build: pyh6c4a22f_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - sha256: a85c38227b446f42c5b90d9b642f2c0567880c15d72492d8da074a59c8f91dd6 - md5: e5f25f8dbc060e9a8d912e432202afc2 + size: 774252 + timestamp: 1732632769210 +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda + sha256: 41db0180680cc67c3fa76544ffd48d6a5679d96f4b71d7498a759e94edc9a2db + md5: a451d576819089b0d672f18768be0f65 depends: - - python + - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/six?source=hash-mapping - size: 14259 - timestamp: 1620240338595 -- kind: conda - name: stack_data - version: 0.6.2 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda - sha256: a58433e75229bec39f3be50c02efbe9b7083e53a1f31d8ee247564f370191eec - md5: e7df0fdd404616638df5ece6e69ba7af + size: 16385 + timestamp: 1733381032766 +- conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + sha256: 570da295d421661af487f1595045760526964f41471021056e993e73089e9c41 + md5: b1b505328da7a6b246787df4b5a49fbc depends: - asttokens - executing - pure_eval - - python >=3.5 + - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/stack-data?source=hash-mapping - size: 26205 - timestamp: 1669632203115 -- kind: conda - name: statsmodels - version: 0.14.4 - build: py312hc0a28a1_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.4-py312hc0a28a1_0.conda + size: 26988 + timestamp: 1733569565672 +- conda: https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.4-py312hc0a28a1_0.conda sha256: 6cc65ba902b32207e8a697b0e0408a28d6cc166be04f1882c40739a86a253d22 md5: 97dc960f3d9911964d73c2cf240baea5 depends: @@ -4194,20 +3397,15 @@ packages: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - scipy !=1.9.2,>=1.8 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/statsmodels?source=hash-mapping size: 12103203 timestamp: 1727987129263 -- kind: conda - name: sysroot_linux-64 - version: '2.17' - build: h4a8ded7_18 - build_number: 18 - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h4a8ded7_18.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h4a8ded7_18.conda sha256: 23c7ab371c1b74d01a187e05aa7240e3f5654599e364a9adff7f0b02e26f471f md5: 0ea96f90a10838f58412aa84fdd9df09 depends: @@ -4218,31 +3416,22 @@ packages: purls: [] size: 15500960 timestamp: 1729794510631 -- kind: conda - name: tbb - version: 2021.13.0 - build: h84d6215_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-h84d6215_0.conda - sha256: 7d4d3ad608dc6ae5a7e0f431f784985398a18bcde2ba3ce19cc32f61e2defd98 - md5: ee6f7fd1e76061ef1fa307d41fa86a96 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda + sha256: 65463732129899770d54b1fbf30e1bb82fdebda9d7553caf08d23db4590cd691 + md5: ba7726b8df7b9d34ea80e82b097a4893 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - - libhwloc >=2.11.1,<2.11.2.0a0 + - libhwloc >=2.11.2,<2.11.3.0a0 - libstdcxx >=13 + arch: x86_64 + platform: linux license: Apache-2.0 license_family: APACHE purls: [] - size: 175779 - timestamp: 1725532539822 -- kind: conda - name: threadpoolctl - version: 3.5.0 - build: pyhc1e730c_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda + size: 175954 + timestamp: 1732982638805 +- conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda sha256: 45e402941f6bed094022c5726a2ca494e6224b85180d2367fb6ddd9aea68079d md5: df68d78237980a159bd7149f33c0e8fd depends: @@ -4253,175 +3442,114 @@ packages: - pkg:pypi/threadpoolctl?source=hash-mapping size: 23548 timestamp: 1714400228771 -- kind: conda - name: tk - version: 8.6.13 - build: noxft_h4845f30_101 - build_number: 101 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e md5: d453b98d9c83e71da0741bb0ff4d76bc depends: - libgcc-ng >=12 - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux license: TCL license_family: BSD purls: [] size: 3318875 timestamp: 1699202167581 -- kind: conda - name: tomli - version: 2.1.0 - build: pyhff2d567_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/tomli-2.1.0-pyhff2d567_0.conda - sha256: 354b8a64d4f3311179d85aefc529ca201a36afc1af090d0010c46be7b79f9a47 - md5: 3fa1089b4722df3a900135925f4519d9 +- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda + sha256: 18636339a79656962723077df9a56c0ac7b8a864329eb8f847ee3d38495b863e + md5: ac944244f1fed2eb49bae07193ae8215 depends: - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/tomli?source=hash-mapping - size: 18741 - timestamp: 1731426862834 -- kind: conda - name: toolz - version: 1.0.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_0.conda - sha256: 6371cf3cf8292f2abdcc2bf783d6e70203d72f8ff0c1625f55a486711e276c75 - md5: 34feccdd4177f2d3d53c73fc44fd9a37 + size: 19167 + timestamp: 1733256819729 +- conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda + sha256: eda38f423c33c2eaeca49ed946a8d3bf466cc3364970e083a65eb2fd85258d87 + md5: 40d0ed782a8aaa16ef248e68c06c168d depends: - - python >=3.8 + - python >=3.9 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/toolz?source=hash-mapping - size: 52623 - timestamp: 1728059623353 -- kind: conda - name: tornado - version: 6.4.1 - build: py312h66e93f0_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py312h66e93f0_1.conda - sha256: c0c9cc7834e8f43702956afaa5af7b0639c4835c285108a43e6b91687ce53ab8 - md5: af648b62462794649066366af4ecd5b0 + size: 52475 + timestamp: 1733736126261 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + sha256: 062a3a3a37fa8615ce57929ba7e982c76f5a5810bcebd435950f6d6c4147c310 + md5: e417822cb989e80a0d2b1b576fdd1657 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux license: Apache-2.0 license_family: Apache purls: - pkg:pypi/tornado?source=hash-mapping - size: 837665 - timestamp: 1724956252424 -- kind: pypi + size: 840414 + timestamp: 1732616043734 +- pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl name: tqdm - version: 4.67.0 - url: https://files.pythonhosted.org/packages/2b/78/57043611a16c655c8350b4c01b8d6abfb38cc2acb475238b62c2146186d7/tqdm-4.67.0-py3-none-any.whl - sha256: 0cd8af9d56911acab92182e88d763100d4788bdf421d251616040cc4d44863be + version: 4.67.1 + sha256: 26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2 requires_dist: - colorama ; platform_system == 'Windows' - pytest>=6 ; extra == 'dev' - pytest-cov ; extra == 'dev' - pytest-timeout ; extra == 'dev' - - pytest-xdist ; extra == 'dev' + - pytest-asyncio>=0.24 ; extra == 'dev' + - nbval ; extra == 'dev' - requests ; extra == 'discord' - - ipywidgets>=6 ; extra == 'notebook' - slack-sdk ; extra == 'slack' - requests ; extra == 'telegram' + - ipywidgets>=6 ; extra == 'notebook' requires_python: '>=3.7' -- kind: conda - name: traitlets - version: 5.14.3 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda - sha256: 8a64fa0f19022828513667c2c7176cfd125001f3f4b9bc00d33732e627dd2592 - md5: 3df84416a021220d8b5700c613af2dc5 +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda + sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 + md5: 019a7385be9af33791c989871317e1ed depends: - - python >=3.8 + - python >=3.9 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/traitlets?source=hash-mapping - size: 110187 - timestamp: 1713535244513 -- kind: pypi - name: typeguard - version: 2.13.3 - url: https://files.pythonhosted.org/packages/9a/bb/d43e5c75054e53efce310e79d63df0ac3f25e34c926be5dffb7d283fb2a8/typeguard-2.13.3-py3-none-any.whl - sha256: 5e3e3be01e887e7eafae5af63d1f36c849aaa94e3a0112097312aabfa16284f1 - requires_dist: - - sphinx-rtd-theme ; extra == 'doc' - - sphinx-autodoc-typehints>=1.2.0 ; extra == 'doc' - - pytest ; extra == 'test' - - typing-extensions ; extra == 'test' - - mypy ; platform_python_implementation != 'PyPy' and extra == 'test' - requires_python: '>=3.5.3' -- kind: conda - name: typing-extensions - version: 4.12.2 - build: hd8ed1ab_0 - subdir: noarch + size: 110051 + timestamp: 1733367480074 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda - sha256: d3b9a8ed6da7c9f9553c5fd8a4fca9c3e0ab712fa5f497859f82337d67533b73 - md5: 52d648bd608f5737b123f510bb5514b5 + sha256: c8e9c1c467b5f960b627d7adc1c65fece8e929a3de89967e91ef0f726422fd32 + md5: b6a408c64b78ec7b779a3e5c7a902433 depends: - - typing_extensions 4.12.2 pyha770c72_0 + - typing_extensions 4.12.2 pyha770c72_1 license: PSF-2.0 license_family: PSF purls: [] - size: 10097 - timestamp: 1717802659025 -- kind: conda - name: typing_extensions - version: 4.12.2 - build: pyha770c72_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - sha256: 0fce54f8ec3e59f5ef3bb7641863be4e1bf1279623e5af3d3fa726e8f7628ddb - md5: ebe6952715e1d5eb567eeebf25250fa7 + size: 10075 + timestamp: 1733188758872 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda + sha256: 337be7af5af8b2817f115b3b68870208b30c31d3439bec07bfb2d8f4823e3568 + md5: d17f13df8b65464ca316cbc000a3cb64 depends: - - python >=3.8 + - python >=3.9 license: PSF-2.0 license_family: PSF purls: - pkg:pypi/typing-extensions?source=hash-mapping - size: 39888 - timestamp: 1717802653893 -- kind: conda - name: tzdata - version: 2024b - build: hc8b5060_0 - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + size: 39637 + timestamp: 1733188758212 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda sha256: 4fde5c3008bf5d2db82f2b50204464314cc3c91c1d953652f7bd01d9e52aefdf md5: 8ac3367aafb1cc0a068483c580af8015 license: LicenseRef-Public-Domain purls: [] size: 122354 timestamp: 1728047496079 -- kind: conda - name: unicodedata2 - version: 15.1.0 - build: py312h66e93f0_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py312h66e93f0_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py312h66e93f0_1.conda sha256: 1fcba6d363d901d9a06381e1aee2d5634f82389965dd7a339f19b3ae81ce6da0 md5: 588486a61153f94c7c13816f7069e440 depends: @@ -4429,16 +3557,17 @@ packages: - libgcc >=13 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux license: Apache-2.0 license_family: Apache purls: - pkg:pypi/unicodedata2?source=hash-mapping size: 368550 timestamp: 1729704685856 -- kind: pypi +- pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl name: urllib3 version: 2.2.3 - url: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl sha256: ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac requires_dist: - brotli>=1.0.9 ; platform_python_implementation == 'CPython' and extra == 'brotli' @@ -4447,10 +3576,28 @@ packages: - pysocks>=1.5.6,!=1.5.7,<2.0 ; extra == 'socks' - zstandard>=0.18.0 ; extra == 'zstd' requires_python: '>=3.8' -- kind: pypi +- conda: https://conda.anaconda.org/conda-forge/linux-64/viztracer-1.0.0-py312h3a80f7f_0.conda + sha256: a3d79c45b4d4adc4c061f399324a70ef89318690413f98bd5fcbfe170936cd37 + md5: e022a3d098ce2fac2df49ffc1ccd2240 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc + - libgcc-ng >=12 + - objprint >=0.3.0 + - orjson + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/viztracer?source=hash-mapping + size: 11361364 + timestamp: 1732425850776 +- pypi: https://files.pythonhosted.org/packages/c3/ac/1847959031ce09eb65a70b16d0f07633d7ddaf8a97752cc924f9a8cbe253/watermark-2.5.0-py2.py3-none-any.whl name: watermark version: 2.5.0 - url: https://files.pythonhosted.org/packages/c3/ac/1847959031ce09eb65a70b16d0f07633d7ddaf8a97752cc924f9a8cbe253/watermark-2.5.0-py2.py3-none-any.whl sha256: d775afa075f5ea15152ad9f4c82dfc95bffb9d0cb4341c9b62073b627191464d requires_dist: - ipython>=6.0 @@ -4458,88 +3605,75 @@ packages: - setuptools - py3nvml>=0.2 ; extra == 'gpu' requires_python: '>=3.7' -- kind: conda - name: wcwidth - version: 0.2.13 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_0.conda - sha256: b6cd2fee7e728e620ec736d8dfee29c6c9e2adbd4e695a31f1d8f834a83e57e3 - md5: 68f0738df502a14213624b288c60c9ad +- conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda + sha256: f21e63e8f7346f9074fd00ca3b079bd3d2fa4d71f1f89d5b6934bf31446dc2a5 + md5: b68980f2495d096e71c7fd9d7ccf63e6 depends: - - python >=3.8 + - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/wcwidth?source=hash-mapping - size: 32709 - timestamp: 1704731373922 -- kind: conda - name: wheel - version: 0.45.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.0-pyhd8ed1ab_0.conda - sha256: 8a51067f8e1a2cb0b5e89672dbcc0369e344a92e869c38b2946584aa09ab7088 - md5: f9751d7c71df27b2d29f5cab3378982e + size: 32581 + timestamp: 1733231433877 +- conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda + sha256: 1b34021e815ff89a4d902d879c3bd2040bc1bd6169b32e9427497fa05c55f1ce + md5: 75cb7132eb58d97896e173ef12ac9986 depends: - - python >=3.8 + - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/wheel?source=hash-mapping - size: 62755 - timestamp: 1731120002488 -- kind: conda - name: xarray - version: 2024.10.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/xarray-2024.10.0-pyhd8ed1ab_0.conda - sha256: a35c8291de55f96ecc9121d1ebd4995977ea2f51d9e529e97749abc108afb0e4 - md5: 53e365732dfa053c4d19fc6b927392c4 + size: 62931 + timestamp: 1733130309598 +- conda: https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_1.conda + sha256: a750202ae2a31d8e5ee5a5c127fcc7fa783cd0fbedbc0bf1ab549a109881fa9f + md5: 237db148cc37a466e4222d589029b53e + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/widgetsnbextension?source=hash-mapping + size: 898402 + timestamp: 1733128654300 +- conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2024.11.0-pyhd8ed1ab_0.conda + sha256: 1312af7bc507afdcf24df1599d6aa062ceb252d4c086d5b8e5a022bf8051d980 + md5: 7358eeedbffd742549d372e0066999d3 depends: - numpy >=1.24 - - packaging >=23.1 + - packaging >=23.2 - pandas >=2.1 - python >=3.10 constrains: - - matplotlib-base >=3.7 - - netcdf4 >=1.6.0 - - numba >=0.57 - - hdf5 >=1.12 + - cartopy >=0.22 + - h5py >=3.8 + - h5netcdf >=1.3 - sparse >=0.14 + - dask-core >=2023.11 - cftime >=1.6 + - bottleneck >=1.3 + - netcdf4 >=1.6.0 + - iris >=3.7 - zarr >=2.16 + - seaborn-base >=0.13 + - distributed >=2023.11 + - matplotlib-base >=3.8 + - nc-time-axis >=1.4 + - scipy >=1.11 + - toolz >=0.12 - flox >=0.7 + - numba >=0.57 - pint >=0.22 - - toolz >=0.12 - - scipy >=1.11 - - seaborn-base >=0.12 - - distributed >=2023.9 - - iris >=3.7 - - cartopy >=0.22 - - bottleneck >=1.3 - - dask-core >=2023.9 - - h5py >=3.8 - - h5netcdf >=1.2 - - nc-time-axis >=1.4 + - hdf5 >=1.12 license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/xarray?source=hash-mapping - size: 813754 - timestamp: 1729867978934 -- kind: conda - name: xarray-einstats - version: 0.8.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/xarray-einstats-0.8.0-pyhd8ed1ab_0.conda + size: 826310 + timestamp: 1732532972254 +- conda: https://conda.anaconda.org/conda-forge/noarch/xarray-einstats-0.8.0-pyhd8ed1ab_0.conda sha256: 8cb41b361184ee06515829e729184716e252c6f661590898242e93c3e87dd415 md5: 729ecac2a5d024cce0837c25cf28f695 depends: @@ -4553,30 +3687,20 @@ packages: - pkg:pypi/xarray-einstats?source=hash-mapping size: 33815 timestamp: 1726758642806 -- kind: conda - name: xorg-libice - version: 1.1.1 - build: hb9d3cd8_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hb9d3cd8_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hb9d3cd8_1.conda sha256: ec276da68d1c4a3d34a63195b35ca5b248d4aff0812464dcd843d74649b5cec4 md5: 19608a9656912805b2b9a2f6bd257b04 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] size: 58159 timestamp: 1727531850109 -- kind: conda - name: xorg-libsm - version: 1.2.4 - build: he73a12e_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-he73a12e_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-he73a12e_1.conda sha256: 70e903370977d44c9120a5641ab563887bd48446e9ef6fc2a3f5f60531c2cd6c md5: 05a8ea5f446de33006171a7afe6ae857 depends: @@ -4584,138 +3708,84 @@ packages: - libgcc >=13 - libuuid >=2.38.1,<3.0a0 - xorg-libice >=1.1.1,<2.0a0 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] size: 27516 timestamp: 1727634669421 -- kind: conda - name: xorg-libx11 - version: 1.8.10 - build: h4f16b4b_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_0.conda - sha256: c4650634607864630fb03696474a0535f6fce5fda7d81a6462346e071b53dfa7 - md5: 0b666058a179b744a622d0a4a0c56353 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_1.conda + sha256: f53994d54f0604df881c4e984279b3cf6a1648a22d4b2113e2c89829968784c9 + md5: 125f34a17d7b4bea418a83904ea82ea6 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libxcb >=1.17.0,<2.0a0 - - xorg-xorgproto + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] - size: 838308 - timestamp: 1727356837875 -- kind: conda - name: xorg-libxau - version: 1.0.11 - build: hb9d3cd8_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hb9d3cd8_1.conda + size: 837524 + timestamp: 1733324962639 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hb9d3cd8_1.conda sha256: 532a046fee0b3a402db867b6ec55c84ba4cdedb91d817147c8feeae9766be3d6 md5: 77cbc488235ebbaab2b6e912d3934bae depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] size: 14679 timestamp: 1727034741045 -- kind: conda - name: xorg-libxdmcp - version: 1.1.5 - build: hb9d3cd8_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda sha256: 6b250f3e59db07c2514057944a3ea2044d6a8cdde8a47b6497c254520fade1ee md5: 8035c64cb77ed555e3f150b7b3972480 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] size: 19901 timestamp: 1727794976192 -- kind: conda - name: xorg-libxext - version: 1.3.6 - build: hb9d3cd8_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda sha256: da5dc921c017c05f38a38bd75245017463104457b63a1ce633ed41f214159c14 md5: febbab7d15033c913d53c7a2c102309d depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - xorg-libx11 >=1.8.10,<2.0a0 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] size: 50060 timestamp: 1727752228921 -- kind: conda - name: xorg-libxrender - version: 0.9.11 - build: hb9d3cd8_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hb9d3cd8_1.conda - sha256: f1217e902c0b1d8bc5d3ce65e483ebf38b049c823c9117b7198cfb16bd2b9143 - md5: a7a49a8b85122b49214798321e2e96b4 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hb9d3cd8_2.conda + sha256: a2f533fe2374789413a9dfa1369322573910f4b010fd24386cdd1c5cd977a087 + md5: eef3132295d92678c17ffc8b114b8371 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - xorg-libx11 >=1.8.10,<2.0a0 - - xorg-xorgproto + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] - size: 37780 - timestamp: 1727529943015 -- kind: conda - name: xorg-xorgproto - version: '2024.1' - build: hb9d3cd8_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2024.1-hb9d3cd8_1.conda - sha256: 1316680be6edddee0156b86ec1102fc8286f51c1a5440366ed1db596a2dc3731 - md5: 7c21106b851ec72c037b162c216d8f05 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - license: MIT - license_family: MIT - purls: [] - size: 565425 - timestamp: 1726846388217 -- kind: conda - name: xz - version: 5.2.6 - build: h166bdaf_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - sha256: 03a6d28ded42af8a347345f82f3eebdd6807a08526d47899a42d62d319609162 - md5: 2161070d867d1b1204ea749c8eec4ef0 - depends: - - libgcc-ng >=12 - license: LGPL-2.1 and GPL-2.0 - purls: [] - size: 418368 - timestamp: 1660346797927 -- kind: conda - name: zarr - version: 2.18.3 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/zarr-2.18.3-pyhd8ed1ab_0.conda - sha256: 0fd9bf7ba90088115c52dad7b9d44fbffeabe34cb35299b2c38d5f17851fda36 - md5: 41abde21508578e02e3fd492e82a05cd + size: 37638 + timestamp: 1733755897245 +- conda: https://conda.anaconda.org/conda-forge/noarch/zarr-2.18.3-pyhd8ed1ab_1.conda + sha256: 02c045d3ab97bd5a713b0f35b05f017603d33bd728694ce3cf843c45c2906535 + md5: 3e9a0fee25417c432c4780b9597fc312 depends: - asciitree - fasteners @@ -4723,22 +3793,16 @@ packages: - numpy >=1.24,<3.0 - python >=3.10 constrains: - - ipywidgets >=8.0.0 - notebook - ipytree >=0.2.2 + - ipywidgets >=8.0.0 license: MIT license_family: MIT purls: - pkg:pypi/zarr?source=hash-mapping - size: 159273 - timestamp: 1725539879186 -- kind: conda - name: zeromq - version: 4.3.5 - build: h3b0a872_7 - build_number: 7 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda + size: 160013 + timestamp: 1733237313723 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda sha256: a4dc72c96848f764bb5a5176aa93dd1e9b9e52804137b99daeebba277b31ea10 md5: 3947a35e916fcc6b9825449affbf4214 depends: @@ -4747,57 +3811,33 @@ packages: - libgcc >=13 - libsodium >=1.0.20,<1.0.21.0a0 - libstdcxx >=13 + arch: x86_64 + platform: linux license: MPL-2.0 + license_family: MOZILLA purls: [] size: 335400 timestamp: 1731585026517 -- kind: conda - name: zipp - version: 3.21.0 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_0.conda - sha256: 232a30e4b0045c9de5e168dda0328dc0e28df9439cdecdfb97dd79c1c82c4cec - md5: fee389bf8a4843bd7a2248ce11b7f188 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda + sha256: 567c04f124525c97a096b65769834b7acb047db24b15a56888a322bf3966c3e1 + md5: 0c3cc595284c5e8f0f9900a9b228a332 depends: - - python >=3.8 + - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/zipp?source=hash-mapping - size: 21702 - timestamp: 1731262194278 -- kind: conda - name: zlib - version: 1.3.1 - build: hb9d3cd8_2 - build_number: 2 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda - sha256: 5d7c0e5f0005f74112a34a7425179f4eb6e73c92f5d109e6af4ddeca407c92ab - md5: c9f075ab2f33b3bbee9e62d4ad0a6cd8 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libzlib 1.3.1 hb9d3cd8_2 - license: Zlib - license_family: Other - purls: [] - size: 92286 - timestamp: 1727963153079 -- kind: conda - name: zstd - version: 1.5.6 - build: ha6fb4c9_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + size: 21809 + timestamp: 1732827613585 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda sha256: c558b9cc01d9c1444031bd1ce4b9cff86f9085765f17627a6cd85fc623c8a02b md5: 4d056880988120e29d75bfff282e0f45 depends: - libgcc-ng >=12 - libstdcxx-ng >=12 - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] diff --git a/pixi.toml b/pixi.toml index 9315e61..deffa6a 100644 --- a/pixi.toml +++ b/pixi.toml @@ -12,18 +12,20 @@ develop = "maturin develop --release" [dependencies] python = ">=3.12.7,<3.13" -pymc = ">=5.18.0,<5.19" +pymc = ">=5.19.0,<6" numba = ">=0.60.0,<0.61" -pytest = ">=8.3.3,<9" -maturin = ">=1.7.4,<2" +pytest = ">=8.3.4,<9" +maturin = ">=1.7.7,<2" pip = ">=24.3.1,<25" -#jax = ">=0.4.34,<0.5" ipykernel = ">=6.29.5,<7" seaborn = ">=0.13.2,<0.14" threadpoolctl = ">=3.5.0,<4" zarr = ">=2.18.3,<3" -polars = ">=1.12.0,<2" +polars = ">=1.16.0,<2" +viztracer = ">=1.0.0,<2" +ipywidgets = ">=8.1.5,<9" # The jaxlib cuda build seems to be broken around version 0.4.34 +#jax = ">=0.4.35,<0.5" #jaxlib = { version = "*", build = "*cuda12*" } [pypi-dependencies] @@ -32,7 +34,7 @@ bridgestan = ">=2.5.0, <3" flowjax = { path = "../flowjax/", editable = true } samplerlab = { path = "../pymc-labs/benchmark-pymc", editable = true } posteriordb = ">=0.2.0, <0.3" -jax = { version = "==0.4.35", extras = ["cuda12"] } +jax = { version = ">=0.4.35, <0.5", extras = ["cuda12"] } watermark = ">=2.5.0, <3" [system-requirements] From 97477224a9080c6399557b7215fdbc46dcba8191 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Fri, 13 Dec 2024 10:47:09 +0100 Subject: [PATCH 26/55] chore: update nuts-rs --- Cargo.lock | 4 +- Cargo.toml | 2 +- pixi.lock | 326 ++++++----------------------------------------------- pixi.toml | 2 +- 4 files changed, 38 insertions(+), 296 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4693433..263aa2e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1529,7 +1529,9 @@ dependencies = [ [[package]] name = "nuts-rs" -version = "0.13.0" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "975b57d4d2a3c0755252745d0afc55886b8a0b482be224cb615591b35280f99d" dependencies = [ "anyhow", "arrow", diff --git a/Cargo.toml b/Cargo.toml index 911b3c8..d3cacb3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,7 +22,7 @@ name = "_lib" crate-type = ["cdylib"] [dependencies] -nuts-rs = "0.13.0" +nuts-rs = "0.14.0" numpy = "0.23.0" rand = "0.8.5" thiserror = "2.0.3" diff --git a/pixi.lock b/pixi.lock index 4216fdc..c7fcfe1 100644 --- a/pixi.lock +++ b/pixi.lock @@ -232,10 +232,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/3a/af/411e94c165229882eb2d0a329114826aa52c7c61ef3108d0d3d8ad7189ed/equinox-0.11.10-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4f/4a/ff8aa2c57300613b69905308c5afe92c5b01112d766c25a305fd6796170a/etils-1.11.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/5f/3f/6c5553baaa7faa3fa8bae8279b1e46cb54c7ce52360139eae53498786ea5/jax-0.4.37-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/04/31/8fd189998732d1c5ecacf6a68b6c9aeaafa300b0eaa85b8c678238edba7c/jax_cuda12_pjrt-0.4.36-py3-none-manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/4b/b9/aaf71a9878ef3f4e4997dabf8458765cd8085c37f65865631980bfb83d53/jax_cuda12_plugin-0.4.36-cp312-cp312-manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/fe/f2/7624a304426daa7b135b85caf1b8eccf879e7cb10bc074656ce628309cb0/jaxlib-0.4.36-cp312-cp312-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/62/20/6c57c50c0ccc645fea1895950f1e5cd02f961ee44b3ffe83617fa46b0c1d/jax-0.4.35-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/aa/f15ea857ad9bcff7a0c942dc570ca718b026cc0cc5c513525bb08cacf3c0/jax_cuda12_pjrt-0.4.35-py3-none-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/23/a1/781f98da41b9abf63a1468c5babbafa7b1bdb766c081386644a4034fbdef/jax_cuda12_plugin-0.4.35-cp312-cp312-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e7/0d/4faf839e3c8ce2a5b615df64427be3e870899c72c0ebfb5859348150aba1/jaxlib-0.4.34-cp312-cp312-manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/94/99/c83c6a97f4382caf1c9bfeeeca935d3eb1f479f711665aeadf4408048107/jaxtyping-0.2.36-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6f/d3/1321715a95e856d4ef4fba24e4351cf5e4c89d459ad132a8cba5fe257d72/ml_dtypes-0.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/af/eb/ff4b8c503fa1f1796679dce648854d58751982426e4e4b37d6fce49d259c/nvidia_cublas_cu12-12.6.4.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl @@ -262,8 +262,6 @@ packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 md5: d7c89558ba9fa0495403155b64376d81 - arch: x86_64 - platform: linux license: None purls: [] size: 2562 @@ -275,8 +273,6 @@ packages: depends: - _libgcc_mutex 0.1 conda_forge - llvm-openmp >=9.0.1 - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: [] @@ -341,8 +337,6 @@ packages: - libstdcxx-ng >=12 constrains: - atk-1.0 2.38.0 - arch: x86_64 - platform: linux license: LGPL-2.0-or-later license_family: LGPL purls: [] @@ -354,8 +348,6 @@ packages: depends: - ld_impl_linux-64 2.43 h712a8e2_2 - sysroot_linux-64 - arch: x86_64 - platform: linux license: GPL-3.0-only license_family: GPL purls: [] @@ -366,8 +358,6 @@ packages: md5: 18aba879ddf1f8f28145ca6fcb873d8c depends: - binutils_impl_linux-64 2.43 h4bf12b8_2 - arch: x86_64 - platform: linux license: GPL-3.0-only license_family: GPL purls: [] @@ -390,8 +380,6 @@ packages: - liblapack 3.9.0 25_linux64_openblas - liblapacke 3.9.0 25_linux64_openblas - llvm-openmp >=19.1.2 - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: [] @@ -407,8 +395,6 @@ packages: - liblapack 3.9.0 25_linux64_openblas - liblapacke 3.9.0 25_linux64_openblas - openblas 0.3.28.* - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: [] @@ -434,8 +420,6 @@ packages: - libbrotlidec 1.1.0 hb9d3cd8_2 - libbrotlienc 1.1.0 hb9d3cd8_2 - libgcc >=13 - arch: x86_64 - platform: linux license: MIT license_family: MIT purls: [] @@ -449,8 +433,6 @@ packages: - libbrotlidec 1.1.0 hb9d3cd8_2 - libbrotlienc 1.1.0 hb9d3cd8_2 - libgcc >=13 - arch: x86_64 - platform: linux license: MIT license_family: MIT purls: [] @@ -462,8 +444,6 @@ packages: depends: - __glibc >=2.17,<3.0.a0 - libgcc-ng >=12 - arch: x86_64 - platform: linux license: bzip2-1.0.6 license_family: BSD purls: [] @@ -475,8 +455,6 @@ packages: depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - arch: x86_64 - platform: linux license: MIT license_family: MIT purls: [] @@ -485,8 +463,6 @@ packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda sha256: afee721baa6d988e27fef1832f68d6f32ac8cc99cdf6015732224c2841a09cea md5: c27d1c142233b5bc9ca570c6e2e0c244 - arch: x86_64 - platform: linux license: ISC purls: [] size: 159003 @@ -546,8 +522,6 @@ packages: - xorg-libx11 >=1.8.10,<2.0a0 - xorg-libxext >=1.3.6,<2.0a0 - xorg-libxrender >=0.9.11,<0.10.0a0 - arch: x86_64 - platform: linux license: LGPL-2.1-only or MPL-1.1 purls: [] size: 978868 @@ -636,8 +610,6 @@ packages: - numpy >=1.23 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: @@ -664,8 +636,6 @@ packages: - libstdcxx >=13 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - arch: x86_64 - platform: linux license: MIT license_family: MIT purls: @@ -892,8 +862,6 @@ packages: - libgcc >=13 - libuuid >=2.38.1,<3.0a0 - libzlib >=1.3.1,<2.0a0 - arch: x86_64 - platform: linux license: MIT license_family: MIT purls: [] @@ -933,8 +901,6 @@ packages: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - unicodedata2 >=15.1.0 - arch: x86_64 - platform: linux license: MIT license_family: MIT purls: @@ -948,8 +914,6 @@ packages: - libgcc-ng >=12 - libpng >=1.6.39,<1.7.0a0 - libzlib >=1.2.13,<2.0.0a0 - arch: x86_64 - platform: linux license: GPL-2.0-only OR FTL purls: [] size: 634972 @@ -959,8 +923,6 @@ packages: md5: ac7bc6a654f8f41b352b38f4051135f8 depends: - libgcc-ng >=7.5.0 - arch: x86_64 - platform: linux license: LGPL-2.1 purls: [] size: 114383 @@ -970,8 +932,6 @@ packages: md5: 606924335b5bcdf90e9aed9a2f5d22ed depends: - gcc_impl_linux-64 13.3.0.* - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: [] @@ -988,8 +948,6 @@ packages: - libsanitizer 13.3.0 heb74ff8_1 - libstdcxx >=13.3.0 - sysroot_linux-64 - arch: x86_64 - platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] @@ -1002,8 +960,6 @@ packages: - binutils_linux-64 - gcc_impl_linux-64 13.3.0.* - sysroot_linux-64 - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: [] @@ -1018,8 +974,6 @@ packages: - libjpeg-turbo >=3.0.0,<4.0a0 - libpng >=1.6.43,<1.7.0a0 - libtiff >=4.6.0,<4.8.0a0 - arch: x86_64 - platform: linux license: LGPL-2.1-or-later license_family: LGPL purls: [] @@ -1031,8 +985,6 @@ packages: depends: - libgcc-ng >=12 - libstdcxx-ng >=12 - arch: x86_64 - platform: linux license: LGPL-2.0-or-later license_family: LGPL purls: [] @@ -1057,8 +1009,6 @@ packages: - libwebp-base >=1.4.0,<2.0a0 - libzlib >=1.3.1,<2.0a0 - pango >=1.50.14,<2.0a0 - arch: x86_64 - platform: linux license: EPL-1.0 license_family: Other purls: [] @@ -1082,8 +1032,6 @@ packages: - xorg-libx11 >=1.8.9,<2.0a0 - xorg-libxext >=1.3.4,<2.0a0 - xorg-libxrender >=0.9.11,<0.10.0a0 - arch: x86_64 - platform: linux license: LGPL-2.1-or-later purls: [] size: 6501561 @@ -1095,8 +1043,6 @@ packages: - libgcc-ng >=12 - libglib >=2.76.3,<3.0a0 - libstdcxx-ng >=12 - arch: x86_64 - platform: linux license: LGPL-2.0-or-later license_family: LGPL purls: [] @@ -1108,8 +1054,6 @@ packages: depends: - gcc 13.3.0.* - gxx_impl_linux-64 13.3.0.* - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: [] @@ -1123,8 +1067,6 @@ packages: - libstdcxx-devel_linux-64 13.3.0 h84ea5a7_101 - sysroot_linux-64 - tzdata - arch: x86_64 - platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] @@ -1138,8 +1080,6 @@ packages: - gcc_linux-64 13.3.0 hc28eda2_7 - gxx_impl_linux-64 13.3.0.* - sysroot_linux-64 - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: [] @@ -1169,8 +1109,6 @@ packages: - numpy >=1.19,<3 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: @@ -1189,8 +1127,6 @@ packages: - libgcc-ng >=12 - libglib >=2.80.3,<3.0a0 - libstdcxx-ng >=12 - arch: x86_64 - platform: linux license: MIT license_family: MIT purls: [] @@ -1209,8 +1145,6 @@ packages: - libstdcxx >=13 - libzlib >=1.3.1,<2.0a0 - openssl >=3.4.0,<4.0a0 - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: [] @@ -1223,8 +1157,6 @@ packages: - __glibc >=2.17,<3.0.a0 - libgcc-ng >=12 - libstdcxx-ng >=12 - arch: x86_64 - platform: linux license: MIT license_family: MIT purls: [] @@ -1326,47 +1258,47 @@ packages: - pkg:pypi/ipywidgets?source=hash-mapping size: 113982 timestamp: 1733493669268 -- pypi: https://files.pythonhosted.org/packages/5f/3f/6c5553baaa7faa3fa8bae8279b1e46cb54c7ce52360139eae53498786ea5/jax-0.4.37-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/62/20/6c57c50c0ccc645fea1895950f1e5cd02f961ee44b3ffe83617fa46b0c1d/jax-0.4.35-py3-none-any.whl name: jax - version: 0.4.37 - sha256: bdc0686d7e5a944e2d38026eae632214d98dd2d91869cbcedbf1c11298ae3e3e + version: 0.4.35 + sha256: fa99e909a31424abfec750019a6dd36f6acc18a6e7d40e2c0086b932cc351325 requires_dist: - - jaxlib>=0.4.36,<=0.4.37 + - jaxlib>=0.4.34,<=0.4.35 - ml-dtypes>=0.4.0 - numpy>=1.24 - - numpy>=1.26.0 ; python_full_version >= '3.12' - opt-einsum - scipy>=1.10 + - numpy>=1.26.0 ; python_full_version >= '3.12' - scipy>=1.11.1 ; python_full_version >= '3.12' - - jaxlib==0.4.36 ; extra == 'minimum-jaxlib' - - jaxlib==0.4.35 ; extra == 'ci' - - jaxlib>=0.4.36,<=0.4.37 ; extra == 'tpu' + - jaxlib==0.4.34 ; extra == 'ci' + - jaxlib==0.4.34 ; extra == 'cuda' + - jax-cuda12-plugin[with-cuda]>=0.4.34,<=0.4.35 ; extra == 'cuda' + - jaxlib==0.4.34 ; extra == 'cuda12' + - jax-cuda12-plugin[with-cuda]>=0.4.34,<=0.4.35 ; extra == 'cuda12' + - jaxlib==0.4.34 ; extra == 'cuda12-local' + - jax-cuda12-plugin==0.4.34 ; extra == 'cuda12-local' + - jaxlib==0.4.34 ; extra == 'cuda12-pip' + - jax-cuda12-plugin[with-cuda]>=0.4.34,<=0.4.35 ; extra == 'cuda12-pip' + - kubernetes ; extra == 'k8s' + - jaxlib==0.4.34 ; extra == 'minimum-jaxlib' + - jaxlib>=0.4.34,<=0.4.35 ; extra == 'tpu' - libtpu-nightly==0.1.dev20241010+nightly.cleanup ; extra == 'tpu' - - libtpu==0.0.6 ; extra == 'tpu' + - libtpu==0.0.2 ; extra == 'tpu' - requests ; extra == 'tpu' - - jaxlib==0.4.36 ; extra == 'cuda' - - jax-cuda12-plugin[with-cuda]>=0.4.36,<=0.4.37 ; extra == 'cuda' - - jaxlib==0.4.36 ; extra == 'cuda12' - - jax-cuda12-plugin[with-cuda]>=0.4.36,<=0.4.37 ; extra == 'cuda12' - - jaxlib==0.4.36 ; extra == 'cuda12-pip' - - jax-cuda12-plugin[with-cuda]>=0.4.36,<=0.4.37 ; extra == 'cuda12-pip' - - jaxlib==0.4.36 ; extra == 'cuda12-local' - - jax-cuda12-plugin==0.4.36 ; extra == 'cuda12-local' - - kubernetes ; extra == 'k8s' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/04/31/8fd189998732d1c5ecacf6a68b6c9aeaafa300b0eaa85b8c678238edba7c/jax_cuda12_pjrt-0.4.36-py3-none-manylinux2014_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/d7/aa/f15ea857ad9bcff7a0c942dc570ca718b026cc0cc5c513525bb08cacf3c0/jax_cuda12_pjrt-0.4.35-py3-none-manylinux2014_x86_64.whl name: jax-cuda12-pjrt - version: 0.4.36 - sha256: e3c3705d8db7d63da9abfaebf06f5cd0667f5acb0748a5c5eb00d80041e922ed -- pypi: https://files.pythonhosted.org/packages/4b/b9/aaf71a9878ef3f4e4997dabf8458765cd8085c37f65865631980bfb83d53/jax_cuda12_plugin-0.4.36-cp312-cp312-manylinux2014_x86_64.whl + version: 0.4.35 + sha256: 0ffe7e1ba65659bd5738c2cc5addaf0a56205d2188eec5da194b63c068e1fdd2 +- pypi: https://files.pythonhosted.org/packages/23/a1/781f98da41b9abf63a1468c5babbafa7b1bdb766c081386644a4034fbdef/jax_cuda12_plugin-0.4.35-cp312-cp312-manylinux2014_x86_64.whl name: jax-cuda12-plugin - version: 0.4.36 - sha256: 5d4727fb519fedc06a9a984d5a0714804d81ef126a2cb60cefd5cbc4a3ea2627 + version: 0.4.35 + sha256: 80aa5e628e8e9dd4f89b767f73900152033c3bf6d5f49dc2081e93f9bac1c9dc requires_dist: - - jax-cuda12-pjrt==0.4.36 + - jax-cuda12-pjrt==0.4.35 - nvidia-cublas-cu12>=12.1.3.1 ; extra == 'with-cuda' - nvidia-cuda-cupti-cu12>=12.1.105 ; extra == 'with-cuda' - - nvidia-cuda-nvcc-cu12>=12.6.85 ; extra == 'with-cuda' + - nvidia-cuda-nvcc-cu12>=12.1.105 ; extra == 'with-cuda' - nvidia-cuda-runtime-cu12>=12.1.105 ; extra == 'with-cuda' - nvidia-cudnn-cu12>=9.1,<10.0 ; extra == 'with-cuda' - nvidia-cufft-cu12>=11.0.2.54 ; extra == 'with-cuda' @@ -1375,10 +1307,10 @@ packages: - nvidia-nccl-cu12>=2.18.1 ; extra == 'with-cuda' - nvidia-nvjitlink-cu12>=12.1.105 ; extra == 'with-cuda' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/fe/f2/7624a304426daa7b135b85caf1b8eccf879e7cb10bc074656ce628309cb0/jaxlib-0.4.36-cp312-cp312-manylinux2014_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/e7/0d/4faf839e3c8ce2a5b615df64427be3e870899c72c0ebfb5859348150aba1/jaxlib-0.4.34-cp312-cp312-manylinux2014_x86_64.whl name: jaxlib - version: 0.4.36 - sha256: be295abc209c980817db0488f21f1fbc0644f87326522895e2b9b64729106357 + version: 0.4.34 + sha256: 48272e9034ff868d4328cf0055a07882fd2be93f59dfb6283af7de491f9d1290 requires_dist: - scipy>=1.10 - numpy>=1.24 @@ -1462,8 +1394,6 @@ packages: md5: 30186d27e2c9fa62b45fb1476b7200e3 depends: - libgcc-ng >=10.3.0 - arch: x86_64 - platform: linux license: LGPL-2.1-or-later purls: [] size: 117831 @@ -1477,8 +1407,6 @@ packages: - libstdcxx >=13 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: @@ -1495,8 +1423,6 @@ packages: - libgcc-ng >=12 - libstdcxx-ng >=12 - openssl >=3.3.1,<4.0a0 - arch: x86_64 - platform: linux license: MIT license_family: MIT purls: [] @@ -1509,8 +1435,6 @@ packages: - libgcc-ng >=12 - libjpeg-turbo >=3.0.0,<4.0a0 - libtiff >=4.6.0,<4.8.0a0 - arch: x86_64 - platform: linux license: MIT license_family: MIT purls: [] @@ -1523,8 +1447,6 @@ packages: - __glibc >=2.17,<3.0.a0 constrains: - binutils_impl_linux-64 2.43 - arch: x86_64 - platform: linux license: GPL-3.0-only license_family: GPL purls: [] @@ -1536,8 +1458,6 @@ packages: depends: - libgcc-ng >=12 - libstdcxx-ng >=12 - arch: x86_64 - platform: linux license: Apache-2.0 license_family: Apache purls: [] @@ -1549,8 +1469,6 @@ packages: depends: - libgcc-ng >=12 - libstdcxx-ng >=12 - arch: x86_64 - platform: linux license: BSD-2-Clause license_family: BSD purls: [] @@ -1568,8 +1486,6 @@ packages: - libcblas 3.9.0 25_linux64_openblas - blas * openblas - liblapacke 3.9.0 25_linux64_openblas - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: [] @@ -1581,8 +1497,6 @@ packages: depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - arch: x86_64 - platform: linux license: MIT license_family: MIT purls: [] @@ -1595,8 +1509,6 @@ packages: - __glibc >=2.17,<3.0.a0 - libbrotlicommon 1.1.0 hb9d3cd8_2 - libgcc >=13 - arch: x86_64 - platform: linux license: MIT license_family: MIT purls: [] @@ -1609,8 +1521,6 @@ packages: - __glibc >=2.17,<3.0.a0 - libbrotlicommon 1.1.0 hb9d3cd8_2 - libgcc >=13 - arch: x86_64 - platform: linux license: MIT license_family: MIT purls: [] @@ -1626,8 +1536,6 @@ packages: - liblapack 3.9.0 25_linux64_openblas - blas * openblas - liblapacke 3.9.0 25_linux64_openblas - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: [] @@ -1645,8 +1553,6 @@ packages: - libzlib >=1.3.1,<2.0a0 - openssl >=3.4.0,<4.0a0 - zstd >=1.5.6,<1.6.0a0 - arch: x86_64 - platform: linux license: curl license_family: MIT purls: [] @@ -1658,8 +1564,6 @@ packages: depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - arch: x86_64 - platform: linux license: MIT license_family: MIT purls: [] @@ -1671,8 +1575,6 @@ packages: depends: - libgcc-ng >=7.5.0 - ncurses >=6.2,<7.0.0a0 - arch: x86_64 - platform: linux license: BSD-2-Clause license_family: BSD purls: [] @@ -1683,8 +1585,6 @@ packages: md5: 172bf1cd1ff8629f2b1179945ed45055 depends: - libgcc-ng >=12 - arch: x86_64 - platform: linux license: BSD-2-Clause license_family: BSD purls: [] @@ -1698,8 +1598,6 @@ packages: - libgcc >=13 constrains: - expat 2.6.4.* - arch: x86_64 - platform: linux license: MIT license_family: MIT purls: [] @@ -1710,8 +1608,6 @@ packages: md5: d645c6d2ac96843a2bfaccd2d62b3ac3 depends: - libgcc-ng >=9.4.0 - arch: x86_64 - platform: linux license: MIT license_family: MIT purls: [] @@ -1726,8 +1622,6 @@ packages: constrains: - libgomp 14.2.0 h77fa898_1 - libgcc-ng ==14.2.0=*_1 - arch: x86_64 - platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] @@ -1748,8 +1642,6 @@ packages: md5: e39480b9ca41323497b05492a63bc35b depends: - libgcc 14.2.0 h77fa898_1 - arch: x86_64 - platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] @@ -1771,8 +1663,6 @@ packages: - libtiff >=4.6.0,<4.8.0a0 - libwebp-base >=1.4.0,<2.0a0 - libzlib >=1.3.1,<2.0a0 - arch: x86_64 - platform: linux license: GD license_family: BSD purls: [] @@ -1785,8 +1675,6 @@ packages: - libgfortran5 14.2.0 hd5240d6_1 constrains: - libgfortran-ng ==14.2.0=*_1 - arch: x86_64 - platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] @@ -1799,8 +1687,6 @@ packages: - libgcc >=14.2.0 constrains: - libgfortran 14.2.0 - arch: x86_64 - platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] @@ -1818,8 +1704,6 @@ packages: - pcre2 >=10.44,<10.45.0a0 constrains: - glib 2.82.2 *_0 - arch: x86_64 - platform: linux license: LGPL-2.1-or-later purls: [] size: 3931898 @@ -1829,8 +1713,6 @@ packages: md5: cc3573974587f12dda90d96e3e55a702 depends: - _libgcc_mutex 0.1 conda_forge - arch: x86_64 - platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] @@ -1844,8 +1726,6 @@ packages: - libgcc >=13 - libstdcxx >=13 - libxml2 >=2.13.4,<3.0a0 - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: [] @@ -1856,8 +1736,6 @@ packages: md5: d66573916ffcf376178462f1b61c941e depends: - libgcc-ng >=12 - arch: x86_64 - platform: linux license: LGPL-2.1-only purls: [] size: 705775 @@ -1869,8 +1747,6 @@ packages: - libgcc-ng >=12 constrains: - jpeg <0.0.0a - arch: x86_64 - platform: linux license: IJG AND BSD-3-Clause AND Zlib purls: [] size: 618575 @@ -1885,8 +1761,6 @@ packages: - liblapacke 3.9.0 25_linux64_openblas - libcblas 3.9.0 25_linux64_openblas - blas * openblas - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: [] @@ -1902,8 +1776,6 @@ packages: - liblapack 3.9.0 25_linux64_openblas constrains: - blas * openblas - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: [] @@ -1916,8 +1788,6 @@ packages: - libgcc-ng >=12 - libstdcxx-ng >=12 - libzlib >=1.2.13,<2.0.0a0 - arch: x86_64 - platform: linux license: Apache-2.0 WITH LLVM-exception license_family: Apache purls: [] @@ -1929,8 +1799,6 @@ packages: depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - arch: x86_64 - platform: linux license: 0BSD purls: [] size: 111132 @@ -1947,8 +1815,6 @@ packages: - libstdcxx >=13 - libzlib >=1.3.1,<2.0a0 - openssl >=3.3.2,<4.0a0 - arch: x86_64 - platform: linux license: MIT license_family: MIT purls: [] @@ -1959,8 +1825,6 @@ packages: md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 depends: - libgcc-ng >=12 - arch: x86_64 - platform: linux license: LGPL-2.1-only license_family: GPL purls: [] @@ -1976,8 +1840,6 @@ packages: - libgfortran5 >=14.2.0 constrains: - openblas >=0.3.28,<0.3.29.0a0 - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: [] @@ -1990,8 +1852,6 @@ packages: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libzlib >=1.3.1,<2.0a0 - arch: x86_64 - platform: linux license: zlib-acknowledgement purls: [] size: 290661 @@ -2012,8 +1872,6 @@ packages: - pango >=1.54.0,<2.0a0 constrains: - __glibc >=2.17 - arch: x86_64 - platform: linux license: LGPL-2.1-or-later purls: [] size: 6390511 @@ -2024,8 +1882,6 @@ packages: depends: - libgcc >=13.3.0 - libstdcxx >=13.3.0 - arch: x86_64 - platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] @@ -2036,8 +1892,6 @@ packages: md5: a587892d3c13b6621a6091be690dbca2 depends: - libgcc-ng >=12 - arch: x86_64 - platform: linux license: ISC purls: [] size: 205978 @@ -2049,8 +1903,6 @@ packages: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libzlib >=1.3.1,<2.0a0 - arch: x86_64 - platform: linux license: Unlicense purls: [] size: 873551 @@ -2063,8 +1915,6 @@ packages: - libgcc >=13 - libzlib >=1.3.1,<2.0a0 - openssl >=3.4.0,<4.0a0 - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: [] @@ -2075,8 +1925,6 @@ packages: md5: 234a5554c53625688d51062645337328 depends: - libgcc 14.2.0 h77fa898_1 - arch: x86_64 - platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] @@ -2097,8 +1945,6 @@ packages: md5: 8371ac6457591af2cf6159439c1fd051 depends: - libstdcxx 14.2.0 hc0a3c3a_1 - arch: x86_64 - platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] @@ -2118,8 +1964,6 @@ packages: - libwebp-base >=1.4.0,<2.0a0 - libzlib >=1.3.1,<2.0a0 - zstd >=1.5.6,<1.6.0a0 - arch: x86_64 - platform: linux license: HPND purls: [] size: 429018 @@ -2129,8 +1973,6 @@ packages: md5: 40b61aab5c7ba9ff276c41cfffe6b80b depends: - libgcc-ng >=12 - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: [] @@ -2143,8 +1985,6 @@ packages: - libgcc-ng >=12 constrains: - libwebp 1.4.0 - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: [] @@ -2159,8 +1999,6 @@ packages: - pthread-stubs - xorg-libxau >=1.0.11,<2.0a0 - xorg-libxdmcp - arch: x86_64 - platform: linux license: MIT license_family: MIT purls: [] @@ -2171,8 +2009,6 @@ packages: md5: 5aa797f8787fe7a17d1b0821485b5adc depends: - libgcc-ng >=12 - arch: x86_64 - platform: linux license: LGPL-2.1-or-later purls: [] size: 100393 @@ -2187,8 +2023,6 @@ packages: - libiconv >=1.17,<2.0a0 - liblzma >=5.6.3,<6.0a0 - libzlib >=1.3.1,<2.0a0 - arch: x86_64 - platform: linux license: MIT license_family: MIT purls: [] @@ -2202,8 +2036,6 @@ packages: - libgcc >=13 constrains: - zlib 1.3.1 *_2 - arch: x86_64 - platform: linux license: Zlib license_family: Other purls: [] @@ -2216,8 +2048,6 @@ packages: - __glibc >=2.17,<3.0.a0 constrains: - openmp 19.1.5|19.1.5.* - arch: x86_64 - platform: linux license: Apache-2.0 WITH LLVM-exception license_family: APACHE purls: [] @@ -2234,8 +2064,6 @@ packages: - libzlib >=1.3.1,<2.0a0 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - arch: x86_64 - platform: linux license: BSD-2-Clause license_family: BSD purls: @@ -2290,8 +2118,6 @@ packages: - python_abi 3.12.* *_cp312 - qhull >=2020.2,<2020.3.0a0 - tk >=8.6.13,<8.7.0a0 - arch: x86_64 - platform: linux license: PSF-2.0 license_family: PSF purls: @@ -2320,8 +2146,6 @@ packages: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - tomli >=1.1.0 - arch: x86_64 - platform: linux license: MIT license_family: MIT purls: @@ -2363,8 +2187,6 @@ packages: - _openmp_mutex >=4.5 - llvm-openmp >=19.1.2 - tbb 2021.* - arch: x86_64 - platform: linux license: LicenseRef-IntelSimplifiedSoftwareOct2022 license_family: Proprietary purls: [] @@ -2379,8 +2201,6 @@ packages: - mkl >=2024.2.2,<2025.0a0 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: @@ -2412,8 +2232,6 @@ packages: - libstdcxx >=13 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - arch: x86_64 - platform: linux license: Apache-2.0 license_family: Apache purls: @@ -2449,8 +2267,6 @@ packages: depends: - __glibc >=2.17,<3.0.a0 - libgcc-ng >=12 - arch: x86_64 - platform: linux license: X11 AND BSD-3-Clause purls: [] size: 889086 @@ -2485,8 +2301,6 @@ packages: - scipy >=1.0 - libopenblas !=0.3.6 - cudatoolkit >=11.2 - arch: x86_64 - platform: linux license: BSD-2-Clause license_family: BSD purls: @@ -2505,8 +2319,6 @@ packages: - numpy >=1.24 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - arch: x86_64 - platform: linux license: MIT license_family: MIT purls: @@ -2526,8 +2338,6 @@ packages: - python_abi 3.12.* *_cp312 constrains: - numpy-base <0a0 - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: @@ -2610,8 +2420,6 @@ packages: md5: 8fe5d50db07e92519cc639cb0aef9b1b depends: - libopenblas 0.3.28 pthreads_h94d23a6_1 - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: [] @@ -2627,8 +2435,6 @@ packages: - libstdcxx >=13 - libtiff >=4.7.0,<4.8.0a0 - libzlib >=1.3.1,<2.0a0 - arch: x86_64 - platform: linux license: BSD-2-Clause license_family: BSD purls: [] @@ -2641,8 +2447,6 @@ packages: - __glibc >=2.17,<3.0.a0 - ca-certificates - libgcc >=13 - arch: x86_64 - platform: linux license: Apache-2.0 license_family: Apache purls: [] @@ -2702,8 +2506,6 @@ packages: - python_abi 3.12.* *_cp312 constrains: - __glibc >=2.17 - arch: x86_64 - platform: linux license: Apache-2.0 license_family: Apache purls: @@ -2735,8 +2537,6 @@ packages: - python-tzdata >=2022a - python_abi 3.12.* *_cp312 - pytz >=2020.1,<2024.2 - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: @@ -2758,8 +2558,6 @@ packages: - libgcc >=13 - libglib >=2.82.2,<3.0a0 - libpng >=1.6.44,<1.7.0a0 - arch: x86_64 - platform: linux license: LGPL-2.1-or-later purls: [] size: 447446 @@ -2811,8 +2609,6 @@ packages: - bzip2 >=1.0.8,<2.0a0 - libgcc-ng >=12 - libzlib >=1.3.1,<2.0a0 - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: [] @@ -2857,8 +2653,6 @@ packages: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - tk >=8.6.13,<8.7.0a0 - arch: x86_64 - platform: linux license: HPND purls: - pkg:pypi/pillow?source=hash-mapping @@ -2884,8 +2678,6 @@ packages: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libstdcxx >=13 - arch: x86_64 - platform: linux license: MIT license_family: MIT purls: [] @@ -2925,8 +2717,6 @@ packages: - python_abi 3.12.* *_cp312 constrains: - __glibc >=2.17 - arch: x86_64 - platform: linux license: MIT license_family: MIT purls: @@ -2961,8 +2751,6 @@ packages: - libgcc >=13 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: @@ -2975,8 +2763,6 @@ packages: depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - arch: x86_64 - platform: linux license: MIT license_family: MIT purls: [] @@ -3072,8 +2858,6 @@ packages: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - sysroot_linux-64 2.17.* - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: [] @@ -3096,8 +2880,6 @@ packages: - python_abi 3.12.* *_cp312 - scipy >=1,<2 - setuptools >=59.0.0 - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: @@ -3147,8 +2929,6 @@ packages: - tzdata constrains: - python_abi 3.12.* *_cp312 - arch: x86_64 - platform: linux license: Python-2.0 purls: [] size: 31565686 @@ -3194,8 +2974,6 @@ packages: md5: 0424ae29b104430108f5218a66db7260 constrains: - python 3.12.* *_cpython - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: [] @@ -3223,8 +3001,6 @@ packages: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - zeromq >=4.3.5,<4.4.0a0 - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: @@ -3238,8 +3014,6 @@ packages: - __glibc >=2.17,<3.0.a0 - libgcc-ng >=12 - libstdcxx-ng >=12 - arch: x86_64 - platform: linux license: LicenseRef-Qhull purls: [] size: 552937 @@ -3250,8 +3024,6 @@ packages: depends: - libgcc-ng >=12 - ncurses >=6.3,<7.0a0 - arch: x86_64 - platform: linux license: GPL-3.0-only license_family: GPL purls: [] @@ -3310,8 +3082,6 @@ packages: - numpy >=1.23.5 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: @@ -3397,8 +3167,6 @@ packages: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - scipy !=1.9.2,>=1.8 - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: @@ -3424,8 +3192,6 @@ packages: - libgcc >=13 - libhwloc >=2.11.2,<2.11.3.0a0 - libstdcxx >=13 - arch: x86_64 - platform: linux license: Apache-2.0 license_family: APACHE purls: [] @@ -3448,8 +3214,6 @@ packages: depends: - libgcc-ng >=12 - libzlib >=1.2.13,<2.0.0a0 - arch: x86_64 - platform: linux license: TCL license_family: BSD purls: [] @@ -3485,8 +3249,6 @@ packages: - libgcc >=13 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - arch: x86_64 - platform: linux license: Apache-2.0 license_family: Apache purls: @@ -3557,8 +3319,6 @@ packages: - libgcc >=13 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - arch: x86_64 - platform: linux license: Apache-2.0 license_family: Apache purls: @@ -3587,8 +3347,6 @@ packages: - orjson - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - arch: x86_64 - platform: linux license: Apache-2.0 license_family: APACHE purls: @@ -3693,8 +3451,6 @@ packages: depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - arch: x86_64 - platform: linux license: MIT license_family: MIT purls: [] @@ -3708,8 +3464,6 @@ packages: - libgcc >=13 - libuuid >=2.38.1,<3.0a0 - xorg-libice >=1.1.1,<2.0a0 - arch: x86_64 - platform: linux license: MIT license_family: MIT purls: [] @@ -3722,8 +3476,6 @@ packages: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libxcb >=1.17.0,<2.0a0 - arch: x86_64 - platform: linux license: MIT license_family: MIT purls: [] @@ -3735,8 +3487,6 @@ packages: depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - arch: x86_64 - platform: linux license: MIT license_family: MIT purls: [] @@ -3748,8 +3498,6 @@ packages: depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - arch: x86_64 - platform: linux license: MIT license_family: MIT purls: [] @@ -3762,8 +3510,6 @@ packages: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - xorg-libx11 >=1.8.10,<2.0a0 - arch: x86_64 - platform: linux license: MIT license_family: MIT purls: [] @@ -3776,8 +3522,6 @@ packages: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - xorg-libx11 >=1.8.10,<2.0a0 - arch: x86_64 - platform: linux license: MIT license_family: MIT purls: [] @@ -3811,8 +3555,6 @@ packages: - libgcc >=13 - libsodium >=1.0.20,<1.0.21.0a0 - libstdcxx >=13 - arch: x86_64 - platform: linux license: MPL-2.0 license_family: MOZILLA purls: [] @@ -3836,8 +3578,6 @@ packages: - libgcc-ng >=12 - libstdcxx-ng >=12 - libzlib >=1.2.13,<2.0.0a0 - arch: x86_64 - platform: linux license: BSD-3-Clause license_family: BSD purls: [] diff --git a/pixi.toml b/pixi.toml index deffa6a..fd6b616 100644 --- a/pixi.toml +++ b/pixi.toml @@ -34,7 +34,7 @@ bridgestan = ">=2.5.0, <3" flowjax = { path = "../flowjax/", editable = true } samplerlab = { path = "../pymc-labs/benchmark-pymc", editable = true } posteriordb = ">=0.2.0, <0.3" -jax = { version = ">=0.4.35, <0.5", extras = ["cuda12"] } +jax = { version = "<0.4.37, <0.5", extras = ["cuda12"] } watermark = ">=2.5.0, <3" [system-requirements] From 5707c03c04be9da62ec61d079e18fbaad53c79d5 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Mon, 16 Dec 2024 18:43:41 +0100 Subject: [PATCH 27/55] chore: add items to gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 2d1f0df..6f4df52 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ tvm_libs/* notebooks/*.stan notebooks/*.csv notebooks/*.hpp +notebooks/radon* perf.data* wheels .vscode/ @@ -15,3 +16,4 @@ wheels .zed .cargo *traces* +.pyrightconfig.json From 04af51c5484c7025edc98526da06be91f922115b Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Mon, 16 Dec 2024 18:44:05 +0100 Subject: [PATCH 28/55] chore: update bridgestan --- Cargo.lock | 148 ++++++++++++----------------------------------------- Cargo.toml | 4 +- 2 files changed, 36 insertions(+), 116 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 263aa2e..79e6311 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -265,25 +265,22 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "bindgen" -version = "0.69.5" +version = "0.71.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" +checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3" dependencies = [ "bitflags 2.6.0", "cexpr", "clang-sys", - "itertools 0.12.1", - "lazy_static", - "lazycell", + "itertools 0.13.0", "log", "prettyplease", "proc-macro2", "quote", "regex", - "rustc-hash 1.1.0", + "rustc-hash", "shlex", "syn", - "which", ] [[package]] @@ -309,15 +306,15 @@ dependencies = [ [[package]] name = "bridgestan" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc8db213e11ba8b22c444912e269f8164d4af17292e6e78d9d6a4162225e929b" +checksum = "9c5194bc381310a0a90cbf52bbf96132f0951b99fcd939f22ca4da09a5c60589" dependencies = [ "bindgen", "libloading", "log", "path-absolutize", - "thiserror 1.0.69", + "thiserror 2.0.7", ] [[package]] @@ -387,9 +384,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.3" +version = "1.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27f657647bcff5394bf56c7317665bbf790a137a50eaaa5c6bfbb9e27a518f2d" +checksum = "9157bbaa6b165880c27a4293a474c91cdcf265cc68cc829bf10be0964a391caf" dependencies = [ "jobserver", "libc", @@ -504,15 +501,15 @@ checksum = "7e8f1e641542c07631228b1e0dc04b69ae3c1d58ef65d5691a439711d805c698" [[package]] name = "console" -version = "0.15.8" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +checksum = "ea3c6ecd8059b57859df5c69830340ed3c41d30e3da0c1cbed90a96ac853041b" dependencies = [ "encode_unicode", - "lazy_static", "libc", - "unicode-width 0.1.14", - "windows-sys 0.52.0", + "once_cell", + "unicode-width", + "windows-sys 0.59.0", ] [[package]] @@ -603,9 +600,9 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -622,9 +619,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" @@ -686,9 +683,9 @@ checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "encode_unicode" -version = "0.3.6" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] name = "enum-as-inner" @@ -742,16 +739,6 @@ dependencies = [ "syn", ] -[[package]] -name = "errno" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - [[package]] name = "faer" version = "0.19.4" @@ -982,15 +969,6 @@ dependencies = [ "digest", ] -[[package]] -name = "home" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" -dependencies = [ - "windows-sys 0.52.0", -] - [[package]] name = "iana-time-zone" version = "0.1.61" @@ -1023,7 +1001,7 @@ dependencies = [ "console", "number_prefix", "portable-atomic", - "unicode-width 0.2.0", + "unicode-width", "web-time", ] @@ -1062,15 +1040,6 @@ dependencies = [ "either", ] -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.13.0" @@ -1111,12 +1080,6 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - [[package]] name = "lexical-core" version = "1.0.5" @@ -1203,12 +1166,6 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" -[[package]] -name = "linux-raw-sys" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" - [[package]] name = "log" version = "0.4.22" @@ -1500,12 +1457,12 @@ dependencies = [ "num-integer", "num-traits", "pyo3", - "rustc-hash 2.1.0", + "rustc-hash", ] [[package]] name = "nutpie" -version = "0.14.0" +version = "0.0.0" dependencies = [ "anyhow", "arrow", @@ -1522,7 +1479,7 @@ dependencies = [ "rayon", "smallvec", "tch", - "thiserror 2.0.6", + "thiserror 2.0.7", "time-humanize", "upon", ] @@ -1543,7 +1500,7 @@ dependencies = [ "rand_chacha", "rand_distr", "rayon", - "thiserror 2.0.6", + "thiserror 2.0.7", ] [[package]] @@ -1895,31 +1852,12 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustc-hash" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" -[[package]] -name = "rustix" -version = "0.38.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" -dependencies = [ - "bitflags 2.6.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.59.0", -] - [[package]] name = "ryu" version = "1.0.18" @@ -2068,9 +2006,9 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tch" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f139aa58f0189998a9674f8617b60e054226d98d541e444cd7db5ed986fcc35f" +checksum = "bb3500c87ef72447c23b33ed6f15fac45a616b09bcac53e62e0e4386bddb3b9d" dependencies = [ "half", "lazy_static", @@ -2094,11 +2032,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.6" +version = "2.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec2a1820ebd077e2b90c4df007bebf344cd394098a13c563957d0afc83ea47" +checksum = "93605438cbd668185516ab499d589afb7ee1859ea3d5fc8f6b0755e1c7443767" dependencies = [ - "thiserror-impl 2.0.6", + "thiserror-impl 2.0.7", ] [[package]] @@ -2114,9 +2052,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.6" +version = "2.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d65750cab40f4ff1929fb1ba509e9914eb756131cef4210da8d5d700d26f6312" +checksum = "e1d8749b4531af2117677a5fcd12b1348a3fe2b81e36e61ffeac5c4aa3273e36" dependencies = [ "proc-macro2", "quote", @@ -2169,9 +2107,9 @@ dependencies = [ [[package]] name = "torch-sys" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c787d00c8e04c9d37db6c4f0048f52820906ee7c42de5bae68a844fa8242fea" +checksum = "61b87ed41261d4278060c3ba3e735c224687cf312403e4565f2ca75310279d73" dependencies = [ "anyhow", "cc", @@ -2191,12 +2129,6 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" -[[package]] -name = "unicode-width" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" - [[package]] name = "unicode-width" version = "0.2.0" @@ -2311,18 +2243,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix", -] - [[package]] name = "winapi-util" version = "0.1.9" diff --git a/Cargo.toml b/Cargo.toml index d3cacb3..b470803 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nutpie" -version = "0.14.0" +#version = "0.14.0" authors = [ "Adrian Seyboldt ", "PyMC Developers ", @@ -32,7 +32,7 @@ rayon = "1.10.0" arrow = { version = "53.1.0", default-features = false, features = ["ffi"] } anyhow = "1.0.72" itertools = "0.13.0" -bridgestan = "2.5.0" +bridgestan = "2.6.0" rand_distr = "0.4.3" smallvec = "1.13.0" upon = { version = "0.8.1", default-features = false, features = [] } From 9a1da91184e89e980b65099ec0d3fa9c5c6ebd45 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Mon, 16 Dec 2024 18:45:49 +0100 Subject: [PATCH 29/55] fix: add lock for pymc init point func --- python/nutpie/compile_pymc.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/python/nutpie/compile_pymc.py b/python/nutpie/compile_pymc.py index 5510053..7f98ac8 100644 --- a/python/nutpie/compile_pymc.py +++ b/python/nutpie/compile_pymc.py @@ -6,6 +6,7 @@ from importlib.util import find_spec from math import prod from typing import TYPE_CHECKING, Any, Callable, Literal, Optional, Union, cast +import threading import numpy as np import pandas as pd @@ -30,7 +31,7 @@ def intrinsic(f): from pytensor.tensor import TensorVariable, Variable -def rv_dict_to_flat_array_wrapper( +def _rv_dict_to_flat_array_wrapper( fn: Callable[[SeedType], dict[str, np.ndarray]], names: list[str], shapes: list[tuple[int]], @@ -69,7 +70,7 @@ def seeded_array_fn(seed: SeedType = None): for name, shape in zip(names, shapes, strict=True): initial_value = initial_value_dict[name] n = int(np.prod(initial_value.shape)) - if initial_value.shape != shape: + if initial_value.shape != tuple(shape): raise ValueError( f"Size of initial value for {name} is {initial_value.shape}, " f"expected {shape}" @@ -498,6 +499,8 @@ def compile_pymc_model( return_transformed=True, ) + initial_point_fn = _wrap_with_lock(initial_point_fn) + if backend.lower() == "numba": if gradient_backend == "jax": raise ValueError("Gradient backend cannot be jax when using numba backend") @@ -515,6 +518,17 @@ def compile_pymc_model( raise ValueError(f"Backend must be one of numba and jax. Got {backend}") +def _wrap_with_lock(func: Callable) -> Callable: + lock = threading.Lock() + + @wraps(func) + def wrapper(*args, **kwargs): + with lock: + return func(*args, **kwargs) + + return wrapper + + def _compute_shapes(model) -> dict[str, tuple[int, ...]]: import pytensor from pymc.initial_point import make_initial_point_fn @@ -645,7 +659,7 @@ def _make_functions( num_free_vars = count - initial_point_fn = rv_dict_to_flat_array_wrapper( + initial_point_fn = _rv_dict_to_flat_array_wrapper( pymc_initial_point_fn, names=joined_names, shapes=joined_shapes ) From 086997acae3d5e8770f7e684f2ff2615cc6ec508 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Fri, 20 Dec 2024 23:38:57 +0100 Subject: [PATCH 30/55] chore: update dependencies --- Cargo.lock | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 79e6311..22ac157 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -307,14 +307,12 @@ dependencies = [ [[package]] name = "bridgestan" version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c5194bc381310a0a90cbf52bbf96132f0951b99fcd939f22ca4da09a5c60589" dependencies = [ "bindgen", "libloading", "log", "path-absolutize", - "thiserror 2.0.7", + "thiserror 2.0.8", ] [[package]] @@ -325,18 +323,18 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.20.0" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a" +checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" +checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" dependencies = [ "proc-macro2", "quote", @@ -384,9 +382,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.4" +version = "1.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9157bbaa6b165880c27a4293a474c91cdcf265cc68cc829bf10be0964a391caf" +checksum = "c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e" dependencies = [ "jobserver", "libc", @@ -1146,9 +1144,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.168" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libloading" @@ -1221,9 +1219,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" dependencies = [ "adler2", ] @@ -1479,7 +1477,7 @@ dependencies = [ "rayon", "smallvec", "tch", - "thiserror 2.0.7", + "thiserror 2.0.8", "time-humanize", "upon", ] @@ -1500,7 +1498,7 @@ dependencies = [ "rand_chacha", "rand_distr", "rayon", - "thiserror 2.0.7", + "thiserror 2.0.8", ] [[package]] @@ -2032,11 +2030,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.7" +version = "2.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93605438cbd668185516ab499d589afb7ee1859ea3d5fc8f6b0755e1c7443767" +checksum = "08f5383f3e0071702bf93ab5ee99b52d26936be9dedd9413067cbdcddcb6141a" dependencies = [ - "thiserror-impl 2.0.7", + "thiserror-impl 2.0.8", ] [[package]] @@ -2052,9 +2050,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.7" +version = "2.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d8749b4531af2117677a5fcd12b1348a3fe2b81e36e61ffeac5c4aa3273e36" +checksum = "f2f357fcec90b3caef6623a099691be676d033b40a058ac95d2a6ade6fa0c943" dependencies = [ "proc-macro2", "quote", From 2a3ad45ac664aaa3ecd702f84d50ed06316d4aa7 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Fri, 20 Dec 2024 23:39:35 +0100 Subject: [PATCH 31/55] chore: remove fluff from pyproject --- pyproject.toml | 52 +++++++++++--------------------------------------- 1 file changed, 11 insertions(+), 41 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index af9c60f..37bd345 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,14 +2,10 @@ requires = ["maturin>=1.1,<2.0"] build-backend = "maturin" -[tool.maturin] -module-name = "nutpie._lib" -python-source = "python" -features = ["pyo3/extension-module"] - [project] name = "nutpie" description = "Sample Stan or PyMC models" +version = "0.14.0" authors = [{ name = "PyMC Developers", email = "pymc.devs@gmail.com" }] readme = "README.md" requires-python = ">=3.10" @@ -40,47 +36,21 @@ all = [ [tool.ruff] line-length = 88 -target-version = "py39" +target-version = "py310" show-fixes = true output-format = "full" -[tool.ruff.lint] -select = [ - "E", # pycodestyle errors - "W", # pycodestyle warnings - "F", # Pyflakes - "I", # isort - "C4", # flake8-comprehensions - "B", # flake8-bugbear - "UP", # pyupgrade - "RUF", # Ruff-specific rules - "TID", # flake8-tidy-imports - "BLE", # flake8-blind-except - "PTH", # flake8-pathlib - "A", # flake8-builtins -] -ignore = [ - "C408", # unnecessary-collection-call (allow dict(a=1, b=2); clarity over speed!) - # The following list is recommended to disable these when using ruff's formatter. - # (Not all of the following are actually enabled.) - "W191", # tab-indentation - "E111", # indentation-with-invalid-multiple - "E114", # indentation-with-invalid-multiple-comment - "E117", # over-indented - "D206", # indent-with-spaces - "D300", # triple-single-quotes - "Q000", # bad-quotes-inline-string - "Q001", # bad-quotes-multiline-string - "Q002", # bad-quotes-docstring - "Q003", # avoidable-escaped-quote - "COM812", # missing-trailing-comma - "COM819", # prohibited-trailing-comma - "ISC001", # single-line-implicit-string-concatenation - "ISC002", # multi-line-implicit-string-concatenation -] - [tool.ruff.lint.flake8-tidy-imports] ban-relative-imports = "all" [tool.ruff.lint.isort] known-first-party = ["nutpie"] + +[tool.pyright] +venvPath = ".pixi/envs/" +venv = "default" + +[tool.maturin] +module-name = "nutpie._lib" +python-source = "python" +features = ["pyo3/extension-module"] From ccfd9fe8425f99644eb07fa60d259fc957769dbf Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Fri, 20 Dec 2024 23:40:06 +0100 Subject: [PATCH 32/55] feat: Add option to freeze pymc models --- python/nutpie/compile_pymc.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/python/nutpie/compile_pymc.py b/python/nutpie/compile_pymc.py index 7f98ac8..cd917d5 100644 --- a/python/nutpie/compile_pymc.py +++ b/python/nutpie/compile_pymc.py @@ -451,6 +451,7 @@ def compile_pymc_model( default_initialization_strategy: Literal[ "support_point", "prior" ] = "support_point", + freeze_model: bool | None = None, **kwargs, ) -> CompiledModel: """Compile necessary functions for sampling a pymc model. @@ -488,6 +489,14 @@ def compile_pymc_model( "and restart your kernel in case you are in an interactive session." ) + from pymc.model.transform.optimization import freeze_dims_and_data + + if freeze_model is None: + freeze_model = backend == "jax" + + if freeze_model: + model = freeze_dims_and_data(model) + if default_initialization_strategy == "support_point" and jitter_rvs is None: jitter_rvs = set(model.free_RVs) From 48f90195b9c5c51dab7acd3e3e03ff07840af6b4 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Fri, 20 Dec 2024 23:41:45 +0100 Subject: [PATCH 33/55] style: Reformat some code --- python/nutpie/transform_adapter.py | 211 +++++++++++++++++++---------- 1 file changed, 140 insertions(+), 71 deletions(-) diff --git a/python/nutpie/transform_adapter.py b/python/nutpie/transform_adapter.py index a5e9338..a8dca26 100644 --- a/python/nutpie/transform_adapter.py +++ b/python/nutpie/transform_adapter.py @@ -2,6 +2,7 @@ _BIJECTION_TRACE = [] + def make_transform_adapter( *, verbose=False, @@ -63,25 +64,31 @@ def __call__( flow = unwrap(eqx.combine(params, static, is_leaf=eqx.is_inexact_array)) if return_elemwise_costs: + def compute_loss(bijection, draw, grad, logp): if True: draw, grad, logp = bijection.inverse_gradient_and_val( draw, grad, logp ) else: - draw, grad, logp = flowjax.bijections.AbstractBijection.inverse_gradient_and_val( - bijection, draw, grad, logp + draw, grad, logp = ( + flowjax.bijections.AbstractBijection.inverse_gradient_and_val( + bijection, draw, grad, logp + ) ) cost = (draw + grad) ** 2 return cost costs = jax.vmap(compute_loss, [None, 0, 0, 0])( - flow.bijection, draws, grads, logps, + flow.bijection, + draws, + grads, + logps, ) return costs.mean(0) - if self._gamma is None: + def compute_loss(bijection, draw, grad, logp): draw, grad, logp = bijection.inverse_gradient_and_val( draw, grad, logp @@ -90,7 +97,10 @@ def compute_loss(bijection, draw, grad, logp): return cost costs = jax.vmap(compute_loss, [None, 0, 0, 0])( - flow.bijection, draws, grads, logps, + flow.bijection, + draws, + grads, + logps, ) if return_all_costs: @@ -102,10 +112,13 @@ def compute_loss(bijection, draw, grad, logp): return jnp.log(costs.mean()) else: + def transform(draw, grad, logp): return flow.bijection.inverse_gradient_and_val(draw, grad, logp) - draws, grads, logps = jax.vmap(transform, [0, 0, 0], (0, 0, 0))(draws, grads, logps) + draws, grads, logps = jax.vmap(transform, [0, 0, 0], (0, 0, 0))( + draws, grads, logps + ) fisher_loss = ((draws + grads) ** 2).sum(1).mean(0) normal_logps = -(draws * draws).sum(1) / 2 var_loss = (logps - normal_logps).var() @@ -168,11 +181,12 @@ def make_flow( diag = jnp.sqrt(pos_std / grad_std) mean = positions.mean(0) + gradients.mean(0) * diag * diag + print("seed", seed) key = jax.random.PRNGKey(seed % (2**63)) diag_param = Parameterize( - lambda x: x + jnp.sqrt(1 + x ** 2), - (diag ** 2 - 1) / (2 * diag), + lambda x: x + jnp.sqrt(1 + x**2), + (diag**2 - 1) / (2 * diag), ) diag_affine = eqx.tree_at( @@ -199,15 +213,17 @@ def make_flow( replace=scale, ) params = jnp.ones(n_dim) * 1e-5 - params = params.at[-1].set(1.) + params = params.at[-1].set(1.0) hh = flowjax.bijections.Householder(params) flows.append( bijections.Sandwich( - bijections.Chain([ - bijections.Vmap(bijections.SoftPlusX(), axis_size=n_dim), - hh, - ]), + bijections.Chain( + [ + bijections.Vmap(bijections.SoftPlusX(), axis_size=n_dim), + hh, + ] + ), affine, ) ) @@ -262,7 +278,9 @@ def add_default_permute(bijection, dim, key): if dim == 2: outer = flowjax.bijections.Flip((dim,)) else: - outer = flowjax.bijections.Permute(jax.random.permutation(key, jnp.arange(dim))) + outer = flowjax.bijections.Permute( + jax.random.permutation(key, jnp.arange(dim)) + ) return flowjax.bijections.Sandwich(outer, bijection) @@ -270,7 +288,7 @@ def add_default_permute(bijection, dim, key): if householder_layer: params = jnp.ones(n_dim) * 1e-5 - params = params.at[0].set(1.) + params = params.at[0].set(1.0) outer = flowjax.bijections.Householder(params) flow = flowjax.bijections.Sandwich(outer, flow) @@ -285,19 +303,25 @@ def add_default_permute(bijection, dim, key): replace=scale, ) params = jnp.ones(n_dim) * 1e-5 - params = params.at[-1].set(1.) + params = params.at[-1].set(1.0) hh = flowjax.bijections.Householder(params) - flow = bijections.Chain([ - bijections.Sandwich( - bijections.Chain([ - bijections.Vmap(bijections.SoftPlusX(), axis_size=n_dim), - hh, - ]), - affine, - ), - flow - ]) + flow = bijections.Chain( + [ + bijections.Sandwich( + bijections.Chain( + [ + bijections.Vmap( + bijections.SoftPlusX(), axis_size=n_dim + ), + hh, + ] + ), + affine, + ), + flow, + ] + ) return flow keys = jax.random.split(key, n_layers) @@ -309,7 +333,6 @@ def add_default_permute(bijection, dim, key): else: layers = [] for i, (key, num_untrafo) in enumerate(zip(keys, untransformed_dim)): - if i % 2 == 0 or not dct_layer: layers.append(make_layer(key, num_untrafo)) else: @@ -367,14 +390,11 @@ def extend_flow( if dct: flow = flowjax.flows.Transformed( flowjax.distributions.StandardNormal(base.shape), - bijections.Chain( - [bijections.DCT(shape=(n_dim,)), base] - ), + bijections.Chain([bijections.DCT(shape=(n_dim,)), base]), ) else: flow = flowjax.flows.Transformed( - flowjax.distributions.StandardNormal(base.shape), - base + flowjax.distributions.StandardNormal(base.shape), base ) params, static = eqx.partition(flow, eqx.is_inexact_array) @@ -421,16 +441,22 @@ def extend_flow( if layer % 2 == 0: pre.append(bijections.Neg(shape=(n_dim,))) - nonlin_affine = bijections.Chain([ - bijections.Sandwich( - bijections.Chain([ - *pre, - bijections.Vmap(bijections.SoftPlusX(), axis_size=n_dim), - ]), - affine, - ), - affine2, - ]) + nonlin_affine = bijections.Chain( + [ + bijections.Sandwich( + bijections.Chain( + [ + *pre, + bijections.Vmap( + bijections.SoftPlusX(), axis_size=n_dim + ), + ] + ), + affine, + ), + affine2, + ] + ) if nn_width is None: width = extension_var_count * 16 @@ -457,7 +483,7 @@ def extend_flow( ) params = jnp.ones(extension_var_count) * 1e-5 - params = params.at[-1].set(1.) + params = params.at[-1].set(1.0) hh = flowjax.bijections.Householder(params) inner_permute = flowjax.bijections.Permute( @@ -528,10 +554,14 @@ def extend_flow( ) inner_permute = flowjax.bijections.Permute( - jnp.concatenate([ - jnp.arange(n_dim - extension_var_count), - jax.random.permutation(key, jnp.arange(n_dim - extension_var_count, n_dim)), - ]) + jnp.concatenate( + [ + jnp.arange(n_dim - extension_var_count), + jax.random.permutation( + key, jnp.arange(n_dim - extension_var_count, n_dim) + ), + ] + ) ) else: coupling = flowjax.bijections.coupling.Coupling( @@ -545,10 +575,14 @@ def extend_flow( ) inner_permute = flowjax.bijections.Permute( - jnp.concatenate([ - jax.random.permutation(key, jnp.arange(n_dim - extension_var_count, n_dim)), - jnp.arange(n_dim - extension_var_count), - ]) + jnp.concatenate( + [ + jax.random.permutation( + key, jnp.arange(n_dim - extension_var_count, n_dim) + ), + jnp.arange(n_dim - extension_var_count), + ] + ) ) if zero_init: @@ -608,10 +642,14 @@ def extend_flow( inner = bijections.Sandwich( inner.outer, - bijections.Chain([ - bijections.Sandwich(bijections.Flip(shape=(n_dim,)), coupling), - inner.inner, - ]), + bijections.Chain( + [ + bijections.Sandwich( + bijections.Flip(shape=(n_dim,)), coupling + ), + inner.inner, + ] + ), ) if dct: @@ -637,10 +675,12 @@ def extend_flow( pre.append(bijections.Neg(shape=(n_dim,))) nonlin_layer = bijections.Sandwich( - bijections.Chain([ - *pre, - bijections.Vmap(bijections.SoftPlusX(), axis_size=n_dim), - ]), + bijections.Chain( + [ + *pre, + bijections.Vmap(bijections.SoftPlusX(), axis_size=n_dim), + ] + ), affine, ) scale = Parameterize( @@ -654,7 +694,6 @@ def extend_flow( ) return bijections.Chain([new_layer, nonlin_layer, affine, base]) - @eqx.filter_jit def _init_from_transformed_position(logp_fn, bijection, transformed_position): bijection = unwrap(bijection) @@ -760,7 +799,9 @@ def __init__( self._window_size = window_size self._initial_skip = initial_skip if make_optimizer is None: - self._make_optimizer = lambda: optax.apply_if_finite(optax.adabelief(learning_rate), 50) + self._make_optimizer = lambda: optax.apply_if_finite( + optax.adabelief(learning_rate), 50 + ) else: self._make_optimizer = make_optimizer self._optimizer = self._make_optimizer() @@ -832,7 +873,9 @@ def update(self, seed, positions, gradients, logps): flowjax.distributions.StandardNormal(fit.shape), fit ) params, static = eqx.partition(flow, eqx.is_inexact_array) - new_loss = self._loss_fn(params, static, positions, gradients, logps) + new_loss = self._loss_fn( + params, static, positions, gradients, logps + ) if self._verbose: print("loss from diag:", new_loss) @@ -843,9 +886,13 @@ def update(self, seed, positions, gradients, logps): return - positions = np.array(positions[self._initial_skip:][-self._window_size :]) - gradients = np.array(gradients[self._initial_skip:][-self._window_size :]) - logps = np.array(logps[self._initial_skip:][-self._window_size:]) + positions = np.array( + positions[self._initial_skip :][-self._window_size :] + ) + gradients = np.array( + gradients[self._initial_skip :][-self._window_size :] + ) + logps = np.array(logps[self._initial_skip :][-self._window_size :]) if len(positions) < 10: return @@ -878,7 +925,13 @@ def update(self, seed, positions, gradients, logps): if self._verbose: print( "loss before optimization: ", - self._loss_fn(params, static, positions[-500:], gradients[-500:], logps[-500:]), + self._loss_fn( + params, + static, + positions[-100:], + gradients[-100:], + logps[-100:], + ), ) else: base = self._bijection @@ -916,7 +969,9 @@ def update(self, seed, positions, gradients, logps): self._bijection, ) params, static = eqx.partition(flow, eqx.is_inexact_array) - old_loss = self._loss_fn(params, static, positions[-100:], gradients[-100:], logps[-100:]) + old_loss = self._loss_fn( + params, static, positions[-128:], gradients[-128:], logps[-128:] + ) if np.isfinite(old_loss) and old_loss < -5 and self.index > 10: if self._verbose: @@ -941,7 +996,9 @@ def update(self, seed, positions, gradients, logps): flowjax.distributions.StandardNormal(fit.shape), fit ) params, static = eqx.partition(flow, eqx.is_inexact_array) - new_loss = self._loss_fn(params, static, positions[-100:], gradients[-100:], logps[-100:]) + new_loss = self._loss_fn( + params, static, positions[-128:], gradients[-128:], logps[-128:] + ) if self._verbose: print( @@ -956,7 +1013,12 @@ def update(self, seed, positions, gradients, logps): params, static = eqx.partition(flow, eqx.is_inexact_array) print( self._loss_fn( - params, static, positions[-100:], gradients[-100:], logps[-100:], return_all_costs=True + params, + static, + positions[-128:], + gradients[-128:], + logps[-128:], + return_all_costs=True, ) ) @@ -967,7 +1029,12 @@ def update(self, seed, positions, gradients, logps): params, static = eqx.partition(flow, eqx.is_inexact_array) print( self._loss_fn( - params, static, positions[-100:], gradients[-100:], logps[-100:], return_all_costs=True + params, + static, + positions[-128:], + gradients[-128:], + logps[-128:], + return_all_costs=True, ) ) @@ -988,7 +1055,9 @@ def update(self, seed, positions, gradients, logps): self._opt_state = opt_state if self._debug_save_bijection: - _BIJECTION_TRACE.append((self.index, fit, (positions, gradients, logps))) + _BIJECTION_TRACE.append( + (self.index, fit, (positions, gradients, logps)) + ) except Exception as e: print("update error:", e) From 94c3e519932134717d5a37458bed3246923edb31 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Fri, 20 Dec 2024 23:42:21 +0100 Subject: [PATCH 34/55] fix: Use arrow list with i64 offsets to store trace --- src/pyfunc.rs | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/pyfunc.rs b/src/pyfunc.rs index 94a102b..c91d7dc 100644 --- a/src/pyfunc.rs +++ b/src/pyfunc.rs @@ -4,7 +4,7 @@ use anyhow::{anyhow, bail, Context, Result}; use arrow::{ array::{ Array, ArrayBuilder, BooleanBuilder, FixedSizeListBuilder, Float32Builder, Float64Builder, - Int64Builder, ListBuilder, PrimitiveBuilder, StructBuilder, + Int64Builder, LargeListBuilder, ListBuilder, PrimitiveBuilder, StructBuilder, }, datatypes::{DataType, Field, Float32Type, Float64Type, Int64Type}, }; @@ -40,21 +40,21 @@ impl PyVariable { ExpandDtype::Float64 {} => DataType::Float64, ExpandDtype::Float32 {} => DataType::Float32, ExpandDtype::Int64 {} => DataType::Int64, - ExpandDtype::BooleanArray { tensor_type } => { + ExpandDtype::BooleanArray { tensor_type: _ } => { let field = Arc::new(Field::new("item", DataType::Boolean, false)); - DataType::FixedSizeList(field, tensor_type.size() as i32) + DataType::LargeList(field) } ExpandDtype::ArrayFloat64 { tensor_type: _ } => { let field = Arc::new(Field::new("item", DataType::Float64, true)); - DataType::List(field) + DataType::LargeList(field) } - ExpandDtype::ArrayFloat32 { tensor_type } => { + ExpandDtype::ArrayFloat32 { tensor_type: _ } => { let field = Arc::new(Field::new("item", DataType::Float32, false)); - DataType::FixedSizeList(field, tensor_type.size() as i32) + DataType::LargeList(field) } - ExpandDtype::ArrayInt64 { tensor_type } => { + ExpandDtype::ArrayInt64 { tensor_type: _ } => { let field = Arc::new(Field::new("item", DataType::Int64, false)); - DataType::FixedSizeList(field, tensor_type.size() as i32) + DataType::LargeList(field) } } } @@ -512,10 +512,10 @@ impl DrawStorage for PyTrace { let value = value.extract().expect("Return value from expand function could not be converted to int64"); builder.append_value(value) }, - ExpandDtype::BooleanArray { tensor_type} => { - let builder: &mut FixedSizeListBuilder> = + ExpandDtype::BooleanArray { tensor_type } => { + let builder: &mut LargeListBuilder> = self.builder.field_builder(i).context( - "Builder has incorrect type", + "Builder has incorrect type. Expected LargeListBuilder of Bool", )?; let value_builder = builder .values() @@ -531,9 +531,9 @@ impl DrawStorage for PyTrace { }, ExpandDtype::ArrayFloat64 { tensor_type } => { //let builder: &mut FixedSizeListBuilder> = - let builder: &mut ListBuilder> = + let builder: &mut LargeListBuilder> = self.builder.field_builder(i).context( - "Builder has incorrect type", + "Builder has incorrect type. Expected LargeListBuilder of Float64", )?; let value_builder = builder .values() @@ -548,9 +548,9 @@ impl DrawStorage for PyTrace { builder.append(true); }, ExpandDtype::ArrayFloat32 { tensor_type } => { - let builder: &mut FixedSizeListBuilder> = + let builder: &mut LargeListBuilder> = self.builder.field_builder(i).context( - "Builder has incorrect type", + "Builder has incorrect type. Expected LargeListBuilder of Float32", )?; let value_builder = builder .values() @@ -565,9 +565,9 @@ impl DrawStorage for PyTrace { builder.append(true); }, ExpandDtype::ArrayInt64 {tensor_type} => { - let builder: &mut FixedSizeListBuilder> = + let builder: &mut LargeListBuilder> = self.builder.field_builder(i).context( - "Builder has incorrect type", + "Builder has incorrect type. Expected LargeListBuilder of Int64", )?; let value_builder = builder .values() From f86f9929ce562377af290ce9e58d5409e30c4c12 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Fri, 31 Jan 2025 14:04:06 +0100 Subject: [PATCH 35/55] Use AsymmetricAffine in normalizing flow --- python/nutpie/transform_adapter.py | 137 ++++++++++++++++++----------- 1 file changed, 87 insertions(+), 50 deletions(-) diff --git a/python/nutpie/transform_adapter.py b/python/nutpie/transform_adapter.py index a8dca26..4601e6d 100644 --- a/python/nutpie/transform_adapter.py +++ b/python/nutpie/transform_adapter.py @@ -188,15 +188,14 @@ def make_flow( lambda x: x + jnp.sqrt(1 + x**2), (diag**2 - 1) / (2 * diag), ) - + diag_affine = bijections.Affine(mean, diag) diag_affine = eqx.tree_at( where=lambda aff: aff.scale, - pytree=bijections.Affine(mean, diag), + pytree=diag_affine, replace=diag_param, ) flows = [ - #flowjax.flows.Affine(loc=mean, scale=diag), diag_affine, ] @@ -212,21 +211,23 @@ def make_flow( pytree=flowjax.bijections.Affine(jnp.zeros(n_dim), jnp.ones(n_dim)), replace=scale, ) - params = jnp.ones(n_dim) * 1e-5 - params = params.at[-1].set(1.0) - hh = flowjax.bijections.Householder(params) - flows.append( - bijections.Sandwich( - bijections.Chain( - [ - bijections.Vmap(bijections.SoftPlusX(), axis_size=n_dim), - hh, - ] - ), - affine, + if False: + params = jnp.ones(n_dim) * 1e-5 + params = params.at[-1].set(1.0) + + hh = flowjax.bijections.Householder(params) + flows.append( + bijections.Sandwich( + bijections.Chain( + [ + bijections.Vmap(bijections.SoftPlusX(), axis_size=n_dim), + hh, + ] + ), + affine, + ) ) - ) if untransformed_dim is None: untransformed_dim = n_dim // 2 @@ -240,11 +241,23 @@ def make_layer(key, untransformed_dim: int | None): lambda x: x + jnp.sqrt(1 + x**2), jnp.array(0.0), ) + theta = Parameterize( + lambda x: x + jnp.sqrt(1 + x**2), + jnp.array(0.0), + ) + + affine = flowjax.bijections.AsymmetricAffine(jnp.zeros(()), jnp.ones(()), jnp.ones(())) + affine = eqx.tree_at( where=lambda aff: aff.scale, - pytree=flowjax.bijections.Affine(), + pytree=affine, replace=scale, ) + affine = eqx.tree_at( + where=lambda aff: aff.theta, + pytree=affine, + replace=theta, + ) if nn_width is None: width = n_dim // 2 @@ -257,6 +270,9 @@ def make_layer(key, untransformed_dim: int | None): if untransformed_dim < 0: untransformed_dim = n_dim + untransformed_dim + if width > 2 * untransformed_dim: + width = 2 * untransformed_dim + coupling = flowjax.bijections.coupling.Coupling( key_couple, transformer=affine, @@ -293,35 +309,41 @@ def add_default_permute(bijection, dim, key): outer = flowjax.bijections.Householder(params) flow = flowjax.bijections.Sandwich(outer, flow) - scale = Parameterize( - lambda x: x + jnp.sqrt(1 + x**2), - jnp.zeros(n_dim), - ) - affine = eqx.tree_at( - where=lambda aff: aff.scale, - pytree=flowjax.bijections.Affine(jnp.zeros(n_dim), jnp.ones(n_dim)), - replace=scale, - ) - params = jnp.ones(n_dim) * 1e-5 - params = params.at[-1].set(1.0) + if True: + scale = Parameterize( + lambda x: x + jnp.sqrt(1 + x**2), + jnp.zeros(n_dim), + ) + theta = Parameterize( + lambda x: x + jnp.sqrt(1 + x**2), + jnp.zeros(n_dim), + ) + affine = bijections.AsymmetricAffine(jnp.zeros(n_dim), jnp.ones(n_dim), jnp.ones(n_dim)) + affine = eqx.tree_at( + where=lambda aff: aff.scale, + pytree=affine, + replace=scale, + ) + affine = eqx.tree_at( + where=lambda aff: aff.theta, + pytree=affine, + replace=theta, + ) - hh = flowjax.bijections.Householder(params) - flow = bijections.Chain( - [ - bijections.Sandwich( - bijections.Chain( - [ - bijections.Vmap( - bijections.SoftPlusX(), axis_size=n_dim - ), - hh, - ] + params = jnp.ones(n_dim) * 1e-5 + params = params.at[-1].set(1.0) + + hh = bijections.Householder(params) + flow = bijections.Chain( + [ + bijections.Sandwich( + hh, + affine, ), - affine, - ), - flow, - ] - ) + flow, + ] + ) + return flow keys = jax.random.split(key, n_layers) @@ -466,6 +488,9 @@ def extend_flow( if untransformed_dim is None: untransformed_dim = extension_var_count // 2 + if width > 2 * untransformed_dim: + width = 2 * untransformed_dim + coupling = flowjax.bijections.coupling.Coupling( key, transformer=nonlin_affine, @@ -500,11 +525,23 @@ def extend_flow( lambda x: x + jnp.sqrt(1 + x**2), jnp.array(0.0), ) + theta = Parameterize( + lambda x: x + jnp.sqrt(1 + x**2), + jnp.array(0.0), + ) + + affine = flowjax.bijections.AsymmetricAffine(jnp.zeros(()), jnp.ones(()), jnp.ones(())) + affine = eqx.tree_at( where=lambda aff: aff.scale, - pytree=flowjax.bijections.Affine(), + pytree=affine, replace=scale, ) + affine = eqx.tree_at( + where=lambda aff: aff.theta, + pytree=affine, + replace=theta, + ) """ scale = Parameterize( @@ -1038,6 +1075,11 @@ def update(self, seed, positions, gradients, logps): ) ) + if self._debug_save_bijection: + _BIJECTION_TRACE.append( + (self.index, fit, (positions, gradients, logps)) + ) + if (not np.isfinite(old_loss)) and (not np.isfinite(new_loss)): self._bijection = self._make_flow_fn( seed, positions, gradients, n_layers=0 @@ -1054,11 +1096,6 @@ def update(self, seed, positions, gradients, logps): self._bijection = fit self._opt_state = opt_state - if self._debug_save_bijection: - _BIJECTION_TRACE.append( - (self.index, fit, (positions, gradients, logps)) - ) - except Exception as e: print("update error:", e) print(traceback.format_exc()) From 64b798c5893512ab71f4f4ba0733df54277bdf81 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Fri, 7 Feb 2025 18:27:40 +0100 Subject: [PATCH 36/55] Update dependencies --- Cargo.lock | 437 ++++++++++++++++++++++++++++++++--------------------- Cargo.toml | 2 +- 2 files changed, 265 insertions(+), 174 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 22ac157..cc6af68 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -27,10 +27,10 @@ checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", "const-random", - "getrandom", + "getrandom 0.2.15", "once_cell", "version_check", - "zerocopy", + "zerocopy 0.7.35", ] [[package]] @@ -71,15 +71,15 @@ checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anyhow" -version = "1.0.94" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" [[package]] name = "arrow" -version = "53.3.0" +version = "53.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c91839b07e474b3995035fd8ac33ee54f9c9ccbbb1ea33d9909c71bffdf1259d" +checksum = "eaf3437355979f1e93ba84ba108c38be5767713051f3c8ffbf07c094e2e61f9f" dependencies = [ "arrow-arith", "arrow-array", @@ -95,9 +95,9 @@ dependencies = [ [[package]] name = "arrow-arith" -version = "53.3.0" +version = "53.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "855c57c4efd26722b044dcd3e348252560e3e0333087fb9f6479dc0bf744054f" +checksum = "31dce77d2985522288edae7206bffd5fc4996491841dda01a13a58415867e681" dependencies = [ "arrow-array", "arrow-buffer", @@ -110,9 +110,9 @@ dependencies = [ [[package]] name = "arrow-array" -version = "53.3.0" +version = "53.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd03279cea46569acf9295f6224fbc370c5df184b4d2ecfe97ccb131d5615a7f" +checksum = "2d45fe6d3faed0435b7313e59a02583b14c6c6339fa7729e94c32a20af319a79" dependencies = [ "ahash", "arrow-buffer", @@ -126,9 +126,9 @@ dependencies = [ [[package]] name = "arrow-buffer" -version = "53.3.0" +version = "53.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e4a9b9b1d6d7117f6138e13bc4dd5daa7f94e671b70e8c9c4dc37b4f5ecfc16" +checksum = "2b02656a35cc103f28084bc80a0159668e0a680d919cef127bd7e0aaccb06ec1" dependencies = [ "bytes", "half", @@ -137,9 +137,9 @@ dependencies = [ [[package]] name = "arrow-cast" -version = "53.3.0" +version = "53.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc70e39916e60c5b7af7a8e2719e3ae589326039e1e863675a008bee5ffe90fd" +checksum = "c73c6233c5b5d635a56f6010e6eb1ab9e30e94707db21cea03da317f67d84cf3" dependencies = [ "arrow-array", "arrow-buffer", @@ -157,9 +157,9 @@ dependencies = [ [[package]] name = "arrow-data" -version = "53.3.0" +version = "53.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4e75edf21ffd53744a9b8e3ed11101f610e7ceb1a29860432824f1834a1f623" +checksum = "b7f2861ffa86f107b8ab577d86cff7c7a490243eabe961ba1e1af4f27542bb79" dependencies = [ "arrow-buffer", "arrow-schema", @@ -169,9 +169,9 @@ dependencies = [ [[package]] name = "arrow-ord" -version = "53.3.0" +version = "53.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ece7b5bc1180e6d82d1a60e1688c199829e8842e38497563c3ab6ea813e527fd" +checksum = "c6f202a879d287099139ff0d121e7f55ae5e0efe634b8cf2106ebc27a8715dee" dependencies = [ "arrow-array", "arrow-buffer", @@ -184,9 +184,9 @@ dependencies = [ [[package]] name = "arrow-row" -version = "53.3.0" +version = "53.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "745c114c8f0e8ce211c83389270de6fbe96a9088a7b32c2a041258a443fe83ff" +checksum = "a8f936954991c360ba762dff23f5dda16300774fafd722353d9683abd97630ae" dependencies = [ "ahash", "arrow-array", @@ -198,18 +198,18 @@ dependencies = [ [[package]] name = "arrow-schema" -version = "53.3.0" +version = "53.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b95513080e728e4cec37f1ff5af4f12c9688d47795d17cda80b6ec2cf74d4678" +checksum = "9579b9d8bce47aa41389fe344f2c6758279983b7c0ebb4013e283e3e91bb450e" dependencies = [ - "bitflags 2.6.0", + "bitflags", ] [[package]] name = "arrow-select" -version = "53.3.0" +version = "53.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e415279094ea70323c032c6e739c48ad8d80e78a09bef7117b8718ad5bf3722" +checksum = "7471ba126d0b0aaa24b50a36bc6c25e4e74869a1fd1a5553357027a0b1c8d1f1" dependencies = [ "ahash", "arrow-array", @@ -221,9 +221,9 @@ dependencies = [ [[package]] name = "arrow-string" -version = "53.3.0" +version = "53.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d956cae7002eb8d83a27dbd34daaea1cf5b75852f0b84deb4d93a276e92bbf" +checksum = "72993b01cb62507b06f1fb49648d7286c8989ecfabdb7b77a750fcb54410731b" dependencies = [ "arrow-array", "arrow-buffer", @@ -269,7 +269,7 @@ version = "0.71.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3" dependencies = [ - "bitflags 2.6.0", + "bitflags", "cexpr", "clang-sys", "itertools 0.13.0", @@ -285,15 +285,9 @@ dependencies = [ [[package]] name = "bitflags" -version = "1.3.2" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" [[package]] name = "block-buffer" @@ -306,20 +300,22 @@ dependencies = [ [[package]] name = "bridgestan" -version = "2.6.0" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bcc63930a0b64b9c4ca744d32aa2c664bcc4fdd34bd68778e531572318cd0bc" dependencies = [ "bindgen", "libloading", "log", "path-absolutize", - "thiserror 2.0.8", + "thiserror 2.0.11", ] [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "bytemuck" @@ -349,9 +345,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" +checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" [[package]] name = "bzip2" @@ -382,9 +378,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.5" +version = "1.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e" +checksum = "755717a7de9ec452bf7f3f1a3099085deabd7f2962b861dae91ecd7a365903d2" dependencies = [ "jobserver", "libc", @@ -468,18 +464,18 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.23" +version = "4.5.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" +checksum = "3e77c3243bd94243c03672cb5154667347c457ca271254724f9f393aee1c05ff" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.5.23" +version = "4.5.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" +checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" dependencies = [ "anstyle", "clap_lex", @@ -507,7 +503,7 @@ dependencies = [ "libc", "once_cell", "unicode-width", - "windows-sys 0.59.0", + "windows-sys", ] [[package]] @@ -525,7 +521,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ - "getrandom", + "getrandom 0.2.15", "once_cell", "tiny-keccak", ] @@ -544,9 +540,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] @@ -623,9 +619,9 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" [[package]] name = "crypto-common" @@ -673,6 +669,15 @@ dependencies = [ "reborrow", ] +[[package]] +name = "dyn-stack" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "490bd48eb68fffcfed519b4edbfd82c69cbe741d175b84f0e0cbe8c57cbe0bdd" +dependencies = [ + "bytemuck", +] + [[package]] name = "either" version = "1.13.0" @@ -708,11 +713,11 @@ dependencies = [ [[package]] name = "equator" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5099e7b6f0b7431c7a1c49f75929e2777693da192784f167066977a2965767af" +checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" dependencies = [ - "equator-macro 0.4.1", + "equator-macro 0.4.2", ] [[package]] @@ -728,9 +733,9 @@ dependencies = [ [[package]] name = "equator-macro" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5322a90066ddae2b705096eb9e10c465c0498ae93bf9bdd6437415327c88e3bb" +checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" dependencies = [ "proc-macro2", "quote", @@ -746,8 +751,8 @@ dependencies = [ "bytemuck", "coe-rs", "dbgf", - "dyn-stack", - "equator 0.4.1", + "dyn-stack 0.10.0", + "equator 0.4.2", "faer-entity", "gemm", "libm", @@ -787,11 +792,11 @@ dependencies = [ [[package]] name = "gemm" -version = "0.18.0" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400f2ffd14e7548356236c35dc39cad6666d833a852cb8a8f3f28029359bb03" +checksum = "ab96b703d31950f1aeddded248bc95543c9efc7ac9c4a21fda8703a83ee35451" dependencies = [ - "dyn-stack", + "dyn-stack 0.13.0", "gemm-c32", "gemm-c64", "gemm-common", @@ -807,11 +812,11 @@ dependencies = [ [[package]] name = "gemm-c32" -version = "0.18.0" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10dc4a6176c8452d60eac1a155b454c91c668f794151a303bf3c75ea2874812d" +checksum = "f6db9fd9f40421d00eea9dd0770045a5603b8d684654816637732463f4073847" dependencies = [ - "dyn-stack", + "dyn-stack 0.13.0", "gemm-common", "num-complex", "num-traits", @@ -822,11 +827,11 @@ dependencies = [ [[package]] name = "gemm-c64" -version = "0.18.0" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2032ce2c0bb150da0256338759a6fb01ca056f6dfe28c4d14af32d7f878f6f" +checksum = "dfcad8a3d35a43758330b635d02edad980c1e143dc2f21e6fd25f9e4eada8edf" dependencies = [ - "dyn-stack", + "dyn-stack 0.13.0", "gemm-common", "num-complex", "num-traits", @@ -837,18 +842,19 @@ dependencies = [ [[package]] name = "gemm-common" -version = "0.18.0" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fd234fc525939654f47b39325fd5f55e552ceceea9135f3aa8bdba61eabef6" +checksum = "a352d4a69cbe938b9e2a9cb7a3a63b7e72f9349174a2752a558a8a563510d0f3" dependencies = [ "bytemuck", - "dyn-stack", + "dyn-stack 0.13.0", "half", + "libm", "num-complex", "num-traits", "once_cell", "paste", - "pulp 0.18.22", + "pulp 0.21.4", "raw-cpuid", "seq-macro", "sysctl", @@ -856,11 +862,11 @@ dependencies = [ [[package]] name = "gemm-f16" -version = "0.18.0" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fc3652651f96a711d46b8833e1fac27a864be4bdfa81a374055f33ddd25c0c6" +checksum = "cff95ae3259432f3c3410eaa919033cd03791d81cebd18018393dc147952e109" dependencies = [ - "dyn-stack", + "dyn-stack 0.13.0", "gemm-common", "gemm-f32", "half", @@ -873,11 +879,11 @@ dependencies = [ [[package]] name = "gemm-f32" -version = "0.18.0" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbc51c44ae3defd207e6d9416afccb3c4af1e7cef5e4960e4c720ac4d6f998e" +checksum = "bc8d3d4385393304f407392f754cd2dc4b315d05063f62cf09f47b58de276864" dependencies = [ - "dyn-stack", + "dyn-stack 0.13.0", "gemm-common", "num-complex", "num-traits", @@ -888,11 +894,11 @@ dependencies = [ [[package]] name = "gemm-f64" -version = "0.18.0" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f37fc86e325c2415a4d0cab8324a0c5371ec06fc7d2f9cb1636fcfc9536a8d8" +checksum = "35b2a4f76ce4b8b16eadc11ccf2e083252d8237c1b589558a49b0183545015bd" dependencies = [ - "dyn-stack", + "dyn-stack 0.13.0", "gemm-common", "num-complex", "num-traits", @@ -919,14 +925,26 @@ checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", ] [[package]] -name = "glob" +name = "getrandom" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.13.3+wasi-0.2.2", + "windows-targets", +] + +[[package]] +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] name = "half" @@ -992,9 +1010,9 @@ dependencies = [ [[package]] name = "indicatif" -version = "0.17.9" +version = "0.17.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf675b85ed934d3c67b5c5469701eec7db22689d0a2139d856e0925fa28b281" +checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" dependencies = [ "console", "number_prefix", @@ -1020,13 +1038,13 @@ dependencies = [ [[package]] name = "is-terminal" -version = "0.4.13" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" +checksum = "e19b23d53f35ce9f56aebc7d1bb4e6ac1e9c0db7ac85c8d1760c04379edced37" dependencies = [ "hermit-abi", "libc", - "windows-sys 0.52.0", + "windows-sys", ] [[package]] @@ -1064,9 +1082,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.76" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ "once_cell", "wasm-bindgen", @@ -1166,9 +1184,9 @@ checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" [[package]] name = "log" -version = "0.4.22" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" [[package]] name = "matrixcompare" @@ -1219,9 +1237,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" +checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" dependencies = [ "adler2", ] @@ -1472,12 +1490,12 @@ dependencies = [ "nuts-rs", "pyo3", "rand", - "rand_chacha", + "rand_chacha 0.9.0", "rand_distr", "rayon", "smallvec", "tch", - "thiserror 2.0.8", + "thiserror 2.0.11", "time-humanize", "upon", ] @@ -1495,17 +1513,17 @@ dependencies = [ "multiversion", "pulp 0.20.1", "rand", - "rand_chacha", + "rand_chacha 0.3.1", "rand_distr", "rayon", - "thiserror 2.0.8", + "thiserror 2.0.11", ] [[package]] name = "once_cell" -version = "1.20.2" +version = "1.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" [[package]] name = "oorandom" @@ -1520,7 +1538,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" dependencies = [ "base64ct", - "rand_core", + "rand_core 0.6.4", "subtle", ] @@ -1621,14 +1639,14 @@ version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" dependencies = [ - "zerocopy", + "zerocopy 0.7.35", ] [[package]] name = "prettyplease" -version = "0.2.25" +version = "0.2.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" +checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" dependencies = [ "proc-macro2", "syn", @@ -1636,9 +1654,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] @@ -1667,11 +1685,25 @@ dependencies = [ "reborrow", ] +[[package]] +name = "pulp" +version = "0.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95fb7a99b37aaef4c7dd2fd15a819eb8010bfc7a2c2155230d51f497316cad6d" +dependencies = [ + "bytemuck", + "cfg-if", + "libm", + "num-complex", + "reborrow", + "version_check", +] + [[package]] name = "pyo3" -version = "0.23.3" +version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e484fd2c8b4cb67ab05a318f1fd6fa8f199fcc30819f08f07d200809dba26c15" +checksum = "57fe09249128b3173d092de9523eaa75136bf7ba85e0d69eca241c7939c933cc" dependencies = [ "anyhow", "cfg-if", @@ -1688,9 +1720,9 @@ dependencies = [ [[package]] name = "pyo3-build-config" -version = "0.23.3" +version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc0e0469a84f208e20044b98965e1561028180219e35352a2afaf2b942beff3b" +checksum = "1cd3927b5a78757a0d71aa9dff669f903b1eb64b54142a9bd9f757f8fde65fd7" dependencies = [ "once_cell", "target-lexicon", @@ -1698,9 +1730,9 @@ dependencies = [ [[package]] name = "pyo3-ffi" -version = "0.23.3" +version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1547a7f9966f6f1a0f0227564a9945fe36b90da5a93b3933fc3dc03fae372d" +checksum = "dab6bb2102bd8f991e7749f130a70d05dd557613e39ed2deeee8e9ca0c4d548d" dependencies = [ "libc", "pyo3-build-config", @@ -1708,9 +1740,9 @@ dependencies = [ [[package]] name = "pyo3-macros" -version = "0.23.3" +version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb6da8ec6fa5cedd1626c886fc8749bdcbb09424a86461eb8cdf096b7c33257" +checksum = "91871864b353fd5ffcb3f91f2f703a22a9797c91b9ab497b1acac7b07ae509c7" dependencies = [ "proc-macro2", "pyo3-macros-backend", @@ -1720,9 +1752,9 @@ dependencies = [ [[package]] name = "pyo3-macros-backend" -version = "0.23.3" +version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38a385202ff5a92791168b1136afae5059d3ac118457bb7bc304c197c2d33e7d" +checksum = "43abc3b80bc20f3facd86cd3c60beed58c3e2aa26213f3cda368de39c60a27e4" dependencies = [ "heck", "proc-macro2", @@ -1733,9 +1765,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -1747,8 +1779,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", ] [[package]] @@ -1758,7 +1790,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.0", ] [[package]] @@ -1767,7 +1809,17 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.15", +] + +[[package]] +name = "rand_core" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b08f3c9802962f7e1b25113931d94f43ed9725bebc59db9d0c3e9a23b67e15ff" +dependencies = [ + "getrandom 0.3.1", + "zerocopy 0.8.17", ] [[package]] @@ -1782,11 +1834,11 @@ dependencies = [ [[package]] name = "raw-cpuid" -version = "10.7.0" +version = "11.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c297679cb867470fa8c9f67dbba74a78d78e3e98d7cf2b08d6d71540f797332" +checksum = "c6928fa44c097620b706542d428957635951bade7143269085389d42c8a4927e" dependencies = [ - "bitflags 1.3.2", + "bitflags", ] [[package]] @@ -1852,15 +1904,21 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "rustc-hash" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustversion" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" [[package]] name = "safetensors" @@ -1889,18 +1947,18 @@ checksum = "a3f0bf26fd526d2a95683cd0f87bf103b8539e2ca1ef48ce002d67aad59aa0b4" [[package]] name = "serde" -version = "1.0.216" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.216" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", @@ -1909,9 +1967,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.133" +version = "1.0.138" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" +checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" dependencies = [ "itoa", "memchr", @@ -1967,9 +2025,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.90" +version = "2.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" dependencies = [ "proc-macro2", "quote", @@ -1978,11 +2036,11 @@ dependencies = [ [[package]] name = "sysctl" -version = "0.5.5" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7dddc5f0fee506baf8b9fdb989e242f17e4b11c61dfbb0635b705217199eea" +checksum = "01198a2debb237c62b6826ec7081082d951f46dbb64b0e8c7649a452230d1dfc" dependencies = [ - "bitflags 2.6.0", + "bitflags", "byteorder", "enum-as-inner", "libc", @@ -2030,11 +2088,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.8" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f5383f3e0071702bf93ab5ee99b52d26936be9dedd9413067cbdcddcb6141a" +checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" dependencies = [ - "thiserror-impl 2.0.8", + "thiserror-impl 2.0.11", ] [[package]] @@ -2050,9 +2108,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.8" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f357fcec90b3caef6623a099691be676d033b40a058ac95d2a6ade6fa0c943" +checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" dependencies = [ "proc-macro2", "quote", @@ -2123,9 +2181,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-ident" -version = "1.0.14" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" [[package]] name = "unicode-width" @@ -2167,22 +2225,32 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.13.3+wasi-0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasm-bindgen" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", @@ -2194,9 +2262,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2204,9 +2272,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", @@ -2217,15 +2285,18 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "web-sys" -version = "0.3.76" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", @@ -2247,7 +2318,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.59.0", + "windows-sys", ] [[package]] @@ -2259,15 +2330,6 @@ dependencies = [ "windows-targets", ] -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets", -] - [[package]] name = "windows-sys" version = "0.59.0" @@ -2341,6 +2403,15 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags", +] + [[package]] name = "zerocopy" version = "0.7.35" @@ -2348,7 +2419,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ "byteorder", - "zerocopy-derive", + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa91407dacce3a68c56de03abe2760159582b846c6a4acd2f456618087f12713" +dependencies = [ + "zerocopy-derive 0.8.17", ] [[package]] @@ -2362,6 +2442,17 @@ dependencies = [ "syn", ] +[[package]] +name = "zerocopy-derive" +version = "0.8.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06718a168365cad3d5ff0bb133aad346959a2074bd4a85c121255a11304a8626" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "zip" version = "0.6.6" diff --git a/Cargo.toml b/Cargo.toml index b470803..eb557e6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,7 +26,7 @@ nuts-rs = "0.14.0" numpy = "0.23.0" rand = "0.8.5" thiserror = "2.0.3" -rand_chacha = "0.3.1" +rand_chacha = "0.9.0" rayon = "1.10.0" # Keep arrow in sync with nuts-rs requirements arrow = { version = "53.1.0", default-features = false, features = ["ffi"] } From 1d943a78f350c68aa9653180eda0a38c138921f0 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Fri, 7 Feb 2025 18:28:37 +0100 Subject: [PATCH 37/55] Improve normalizing flow --- python/nutpie/transform_adapter.py | 838 ++++++++++++++++++++--------- 1 file changed, 597 insertions(+), 241 deletions(-) diff --git a/python/nutpie/transform_adapter.py b/python/nutpie/transform_adapter.py index 4601e6d..c1f4b71 100644 --- a/python/nutpie/transform_adapter.py +++ b/python/nutpie/transform_adapter.py @@ -1,8 +1,425 @@ -from typing import cast +from typing import Callable, Literal, Union, cast +import itertools +import math +import numpy as np +import equinox as eqx +import jax _BIJECTION_TRACE = [] +class FactoredMLP(eqx.Module, strict=True): + """Standard Multi-Layer Perceptron; also known as a feed-forward network. + + !!! faq + + If you get a TypeError saying an object is not a valid JAX type, see the + [FAQ](https://docs.kidger.site/equinox/faq/).""" + + layers: tuple[tuple[eqx.nn.Linear, eqx.nn.Linear], ...] + activation: tuple[Callable, ...] + final_activation: Callable + use_bias: bool = eqx.field(static=True) + use_final_bias: bool = eqx.field(static=True) + in_size: Union[int, Literal["scalar"]] = eqx.field(static=True) + out_size: Union[int, Literal["scalar"]] = eqx.field(static=True) + width_size: tuple[int, ...] = eqx.field(static=True) + depth: int = eqx.field(static=True) + + def __init__( + self, + in_size: Union[int, Literal["scalar"]], + out_size: Union[int, Literal["scalar"]], + width_size: int | tuple[int | tuple[int, int], ...], + depth: int, + activation: Callable = jax.nn.relu, + final_activation: Callable = lambda x: x, + use_bias: bool = True, + use_final_bias: bool = True, + dtype=None, + *, + key, + ): + """**Arguments**: + + - `in_size`: The input size. The input to the module should be a vector of + shape `(in_features,)` + - `out_size`: The output size. The output from the module will be a vector + of shape `(out_features,)`. + - `width_size`: The size of each hidden layer. + - `depth`: The number of hidden layers, including the output layer. + For example, `depth=2` results in an network with layers: + [`Linear(in_size, width_size)`, `Linear(width_size, width_size)`, + `Linear(width_size, out_size)`]. + - `activation`: The activation function after each hidden layer. Defaults to + ReLU. + - `final_activation`: The activation function after the output layer. Defaults + to the identity. + - `use_bias`: Whether to add on a bias to internal layers. Defaults + to `True`. + - `use_final_bias`: Whether to add on a bias to the final layer. Defaults + to `True`. + - `dtype`: The dtype to use for all the weights and biases in this MLP. + Defaults to either `jax.numpy.float32` or `jax.numpy.float64` depending + on whether JAX is in 64-bit mode. + - `key`: A `jax.random.PRNGKey` used to provide randomness for parameter + initialisation. (Keyword only argument.) + + Note that `in_size` also supports the string `"scalar"` as a special value. + In this case the input to the module should be of shape `()`. + + Likewise `out_size` can also be a string `"scalar"`, in which case the + output from the module will have shape `()`. + """ + #dtype = default_floating_dtype() if dtype is None else dtype + keys = jax.random.split(key, depth + 1) + layers = [] + if isinstance(width_size, int): + width_size = (width_size,) * depth + + assert len(width_size) == depth + activations: list[Callable] = [] + + if depth == 0: + layers.append( + eqx.nn.Linear(in_size, out_size, use_final_bias, dtype=dtype, key=keys[0]) + ) + else: + if isinstance(width_size[0], tuple): + n, k = width_size[0] + key1, key2 = jax.random.split(keys[0]) + U = eqx.nn.Linear(in_size, n, use_bias=False, dtype=dtype, key=key1) + K = eqx.nn.Linear(n, k, use_bias=True, dtype=dtype, key=key2) + layers.append((U, K)) + else: + k = width_size[0] + layers.append( + eqx.nn.Linear(in_size, k, use_bias, dtype=dtype, key=keys[0]) + ) + activations.append(eqx.filter_vmap(lambda: activation, axis_size=k)()) + + for i in range(depth - 1): + if isinstance(width_size[i + 1], tuple): + n, k_new = width_size[i + 1] + key1, key2 = jax.random.split(keys[i + 1]) + U = eqx.nn.Linear(k, n, use_bias=False, dtype=dtype, key=key1) + K = eqx.nn.Linear(n, k_new, use_bias=True, dtype=dtype, key=key2) + layers.append((U, K)) + k = k_new + else: + layers.append( + eqx.nn.Linear( + k, width_size[i + 1], use_bias, dtype=dtype, key=keys[i + 1] + ) + ) + k = width_size[i + 1] + activations.append(eqx.filter_vmap(lambda: activation, axis_size=k)()) + + if isinstance(out_size, tuple): + n, k_new = out_size + key1, key2 = jax.random.split(keys[-1]) + U = eqx.nn.Linear(k, n, use_bias=False, dtype=dtype, key=key1) + K = eqx.nn.Linear(n, k_new, use_bias=True, dtype=dtype, key=key2) + k = k_new + layers.append((U, K)) + else: + layers.append( + eqx.nn.Linear(k, out_size, use_final_bias, dtype=dtype, key=keys[-1]) + ) + self.layers = tuple(layers) + self.in_size = in_size + self.out_size = out_size + self.width_size = width_size + self.depth = depth + # In case `activation` or `final_activation` are learnt, then make a separate + # copy of their weights for every neuron. + self.activation = tuple(activations) + #self.activation = eqx.filter_vmap( + # eqx.filter_vmap(lambda: activation), axis_size=depth + #)() + if out_size == "scalar": + self.final_activation = final_activation + else: + self.final_activation = eqx.filter_vmap( + lambda: final_activation, axis_size=out_size + )() + self.use_bias = use_bias + self.use_final_bias = use_final_bias + + @jax.named_scope("eqx.nn.MLP") + def __call__(self, x: jax.Array, *, key = None) -> jax.Array: + """**Arguments:** + + - `x`: A JAX array with shape `(in_size,)`. (Or shape `()` if + `in_size="scalar"`.) + - `key`: Ignored; provided for compatibility with the rest of the Equinox API. + (Keyword only argument.) + + **Returns:** + + A JAX array with shape `(out_size,)`. (Or shape `()` if `out_size="scalar"`.) + """ + for i, (layer, act) in enumerate(zip(self.layers[:-1], self.activation)): + if isinstance(layer, tuple): + U, K = layer + x = U(x) + x = K(x) + else: + x = layer(x) + layer_activation = jax.tree.map( + lambda x: x[i] if eqx.is_array(x) else x, act + ) + x = eqx.filter_vmap(lambda a, b: a(b))(layer_activation, x) + + if isinstance(self.layers[-1], tuple): + U, K = self.layers[-1] + x = U(x) + x = K(x) + else: + x = self.layers[-1](x) + + if self.out_size == "scalar": + x = self.final_activation(x) + else: + x = eqx.filter_vmap(lambda a, b: a(b))(self.final_activation, x) + return x + + +class MLP(eqx.Module, strict=True): + """Standard Multi-Layer Perceptron; also known as a feed-forward network. + + !!! faq + + If you get a TypeError saying an object is not a valid JAX type, see the + [FAQ](https://docs.kidger.site/equinox/faq/).""" + + layers: tuple[eqx.nn.Linear, ...] + activation: tuple[Callable, ...] + final_activation: Callable + use_bias: bool = eqx.field(static=True) + use_final_bias: bool = eqx.field(static=True) + in_size: Union[int, Literal["scalar"]] = eqx.field(static=True) + out_size: Union[int, Literal["scalar"]] = eqx.field(static=True) + width_size: tuple[int, ...] = eqx.field(static=True) + depth: int = eqx.field(static=True) + + def __init__( + self, + in_size: Union[int, Literal["scalar"]], + out_size: Union[int, Literal["scalar"]], + width_size: int | tuple[int, ...], + depth: int, + activation: Callable = jax.nn.relu, + final_activation: Callable = lambda x: x, + use_bias: bool = True, + use_final_bias: bool = True, + dtype=None, + *, + key, + ): + """**Arguments**: + + - `in_size`: The input size. The input to the module should be a vector of + shape `(in_features,)` + - `out_size`: The output size. The output from the module will be a vector + of shape `(out_features,)`. + - `width_size`: The size of each hidden layer. + - `depth`: The number of hidden layers, including the output layer. + For example, `depth=2` results in an network with layers: + [`Linear(in_size, width_size)`, `Linear(width_size, width_size)`, + `Linear(width_size, out_size)`]. + - `activation`: The activation function after each hidden layer. Defaults to + ReLU. + - `final_activation`: The activation function after the output layer. Defaults + to the identity. + - `use_bias`: Whether to add on a bias to internal layers. Defaults + to `True`. + - `use_final_bias`: Whether to add on a bias to the final layer. Defaults + to `True`. + - `dtype`: The dtype to use for all the weights and biases in this MLP. + Defaults to either `jax.numpy.float32` or `jax.numpy.float64` depending + on whether JAX is in 64-bit mode. + - `key`: A `jax.random.PRNGKey` used to provide randomness for parameter + initialisation. (Keyword only argument.) + + Note that `in_size` also supports the string `"scalar"` as a special value. + In this case the input to the module should be of shape `()`. + + Likewise `out_size` can also be a string `"scalar"`, in which case the + output from the module will have shape `()`. + """ + #dtype = default_floating_dtype() if dtype is None else dtype + keys = jax.random.split(key, depth + 1) + layers = [] + if isinstance(width_size, int): + width_size = (width_size,) * depth + + assert len(width_size) == depth + activations: list[Callable] = [] + + if depth == 0: + layers.append( + eqx.nn.Linear(in_size, out_size, use_final_bias, dtype=dtype, key=keys[0]) + ) + else: + layers.append( + eqx.nn.Linear(in_size, width_size[0], use_bias, dtype=dtype, key=keys[0]) + ) + activations.append(eqx.filter_vmap(lambda: activation, axis_size=width_size[0])()) + for i in range(depth - 1): + layers.append( + eqx.nn.Linear( + width_size[i], width_size[i + 1], use_bias, dtype=dtype, key=keys[i + 1] + ) + ) + activations.append(eqx.filter_vmap(lambda: activation, axis_size=width_size[i])()) + layers.append( + eqx.nn.Linear(width_size[-1], out_size, use_final_bias, dtype=dtype, key=keys[-1]) + ) + self.layers = tuple(layers) + self.in_size = in_size + self.out_size = out_size + self.width_size = width_size + self.depth = depth + # In case `activation` or `final_activation` are learnt, then make a separate + # copy of their weights for every neuron. + self.activation = tuple(activations) + #self.activation = eqx.filter_vmap( + # eqx.filter_vmap(lambda: activation), axis_size=depth + #)() + if out_size == "scalar": + self.final_activation = final_activation + else: + self.final_activation = eqx.filter_vmap( + lambda: final_activation, axis_size=out_size + )() + self.use_bias = use_bias + self.use_final_bias = use_final_bias + + @jax.named_scope("eqx.nn.MLP") + def __call__(self, x: jax.Array, *, key = None) -> jax.Array: + """**Arguments:** + + - `x`: A JAX array with shape `(in_size,)`. (Or shape `()` if + `in_size="scalar"`.) + - `key`: Ignored; provided for compatibility with the rest of the Equinox API. + (Keyword only argument.) + + **Returns:** + + A JAX array with shape `(out_size,)`. (Or shape `()` if `out_size="scalar"`.) + """ + for i, (layer, act) in enumerate(zip(self.layers[:-1], self.activation)): + x = layer(x) + layer_activation = jax.tree.map( + lambda x: x[i] if eqx.is_array(x) else x, act + ) + x = eqx.filter_vmap(lambda a, b: a(b))(layer_activation, x) + x = self.layers[-1](x) + if self.out_size == "scalar": + x = self.final_activation(x) + else: + x = eqx.filter_vmap(lambda a, b: a(b))(self.final_activation, x) + return x + +def generate_sequences(k, r_vals): + """ + Generate all binary sequences of length k with exactly r 1's. + The sequences are stored in a preallocated boolean NumPy array of shape (N, k), + where N = comb(k, r). A True value represents a '1' and False represents a '0'. + + Parameters: + k (int): The length of each sequence. + r (int): The exact number of ones in each sequence. + + Returns: + A NumPy boolean array of shape (comb(k, r), k) containing all sequences. + """ + all_sequences = [] + for r in r_vals: + N = math.comb(k, r) # number of sequences + sequences = np.zeros((N, k), dtype=bool) + # Use enumerate on all combinations where ones appear. + for i, ones_positions in enumerate(itertools.combinations(range(k), r)): + sequences[i, list(ones_positions)] = True + all_sequences.append(sequences) + return np.concatenate(all_sequences, axis=0) + +def max_run_length(seq): + """ + Given a 1D boolean NumPy array 'seq', compute the maximum run length of consecutive + identical values (either True or False). + + Parameters: + seq (np.array): A 1D boolean array. + + Returns: + The length (int) of the longest run. + """ + # If the sequence is empty, return 0. + if seq.size == 0: + return 0 + + # Convert boolean to int (0 or 1) so we can use np.diff. + arr = seq.astype(int) + # Compute differences between consecutive elements. + diffs = np.diff(arr) + # Positions where the value changes: + change_indices = np.nonzero(diffs)[0] + + if change_indices.size == 0: + # No changes at all, so the entire sequence is one run. + return seq.size + + # To compute the run lengths, add the "start" index (-1) and the last index. + # For example, if change_indices = [i1, i2, ..., in], + # then the runs are: (i1 - (-1)), (i2 - i1), ..., (seq.size-1 - in). + boundaries = np.concatenate(([-1], change_indices, [seq.size - 1])) + run_lengths = np.diff(boundaries) + return int(run_lengths.max()) + +def filter_sequences(sequences, m): + """ + Filter a 2D NumPy boolean array 'sequences' (each row a binary sequence) so that + only sequences with maximum run length (of 0's or 1's) at most m are kept. + + Parameters: + sequences (np.array): A 2D boolean array of shape (N, k). + m (int): Maximum allowed run length. + + Returns: + A NumPy array containing only the rows (sequences) that pass the filter. + """ + filtered = [] + for seq in sequences: + if max_run_length(seq) <= m: + filtered.append(seq) + return np.array(filtered) + + +def generate_permutations(rng, n_dim, n_layers, max_run=3): + if n_layers == 1: + r = [0, 1] + elif n_layers == 2: + r = [1] + else: + if n_layers % 2 == 0: + half = n_layers // 2 + r = [half - 1, half, half + 1] + else: + half = n_layers // 2 + r = [half, half + 1] + + all_sequences = generate_sequences(n_layers, r) + valid_sequences = filter_sequences(all_sequences, max_run) + + valid_sequences = np.repeat(valid_sequences, n_dim // len(valid_sequences) + 1, axis=0) + rng.shuffle(valid_sequences, axis=0) + is_in_first = valid_sequences[:n_dim] + rng = np.random.default_rng(42) + permutations = (~is_in_first).argsort(axis=0, kind="stable") + return permutations.T, is_in_first.sum(0) + def make_transform_adapter( *, verbose=False, @@ -37,6 +454,7 @@ def make_transform_adapter( import flowjax import flowjax.flows import flowjax.train + from flowjax import bijections import jax import jax.numpy as jnp import numpy as np @@ -67,12 +485,12 @@ def __call__( def compute_loss(bijection, draw, grad, logp): if True: - draw, grad, logp = bijection.inverse_gradient_and_val( + draw, grad, logp = bijection.inverse_gradient_and_val_( draw, grad, logp ) else: draw, grad, logp = ( - flowjax.bijections.AbstractBijection.inverse_gradient_and_val( + flowjax.bijections.AbstractBijection.inverse_gradient_and_val_( bijection, draw, grad, logp ) ) @@ -90,7 +508,7 @@ def compute_loss(bijection, draw, grad, logp): if self._gamma is None: def compute_loss(bijection, draw, grad, logp): - draw, grad, logp = bijection.inverse_gradient_and_val( + draw, grad, logp = bijection.inverse_gradient_and_val_( draw, grad, logp ) cost = ((draw + grad) ** 2).sum() @@ -114,7 +532,7 @@ def compute_loss(bijection, draw, grad, logp): else: def transform(draw, grad, logp): - return flow.bijection.inverse_gradient_and_val(draw, grad, logp) + return flow.bijection.inverse_gradient_and_val_(draw, grad, logp) draws, grads, logps = jax.vmap(transform, [0, 0, 0], (0, 0, 0))( draws, grads, logps @@ -142,6 +560,140 @@ def fit_flow(key, bijection, loss_fn, draws, grads, logps, **kwargs): ) return fit.bijection, losses, losses["opt_state"] + def make_mvscale(key, n_dim, size, randomize_base=False): + def make_single_hh(key, idx): + key1, key2 = jax.random.split(key) + params = jax.random.normal(key1, (n_dim,)) + params = params / jnp.linalg.norm(params) + mvscale = bijections.MvScale(params) + return mvscale + + keys = jax.random.split(key, size) + + if randomize_base: + key, key_base = jax.random.split(key) + indices = jax.random.randint(key_base, (size,), 0, n_dim) + else: + indices = [val % n_dim for val in range(size)] + + return bijections.Chain([make_single_hh(key, idx) for key, idx in zip(keys, indices)]) + + def make_hh(key, n_dim, size, randomize_base=False): + def make_single_hh(key, idx): + key1, key2 = jax.random.split(key) + params = jax.random.normal(key1, (n_dim,)) * 1e-2 + return bijections.Householder(params, base_index=idx) + + keys = jax.random.split(key, size) + + if randomize_base: + key, key_base = jax.random.split(key) + indices = jax.random.randint(key_base, (size,), 0, n_dim) + else: + indices = [val % n_dim for val in range(size)] + + return bijections.Chain([make_single_hh(key, idx) for key, idx in zip(keys, indices)]) + + def make_elemwise_trafo(key, n_dim, *, count=1): + def make_elemwise(key, loc): + key1, key2 = jax.random.split(key) + scale = Parameterize( + lambda x: x + jnp.sqrt(1 + x**2), + jnp.zeros(()) + ) + theta = Parameterize( + lambda x: x + jnp.sqrt(1 + x**2), + jnp.zeros(()) + ) + + affine = bijections.AsymmetricAffine( + loc, + jnp.ones(()), + jnp.ones(()), + ) + + affine = eqx.tree_at( + where=lambda aff: aff.scale, + pytree=affine, + replace=scale, + ) + affine = eqx.tree_at( + where=lambda aff: aff.theta, + pytree=affine, + replace=theta, + ) + + return affine + + def make(key): + keys = jax.random.split(key, count + 1) + key, keys = keys[0], keys[1:] + loc = jax.random.normal(key=key, shape=(count,)) * 2 + loc = loc - loc.mean() + return bijections.Chain([make_elemwise(key, mu) for key, mu in zip(keys, loc)]) + + keys = jax.random.split(key, n_dim) + make_affine = eqx.filter_vmap(make, axis_size=n_dim)(keys) + return bijections.Vmap(make_affine, in_axes=eqx.if_array(0)) + + def make_elemwise_trafo_(key, n_dim, *, count=1): + def make_elemwise(key): + scale = Parameterize( + lambda x: x + jnp.sqrt(1 + x**2), + jax.random.normal(key=key) / 5, + ) + theta = Parameterize( + lambda x: x + jnp.sqrt(1 + x**2), + jax.random.normal(key=key) / 5, + ) + + affine = bijections.AsymmetricAffine( + jax.random.normal(key=key) * 2, + jnp.ones(()), + jnp.ones(()), + ) + + affine = eqx.tree_at( + where=lambda aff: aff.scale, + pytree=affine, + replace=scale, + ) + affine = eqx.tree_at( + where=lambda aff: aff.theta, + pytree=affine, + replace=theta, + ) + + return affine + + def make(key): + keys = jax.random.split(key, count) + return bijections.Scan(eqx.filter_vmap(make_elemwise)(keys)) + + keys = jax.random.split(key, n_dim) + make_affine = eqx.filter_vmap(make)(keys) + return bijections.Vmap(make_affine()) + + def make_coupling(key, dim, n_untransformed, **kwargs): + n_transformed = dim - n_untransformed + + mvscale = make_mvscale(key, n_transformed, 1, randomize_base=True) + + transformer = bijections.Chain([ + make_elemwise_trafo(key, n_transformed, count=3), + mvscale, + ]) + mlp1 = lambda out_size: FactoredMLP( + n_untransformed, + (32, out_size), + kwargs["nn_width"], + depth=len(kwargs["nn_width"]), + key=key, + dtype=jnp.float32, + activation=jax.nn.gelu, + ) + return bijections.Coupling(key, transformer=transformer, untransformed_dim=n_untransformed, dim=dim, conditioner=mlp1, **kwargs) + def make_flow( seed, positions, @@ -212,52 +764,8 @@ def make_flow( replace=scale, ) - if False: - params = jnp.ones(n_dim) * 1e-5 - params = params.at[-1].set(1.0) - - hh = flowjax.bijections.Householder(params) - flows.append( - bijections.Sandwich( - bijections.Chain( - [ - bijections.Vmap(bijections.SoftPlusX(), axis_size=n_dim), - hh, - ] - ), - affine, - ) - ) - - if untransformed_dim is None: - untransformed_dim = n_dim // 2 - - untransformed_dim = cast(list[int | None] | int, untransformed_dim) - - def make_layer(key, untransformed_dim: int | None): - key, key_couple, key_permute = jax.random.split(key, 3) - - scale = Parameterize( - lambda x: x + jnp.sqrt(1 + x**2), - jnp.array(0.0), - ) - theta = Parameterize( - lambda x: x + jnp.sqrt(1 + x**2), - jnp.array(0.0), - ) - - affine = flowjax.bijections.AsymmetricAffine(jnp.zeros(()), jnp.ones(()), jnp.ones(())) - - affine = eqx.tree_at( - where=lambda aff: aff.scale, - pytree=affine, - replace=scale, - ) - affine = eqx.tree_at( - where=lambda aff: aff.theta, - pytree=affine, - replace=theta, - ) + def make_layer(key, untransformed_dim: int | None, permutation=None): + key, key_couple, key_permute, key_hh = jax.random.split(key, 4) if nn_width is None: width = n_dim // 2 @@ -270,24 +778,30 @@ def make_layer(key, untransformed_dim: int | None): if untransformed_dim < 0: untransformed_dim = n_dim + untransformed_dim - if width > 2 * untransformed_dim: - width = 2 * untransformed_dim + if isinstance(width, int) and width > 16 * untransformed_dim: + width = 16 * untransformed_dim - coupling = flowjax.bijections.coupling.Coupling( + coupling = make_coupling( key_couple, - transformer=affine, - untransformed_dim=untransformed_dim, - dim=n_dim, - nn_activation=jax.nn.gelu, + n_dim, + untransformed_dim, nn_width=width, nn_depth=nn_depth, + nn_activation=jax.nn.gelu, ) + if zero_init: coupling = jax.tree_util.tree_map( lambda x: x * 1e-3 if eqx.is_inexact_array(x) else x, coupling, ) + flow = coupling + + if householder_layer: + hh = make_hh(key_hh, n_dim, 1, randomize_base=False) + flow = bijections.Sandwich(hh, flow) + def add_default_permute(bijection, dim, key): if dim == 1: return bijection @@ -300,55 +814,34 @@ def add_default_permute(bijection, dim, key): return flowjax.bijections.Sandwich(outer, bijection) - flow = add_default_permute(coupling, n_dim, key_permute) - - if householder_layer: - params = jnp.ones(n_dim) * 1e-5 - params = params.at[0].set(1.0) + if permutation is None: + flow = add_default_permute(flow, n_dim, key_permute) + else: + flow = bijections.Sandwich(bijections.Permute(permutation), flow) - outer = flowjax.bijections.Householder(params) - flow = flowjax.bijections.Sandwich(outer, flow) + mvscale = make_mvscale(key, n_dim, 1, randomize_base=True) - if True: - scale = Parameterize( - lambda x: x + jnp.sqrt(1 + x**2), - jnp.zeros(n_dim), - ) - theta = Parameterize( - lambda x: x + jnp.sqrt(1 + x**2), - jnp.zeros(n_dim), - ) - affine = bijections.AsymmetricAffine(jnp.zeros(n_dim), jnp.ones(n_dim), jnp.ones(n_dim)) - affine = eqx.tree_at( - where=lambda aff: aff.scale, - pytree=affine, - replace=scale, - ) - affine = eqx.tree_at( - where=lambda aff: aff.theta, - pytree=affine, - replace=theta, - ) - - params = jnp.ones(n_dim) * 1e-5 - params = params.at[-1].set(1.0) - - hh = bijections.Householder(params) - flow = bijections.Chain( - [ - bijections.Sandwich( - hh, - affine, - ), - flow, - ] - ) + flow = bijections.Chain( + [ + #make_elemwise_trafo(key, n_dim, count=1), + mvscale, + flow, + ] + ) return flow + key, key_permute = jax.random.split(key) keys = jax.random.split(key, n_layers) - if isinstance(untransformed_dim, int): + if untransformed_dim is None: + rng = np.random.default_rng(int(jax.random.randint(key, (), 0, 2**32))) + permutation, lengths = generate_permutations(rng, n_dim, n_layers) + layers = [] + for i, (key, p, length) in enumerate(zip(keys, permutation, lengths)): + layers.append(make_layer(key, int(length), p)) + bijection = flowjax.bijections.Chain(layers) + elif isinstance(untransformed_dim, int): make_layers = eqx.filter_vmap(make_layer) layers = make_layers(keys, untransformed_dim) bijection = flowjax.bijections.Scan(layers) @@ -363,20 +856,6 @@ def add_default_permute(bijection, dim, key): layers.append(flowjax.bijections.Sandwich(outer, inner)) - scale_val = jnp.ones(n_dim) - scale = Parameterize( - lambda x: x + jnp.sqrt(1 + x**2), - jnp.zeros(n_dim), - ) - mean = jnp.zeros(n_dim) - inner = eqx.tree_at( - where=lambda aff: aff.scale, - pytree=flowjax.bijections.Affine(mean, scale_val), - replace=scale, - ) - outer = flowjax.bijections.DCT(inner.shape) - layers.append(flowjax.bijections.Sandwich(outer, inner)) - bijection = flowjax.bijections.Chain(layers) return flowjax.bijections.Chain([bijection, *flows]) @@ -436,91 +915,7 @@ def extend_flow( permute = bijections.Permute(idxs) - if False: - identity = bijections.Identity(shape=(n_dim - extension_var_count,)) - print(costs[idxs]) - - scale = Parameterize( - lambda x: x + jnp.sqrt(1 + x**2), - jnp.array(0.0), - ) - affine = eqx.tree_at( - where=lambda aff: aff.scale, - pytree=flowjax.bijections.Affine(), - replace=scale, - ) - scale = Parameterize( - lambda x: x + jnp.sqrt(1 + x**2), - jnp.array(0.0), - ) - affine2 = eqx.tree_at( - where=lambda aff: aff.scale, - pytree=flowjax.bijections.Affine(), - replace=scale, - ) - - pre = [] - if layer % 2 == 0: - pre.append(bijections.Neg(shape=(n_dim,))) - - nonlin_affine = bijections.Chain( - [ - bijections.Sandwich( - bijections.Chain( - [ - *pre, - bijections.Vmap( - bijections.SoftPlusX(), axis_size=n_dim - ), - ] - ), - affine, - ), - affine2, - ] - ) - - if nn_width is None: - width = extension_var_count * 16 - else: - width = nn_width * 16 - - if untransformed_dim is None: - untransformed_dim = extension_var_count // 2 - - if width > 2 * untransformed_dim: - width = 2 * untransformed_dim - - coupling = flowjax.bijections.coupling.Coupling( - key, - transformer=nonlin_affine, - #transformer=affine, - untransformed_dim=untransformed_dim, - dim=extension_var_count, - nn_activation=jax.nn.gelu, - nn_width=width, - nn_depth=nn_depth + 1, - ) - if zero_init: - coupling = jax.tree_util.tree_map( - lambda x: x * 1e-3 if eqx.is_inexact_array(x) else x, - coupling, - ) - - params = jnp.ones(extension_var_count) * 1e-5 - params = params.at[-1].set(1.0) - - hh = flowjax.bijections.Householder(params) - inner_permute = flowjax.bijections.Permute( - jax.random.permutation(key, jnp.arange(extension_var_count)) - ) - coupling = flowjax.bijections.Sandwich( - inner_permute, - flowjax.bijections.Sandwich(hh, coupling), - ) - - inner = bijections.Concatenate([identity, coupling]) - else: + if True: scale = Parameterize( lambda x: x + jnp.sqrt(1 + x**2), jnp.array(0.0), @@ -543,32 +938,6 @@ def extend_flow( replace=theta, ) - """ - scale = Parameterize( - lambda x: x + jnp.sqrt(1 + x**2), - jnp.array(0.0), - ) - affine2 = eqx.tree_at( - where=lambda aff: aff.scale, - pytree=flowjax.bijections.Affine(), - replace=scale, - ) - pre = [] - if layer % 2 == 0: - pre.append(bijections.Neg(shape=())) - - nonlin_affine = bijections.Chain([ - bijections.Sandwich( - bijections.Chain([ - *pre, - bijections.SoftPlusX(), - ]), - affine, - ), - affine2, - ]) - """ - do_flip = layer % 2 == 0 if nn_width is None: @@ -576,9 +945,6 @@ def extend_flow( else: width = nn_width - #if untransformed_dim is None: - # untransformed_dim = extension_var_count // 2 - if do_flip: coupling = flowjax.bijections.coupling.Coupling( key, @@ -646,9 +1012,6 @@ def extend_flow( else: width = nn_width - #if untransformed_dim is None: - # untransformed_dim = extension_var_count // 2 - coupling = flowjax.bijections.coupling.Coupling( key, transformer=affine, @@ -668,15 +1031,6 @@ def extend_flow( if verbose: print(costs[permute.permutation][inner.outer.permutation]) - """ - params = jnp.ones(n_dim) * 1e-5 - params = params.at[-1].set(0.) - - hh = flowjax.bijections.Householder(params) - - coupling = bijections.Sandwich(hh, coupling) - """ - inner = bijections.Sandwich( inner.outer, bijections.Chain( @@ -793,7 +1147,7 @@ def _init_from_untransformed_position(logp_fn, bijection, untransformed_position def _inv_transform(bijection, untransformed_position, untransformed_gradient): bijection = unwrap(bijection) transformed_position, transformed_gradient, logdet = ( - bijection.inverse_gradient_and_val( + bijection.inverse_gradient_and_val_( untransformed_position, untransformed_gradient, 0.0 ) ) @@ -837,7 +1191,9 @@ def __init__( self._initial_skip = initial_skip if make_optimizer is None: self._make_optimizer = lambda: optax.apply_if_finite( + #optax.adamw(learning_rate), 50 optax.adabelief(learning_rate), 50 + #optax.adam(learning_rate), 50 ) else: self._make_optimizer = make_optimizer From 281005c592c251dd6247f3a4d929cc2efa361d92 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Fri, 7 Feb 2025 19:37:36 +0100 Subject: [PATCH 38/55] Update pixi files --- pixi.lock | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/pixi.lock b/pixi.lock index c7fcfe1..7230225 100644 --- a/pixi.lock +++ b/pixi.lock @@ -225,12 +225,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda - pypi: https://files.pythonhosted.org/packages/a2/ad/e0d3c824784ff121c03cc031f944bc7e139a8f1870ffd2845cc2dd76f6c4/absl_py-2.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/02/c8/542c1f9513136b431b101d06fb547e94d3ebc1d33740c3024315b55d4ada/bridgestan-2.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8c/ce/b9a154415fe7f51a481bece2bd998c679ce0ef93833ad4e7c87c60f0e461/bridgestan-2.6.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/92/92a76dc2ff3a12e69ba94e7e05168d37d0345fa08c87e1fe24d0c2a42223/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/58/a0/e4bebe76bdd0a68077030f1b5e48b545597473ae1b773c84150311152efc/chex-0.1.88-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e9/59/f189b03d743364a350c972b89fe08a6db5bbbdc5f1ea6b604b3eee0a7967/dllist-1.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/3a/af/411e94c165229882eb2d0a329114826aa52c7c61ef3108d0d3d8ad7189ed/equinox-0.11.10-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4f/4a/ff8aa2c57300613b69905308c5afe92c5b01112d766c25a305fd6796170a/etils-1.11.0-py3-none-any.whl + - pypi: git+https://github.com/aseyboldt/flowjax?rev=07e7e32217bcfcaa7d68a304f332c925d26ab76f#07e7e32217bcfcaa7d68a304f332c925d26ab76f - pypi: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/62/20/6c57c50c0ccc645fea1895950f1e5cd02f961ee44b3ffe83617fa46b0c1d/jax-0.4.35-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d7/aa/f15ea857ad9bcff7a0c942dc570ca718b026cc0cc5c513525bb08cacf3c0/jax_cuda12_pjrt-0.4.35-py3-none-manylinux2014_x86_64.whl @@ -253,11 +254,10 @@ environments: - pypi: https://files.pythonhosted.org/packages/20/f8/7b1f5b84f84e43face7349ac2df23f0f75d36b5b4a1c1c0305edce82bcc8/paramax-0.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/4d/b72e0782abec07f3d8dabf24cf12673d26b173af2046eb4e67365c776ccf/posteriordb-0.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl + - pypi: git+https://github.com/aseyboldt/samplerlab#5ae57577f2a586fd941d77afd1f450bbdda796ac - pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c3/ac/1847959031ce09eb65a70b16d0f07633d7ddaf8a97752cc924f9a8cbe253/watermark-2.5.0-py2.py3-none-any.whl - - pypi: ../flowjax/ - - pypi: ../pymc-labs/benchmark-pymc packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 @@ -400,10 +400,10 @@ packages: purls: [] size: 15609 timestamp: 1729642921261 -- pypi: https://files.pythonhosted.org/packages/02/c8/542c1f9513136b431b101d06fb547e94d3ebc1d33740c3024315b55d4ada/bridgestan-2.5.0-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/8c/ce/b9a154415fe7f51a481bece2bd998c679ce0ef93833ad4e7c87c60f0e461/bridgestan-2.6.1-py3-none-any.whl name: bridgestan - version: 2.5.0 - sha256: f417836f35258688759ad46351621d8bb03440d84965f778c82ee702be93f300 + version: 2.6.1 + sha256: 142ea79542db6022e8d85b8d5eaed7817f0429ad0156dbef7e147c72e72bcd98 requires_dist: - numpy - dllist @@ -797,10 +797,9 @@ packages: - pkg:pypi/filelock?source=hash-mapping size: 17441 timestamp: 1733240909987 -- pypi: ../flowjax/ +- pypi: git+https://github.com/aseyboldt/flowjax?rev=07e7e32217bcfcaa7d68a304f332c925d26ab76f#07e7e32217bcfcaa7d68a304f332c925d26ab76f name: flowjax - version: 16.0.0 - sha256: 44c0d14eacfee77e1254f841f2f2b6d169c5d3a34360240d4b9fcf252b9b951c + version: 17.0.2 requires_dist: - jax>=0.4.16 - equinox>=0.10 @@ -819,7 +818,6 @@ packages: - ipython ; extra == 'dev' - numpyro ; extra == 'dev' requires_python: '>=3.10' - editable: true - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b md5: 0c96522c6bdaed4b1566d11387caaf45 @@ -3055,16 +3053,14 @@ packages: - pkg:pypi/rich?source=hash-mapping size: 185646 timestamp: 1733342347277 -- pypi: ../pymc-labs/benchmark-pymc +- pypi: git+https://github.com/aseyboldt/samplerlab#5ae57577f2a586fd941d77afd1f450bbdda796ac name: samplerlab version: '0.1' - sha256: 3229a0e9de6c13db630469c1501ae97625ca85287d2f955280a154dbadd900cd requires_dist: - numpy - arviz - pymc requires_python: '>=3.11' - editable: true - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py312h62794b6_2.conda sha256: 6e4916d610dc15f9b504517bd6c1f3dbbae019a3c7abf0aeb55f310c452a4474 md5: 94688dd449f6c092e5f951780235aca1 From f00b729792724a8a9cf173632893df501c74b967 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Fri, 7 Feb 2025 19:39:02 +0100 Subject: [PATCH 39/55] Update pixi files --- pixi.toml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/pixi.toml b/pixi.toml index fd6b616..9044b45 100644 --- a/pixi.toml +++ b/pixi.toml @@ -9,6 +9,11 @@ version = "0.1.0" [tasks] test = "pytest" develop = "maturin develop --release" +get-posteriordb = "git clone 'https://github.com/stan-dev/posteriordb'" + +[tasks.bench] +depends-on = ["develop", "get-posteriordb"] +cmd = "python -m samplerlab -m posteriordb-fast --posteriordb posteriordb/posterior_database --save-traces --seed 12345" [dependencies] python = ">=3.12.7,<3.13" @@ -29,10 +34,9 @@ ipywidgets = ">=8.1.5,<9" #jaxlib = { version = "*", build = "*cuda12*" } [pypi-dependencies] -bridgestan = ">=2.5.0, <3" -#flowjax = { git = "https://github.com/aseyboldt/flowjax.git", rev = "1c282f2ded78e81c7ce6a96f61523a9f18bf8edc" } -flowjax = { path = "../flowjax/", editable = true } -samplerlab = { path = "../pymc-labs/benchmark-pymc", editable = true } +bridgestan = ">=2.6.0, <3" +flowjax = { git = "https://github.com/aseyboldt/flowjax.git", rev = "07e7e32217bcfcaa7d68a304f332c925d26ab76f" } +samplerlab = { git = "https://github.com/aseyboldt/samplerlab/" } posteriordb = ">=0.2.0, <0.3" jax = { version = "<0.4.37, <0.5", extras = ["cuda12"] } watermark = ">=2.5.0, <3" From d68ee680ace62b9bad123a3e4a060343681c443e Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Sat, 8 Feb 2025 22:51:37 +0100 Subject: [PATCH 40/55] Allow length zero in normalizing flow layer --- python/nutpie/transform_adapter.py | 123 +++++++++++++++++++++++++---- 1 file changed, 108 insertions(+), 15 deletions(-) diff --git a/python/nutpie/transform_adapter.py b/python/nutpie/transform_adapter.py index c1f4b71..b88024f 100644 --- a/python/nutpie/transform_adapter.py +++ b/python/nutpie/transform_adapter.py @@ -4,9 +4,102 @@ import numpy as np import equinox as eqx import jax +import jax.numpy as jnp _BIJECTION_TRACE = [] +class Linear(eqx.Module, strict=True): + """Performs a linear transformation.""" + + weight: jax.Array + bias: jax.Array | None + in_features: Union[int, Literal["scalar"]] = eqx.field(static=True) + out_features: Union[int, Literal["scalar"]] = eqx.field(static=True) + use_bias: bool = eqx.field(static=True) + + def __init__( + self, + in_features: Union[int, Literal["scalar"]], + out_features: Union[int, Literal["scalar"]], + use_bias: bool = True, + dtype=None, + *, + key, + ): + """**Arguments:** + + - `in_features`: The input size. The input to the layer should be a vector of + shape `(in_features,)` + - `out_features`: The output size. The output from the layer will be a vector + of shape `(out_features,)`. + - `use_bias`: Whether to add on a bias as well. + - `dtype`: The dtype to use for the weight and the bias in this layer. + Defaults to either `jax.numpy.float32` or `jax.numpy.float64` depending + on whether JAX is in 64-bit mode. + - `key`: A `jax.random.PRNGKey` used to provide randomness for parameter + initialisation. (Keyword only argument.) + + Note that `in_features` also supports the string `"scalar"` as a special value. + In this case the input to the layer should be of shape `()`. + + Likewise `out_features` can also be a string `"scalar"`, in which case the + output from the layer will have shape `()`. + """ + #dtype = default_floating_dtype() if dtype is None else dtype + dtype = np.float32 if dtype is None else dtype + wkey, bkey = jax.random.split(key, 2) + in_features_ = 1 if in_features == "scalar" else in_features + out_features_ = 1 if out_features == "scalar" else out_features + if in_features_ == 0: + lim = 1.0 + else: + lim = 1 / math.sqrt(in_features_) + wshape = (out_features_, in_features_) + self.weight = eqx.nn._misc.default_init(wkey, wshape, dtype, lim) + bshape = (out_features_,) + self.bias = eqx.nn._misc.default_init(bkey, bshape, dtype, lim) if use_bias else None + + self.in_features = in_features + self.out_features = out_features + self.use_bias = use_bias + + @jax.named_scope("eqx.nn.Linear") + def __call__(self, x: jax.Array, *, key=None) -> jax.Array: + """**Arguments:** + + - `x`: The input. Should be a JAX array of shape `(in_features,)`. (Or shape + `()` if `in_features="scalar"`.) + - `key`: Ignored; provided for compatibility with the rest of the Equinox API. + (Keyword only argument.) + + !!! info + + If you want to use higher order tensors as inputs (for example featuring " + "batch dimensions) then use `jax.vmap`. For example, for an input `x` of " + "shape `(batch, in_features)`, using + ```python + linear = equinox.nn.Linear(...) + jax.vmap(linear)(x) + ``` + will produce the appropriate output of shape `(batch, out_features)`. + + **Returns:** + + A JAX array of shape `(out_features,)`. (Or shape `()` if + `out_features="scalar"`.) + """ + + if self.in_features == "scalar": + if jnp.shape(x) != (): + raise ValueError("x must have scalar shape") + x = jnp.broadcast_to(x, (1,)) + x = self.weight @ x + if self.bias is not None: + x = x + self.bias + if self.out_features == "scalar": + assert jnp.shape(x) == (1,) + x = jnp.squeeze(x) + return x class FactoredMLP(eqx.Module, strict=True): """Standard Multi-Layer Perceptron; also known as a feed-forward network. @@ -16,7 +109,7 @@ class FactoredMLP(eqx.Module, strict=True): If you get a TypeError saying an object is not a valid JAX type, see the [FAQ](https://docs.kidger.site/equinox/faq/).""" - layers: tuple[tuple[eqx.nn.Linear, eqx.nn.Linear], ...] + layers: tuple[tuple[Linear, Linear], ...] activation: tuple[Callable, ...] final_activation: Callable use_bias: bool = eqx.field(static=True) @@ -82,19 +175,19 @@ def __init__( if depth == 0: layers.append( - eqx.nn.Linear(in_size, out_size, use_final_bias, dtype=dtype, key=keys[0]) + Linear(in_size, out_size, use_final_bias, dtype=dtype, key=keys[0]) ) else: if isinstance(width_size[0], tuple): n, k = width_size[0] key1, key2 = jax.random.split(keys[0]) - U = eqx.nn.Linear(in_size, n, use_bias=False, dtype=dtype, key=key1) - K = eqx.nn.Linear(n, k, use_bias=True, dtype=dtype, key=key2) + U = Linear(in_size, n, use_bias=False, dtype=dtype, key=key1) + K = Linear(n, k, use_bias=True, dtype=dtype, key=key2) layers.append((U, K)) else: k = width_size[0] layers.append( - eqx.nn.Linear(in_size, k, use_bias, dtype=dtype, key=keys[0]) + Linear(in_size, k, use_bias, dtype=dtype, key=keys[0]) ) activations.append(eqx.filter_vmap(lambda: activation, axis_size=k)()) @@ -102,13 +195,13 @@ def __init__( if isinstance(width_size[i + 1], tuple): n, k_new = width_size[i + 1] key1, key2 = jax.random.split(keys[i + 1]) - U = eqx.nn.Linear(k, n, use_bias=False, dtype=dtype, key=key1) - K = eqx.nn.Linear(n, k_new, use_bias=True, dtype=dtype, key=key2) + U = Linear(k, n, use_bias=False, dtype=dtype, key=key1) + K = Linear(n, k_new, use_bias=True, dtype=dtype, key=key2) layers.append((U, K)) k = k_new else: layers.append( - eqx.nn.Linear( + Linear( k, width_size[i + 1], use_bias, dtype=dtype, key=keys[i + 1] ) ) @@ -118,13 +211,13 @@ def __init__( if isinstance(out_size, tuple): n, k_new = out_size key1, key2 = jax.random.split(keys[-1]) - U = eqx.nn.Linear(k, n, use_bias=False, dtype=dtype, key=key1) - K = eqx.nn.Linear(n, k_new, use_bias=True, dtype=dtype, key=key2) + U = Linear(k, n, use_bias=False, dtype=dtype, key=key1) + K = Linear(n, k_new, use_bias=True, dtype=dtype, key=key2) k = k_new layers.append((U, K)) else: layers.append( - eqx.nn.Linear(k, out_size, use_final_bias, dtype=dtype, key=keys[-1]) + Linear(k, out_size, use_final_bias, dtype=dtype, key=keys[-1]) ) self.layers = tuple(layers) self.in_size = in_size @@ -193,7 +286,7 @@ class MLP(eqx.Module, strict=True): If you get a TypeError saying an object is not a valid JAX type, see the [FAQ](https://docs.kidger.site/equinox/faq/).""" - layers: tuple[eqx.nn.Linear, ...] + layers: tuple[Linear, ...] activation: tuple[Callable, ...] final_activation: Callable use_bias: bool = eqx.field(static=True) @@ -259,16 +352,16 @@ def __init__( if depth == 0: layers.append( - eqx.nn.Linear(in_size, out_size, use_final_bias, dtype=dtype, key=keys[0]) + Linear(in_size, out_size, use_final_bias, dtype=dtype, key=keys[0]) ) else: layers.append( - eqx.nn.Linear(in_size, width_size[0], use_bias, dtype=dtype, key=keys[0]) + Linear(in_size, width_size[0], use_bias, dtype=dtype, key=keys[0]) ) activations.append(eqx.filter_vmap(lambda: activation, axis_size=width_size[0])()) for i in range(depth - 1): layers.append( - eqx.nn.Linear( + Linear( width_size[i], width_size[i + 1], use_bias, dtype=dtype, key=keys[i + 1] ) ) From 12b61bd9b15bdfd4be783df0b0c63b9b9e3ed9bf Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Sat, 8 Feb 2025 22:52:09 +0100 Subject: [PATCH 41/55] Update normalizing flow parameters --- python/nutpie/transform_adapter.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/python/nutpie/transform_adapter.py b/python/nutpie/transform_adapter.py index b88024f..504fb36 100644 --- a/python/nutpie/transform_adapter.py +++ b/python/nutpie/transform_adapter.py @@ -520,14 +520,14 @@ def make_transform_adapter( show_progress=False, nn_depth=1, nn_width=16, - num_layers=3, + num_layers=9, num_diag_windows=10, - learning_rate=1e-3, - untransformed_dim=[1, None, -1], + learning_rate=5e-4, + untransformed_dim=None, zero_init=True, batch_size=128, reuse_opt_state=False, - max_patience=60, + max_patience=20, householder_layer=True, dct_layer=False, gamma=None, @@ -778,7 +778,7 @@ def make_coupling(key, dim, n_untransformed, **kwargs): ]) mlp1 = lambda out_size: FactoredMLP( n_untransformed, - (32, out_size), + (128, out_size), kwargs["nn_width"], depth=len(kwargs["nn_width"]), key=key, @@ -928,7 +928,8 @@ def add_default_permute(bijection, dim, key): keys = jax.random.split(key, n_layers) if untransformed_dim is None: - rng = np.random.default_rng(int(jax.random.randint(key, (), 0, 2**32))) + # TODO better rng? + rng = np.random.default_rng(int(jax.random.randint(key, (), 0, 2**30))) permutation, lengths = generate_permutations(rng, n_dim, n_layers) layers = [] for i, (key, p, length) in enumerate(zip(keys, permutation, lengths)): From f69cc55402175eb130f83fae469b2c12d071d1e2 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Mon, 10 Feb 2025 11:03:29 +0100 Subject: [PATCH 42/55] Check transformation logdet for nans --- python/nutpie/transform_adapter.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/python/nutpie/transform_adapter.py b/python/nutpie/transform_adapter.py index 504fb36..02a1cf2 100644 --- a/python/nutpie/transform_adapter.py +++ b/python/nutpie/transform_adapter.py @@ -1530,6 +1530,15 @@ def update(self, seed, positions, gradients, logps): (self.index, fit, (positions, gradients, logps)) ) + + def valid_new_logp(): + logdet, pos, grad = _inv_transform( + fit, + jnp.array(positions[-1]), + jnp.array(gradients[-1]), + ) + return np.isfinite(logdet) and np.isfinite(pos[0]).all() and np.isfinite(grad[0]).all() + if (not np.isfinite(old_loss)) and (not np.isfinite(new_loss)): self._bijection = self._make_flow_fn( seed, positions, gradients, n_layers=0 @@ -1537,7 +1546,14 @@ def update(self, seed, positions, gradients, logps): self._opt_state = None return + if not valid_new_logp(): + if self._verbose: + print("Invalid new logp. Skipping update.") + return + if not np.isfinite(new_loss): + if self._verbose: + print("Invalid new loss. Skipping update.") return if new_loss > old_loss: From 3829f07430aa85503edf8d6f716dbe7cb1ffae32 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Mon, 10 Feb 2025 18:13:47 +0100 Subject: [PATCH 43/55] Disable householder layer by default --- python/nutpie/transform_adapter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/nutpie/transform_adapter.py b/python/nutpie/transform_adapter.py index 02a1cf2..ebba8f4 100644 --- a/python/nutpie/transform_adapter.py +++ b/python/nutpie/transform_adapter.py @@ -528,7 +528,7 @@ def make_transform_adapter( batch_size=128, reuse_opt_state=False, max_patience=20, - householder_layer=True, + householder_layer=False, dct_layer=False, gamma=None, log_inside_batch=False, From 92ea636f6ba8b6209b88ef591187fc9c01dd950e Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Mon, 10 Feb 2025 19:34:06 +0100 Subject: [PATCH 44/55] Refactor transform code --- python/nutpie/normalizing_flow.py | 922 +++++++++++++ python/nutpie/transform_adapter.py | 2064 +++++++--------------------- 2 files changed, 1439 insertions(+), 1547 deletions(-) create mode 100644 python/nutpie/normalizing_flow.py diff --git a/python/nutpie/normalizing_flow.py b/python/nutpie/normalizing_flow.py new file mode 100644 index 0000000..021a687 --- /dev/null +++ b/python/nutpie/normalizing_flow.py @@ -0,0 +1,922 @@ +from typing import Union, Literal, Callable +import math +import itertools + +import jax +import jax.numpy as jnp +import equinox as eqx +from flowjax import bijections +import flowjax.distributions +import flowjax.flows +import numpy as np +from paramax import Parameterize, unwrap + + +def _generate_sequences(k, r_vals): + """ + Generate all binary sequences of length k with exactly r 1's. + The sequences are stored in a preallocated boolean NumPy array of shape (N, k), + where N = comb(k, r). A True value represents a '1' and False represents a '0'. + + Parameters: + k (int): The length of each sequence. + r (int): The exact number of ones in each sequence. + + Returns: + A NumPy boolean array of shape (comb(k, r), k) containing all sequences. + """ + all_sequences = [] + for r in r_vals: + N = math.comb(k, r) # number of sequences + sequences = np.zeros((N, k), dtype=bool) + # Use enumerate on all combinations where ones appear. + for i, ones_positions in enumerate(itertools.combinations(range(k), r)): + sequences[i, list(ones_positions)] = True + all_sequences.append(sequences) + return np.concatenate(all_sequences, axis=0) + +def _max_run_length(seq): + """ + Given a 1D boolean NumPy array 'seq', compute the maximum run length of consecutive + identical values (either True or False). + + Parameters: + seq (np.array): A 1D boolean array. + + Returns: + The length (int) of the longest run. + """ + # If the sequence is empty, return 0. + if seq.size == 0: + return 0 + + # Convert boolean to int (0 or 1) so we can use np.diff. + arr = seq.astype(int) + # Compute differences between consecutive elements. + diffs = np.diff(arr) + # Positions where the value changes: + change_indices = np.nonzero(diffs)[0] + + if change_indices.size == 0: + # No changes at all, so the entire sequence is one run. + return seq.size + + # To compute the run lengths, add the "start" index (-1) and the last index. + # For example, if change_indices = [i1, i2, ..., in], + # then the runs are: (i1 - (-1)), (i2 - i1), ..., (seq.size-1 - in). + boundaries = np.concatenate(([-1], change_indices, [seq.size - 1])) + run_lengths = np.diff(boundaries) + return int(run_lengths.max()) + +def _filter_sequences(sequences, m): + """ + Filter a 2D NumPy boolean array 'sequences' (each row a binary sequence) so that + only sequences with maximum run length (of 0's or 1's) at most m are kept. + + Parameters: + sequences (np.array): A 2D boolean array of shape (N, k). + m (int): Maximum allowed run length. + + Returns: + A NumPy array containing only the rows (sequences) that pass the filter. + """ + filtered = [] + for seq in sequences: + if _max_run_length(seq) <= m: + filtered.append(seq) + return np.array(filtered) + + +def _generate_permutations(rng, n_dim, n_layers, max_run=3): + if n_layers == 1: + r = [0, 1] + elif n_layers == 2: + r = [1] + else: + if n_layers % 2 == 0: + half = n_layers // 2 + r = [half - 1, half, half + 1] + else: + half = n_layers // 2 + r = [half, half + 1] + + all_sequences = _generate_sequences(n_layers, r) + valid_sequences = _filter_sequences(all_sequences, max_run) + + valid_sequences = np.repeat(valid_sequences, n_dim // len(valid_sequences) + 1, axis=0) + rng.shuffle(valid_sequences, axis=0) + is_in_first = valid_sequences[:n_dim] + rng = np.random.default_rng(42) + permutations = (~is_in_first).argsort(axis=0, kind="stable") + return permutations.T, is_in_first.sum(0) + + +# Fix upstream bug for zero-dimensional arrays +class Linear(eqx.Module, strict=True): + """Performs a linear transformation.""" + + weight: jax.Array + bias: jax.Array | None + in_features: Union[int, Literal["scalar"]] = eqx.field(static=True) + out_features: Union[int, Literal["scalar"]] = eqx.field(static=True) + use_bias: bool = eqx.field(static=True) + + def __init__( + self, + in_features: Union[int, Literal["scalar"]], + out_features: Union[int, Literal["scalar"]], + use_bias: bool = True, + dtype=None, + *, + key, + ): + """**Arguments:** + + - `in_features`: The input size. The input to the layer should be a vector of + shape `(in_features,)` + - `out_features`: The output size. The output from the layer will be a vector + of shape `(out_features,)`. + - `use_bias`: Whether to add on a bias as well. + - `dtype`: The dtype to use for the weight and the bias in this layer. + Defaults to either `jax.numpy.float32` or `jax.numpy.float64` depending + on whether JAX is in 64-bit mode. + - `key`: A `jax.random.PRNGKey` used to provide randomness for parameter + initialisation. (Keyword only argument.) + + Note that `in_features` also supports the string `"scalar"` as a special value. + In this case the input to the layer should be of shape `()`. + + Likewise `out_features` can also be a string `"scalar"`, in which case the + output from the layer will have shape `()`. + """ + #dtype = default_floating_dtype() if dtype is None else dtype + dtype = np.float32 if dtype is None else dtype + wkey, bkey = jax.random.split(key, 2) + in_features_ = 1 if in_features == "scalar" else in_features + out_features_ = 1 if out_features == "scalar" else out_features + if in_features_ == 0: + lim = 1.0 + else: + lim = 1 / math.sqrt(in_features_) + wshape = (out_features_, in_features_) + self.weight = eqx.nn._misc.default_init(wkey, wshape, dtype, lim) + bshape = (out_features_,) + self.bias = eqx.nn._misc.default_init(bkey, bshape, dtype, lim) if use_bias else None + + self.in_features = in_features + self.out_features = out_features + self.use_bias = use_bias + + @jax.named_scope("eqx.nn.Linear") + def __call__(self, x: jax.Array, *, key=None) -> jax.Array: + """**Arguments:** + + - `x`: The input. Should be a JAX array of shape `(in_features,)`. (Or shape + `()` if `in_features="scalar"`.) + - `key`: Ignored; provided for compatibility with the rest of the Equinox API. + (Keyword only argument.) + + !!! info + + If you want to use higher order tensors as inputs (for example featuring " + "batch dimensions) then use `jax.vmap`. For example, for an input `x` of " + "shape `(batch, in_features)`, using + ```python + linear = equinox.nn.Linear(...) + jax.vmap(linear)(x) + ``` + will produce the appropriate output of shape `(batch, out_features)`. + + **Returns:** + + A JAX array of shape `(out_features,)`. (Or shape `()` if + `out_features="scalar"`.) + """ + + if self.in_features == "scalar": + if jnp.shape(x) != (): + raise ValueError("x must have scalar shape") + x = jnp.broadcast_to(x, (1,)) + x = self.weight @ x + if self.bias is not None: + x = x + self.bias + if self.out_features == "scalar": + assert jnp.shape(x) == (1,) + x = jnp.squeeze(x) + return x + +class FactoredMLP(eqx.Module, strict=True): + """Standard Multi-Layer Perceptron; also known as a feed-forward network. + + !!! faq + + If you get a TypeError saying an object is not a valid JAX type, see the + [FAQ](https://docs.kidger.site/equinox/faq/).""" + + layers: tuple[tuple[Linear, Linear], ...] + activation: tuple[Callable, ...] + final_activation: Callable + use_bias: bool = eqx.field(static=True) + use_final_bias: bool = eqx.field(static=True) + in_size: Union[int, Literal["scalar"]] = eqx.field(static=True) + out_size: Union[int, Literal["scalar"]] = eqx.field(static=True) + width_size: tuple[int, ...] = eqx.field(static=True) + depth: int = eqx.field(static=True) + + def __init__( + self, + in_size: Union[int, Literal["scalar"]], + out_size: Union[int, Literal["scalar"]], + width_size: int | tuple[int | tuple[int, int], ...], + depth: int, + activation: Callable = jax.nn.relu, + final_activation: Callable = lambda x: x, + use_bias: bool = True, + use_final_bias: bool = True, + dtype=None, + *, + key, + ): + """**Arguments**: + + - `in_size`: The input size. The input to the module should be a vector of + shape `(in_features,)` + - `out_size`: The output size. The output from the module will be a vector + of shape `(out_features,)`. + - `width_size`: The size of each hidden layer. + - `depth`: The number of hidden layers, including the output layer. + For example, `depth=2` results in an network with layers: + [`Linear(in_size, width_size)`, `Linear(width_size, width_size)`, + `Linear(width_size, out_size)`]. + - `activation`: The activation function after each hidden layer. Defaults to + ReLU. + - `final_activation`: The activation function after the output layer. Defaults + to the identity. + - `use_bias`: Whether to add on a bias to internal layers. Defaults + to `True`. + - `use_final_bias`: Whether to add on a bias to the final layer. Defaults + to `True`. + - `dtype`: The dtype to use for all the weights and biases in this MLP. + Defaults to either `jax.numpy.float32` or `jax.numpy.float64` depending + on whether JAX is in 64-bit mode. + - `key`: A `jax.random.PRNGKey` used to provide randomness for parameter + initialisation. (Keyword only argument.) + + Note that `in_size` also supports the string `"scalar"` as a special value. + In this case the input to the module should be of shape `()`. + + Likewise `out_size` can also be a string `"scalar"`, in which case the + output from the module will have shape `()`. + """ + #dtype = default_floating_dtype() if dtype is None else dtype + keys = jax.random.split(key, depth + 1) + layers = [] + if isinstance(width_size, int): + width_size = (width_size,) * depth + + assert len(width_size) == depth + activations: list[Callable] = [] + + if depth == 0: + layers.append( + Linear(in_size, out_size, use_final_bias, dtype=dtype, key=keys[0]) + ) + else: + if isinstance(width_size[0], tuple): + n, k = width_size[0] + key1, key2 = jax.random.split(keys[0]) + U = Linear(in_size, n, use_bias=False, dtype=dtype, key=key1) + K = Linear(n, k, use_bias=True, dtype=dtype, key=key2) + layers.append((U, K)) + else: + k = width_size[0] + layers.append( + Linear(in_size, k, use_bias, dtype=dtype, key=keys[0]) + ) + activations.append(eqx.filter_vmap(lambda: activation, axis_size=k)()) + + for i in range(depth - 1): + if isinstance(width_size[i + 1], tuple): + n, k_new = width_size[i + 1] + key1, key2 = jax.random.split(keys[i + 1]) + U = Linear(k, n, use_bias=False, dtype=dtype, key=key1) + K = Linear(n, k_new, use_bias=True, dtype=dtype, key=key2) + layers.append((U, K)) + k = k_new + else: + layers.append( + Linear( + k, width_size[i + 1], use_bias, dtype=dtype, key=keys[i + 1] + ) + ) + k = width_size[i + 1] + activations.append(eqx.filter_vmap(lambda: activation, axis_size=k)()) + + if isinstance(out_size, tuple): + n, k_new = out_size + key1, key2 = jax.random.split(keys[-1]) + U = Linear(k, n, use_bias=False, dtype=dtype, key=key1) + K = Linear(n, k_new, use_bias=True, dtype=dtype, key=key2) + k = k_new + layers.append((U, K)) + else: + layers.append( + Linear(k, out_size, use_final_bias, dtype=dtype, key=keys[-1]) + ) + self.layers = tuple(layers) + self.in_size = in_size + self.out_size = out_size + self.width_size = width_size + self.depth = depth + # In case `activation` or `final_activation` are learnt, then make a separate + # copy of their weights for every neuron. + self.activation = tuple(activations) + #self.activation = eqx.filter_vmap( + # eqx.filter_vmap(lambda: activation), axis_size=depth + #)() + if out_size == "scalar": + self.final_activation = final_activation + else: + self.final_activation = eqx.filter_vmap( + lambda: final_activation, axis_size=out_size + )() + self.use_bias = use_bias + self.use_final_bias = use_final_bias + + @jax.named_scope("eqx.nn.MLP") + def __call__(self, x: jax.Array, *, key = None) -> jax.Array: + """**Arguments:** + + - `x`: A JAX array with shape `(in_size,)`. (Or shape `()` if + `in_size="scalar"`.) + - `key`: Ignored; provided for compatibility with the rest of the Equinox API. + (Keyword only argument.) + + **Returns:** + + A JAX array with shape `(out_size,)`. (Or shape `()` if `out_size="scalar"`.) + """ + for i, (layer, act) in enumerate(zip(self.layers[:-1], self.activation)): + if isinstance(layer, tuple): + U, K = layer + x = U(x) + x = K(x) + else: + x = layer(x) + layer_activation = jax.tree.map( + lambda x: x[i] if eqx.is_array(x) else x, act + ) + x = eqx.filter_vmap(lambda a, b: a(b))(layer_activation, x) + + if isinstance(self.layers[-1], tuple): + U, K = self.layers[-1] + x = U(x) + x = K(x) + else: + x = self.layers[-1](x) + + if self.out_size == "scalar": + x = self.final_activation(x) + else: + x = eqx.filter_vmap(lambda a, b: a(b))(self.final_activation, x) + return x + + + +def make_mvscale(key, n_dim, size, randomize_base=False): + def make_single_hh(key, idx): + key1, key2 = jax.random.split(key) + params = jax.random.normal(key1, (n_dim,)) + params = params / jnp.linalg.norm(params) + mvscale = bijections.MvScale(params) + return mvscale + + keys = jax.random.split(key, size) + + if randomize_base: + key, key_base = jax.random.split(key) + indices = jax.random.randint(key_base, (size,), 0, n_dim) + else: + indices = [val % n_dim for val in range(size)] + + return bijections.Chain([make_single_hh(key, idx) for key, idx in zip(keys, indices)]) + +def make_hh(key, n_dim, size, randomize_base=False): + def make_single_hh(key, idx): + key1, key2 = jax.random.split(key) + params = jax.random.normal(key1, (n_dim,)) * 1e-2 + return bijections.Householder(params, base_index=idx) + + keys = jax.random.split(key, size) + + if randomize_base: + key, key_base = jax.random.split(key) + indices = jax.random.randint(key_base, (size,), 0, n_dim) + else: + indices = [val % n_dim for val in range(size)] + + return bijections.Chain([make_single_hh(key, idx) for key, idx in zip(keys, indices)]) + +def make_elemwise_trafo(key, n_dim, *, count=1): + def make_elemwise(key, loc): + key1, key2 = jax.random.split(key) + scale = Parameterize( + lambda x: x + jnp.sqrt(1 + x**2), + jnp.zeros(()) + ) + theta = Parameterize( + lambda x: x + jnp.sqrt(1 + x**2), + jnp.zeros(()) + ) + + affine = bijections.AsymmetricAffine( + loc, + jnp.ones(()), + jnp.ones(()), + ) + + affine = eqx.tree_at( + where=lambda aff: aff.scale, + pytree=affine, + replace=scale, + ) + affine = eqx.tree_at( + where=lambda aff: aff.theta, + pytree=affine, + replace=theta, + ) + + return affine + + def make(key): + keys = jax.random.split(key, count + 1) + key, keys = keys[0], keys[1:] + loc = jax.random.normal(key=key, shape=(count,)) * 2 + loc = loc - loc.mean() + return bijections.Chain([make_elemwise(key, mu) for key, mu in zip(keys, loc)]) + + keys = jax.random.split(key, n_dim) + make_affine = eqx.filter_vmap(make, axis_size=n_dim)(keys) + return bijections.Vmap(make_affine, in_axes=eqx.if_array(0)) + +def make_elemwise_trafo_(key, n_dim, *, count=1): + def make_elemwise(key): + scale = Parameterize( + lambda x: x + jnp.sqrt(1 + x**2), + jax.random.normal(key=key) / 5, + ) + theta = Parameterize( + lambda x: x + jnp.sqrt(1 + x**2), + jax.random.normal(key=key) / 5, + ) + + affine = bijections.AsymmetricAffine( + jax.random.normal(key=key) * 2, + jnp.ones(()), + jnp.ones(()), + ) + + affine = eqx.tree_at( + where=lambda aff: aff.scale, + pytree=affine, + replace=scale, + ) + affine = eqx.tree_at( + where=lambda aff: aff.theta, + pytree=affine, + replace=theta, + ) + + return affine + + def make(key): + keys = jax.random.split(key, count) + return bijections.Scan(eqx.filter_vmap(make_elemwise)(keys)) + + keys = jax.random.split(key, n_dim) + make_affine = eqx.filter_vmap(make)(keys) + return bijections.Vmap(make_affine()) + +def make_coupling(key, dim, n_untransformed, **kwargs): + n_transformed = dim - n_untransformed + + mvscale = make_mvscale(key, n_transformed, 1, randomize_base=True) + + nn_width = kwargs.get("nn_width", None) + + if nn_width is None: + if dim > 128: + nn_width = (64, 2 * dim) + else: + nn_width = 2 * dim + + transformer = bijections.Chain([ + make_elemwise_trafo(key, n_transformed, count=3), + mvscale, + ]) + + def make_mlp(out_size): + if isinstance(nn_width, tuple): + out = (nn_width[0], out_size) + else: + out = out_size + + return FactoredMLP( + n_untransformed, + out, + nn_width, + depth=1, + key=key, + dtype=jnp.float32, + activation=jax.nn.gelu, + ) + + return bijections.Coupling( + key, + transformer=transformer, + untransformed_dim=n_untransformed, + dim=dim, + conditioner=make_mlp, + nn_depth=1, + **kwargs, + ) + +def make_flow( + seed, + positions, + gradients, + *, + zero_init=False, + householder_layer=False, + dct_layer=False, + untransformed_dim: int | list[int | None] | None = None, + n_layers, + nn_width=None, +): + from flowjax import bijections + + positions = np.array(positions) + gradients = np.array(gradients) + + if len(positions) == 0: + return + + n_draws, n_dim = positions.shape + + if n_dim < 2: + n_layers = 0 + + assert positions.shape == gradients.shape + + if n_draws == 0: + raise ValueError("No draws") + elif n_draws == 1: + assert np.all(gradients != 0) + diag = np.clip(1 / jnp.sqrt(jnp.abs(gradients[0])), 1e-5, 1e5) + assert np.isfinite(diag).all() + mean = jnp.zeros_like(diag) + else: + pos_std = np.clip(positions.std(0), 1e-8, 1e8) + grad_std = np.clip(gradients.std(0), 1e-8, 1e8) + diag = jnp.sqrt(pos_std / grad_std) + mean = positions.mean(0) + gradients.mean(0) * diag * diag + + key = jax.random.PRNGKey(seed % (2**63)) + + diag_param = Parameterize( + lambda x: x + jnp.sqrt(1 + x**2), + (diag**2 - 1) / (2 * diag), + ) + diag_affine = bijections.Affine(mean, diag) + diag_affine = eqx.tree_at( + where=lambda aff: aff.scale, + pytree=diag_affine, + replace=diag_param, + ) + + flows = [ + diag_affine, + ] + + if n_layers == 0: + return bijections.Chain(flows) + + scale = Parameterize( + lambda x: x + jnp.sqrt(1 + x**2), + jnp.zeros(n_dim), + ) + affine = eqx.tree_at( + where=lambda aff: aff.scale, + pytree=bijections.Affine(jnp.zeros(n_dim), jnp.ones(n_dim)), + replace=scale, + ) + + def make_layer(key, untransformed_dim: int | None, permutation=None): + key, key_couple, key_permute, key_hh = jax.random.split(key, 4) + + if untransformed_dim is None: + untransformed_dim = n_dim // 2 + + if untransformed_dim < 0: + untransformed_dim = n_dim + untransformed_dim + + coupling = make_coupling( + key_couple, + n_dim, + untransformed_dim, + nn_activation=jax.nn.gelu, + nn_width=nn_width + ) + + if zero_init: + coupling = jax.tree_util.tree_map( + lambda x: x * 1e-3 if eqx.is_inexact_array(x) else x, + coupling, + ) + + flow = coupling + + if householder_layer: + hh = make_hh(key_hh, n_dim, 1, randomize_base=False) + flow = bijections.Sandwich(hh, flow) + + def add_default_permute(bijection, dim, key): + if dim == 1: + return bijection + if dim == 2: + outer = bijections.Flip((dim,)) + else: + outer = bijections.Permute( + jax.random.permutation(key, jnp.arange(dim)) + ) + + return bijections.Sandwich(outer, bijection) + + if permutation is None: + flow = add_default_permute(flow, n_dim, key_permute) + else: + flow = bijections.Sandwich(bijections.Permute(permutation), flow) + + mvscale = make_mvscale(key, n_dim, 1, randomize_base=True) + + flow = bijections.Chain( + [ + mvscale, + flow, + ] + ) + + return flow + + key, key_permute = jax.random.split(key) + keys = jax.random.split(key, n_layers) + + if untransformed_dim is None: + # TODO better rng? + rng = np.random.default_rng(int(jax.random.randint(key, (), 0, 2**30))) + permutation, lengths = _generate_permutations(rng, n_dim, n_layers) + layers = [] + for i, (key, p, length) in enumerate(zip(keys, permutation, lengths)): + layers.append(make_layer(key, int(length), p)) + bijection = bijections.Chain(layers) + elif isinstance(untransformed_dim, int): + make_layers = eqx.filter_vmap(make_layer) + layers = make_layers(keys, untransformed_dim) + bijection = bijections.Scan(layers) + else: + layers = [] + for i, (key, num_untrafo) in enumerate(zip(keys, untransformed_dim)): + if i % 2 == 0 or not dct_layer: + layers.append(make_layer(key, num_untrafo)) + else: + inner = make_layer(key, num_untrafo) + outer = bijections.DCT(inner.shape) + + layers.append(bijections.Sandwich(outer, inner)) + + bijection = bijections.Chain(layers) + + return bijections.Chain([bijection, *flows]) + +def extend_flow( + key, + base, + loss_fn, + positions, + gradients, + logps, + layer: int, + *, + extension_var_count=4, + zero_init=False, + householder_layer=False, + untransformed_dim: int | list[int | None] | None = None, + dct: bool = False, + extension_var_trafo_count=2, + verbose: bool = False, +): + n_draws, n_dim = positions.shape + + if n_dim < 2: + return base + + if n_dim <= extension_var_count: + extension_var_count = n_dim - 1 + extension_var_trafo_count = 1 + + if dct: + flow = flowjax.flows.Transformed( + flowjax.distributions.StandardNormal(base.shape), + bijections.Chain([bijections.DCT(shape=(n_dim,)), base]), + ) + else: + flow = flowjax.flows.Transformed( + flowjax.distributions.StandardNormal(base.shape), base + ) + + params, static = eqx.partition(flow, eqx.is_inexact_array) + costs = loss_fn( + params, + static, + positions, + gradients, + logps, + return_elemwise_costs=True, + ) + + if verbose: + print(max(costs), costs) + print("dct:", dct) + idxs = np.argsort(costs) + + permute = bijections.Permute(idxs) + + if True: + scale = Parameterize( + lambda x: x + jnp.sqrt(1 + x**2), + jnp.array(0.0), + ) + theta = Parameterize( + lambda x: x + jnp.sqrt(1 + x**2), + jnp.array(0.0), + ) + + affine = bijections.AsymmetricAffine(jnp.zeros(()), jnp.ones(()), jnp.ones(())) + + affine = eqx.tree_at( + where=lambda aff: aff.scale, + pytree=affine, + replace=scale, + ) + affine = eqx.tree_at( + where=lambda aff: aff.theta, + pytree=affine, + replace=theta, + ) + + do_flip = layer % 2 == 0 + + if nn_width is None: + width = 16 + else: + width = nn_width + + if do_flip: + coupling = bijections.coupling.Coupling( + key, + transformer=affine, + untransformed_dim=n_dim - extension_var_trafo_count, + dim=n_dim, + nn_activation=jax.nn.gelu, + nn_width=width, + nn_depth=nn_depth, + ) + + inner_permute = bijections.Permute( + jnp.concatenate( + [ + jnp.arange(n_dim - extension_var_count), + jax.random.permutation( + key, jnp.arange(n_dim - extension_var_count, n_dim) + ), + ] + ) + ) + else: + coupling = bijections.coupling.Coupling( + key, + transformer=affine, + untransformed_dim=extension_var_trafo_count, + dim=n_dim, + nn_activation=jax.nn.gelu, + nn_width=width, + nn_depth=nn_depth, + ) + + inner_permute = bijections.Permute( + jnp.concatenate( + [ + jax.random.permutation( + key, jnp.arange(n_dim - extension_var_count, n_dim) + ), + jnp.arange(n_dim - extension_var_count), + ] + ) + ) + + if zero_init: + coupling = jax.tree_util.tree_map( + lambda x: x * 1e-3 if eqx.is_inexact_array(x) else x, + coupling, + ) + + inner = bijections.Sandwich(inner_permute, coupling) + + if False: + scale = Parameterize( + lambda x: x + jnp.sqrt(1 + x**2), + jnp.array(0.0), + ) + affine = eqx.tree_at( + where=lambda aff: aff.scale, + pytree=flowjax.bijections.Affine(), + replace=scale, + ) + + if nn_width is None: + width = 16 + else: + width = nn_width + + coupling = flowjax.bijections.coupling.Coupling( + key, + transformer=affine, + untransformed_dim=extension_var_trafo_count, + dim=n_dim, + nn_activation=jax.nn.gelu, + nn_width=width, + nn_depth=nn_depth, + ) + + if zero_init: + coupling = jax.tree_util.tree_map( + lambda x: x * 1e-3 if eqx.is_inexact_array(x) else x, + coupling, + ) + + if verbose: + print(costs[permute.permutation][inner.outer.permutation]) + + inner = bijections.Sandwich( + inner.outer, + bijections.Chain( + [ + bijections.Sandwich( + bijections.Flip(shape=(n_dim,)), coupling + ), + inner.inner, + ] + ), + ) + + if dct: + new_layer = bijections.Sandwich( + bijections.DCT(shape=(n_dim,)), + bijections.Sandwich(permute, inner), + ) + else: + new_layer = bijections.Sandwich(permute, inner) + + scale = Parameterize( + lambda x: x + jnp.sqrt(1 + x**2), + jnp.zeros(n_dim), + ) + affine = eqx.tree_at( + where=lambda aff: aff.scale, + pytree=bijections.Affine(jnp.zeros(n_dim), jnp.ones(n_dim)), + replace=scale, + ) + + pre = [] + if layer % 2 == 0: + pre.append(bijections.Neg(shape=(n_dim,))) + + nonlin_layer = bijections.Sandwich( + bijections.Chain( + [ + *pre, + bijections.Vmap(bijections.SoftPlusX(), axis_size=n_dim), + ] + ), + affine, + ) + scale = Parameterize( + lambda x: x + jnp.sqrt(1 + x**2), + jnp.zeros(n_dim), + ) + affine = eqx.tree_at( + where=lambda aff: aff.scale, + pytree=bijections.Affine(jnp.zeros(n_dim), jnp.ones(n_dim)), + replace=scale, + ) + return bijections.Chain([new_layer, nonlin_layer, affine, base]) diff --git a/python/nutpie/transform_adapter.py b/python/nutpie/transform_adapter.py index ebba8f4..9721d7c 100644 --- a/python/nutpie/transform_adapter.py +++ b/python/nutpie/transform_adapter.py @@ -1,1650 +1,620 @@ from typing import Callable, Literal, Union, cast -import itertools import math +from functools import partial + import numpy as np import equinox as eqx import jax import jax.numpy as jnp +import traceback +import flowjax +import flowjax.flows +import flowjax.train +from flowjax import bijections +import optax +from paramax import Parameterize, unwrap + +from nutpie.normalizing_flow import extend_flow, make_flow _BIJECTION_TRACE = [] -class Linear(eqx.Module, strict=True): - """Performs a linear transformation.""" - weight: jax.Array - bias: jax.Array | None - in_features: Union[int, Literal["scalar"]] = eqx.field(static=True) - out_features: Union[int, Literal["scalar"]] = eqx.field(static=True) - use_bias: bool = eqx.field(static=True) +class FisherLoss: + def __init__(self, gamma=None, log_inside_batch=False): + self._gamma = gamma + self._log_inside_batch = log_inside_batch - def __init__( + @eqx.filter_jit + def __call__( self, - in_features: Union[int, Literal["scalar"]], - out_features: Union[int, Literal["scalar"]], - use_bias: bool = True, - dtype=None, - *, - key, + params, + static, + draws, + grads, + logps, + condition=None, + key=None, + return_all_costs=False, + return_elemwise_costs=False, ): - """**Arguments:** - - - `in_features`: The input size. The input to the layer should be a vector of - shape `(in_features,)` - - `out_features`: The output size. The output from the layer will be a vector - of shape `(out_features,)`. - - `use_bias`: Whether to add on a bias as well. - - `dtype`: The dtype to use for the weight and the bias in this layer. - Defaults to either `jax.numpy.float32` or `jax.numpy.float64` depending - on whether JAX is in 64-bit mode. - - `key`: A `jax.random.PRNGKey` used to provide randomness for parameter - initialisation. (Keyword only argument.) - - Note that `in_features` also supports the string `"scalar"` as a special value. - In this case the input to the layer should be of shape `()`. - - Likewise `out_features` can also be a string `"scalar"`, in which case the - output from the layer will have shape `()`. - """ - #dtype = default_floating_dtype() if dtype is None else dtype - dtype = np.float32 if dtype is None else dtype - wkey, bkey = jax.random.split(key, 2) - in_features_ = 1 if in_features == "scalar" else in_features - out_features_ = 1 if out_features == "scalar" else out_features - if in_features_ == 0: - lim = 1.0 - else: - lim = 1 / math.sqrt(in_features_) - wshape = (out_features_, in_features_) - self.weight = eqx.nn._misc.default_init(wkey, wshape, dtype, lim) - bshape = (out_features_,) - self.bias = eqx.nn._misc.default_init(bkey, bshape, dtype, lim) if use_bias else None - - self.in_features = in_features - self.out_features = out_features - self.use_bias = use_bias - - @jax.named_scope("eqx.nn.Linear") - def __call__(self, x: jax.Array, *, key=None) -> jax.Array: - """**Arguments:** - - - `x`: The input. Should be a JAX array of shape `(in_features,)`. (Or shape - `()` if `in_features="scalar"`.) - - `key`: Ignored; provided for compatibility with the rest of the Equinox API. - (Keyword only argument.) - - !!! info - - If you want to use higher order tensors as inputs (for example featuring " - "batch dimensions) then use `jax.vmap`. For example, for an input `x` of " - "shape `(batch, in_features)`, using - ```python - linear = equinox.nn.Linear(...) - jax.vmap(linear)(x) - ``` - will produce the appropriate output of shape `(batch, out_features)`. - - **Returns:** - - A JAX array of shape `(out_features,)`. (Or shape `()` if - `out_features="scalar"`.) - """ - - if self.in_features == "scalar": - if jnp.shape(x) != (): - raise ValueError("x must have scalar shape") - x = jnp.broadcast_to(x, (1,)) - x = self.weight @ x - if self.bias is not None: - x = x + self.bias - if self.out_features == "scalar": - assert jnp.shape(x) == (1,) - x = jnp.squeeze(x) - return x - -class FactoredMLP(eqx.Module, strict=True): - """Standard Multi-Layer Perceptron; also known as a feed-forward network. - - !!! faq - - If you get a TypeError saying an object is not a valid JAX type, see the - [FAQ](https://docs.kidger.site/equinox/faq/).""" - - layers: tuple[tuple[Linear, Linear], ...] - activation: tuple[Callable, ...] - final_activation: Callable - use_bias: bool = eqx.field(static=True) - use_final_bias: bool = eqx.field(static=True) - in_size: Union[int, Literal["scalar"]] = eqx.field(static=True) - out_size: Union[int, Literal["scalar"]] = eqx.field(static=True) - width_size: tuple[int, ...] = eqx.field(static=True) - depth: int = eqx.field(static=True) + flow = unwrap(eqx.combine(params, static, is_leaf=eqx.is_inexact_array)) - def __init__( - self, - in_size: Union[int, Literal["scalar"]], - out_size: Union[int, Literal["scalar"]], - width_size: int | tuple[int | tuple[int, int], ...], - depth: int, - activation: Callable = jax.nn.relu, - final_activation: Callable = lambda x: x, - use_bias: bool = True, - use_final_bias: bool = True, - dtype=None, - *, - key, - ): - """**Arguments**: - - - `in_size`: The input size. The input to the module should be a vector of - shape `(in_features,)` - - `out_size`: The output size. The output from the module will be a vector - of shape `(out_features,)`. - - `width_size`: The size of each hidden layer. - - `depth`: The number of hidden layers, including the output layer. - For example, `depth=2` results in an network with layers: - [`Linear(in_size, width_size)`, `Linear(width_size, width_size)`, - `Linear(width_size, out_size)`]. - - `activation`: The activation function after each hidden layer. Defaults to - ReLU. - - `final_activation`: The activation function after the output layer. Defaults - to the identity. - - `use_bias`: Whether to add on a bias to internal layers. Defaults - to `True`. - - `use_final_bias`: Whether to add on a bias to the final layer. Defaults - to `True`. - - `dtype`: The dtype to use for all the weights and biases in this MLP. - Defaults to either `jax.numpy.float32` or `jax.numpy.float64` depending - on whether JAX is in 64-bit mode. - - `key`: A `jax.random.PRNGKey` used to provide randomness for parameter - initialisation. (Keyword only argument.) - - Note that `in_size` also supports the string `"scalar"` as a special value. - In this case the input to the module should be of shape `()`. - - Likewise `out_size` can also be a string `"scalar"`, in which case the - output from the module will have shape `()`. - """ - #dtype = default_floating_dtype() if dtype is None else dtype - keys = jax.random.split(key, depth + 1) - layers = [] - if isinstance(width_size, int): - width_size = (width_size,) * depth - - assert len(width_size) == depth - activations: list[Callable] = [] - - if depth == 0: - layers.append( - Linear(in_size, out_size, use_final_bias, dtype=dtype, key=keys[0]) - ) - else: - if isinstance(width_size[0], tuple): - n, k = width_size[0] - key1, key2 = jax.random.split(keys[0]) - U = Linear(in_size, n, use_bias=False, dtype=dtype, key=key1) - K = Linear(n, k, use_bias=True, dtype=dtype, key=key2) - layers.append((U, K)) - else: - k = width_size[0] - layers.append( - Linear(in_size, k, use_bias, dtype=dtype, key=keys[0]) - ) - activations.append(eqx.filter_vmap(lambda: activation, axis_size=k)()) - - for i in range(depth - 1): - if isinstance(width_size[i + 1], tuple): - n, k_new = width_size[i + 1] - key1, key2 = jax.random.split(keys[i + 1]) - U = Linear(k, n, use_bias=False, dtype=dtype, key=key1) - K = Linear(n, k_new, use_bias=True, dtype=dtype, key=key2) - layers.append((U, K)) - k = k_new + if return_elemwise_costs: + + def compute_loss(bijection, draw, grad, logp): + if True: + draw, grad, logp = bijection.inverse_gradient_and_val_( + draw, grad, logp + ) else: - layers.append( - Linear( - k, width_size[i + 1], use_bias, dtype=dtype, key=keys[i + 1] + draw, grad, logp = ( + flowjax.bijections.AbstractBijection.inverse_gradient_and_val_( + bijection, draw, grad, logp ) ) - k = width_size[i + 1] - activations.append(eqx.filter_vmap(lambda: activation, axis_size=k)()) - - if isinstance(out_size, tuple): - n, k_new = out_size - key1, key2 = jax.random.split(keys[-1]) - U = Linear(k, n, use_bias=False, dtype=dtype, key=key1) - K = Linear(n, k_new, use_bias=True, dtype=dtype, key=key2) - k = k_new - layers.append((U, K)) - else: - layers.append( - Linear(k, out_size, use_final_bias, dtype=dtype, key=keys[-1]) - ) - self.layers = tuple(layers) - self.in_size = in_size - self.out_size = out_size - self.width_size = width_size - self.depth = depth - # In case `activation` or `final_activation` are learnt, then make a separate - # copy of their weights for every neuron. - self.activation = tuple(activations) - #self.activation = eqx.filter_vmap( - # eqx.filter_vmap(lambda: activation), axis_size=depth - #)() - if out_size == "scalar": - self.final_activation = final_activation - else: - self.final_activation = eqx.filter_vmap( - lambda: final_activation, axis_size=out_size - )() - self.use_bias = use_bias - self.use_final_bias = use_final_bias - - @jax.named_scope("eqx.nn.MLP") - def __call__(self, x: jax.Array, *, key = None) -> jax.Array: - """**Arguments:** - - - `x`: A JAX array with shape `(in_size,)`. (Or shape `()` if - `in_size="scalar"`.) - - `key`: Ignored; provided for compatibility with the rest of the Equinox API. - (Keyword only argument.) - - **Returns:** - - A JAX array with shape `(out_size,)`. (Or shape `()` if `out_size="scalar"`.) - """ - for i, (layer, act) in enumerate(zip(self.layers[:-1], self.activation)): - if isinstance(layer, tuple): - U, K = layer - x = U(x) - x = K(x) - else: - x = layer(x) - layer_activation = jax.tree.map( - lambda x: x[i] if eqx.is_array(x) else x, act + cost = (draw + grad) ** 2 + return cost + + costs = jax.vmap(compute_loss, [None, 0, 0, 0])( + flow.bijection, + draws, + grads, + logps, ) - x = eqx.filter_vmap(lambda a, b: a(b))(layer_activation, x) + return costs.mean(0) - if isinstance(self.layers[-1], tuple): - U, K = self.layers[-1] - x = U(x) - x = K(x) - else: - x = self.layers[-1](x) + if self._gamma is None: - if self.out_size == "scalar": - x = self.final_activation(x) - else: - x = eqx.filter_vmap(lambda a, b: a(b))(self.final_activation, x) - return x - - -class MLP(eqx.Module, strict=True): - """Standard Multi-Layer Perceptron; also known as a feed-forward network. - - !!! faq - - If you get a TypeError saying an object is not a valid JAX type, see the - [FAQ](https://docs.kidger.site/equinox/faq/).""" - - layers: tuple[Linear, ...] - activation: tuple[Callable, ...] - final_activation: Callable - use_bias: bool = eqx.field(static=True) - use_final_bias: bool = eqx.field(static=True) - in_size: Union[int, Literal["scalar"]] = eqx.field(static=True) - out_size: Union[int, Literal["scalar"]] = eqx.field(static=True) - width_size: tuple[int, ...] = eqx.field(static=True) - depth: int = eqx.field(static=True) - - def __init__( - self, - in_size: Union[int, Literal["scalar"]], - out_size: Union[int, Literal["scalar"]], - width_size: int | tuple[int, ...], - depth: int, - activation: Callable = jax.nn.relu, - final_activation: Callable = lambda x: x, - use_bias: bool = True, - use_final_bias: bool = True, - dtype=None, - *, - key, - ): - """**Arguments**: - - - `in_size`: The input size. The input to the module should be a vector of - shape `(in_features,)` - - `out_size`: The output size. The output from the module will be a vector - of shape `(out_features,)`. - - `width_size`: The size of each hidden layer. - - `depth`: The number of hidden layers, including the output layer. - For example, `depth=2` results in an network with layers: - [`Linear(in_size, width_size)`, `Linear(width_size, width_size)`, - `Linear(width_size, out_size)`]. - - `activation`: The activation function after each hidden layer. Defaults to - ReLU. - - `final_activation`: The activation function after the output layer. Defaults - to the identity. - - `use_bias`: Whether to add on a bias to internal layers. Defaults - to `True`. - - `use_final_bias`: Whether to add on a bias to the final layer. Defaults - to `True`. - - `dtype`: The dtype to use for all the weights and biases in this MLP. - Defaults to either `jax.numpy.float32` or `jax.numpy.float64` depending - on whether JAX is in 64-bit mode. - - `key`: A `jax.random.PRNGKey` used to provide randomness for parameter - initialisation. (Keyword only argument.) - - Note that `in_size` also supports the string `"scalar"` as a special value. - In this case the input to the module should be of shape `()`. - - Likewise `out_size` can also be a string `"scalar"`, in which case the - output from the module will have shape `()`. - """ - #dtype = default_floating_dtype() if dtype is None else dtype - keys = jax.random.split(key, depth + 1) - layers = [] - if isinstance(width_size, int): - width_size = (width_size,) * depth - - assert len(width_size) == depth - activations: list[Callable] = [] - - if depth == 0: - layers.append( - Linear(in_size, out_size, use_final_bias, dtype=dtype, key=keys[0]) - ) - else: - layers.append( - Linear(in_size, width_size[0], use_bias, dtype=dtype, key=keys[0]) - ) - activations.append(eqx.filter_vmap(lambda: activation, axis_size=width_size[0])()) - for i in range(depth - 1): - layers.append( - Linear( - width_size[i], width_size[i + 1], use_bias, dtype=dtype, key=keys[i + 1] - ) + def compute_loss(bijection, draw, grad, logp): + draw, grad, logp = bijection.inverse_gradient_and_val_( + draw, grad, logp ) - activations.append(eqx.filter_vmap(lambda: activation, axis_size=width_size[i])()) - layers.append( - eqx.nn.Linear(width_size[-1], out_size, use_final_bias, dtype=dtype, key=keys[-1]) + cost = ((draw + grad) ** 2).sum() + return cost + + costs = jax.vmap(compute_loss, [None, 0, 0, 0])( + flow.bijection, + draws, + grads, + logps, ) - self.layers = tuple(layers) - self.in_size = in_size - self.out_size = out_size - self.width_size = width_size - self.depth = depth - # In case `activation` or `final_activation` are learnt, then make a separate - # copy of their weights for every neuron. - self.activation = tuple(activations) - #self.activation = eqx.filter_vmap( - # eqx.filter_vmap(lambda: activation), axis_size=depth - #)() - if out_size == "scalar": - self.final_activation = final_activation - else: - self.final_activation = eqx.filter_vmap( - lambda: final_activation, axis_size=out_size - )() - self.use_bias = use_bias - self.use_final_bias = use_final_bias - - @jax.named_scope("eqx.nn.MLP") - def __call__(self, x: jax.Array, *, key = None) -> jax.Array: - """**Arguments:** - - - `x`: A JAX array with shape `(in_size,)`. (Or shape `()` if - `in_size="scalar"`.) - - `key`: Ignored; provided for compatibility with the rest of the Equinox API. - (Keyword only argument.) - - **Returns:** - - A JAX array with shape `(out_size,)`. (Or shape `()` if `out_size="scalar"`.) - """ - for i, (layer, act) in enumerate(zip(self.layers[:-1], self.activation)): - x = layer(x) - layer_activation = jax.tree.map( - lambda x: x[i] if eqx.is_array(x) else x, act - ) - x = eqx.filter_vmap(lambda a, b: a(b))(layer_activation, x) - x = self.layers[-1](x) - if self.out_size == "scalar": - x = self.final_activation(x) - else: - x = eqx.filter_vmap(lambda a, b: a(b))(self.final_activation, x) - return x - -def generate_sequences(k, r_vals): - """ - Generate all binary sequences of length k with exactly r 1's. - The sequences are stored in a preallocated boolean NumPy array of shape (N, k), - where N = comb(k, r). A True value represents a '1' and False represents a '0'. - - Parameters: - k (int): The length of each sequence. - r (int): The exact number of ones in each sequence. - - Returns: - A NumPy boolean array of shape (comb(k, r), k) containing all sequences. - """ - all_sequences = [] - for r in r_vals: - N = math.comb(k, r) # number of sequences - sequences = np.zeros((N, k), dtype=bool) - # Use enumerate on all combinations where ones appear. - for i, ones_positions in enumerate(itertools.combinations(range(k), r)): - sequences[i, list(ones_positions)] = True - all_sequences.append(sequences) - return np.concatenate(all_sequences, axis=0) - -def max_run_length(seq): - """ - Given a 1D boolean NumPy array 'seq', compute the maximum run length of consecutive - identical values (either True or False). - - Parameters: - seq (np.array): A 1D boolean array. - - Returns: - The length (int) of the longest run. - """ - # If the sequence is empty, return 0. - if seq.size == 0: - return 0 - - # Convert boolean to int (0 or 1) so we can use np.diff. - arr = seq.astype(int) - # Compute differences between consecutive elements. - diffs = np.diff(arr) - # Positions where the value changes: - change_indices = np.nonzero(diffs)[0] - - if change_indices.size == 0: - # No changes at all, so the entire sequence is one run. - return seq.size - - # To compute the run lengths, add the "start" index (-1) and the last index. - # For example, if change_indices = [i1, i2, ..., in], - # then the runs are: (i1 - (-1)), (i2 - i1), ..., (seq.size-1 - in). - boundaries = np.concatenate(([-1], change_indices, [seq.size - 1])) - run_lengths = np.diff(boundaries) - return int(run_lengths.max()) - -def filter_sequences(sequences, m): - """ - Filter a 2D NumPy boolean array 'sequences' (each row a binary sequence) so that - only sequences with maximum run length (of 0's or 1's) at most m are kept. - - Parameters: - sequences (np.array): A 2D boolean array of shape (N, k). - m (int): Maximum allowed run length. - - Returns: - A NumPy array containing only the rows (sequences) that pass the filter. - """ - filtered = [] - for seq in sequences: - if max_run_length(seq) <= m: - filtered.append(seq) - return np.array(filtered) - - -def generate_permutations(rng, n_dim, n_layers, max_run=3): - if n_layers == 1: - r = [0, 1] - elif n_layers == 2: - r = [1] - else: - if n_layers % 2 == 0: - half = n_layers // 2 - r = [half - 1, half, half + 1] - else: - half = n_layers // 2 - r = [half, half + 1] - - all_sequences = generate_sequences(n_layers, r) - valid_sequences = filter_sequences(all_sequences, max_run) - - valid_sequences = np.repeat(valid_sequences, n_dim // len(valid_sequences) + 1, axis=0) - rng.shuffle(valid_sequences, axis=0) - is_in_first = valid_sequences[:n_dim] - rng = np.random.default_rng(42) - permutations = (~is_in_first).argsort(axis=0, kind="stable") - return permutations.T, is_in_first.sum(0) - -def make_transform_adapter( - *, - verbose=False, - window_size=600, - show_progress=False, - nn_depth=1, - nn_width=16, - num_layers=9, - num_diag_windows=10, - learning_rate=5e-4, - untransformed_dim=None, - zero_init=True, - batch_size=128, - reuse_opt_state=False, - max_patience=20, - householder_layer=False, - dct_layer=False, - gamma=None, - log_inside_batch=False, - initial_skip=120, - extension_windows=[16, 20, 24], - extend_dct=False, - extension_var_count=4, - extension_var_trafo_count=2, - debug_save_bijection=False, - make_optimizer=None, -): - import traceback - from functools import partial - - import equinox as eqx - import flowjax - import flowjax.flows - import flowjax.train - from flowjax import bijections - import jax - import jax.numpy as jnp - import numpy as np - import optax - from paramax import Parameterize, unwrap - - class FisherLoss: - def __init__(self, gamma=None, log_inside_batch=False): - self._gamma = gamma - self._log_inside_batch = log_inside_batch - - @eqx.filter_jit - def __call__( - self, - params, - static, - draws, - grads, - logps, - condition=None, - key=None, - return_all_costs=False, - return_elemwise_costs=False, - ): - flow = unwrap(eqx.combine(params, static, is_leaf=eqx.is_inexact_array)) - - if return_elemwise_costs: - - def compute_loss(bijection, draw, grad, logp): - if True: - draw, grad, logp = bijection.inverse_gradient_and_val_( - draw, grad, logp - ) - else: - draw, grad, logp = ( - flowjax.bijections.AbstractBijection.inverse_gradient_and_val_( - bijection, draw, grad, logp - ) - ) - cost = (draw + grad) ** 2 - return cost - - costs = jax.vmap(compute_loss, [None, 0, 0, 0])( - flow.bijection, - draws, - grads, - logps, - ) - return costs.mean(0) - - if self._gamma is None: - - def compute_loss(bijection, draw, grad, logp): - draw, grad, logp = bijection.inverse_gradient_and_val_( - draw, grad, logp - ) - cost = ((draw + grad) ** 2).sum() - return cost - - costs = jax.vmap(compute_loss, [None, 0, 0, 0])( - flow.bijection, - draws, - grads, - logps, - ) - if return_all_costs: - return costs - - if self._log_inside_batch: - return jnp.log(costs).mean() - else: - return jnp.log(costs.mean()) + if return_all_costs: + return costs + if self._log_inside_batch: + return jnp.log(costs).mean() else: + return jnp.log(costs.mean()) - def transform(draw, grad, logp): - return flow.bijection.inverse_gradient_and_val_(draw, grad, logp) - - draws, grads, logps = jax.vmap(transform, [0, 0, 0], (0, 0, 0))( - draws, grads, logps - ) - fisher_loss = ((draws + grads) ** 2).sum(1).mean(0) - normal_logps = -(draws * draws).sum(1) / 2 - var_loss = (logps - normal_logps).var() - return jnp.log(fisher_loss + self._gamma * var_loss) - - def fit_flow(key, bijection, loss_fn, draws, grads, logps, **kwargs): - flow = flowjax.flows.Transformed( - flowjax.distributions.StandardNormal(bijection.shape), bijection - ) - - key, train_key = jax.random.split(key) - - fit, losses = flowjax.train.fit_to_data( - key=train_key, - dist=flow, - x=(draws, grads, logps), - loss_fn=loss_fn, - max_epochs=1000, - return_best=True, - **kwargs, - ) - return fit.bijection, losses, losses["opt_state"] - - def make_mvscale(key, n_dim, size, randomize_base=False): - def make_single_hh(key, idx): - key1, key2 = jax.random.split(key) - params = jax.random.normal(key1, (n_dim,)) - params = params / jnp.linalg.norm(params) - mvscale = bijections.MvScale(params) - return mvscale - - keys = jax.random.split(key, size) - - if randomize_base: - key, key_base = jax.random.split(key) - indices = jax.random.randint(key_base, (size,), 0, n_dim) else: - indices = [val % n_dim for val in range(size)] - return bijections.Chain([make_single_hh(key, idx) for key, idx in zip(keys, indices)]) + def transform(draw, grad, logp): + return flow.bijection.inverse_gradient_and_val_(draw, grad, logp) - def make_hh(key, n_dim, size, randomize_base=False): - def make_single_hh(key, idx): - key1, key2 = jax.random.split(key) - params = jax.random.normal(key1, (n_dim,)) * 1e-2 - return bijections.Householder(params, base_index=idx) - - keys = jax.random.split(key, size) - - if randomize_base: - key, key_base = jax.random.split(key) - indices = jax.random.randint(key_base, (size,), 0, n_dim) - else: - indices = [val % n_dim for val in range(size)] + draws, grads, logps = jax.vmap(transform, [0, 0, 0], (0, 0, 0))( + draws, grads, logps + ) + fisher_loss = ((draws + grads) ** 2).sum(1).mean(0) + normal_logps = -(draws * draws).sum(1) / 2 + var_loss = (logps - normal_logps).var() + return jnp.log(fisher_loss + self._gamma * var_loss) - return bijections.Chain([make_single_hh(key, idx) for key, idx in zip(keys, indices)]) - def make_elemwise_trafo(key, n_dim, *, count=1): - def make_elemwise(key, loc): - key1, key2 = jax.random.split(key) - scale = Parameterize( - lambda x: x + jnp.sqrt(1 + x**2), - jnp.zeros(()) - ) - theta = Parameterize( - lambda x: x + jnp.sqrt(1 + x**2), - jnp.zeros(()) - ) +def fit_flow(key, bijection, loss_fn, draws, grads, logps, **kwargs): + flow = flowjax.flows.Transformed( + flowjax.distributions.StandardNormal(bijection.shape), bijection + ) - affine = bijections.AsymmetricAffine( - loc, - jnp.ones(()), - jnp.ones(()), - ) + key, train_key = jax.random.split(key) - affine = eqx.tree_at( - where=lambda aff: aff.scale, - pytree=affine, - replace=scale, - ) - affine = eqx.tree_at( - where=lambda aff: aff.theta, - pytree=affine, - replace=theta, - ) + fit, losses = flowjax.train.fit_to_data( + key=train_key, + dist=flow, + x=(draws, grads, logps), + loss_fn=loss_fn, + max_epochs=1000, + return_best=True, + **kwargs, + ) + return fit.bijection, losses, losses["opt_state"] - return affine - def make(key): - keys = jax.random.split(key, count + 1) - key, keys = keys[0], keys[1:] - loc = jax.random.normal(key=key, shape=(count,)) * 2 - loc = loc - loc.mean() - return bijections.Chain([make_elemwise(key, mu) for key, mu in zip(keys, loc)]) +@eqx.filter_jit +def _init_from_transformed_position(logp_fn, bijection, transformed_position): + bijection = unwrap(bijection) + (untransformed_position, logdet), pull_grad = jax.vjp( + bijection.transform_and_log_det, transformed_position + ) + logp, untransformed_gradient = jax.value_and_grad(lambda x: logp_fn(x)[0])( + untransformed_position + ) + (transformed_gradient,) = pull_grad((untransformed_gradient, 1.0)) + return ( + logp, + logdet, + untransformed_position, + untransformed_gradient, + transformed_gradient, + ) - keys = jax.random.split(key, n_dim) - make_affine = eqx.filter_vmap(make, axis_size=n_dim)(keys) - return bijections.Vmap(make_affine, in_axes=eqx.if_array(0)) +@eqx.filter_jit +def _init_from_transformed_position_part1(logp_fn, bijection, transformed_position): + bijection = unwrap(bijection) + (untransformed_position, logdet) = bijection.transform_and_log_det( + transformed_position + ) - def make_elemwise_trafo_(key, n_dim, *, count=1): - def make_elemwise(key): - scale = Parameterize( - lambda x: x + jnp.sqrt(1 + x**2), - jax.random.normal(key=key) / 5, - ) - theta = Parameterize( - lambda x: x + jnp.sqrt(1 + x**2), - jax.random.normal(key=key) / 5, - ) + return (logdet, untransformed_position) - affine = bijections.AsymmetricAffine( - jax.random.normal(key=key) * 2, - jnp.ones(()), - jnp.ones(()), - ) +@eqx.filter_jit +def _init_from_transformed_position_part2( + bijection, + part1, + untransformed_gradient, +): + logdet, untransformed_position, transformed_position = part1 + bijection = unwrap(bijection) + _, pull_grad = jax.vjp(bijection.transform_and_log_det, transformed_position) + (transformed_gradient,) = pull_grad((untransformed_gradient, 1.0)) + return ( + logdet, + transformed_gradient, + ) - affine = eqx.tree_at( - where=lambda aff: aff.scale, - pytree=affine, - replace=scale, - ) - affine = eqx.tree_at( - where=lambda aff: aff.theta, - pytree=affine, - replace=theta, - ) +@eqx.filter_jit +def _init_from_untransformed_position(logp_fn, bijection, untransformed_position): + logp, untransformed_gradient = jax.value_and_grad(lambda x: logp_fn(x)[0])( + untransformed_position + ) + logdet, transformed_position, transformed_gradient = _inv_transform( + bijection, untransformed_position, untransformed_gradient + ) + return ( + logp, + logdet, + untransformed_gradient, + transformed_position, + transformed_gradient, + ) - return affine - - def make(key): - keys = jax.random.split(key, count) - return bijections.Scan(eqx.filter_vmap(make_elemwise)(keys)) - - keys = jax.random.split(key, n_dim) - make_affine = eqx.filter_vmap(make)(keys) - return bijections.Vmap(make_affine()) - - def make_coupling(key, dim, n_untransformed, **kwargs): - n_transformed = dim - n_untransformed - - mvscale = make_mvscale(key, n_transformed, 1, randomize_base=True) - - transformer = bijections.Chain([ - make_elemwise_trafo(key, n_transformed, count=3), - mvscale, - ]) - mlp1 = lambda out_size: FactoredMLP( - n_untransformed, - (128, out_size), - kwargs["nn_width"], - depth=len(kwargs["nn_width"]), - key=key, - dtype=jnp.float32, - activation=jax.nn.gelu, +@eqx.filter_jit +def _inv_transform(bijection, untransformed_position, untransformed_gradient): + bijection = unwrap(bijection) + transformed_position, transformed_gradient, logdet = ( + bijection.inverse_gradient_and_val_( + untransformed_position, untransformed_gradient, 0.0 ) - return bijections.Coupling(key, transformer=transformer, untransformed_dim=n_untransformed, dim=dim, conditioner=mlp1, **kwargs) + ) + return logdet, transformed_position, transformed_gradient - def make_flow( +class TransformAdapter: + def __init__( + self, seed, - positions, - gradients, + position, + gradient, + chain, *, - zero_init=False, - householder_layer=False, - dct_layer=False, - untransformed_dim: int | list[int | None] | None = None, - n_layers, + logp_fn, + make_flow_fn, + verbose=False, + window_size=2000, + show_progress=False, + num_diag_windows=10, + learning_rate=1e-3, + zero_init=True, + untransformed_dim=None, + batch_size=128, + reuse_opt_state=True, + max_patience=5, + gamma=None, + log_inside_batch=False, + initial_skip=500, + extension_windows=None, + extend_dct=False, + extension_var_count=6, + extension_var_trafo_count=4, + debug_save_bijection=False, + make_optimizer=None, + num_layers=9, ): - from flowjax import bijections - - positions = np.array(positions) - gradients = np.array(gradients) - - if len(positions) == 0: - return - - n_draws, n_dim = positions.shape - - if n_dim < 2: - n_layers = 0 - - assert positions.shape == gradients.shape - - if n_draws == 0: - raise ValueError("No draws") - elif n_draws == 1: - assert np.all(gradients != 0) - diag = np.clip(1 / jnp.sqrt(jnp.abs(gradients[0])), 1e-5, 1e5) - assert np.isfinite(diag).all() - mean = jnp.zeros_like(diag) - else: - pos_std = np.clip(positions.std(0), 1e-8, 1e8) - grad_std = np.clip(gradients.std(0), 1e-8, 1e8) - diag = jnp.sqrt(pos_std / grad_std) - mean = positions.mean(0) + gradients.mean(0) * diag * diag - - print("seed", seed) - key = jax.random.PRNGKey(seed % (2**63)) - - diag_param = Parameterize( - lambda x: x + jnp.sqrt(1 + x**2), - (diag**2 - 1) / (2 * diag), - ) - diag_affine = bijections.Affine(mean, diag) - diag_affine = eqx.tree_at( - where=lambda aff: aff.scale, - pytree=diag_affine, - replace=diag_param, - ) - - flows = [ - diag_affine, - ] - - if n_layers == 0: - return flowjax.flows.Chain(flows) - - scale = Parameterize( - lambda x: x + jnp.sqrt(1 + x**2), - jnp.zeros(n_dim), - ) - affine = eqx.tree_at( - where=lambda aff: aff.scale, - pytree=flowjax.bijections.Affine(jnp.zeros(n_dim), jnp.ones(n_dim)), - replace=scale, - ) - - def make_layer(key, untransformed_dim: int | None, permutation=None): - key, key_couple, key_permute, key_hh = jax.random.split(key, 4) - - if nn_width is None: - width = n_dim // 2 - else: - width = nn_width - - if untransformed_dim is None: - untransformed_dim = n_dim // 2 - - if untransformed_dim < 0: - untransformed_dim = n_dim + untransformed_dim - - if isinstance(width, int) and width > 16 * untransformed_dim: - width = 16 * untransformed_dim - - coupling = make_coupling( - key_couple, - n_dim, - untransformed_dim, - nn_width=width, - nn_depth=nn_depth, - nn_activation=jax.nn.gelu, + self._logp_fn = logp_fn + self._make_flow_fn = make_flow_fn + self._chain = chain + self._verbose = verbose + self._window_size = window_size + self._initial_skip = initial_skip + self._num_layers = num_layers + if make_optimizer is None: + self._make_optimizer = lambda: optax.apply_if_finite( + #optax.adamw(learning_rate), 50 + optax.adabelief(learning_rate), 50 + #optax.adam(learning_rate), 50 ) - - if zero_init: - coupling = jax.tree_util.tree_map( - lambda x: x * 1e-3 if eqx.is_inexact_array(x) else x, - coupling, - ) - - flow = coupling - - if householder_layer: - hh = make_hh(key_hh, n_dim, 1, randomize_base=False) - flow = bijections.Sandwich(hh, flow) - - def add_default_permute(bijection, dim, key): - if dim == 1: - return bijection - if dim == 2: - outer = flowjax.bijections.Flip((dim,)) - else: - outer = flowjax.bijections.Permute( - jax.random.permutation(key, jnp.arange(dim)) - ) - - return flowjax.bijections.Sandwich(outer, bijection) - - if permutation is None: - flow = add_default_permute(flow, n_dim, key_permute) - else: - flow = bijections.Sandwich(bijections.Permute(permutation), flow) - - mvscale = make_mvscale(key, n_dim, 1, randomize_base=True) - - flow = bijections.Chain( - [ - #make_elemwise_trafo(key, n_dim, count=1), - mvscale, - flow, - ] - ) - - return flow - - key, key_permute = jax.random.split(key) - keys = jax.random.split(key, n_layers) - - if untransformed_dim is None: - # TODO better rng? - rng = np.random.default_rng(int(jax.random.randint(key, (), 0, 2**30))) - permutation, lengths = generate_permutations(rng, n_dim, n_layers) - layers = [] - for i, (key, p, length) in enumerate(zip(keys, permutation, lengths)): - layers.append(make_layer(key, int(length), p)) - bijection = flowjax.bijections.Chain(layers) - elif isinstance(untransformed_dim, int): - make_layers = eqx.filter_vmap(make_layer) - layers = make_layers(keys, untransformed_dim) - bijection = flowjax.bijections.Scan(layers) else: - layers = [] - for i, (key, num_untrafo) in enumerate(zip(keys, untransformed_dim)): - if i % 2 == 0 or not dct_layer: - layers.append(make_layer(key, num_untrafo)) - else: - inner = make_layer(key, num_untrafo) - outer = flowjax.bijections.DCT(inner.shape) - - layers.append(flowjax.bijections.Sandwich(outer, inner)) - - bijection = flowjax.bijections.Chain(layers) - - return flowjax.bijections.Chain([bijection, *flows]) - - def extend_flow( - key, - base, - loss_fn, - positions, - gradients, - logps, - layer: int, - *, - extension_var_count=4, - zero_init=False, - householder_layer=False, - untransformed_dim: int | list[int | None] | None = None, - dct: bool = False, - extension_var_trafo_count=2, - verbose: bool = False, - ): - from flowjax import bijections + self._make_optimizer = make_optimizer + self._optimizer = self._make_optimizer() + self._loss_fn = FisherLoss(gamma, log_inside_batch) + self._show_progress = show_progress + self._num_diag_windows = num_diag_windows + self._zero_init = zero_init + self._untransformed_dim = untransformed_dim + self._batch_size = batch_size + self._reuse_opt_state = reuse_opt_state + self._opt_state = None + self._max_patience = max_patience + self._count_trace = [] + self._last_extend_dct = True + self._extend_dct = extend_dct + self._extension_var_count = extension_var_count + self._extension_var_trafo_count = extension_var_trafo_count + self._debug_save_bijection = debug_save_bijection + self._layers = 0 + + if extension_windows is None: + self._extension_windows = [] + else: + self._extension_windows = extension_windows + + try: + self._bijection = make_flow_fn(seed, [position], [gradient], n_layers=0) + except Exception as e: + print("make_flow", e) + print(traceback.format_exc()) + raise + self.index = 0 + + @property + def transformation_id(self): + return self.index + + def update(self, seed, positions, gradients, logps): + self.index += 1 + if self._verbose: + print(f"Chain {self._chain}: Total available points: {len(positions)}") + n_draws = len(positions) + assert n_draws == len(positions) + assert n_draws == len(gradients) + assert n_draws == len(logps) + self._count_trace.append(n_draws) + if n_draws == 0: + return + try: + if self.index <= self._num_diag_windows: + size = len(positions) + lower_idx = -size // 5 + 3 + positions_slice = positions[lower_idx:] + gradients_slice = gradients[lower_idx:] + logp_slice = logps[lower_idx:] - n_draws, n_dim = positions.shape + if len(positions_slice) > 0: + positions = positions_slice + gradients = gradients_slice + logps = logp_slice - if n_dim < 2: - return base + positions = np.array(positions) + gradients = np.array(gradients) + logps = np.array(logps) - if n_dim <= extension_var_count: - extension_var_count = n_dim - 1 - extension_var_trafo_count = 1 + fit = self._make_flow_fn(seed, positions, gradients, n_layers=0) - if dct: - flow = flowjax.flows.Transformed( - flowjax.distributions.StandardNormal(base.shape), - bijections.Chain([bijections.DCT(shape=(n_dim,)), base]), - ) - else: - flow = flowjax.flows.Transformed( - flowjax.distributions.StandardNormal(base.shape), base - ) + flow = flowjax.flows.Transformed( + flowjax.distributions.StandardNormal(fit.shape), fit + ) + params, static = eqx.partition(flow, eqx.is_inexact_array) + new_loss = self._loss_fn( + params, static, positions, gradients, logps + ) - params, static = eqx.partition(flow, eqx.is_inexact_array) - costs = loss_fn( - params, - static, - positions, - gradients, - logps, - return_elemwise_costs=True, - ) + if self._verbose: + print("loss from diag:", new_loss) - if verbose: - print(max(costs), costs) - print("dct:", dct) - idxs = np.argsort(costs) + if np.isfinite(new_loss): + self._bijection = fit + self._opt_state = None - permute = bijections.Permute(idxs) + return - if True: - scale = Parameterize( - lambda x: x + jnp.sqrt(1 + x**2), - jnp.array(0.0), + positions = np.array( + positions[self._initial_skip :][-self._window_size :] ) - theta = Parameterize( - lambda x: x + jnp.sqrt(1 + x**2), - jnp.array(0.0), + gradients = np.array( + gradients[self._initial_skip :][-self._window_size :] ) + logps = np.array(logps[self._initial_skip :][-self._window_size :]) - affine = flowjax.bijections.AsymmetricAffine(jnp.zeros(()), jnp.ones(()), jnp.ones(())) - - affine = eqx.tree_at( - where=lambda aff: aff.scale, - pytree=affine, - replace=scale, - ) - affine = eqx.tree_at( - where=lambda aff: aff.theta, - pytree=affine, - replace=theta, - ) + if len(positions) < 10: + return - do_flip = layer % 2 == 0 + if self._verbose and not np.isfinite(gradients).all(): + print(gradients) + print(gradients.shape) + print((~np.isfinite(gradients)).nonzero()) - if nn_width is None: - width = 16 - else: - width = nn_width + assert np.isfinite(positions).all() + assert np.isfinite(gradients).all() + assert np.isfinite(logps).all() - if do_flip: - coupling = flowjax.bijections.coupling.Coupling( - key, - transformer=affine, - untransformed_dim=n_dim - extension_var_trafo_count, - dim=n_dim, - nn_activation=jax.nn.gelu, - nn_width=width, - nn_depth=nn_depth, - ) + # TODO don't reuse seed + key = jax.random.PRNGKey(seed % (2**63)) - inner_permute = flowjax.bijections.Permute( - jnp.concatenate( - [ - jnp.arange(n_dim - extension_var_count), - jax.random.permutation( - key, jnp.arange(n_dim - extension_var_count, n_dim) - ), - ] - ) + if len(self._bijection.bijections) == 1: + base = self._make_flow_fn( + seed, + positions, + gradients, + n_layers=self._num_layers, + untransformed_dim=self._untransformed_dim, + zero_init=self._zero_init, ) - else: - coupling = flowjax.bijections.coupling.Coupling( - key, - transformer=affine, - untransformed_dim=extension_var_trafo_count, - dim=n_dim, - nn_activation=jax.nn.gelu, - nn_width=width, - nn_depth=nn_depth, + flow = flowjax.flows.Transformed( + flowjax.distributions.StandardNormal(base.shape), base ) - - inner_permute = flowjax.bijections.Permute( - jnp.concatenate( - [ - jax.random.permutation( - key, jnp.arange(n_dim - extension_var_count, n_dim) - ), - jnp.arange(n_dim - extension_var_count), - ] + params, static = eqx.partition(flow, eqx.is_inexact_array) + if self._verbose: + print( + "loss before optimization: ", + self._loss_fn( + params, + static, + positions[-100:], + gradients[-100:], + logps[-100:], + ), ) - ) - - if zero_init: - coupling = jax.tree_util.tree_map( - lambda x: x * 1e-3 if eqx.is_inexact_array(x) else x, - coupling, - ) - - inner = bijections.Sandwich(inner_permute, coupling) - - if False: - scale = Parameterize( - lambda x: x + jnp.sqrt(1 + x**2), - jnp.array(0.0), - ) - affine = eqx.tree_at( - where=lambda aff: aff.scale, - pytree=flowjax.bijections.Affine(), - replace=scale, - ) - - if nn_width is None: - width = 16 - else: - width = nn_width + else: + base = self._bijection - coupling = flowjax.bijections.coupling.Coupling( + if self.index in self._extension_windows: + if self._verbose: + print("Extending flow...") + self._last_extend_dct = not self._last_extend_dct + dct = self._last_extend_dct and self._extend_dct + base = extend_flow( key, - transformer=affine, - untransformed_dim=extension_var_trafo_count, - dim=n_dim, - nn_activation=jax.nn.gelu, - nn_width=width, - nn_depth=nn_depth, - ) - - if zero_init: - coupling = jax.tree_util.tree_map( - lambda x: x * 1e-3 if eqx.is_inexact_array(x) else x, - coupling, - ) - - if verbose: - print(costs[permute.permutation][inner.outer.permutation]) - - inner = bijections.Sandwich( - inner.outer, - bijections.Chain( - [ - bijections.Sandwich( - bijections.Flip(shape=(n_dim,)), coupling - ), - inner.inner, - ] - ), + base, + self._loss_fn, + positions, + gradients, + logps, + self._layers, + dct=dct, + extension_var_count=self._extension_var_count, + extension_var_trafo_count=self._extension_var_trafo_count, + verbose=self._verbose, ) + self._optimizer = self._make_optimizer() + self._opt_state = None + self._layers += 1 + + # make_flow might still onreturn a single trafo for 1d problems + if len(base.bijections) == 1: + self._bijection = base + self._opt_state = None + return - if dct: - new_layer = bijections.Sandwich( - bijections.DCT(shape=(n_dim,)), - bijections.Sandwich(permute, inner), + flow = flowjax.flows.Transformed( + flowjax.distributions.StandardNormal(self._bijection.shape), + self._bijection, ) - else: - new_layer = bijections.Sandwich(permute, inner) - - scale = Parameterize( - lambda x: x + jnp.sqrt(1 + x**2), - jnp.zeros(n_dim), - ) - affine = eqx.tree_at( - where=lambda aff: aff.scale, - pytree=flowjax.bijections.Affine(jnp.zeros(n_dim), jnp.ones(n_dim)), - replace=scale, - ) - - pre = [] - if layer % 2 == 0: - pre.append(bijections.Neg(shape=(n_dim,))) - - nonlin_layer = bijections.Sandwich( - bijections.Chain( - [ - *pre, - bijections.Vmap(bijections.SoftPlusX(), axis_size=n_dim), - ] - ), - affine, - ) - scale = Parameterize( - lambda x: x + jnp.sqrt(1 + x**2), - jnp.zeros(n_dim), - ) - affine = eqx.tree_at( - where=lambda aff: aff.scale, - pytree=flowjax.bijections.Affine(jnp.zeros(n_dim), jnp.ones(n_dim)), - replace=scale, - ) - return bijections.Chain([new_layer, nonlin_layer, affine, base]) - - @eqx.filter_jit - def _init_from_transformed_position(logp_fn, bijection, transformed_position): - bijection = unwrap(bijection) - (untransformed_position, logdet), pull_grad = jax.vjp( - bijection.transform_and_log_det, transformed_position - ) - logp, untransformed_gradient = jax.value_and_grad(lambda x: logp_fn(x)[0])( - untransformed_position - ) - (transformed_gradient,) = pull_grad((untransformed_gradient, 1.0)) - return ( - logp, - logdet, - untransformed_position, - untransformed_gradient, - transformed_gradient, - ) - - @eqx.filter_jit - def _init_from_transformed_position_part1(logp_fn, bijection, transformed_position): - bijection = unwrap(bijection) - (untransformed_position, logdet) = bijection.transform_and_log_det( - transformed_position - ) - - return (logdet, untransformed_position) - - @eqx.filter_jit - def _init_from_transformed_position_part2( - bijection, - part1, - untransformed_gradient, - ): - logdet, untransformed_position, transformed_position = part1 - bijection = unwrap(bijection) - _, pull_grad = jax.vjp(bijection.transform_and_log_det, transformed_position) - (transformed_gradient,) = pull_grad((untransformed_gradient, 1.0)) - return ( - logdet, - transformed_gradient, - ) - - @eqx.filter_jit - def _init_from_untransformed_position(logp_fn, bijection, untransformed_position): - logp, untransformed_gradient = jax.value_and_grad(lambda x: logp_fn(x)[0])( - untransformed_position - ) - logdet, transformed_position, transformed_gradient = _inv_transform( - bijection, untransformed_position, untransformed_gradient - ) - return ( - logp, - logdet, - untransformed_gradient, - transformed_position, - transformed_gradient, - ) - - @eqx.filter_jit - def _inv_transform(bijection, untransformed_position, untransformed_gradient): - bijection = unwrap(bijection) - transformed_position, transformed_gradient, logdet = ( - bijection.inverse_gradient_and_val_( - untransformed_position, untransformed_gradient, 0.0 + params, static = eqx.partition(flow, eqx.is_inexact_array) + old_loss = self._loss_fn( + params, static, positions[-128:], gradients[-128:], logps[-128:] ) - ) - return logdet, transformed_position, transformed_gradient - - class TransformAdapter: - def __init__( - self, - seed, - position, - gradient, - chain, - *, - logp_fn, - make_flow_fn, - verbose=False, - window_size=2000, - show_progress=False, - num_diag_windows=10, - learning_rate=1e-3, - zero_init=True, - untransformed_dim=None, - batch_size=128, - reuse_opt_state=True, - max_patience=5, - gamma=None, - log_inside_batch=False, - initial_skip=500, - extension_windows=None, - extend_dct=False, - extension_var_count=6, - extension_var_trafo_count=4, - debug_save_bijection=False, - make_optimizer=None, - ): - self._logp_fn = logp_fn - self._make_flow_fn = make_flow_fn - self._chain = chain - self._verbose = verbose - self._window_size = window_size - self._initial_skip = initial_skip - if make_optimizer is None: - self._make_optimizer = lambda: optax.apply_if_finite( - #optax.adamw(learning_rate), 50 - optax.adabelief(learning_rate), 50 - #optax.adam(learning_rate), 50 - ) - else: - self._make_optimizer = make_optimizer - self._optimizer = self._make_optimizer() - self._loss_fn = FisherLoss(gamma, log_inside_batch) - self._show_progress = show_progress - self._num_diag_windows = num_diag_windows - self._zero_init = zero_init - self._untransformed_dim = untransformed_dim - self._batch_size = batch_size - self._reuse_opt_state = reuse_opt_state - self._opt_state = None - self._max_patience = max_patience - self._count_trace = [] - self._last_extend_dct = True - self._extend_dct = extend_dct - self._extension_var_count = extension_var_count - self._extension_var_trafo_count = extension_var_trafo_count - self._debug_save_bijection = debug_save_bijection - self._layers = 0 - - if extension_windows is None: - self._extension_windows = [] - else: - self._extension_windows = extension_windows - - try: - self._bijection = make_flow_fn(seed, [position], [gradient], n_layers=0) - except Exception as e: - print("make_flow", e) - print(traceback.format_exc()) - raise - self.index = 0 - - @property - def transformation_id(self): - return self.index - - def update(self, seed, positions, gradients, logps): - self.index += 1 - if self._verbose: - print(f"Chain {self._chain}: Total available points: {len(positions)}") - n_draws = len(positions) - assert n_draws == len(positions) - assert n_draws == len(gradients) - assert n_draws == len(logps) - self._count_trace.append(n_draws) - if n_draws == 0: - return - try: - if self.index <= self._num_diag_windows: - size = len(positions) - lower_idx = -size // 5 + 3 - positions_slice = positions[lower_idx:] - gradients_slice = gradients[lower_idx:] - logp_slice = logps[lower_idx:] - - if len(positions_slice) > 0: - positions = positions_slice - gradients = gradients_slice - logps = logp_slice - - positions = np.array(positions) - gradients = np.array(gradients) - logps = np.array(logps) - - fit = self._make_flow_fn(seed, positions, gradients, n_layers=0) - - flow = flowjax.flows.Transformed( - flowjax.distributions.StandardNormal(fit.shape), fit - ) - params, static = eqx.partition(flow, eqx.is_inexact_array) - new_loss = self._loss_fn( - params, static, positions, gradients, logps - ) - if self._verbose: - print("loss from diag:", new_loss) + if np.isfinite(old_loss) and old_loss < -5 and self.index > 10: + if self._verbose: + print(f"Loss is low ({old_loss}), skipping training") + return - if np.isfinite(new_loss): - self._bijection = fit - self._opt_state = None + fit, _, opt_state = fit_flow( + key, + base, + self._loss_fn, + positions, + gradients, + logps, + show_progress=self._show_progress, + optimizer=self._optimizer, + batch_size=self._batch_size, + opt_state=self._opt_state if self._reuse_opt_state else None, + max_patience=self._max_patience, + ) - return + flow = flowjax.flows.Transformed( + flowjax.distributions.StandardNormal(fit.shape), fit + ) + params, static = eqx.partition(flow, eqx.is_inexact_array) + new_loss = self._loss_fn( + params, static, positions[-128:], gradients[-128:], logps[-128:] + ) - positions = np.array( - positions[self._initial_skip :][-self._window_size :] - ) - gradients = np.array( - gradients[self._initial_skip :][-self._window_size :] + if self._verbose: + print( + f"Chain {self._chain}: New loss {new_loss}, old loss {old_loss}" ) - logps = np.array(logps[self._initial_skip :][-self._window_size :]) - - if len(positions) < 10: - return - - if self._verbose and not np.isfinite(gradients).all(): - print(gradients) - print(gradients.shape) - print((~np.isfinite(gradients)).nonzero()) - - assert np.isfinite(positions).all() - assert np.isfinite(gradients).all() - assert np.isfinite(logps).all() - - # TODO don't reuse seed - key = jax.random.PRNGKey(seed % (2**63)) - - if len(self._bijection.bijections) == 1: - base = self._make_flow_fn( - seed, - positions, - gradients, - n_layers=num_layers, - untransformed_dim=self._untransformed_dim, - zero_init=self._zero_init, - ) - flow = flowjax.flows.Transformed( - flowjax.distributions.StandardNormal(base.shape), base - ) - params, static = eqx.partition(flow, eqx.is_inexact_array) - if self._verbose: - print( - "loss before optimization: ", - self._loss_fn( - params, - static, - positions[-100:], - gradients[-100:], - logps[-100:], - ), - ) - else: - base = self._bijection - - if self.index in self._extension_windows: - if self._verbose: - print("Extending flow...") - self._last_extend_dct = not self._last_extend_dct - dct = self._last_extend_dct and self._extend_dct - base = extend_flow( - key, - base, - self._loss_fn, - positions, - gradients, - logps, - self._layers, - dct=dct, - extension_var_count=self._extension_var_count, - extension_var_trafo_count=self._extension_var_trafo_count, - verbose=self._verbose, - ) - self._optimizer = self._make_optimizer() - self._opt_state = None - self._layers += 1 - - # make_flow might still onreturn a single trafo for 1d problems - if len(base.bijections) == 1: - self._bijection = base - self._opt_state = None - return + if not np.isfinite(old_loss): flow = flowjax.flows.Transformed( flowjax.distributions.StandardNormal(self._bijection.shape), self._bijection, ) params, static = eqx.partition(flow, eqx.is_inexact_array) - old_loss = self._loss_fn( - params, static, positions[-128:], gradients[-128:], logps[-128:] - ) - - if np.isfinite(old_loss) and old_loss < -5 and self.index > 10: - if self._verbose: - print(f"Loss is low ({old_loss}), skipping training") - return - - fit, _, opt_state = fit_flow( - key, - base, - self._loss_fn, - positions, - gradients, - logps, - show_progress=self._show_progress, - optimizer=self._optimizer, - batch_size=self._batch_size, - opt_state=self._opt_state if self._reuse_opt_state else None, - max_patience=self._max_patience, + print( + self._loss_fn( + params, + static, + positions[-128:], + gradients[-128:], + logps[-128:], + return_all_costs=True, + ) ) + if not np.isfinite(new_loss): flow = flowjax.flows.Transformed( flowjax.distributions.StandardNormal(fit.shape), fit ) params, static = eqx.partition(flow, eqx.is_inexact_array) - new_loss = self._loss_fn( - params, static, positions[-128:], gradients[-128:], logps[-128:] - ) - - if self._verbose: - print( - f"Chain {self._chain}: New loss {new_loss}, old loss {old_loss}" - ) - - if not np.isfinite(old_loss): - flow = flowjax.flows.Transformed( - flowjax.distributions.StandardNormal(self._bijection.shape), - self._bijection, - ) - params, static = eqx.partition(flow, eqx.is_inexact_array) - print( - self._loss_fn( - params, - static, - positions[-128:], - gradients[-128:], - logps[-128:], - return_all_costs=True, - ) - ) - - if not np.isfinite(new_loss): - flow = flowjax.flows.Transformed( - flowjax.distributions.StandardNormal(fit.shape), fit - ) - params, static = eqx.partition(flow, eqx.is_inexact_array) - print( - self._loss_fn( - params, - static, - positions[-128:], - gradients[-128:], - logps[-128:], - return_all_costs=True, - ) + print( + self._loss_fn( + params, + static, + positions[-128:], + gradients[-128:], + logps[-128:], + return_all_costs=True, ) + ) - if self._debug_save_bijection: - _BIJECTION_TRACE.append( - (self.index, fit, (positions, gradients, logps)) - ) + if self._debug_save_bijection: + _BIJECTION_TRACE.append( + (self.index, fit, (positions, gradients, logps)) + ) - def valid_new_logp(): - logdet, pos, grad = _inv_transform( - fit, - jnp.array(positions[-1]), - jnp.array(gradients[-1]), - ) - return np.isfinite(logdet) and np.isfinite(pos[0]).all() and np.isfinite(grad[0]).all() + def valid_new_logp(): + logdet, pos, grad = _inv_transform( + fit, + jnp.array(positions[-1]), + jnp.array(gradients[-1]), + ) + return np.isfinite(logdet) and np.isfinite(pos[0]).all() and np.isfinite(grad[0]).all() - if (not np.isfinite(old_loss)) and (not np.isfinite(new_loss)): - self._bijection = self._make_flow_fn( - seed, positions, gradients, n_layers=0 - ) - self._opt_state = None - return + if (not np.isfinite(old_loss)) and (not np.isfinite(new_loss)): + self._bijection = self._make_flow_fn( + seed, positions, gradients, n_layers=0 + ) + self._opt_state = None + return - if not valid_new_logp(): - if self._verbose: - print("Invalid new logp. Skipping update.") - return + if not valid_new_logp(): + if self._verbose: + print("Invalid new logp. Skipping update.") + return - if not np.isfinite(new_loss): - if self._verbose: - print("Invalid new loss. Skipping update.") - return + if not np.isfinite(new_loss): + if self._verbose: + print("Invalid new loss. Skipping update.") + return - if new_loss > old_loss: - return + if new_loss > old_loss: + return - self._bijection = fit - self._opt_state = opt_state + self._bijection = fit + self._opt_state = opt_state - except Exception as e: - print("update error:", e) - print(traceback.format_exc()) - raise + except Exception as e: + print("update error:", e) + print(traceback.format_exc()) + raise - def init_from_transformed_position(self, transformed_position): - try: - logp, logdet, *arrays = _init_from_transformed_position( - self._logp_fn, - self._bijection, - jnp.array(transformed_position), - ) - return ( - float(logp), - float(logdet), - *[np.array(val, dtype="float64") for val in arrays], - ) - except Exception as e: - print(e) - print(traceback.format_exc()) - raise - - def init_from_transformed_position_part1(self, transformed_position): - try: - transformed_position = jnp.array(transformed_position) - logdet, untransformed_position = _init_from_transformed_position_part1( - self._logp_fn, - self._bijection, - transformed_position, - ) - part1 = (logdet, untransformed_position, transformed_position) - return np.array(untransformed_position, dtype="float64"), part1 - except Exception as e: - print(e) - print(traceback.format_exc()) - raise - - def init_from_transformed_position_part2( - self, - part1, - untransformed_gradient, - ): - try: - # TODO We could extract the arrays from the pull_grad function - # to reuse computation from part1 - logdet, *arrays = _init_from_transformed_position_part2( - self._bijection, - part1, - untransformed_gradient, - ) - return float(logdet), *[ - np.array(val, dtype="float64") for val in arrays - ] - except Exception as e: - print(e) - print(traceback.format_exc()) - raise - - def init_from_untransformed_position(self, untransformed_position): - try: - logp, logdet, *arrays = _init_from_untransformed_position( - self._logp_fn, - self._bijection, - jnp.array(untransformed_position), - ) - arrays = [np.array(val, dtype="float64") for val in arrays] - return float(logp), float(logdet), *arrays - except Exception as e: - print(e) - print(traceback.format_exc()) - raise - - def inv_transform(self, position, gradient): - try: - logdet, *arrays = _inv_transform( - self._bijection, jnp.array(position), jnp.array(gradient) - ) - return logdet, *[np.array(val, dtype="float64") for val in arrays] - except Exception as e: - print(e) - print(traceback.format_exc()) - raise + def init_from_transformed_position(self, transformed_position): + try: + logp, logdet, *arrays = _init_from_transformed_position( + self._logp_fn, + self._bijection, + jnp.array(transformed_position), + ) + return ( + float(logp), + float(logdet), + *[np.array(val, dtype="float64") for val in arrays], + ) + except Exception as e: + print(e) + print(traceback.format_exc()) + raise + + def init_from_transformed_position_part1(self, transformed_position): + try: + transformed_position = jnp.array(transformed_position) + logdet, untransformed_position = _init_from_transformed_position_part1( + self._logp_fn, + self._bijection, + transformed_position, + ) + part1 = (logdet, untransformed_position, transformed_position) + return np.array(untransformed_position, dtype="float64"), part1 + except Exception as e: + print(e) + print(traceback.format_exc()) + raise + + def init_from_transformed_position_part2( + self, + part1, + untransformed_gradient, + ): + try: + # TODO We could extract the arrays from the pull_grad function + # to reuse computation from part1 + logdet, *arrays = _init_from_transformed_position_part2( + self._bijection, + part1, + untransformed_gradient, + ) + return float(logdet), *[ + np.array(val, dtype="float64") for val in arrays + ] + except Exception as e: + print(e) + print(traceback.format_exc()) + raise + + def init_from_untransformed_position(self, untransformed_position): + try: + logp, logdet, *arrays = _init_from_untransformed_position( + self._logp_fn, + self._bijection, + jnp.array(untransformed_position), + ) + arrays = [np.array(val, dtype="float64") for val in arrays] + return float(logp), float(logdet), *arrays + except Exception as e: + print(e) + print(traceback.format_exc()) + raise + + def inv_transform(self, position, gradient): + try: + logdet, *arrays = _inv_transform( + self._bijection, jnp.array(position), jnp.array(gradient) + ) + return logdet, *[np.array(val, dtype="float64") for val in arrays] + except Exception as e: + print(e) + print(traceback.format_exc()) + raise +def make_transform_adapter( + *, + verbose=False, + window_size=600, + show_progress=False, + nn_depth=1, + nn_width=None, + num_layers=9, + num_diag_windows=9, + learning_rate=5e-4, + untransformed_dim=None, + zero_init=True, + batch_size=128, + reuse_opt_state=False, + max_patience=20, + householder_layer=False, + dct_layer=False, + gamma=None, + log_inside_batch=False, + initial_skip=120, + extension_windows=[], + extend_dct=False, + extension_var_count=4, + extension_var_trafo_count=2, + debug_save_bijection=False, + make_optimizer=None, +): return partial( TransformAdapter, verbose=verbose, From c6f57013cac1d80ef95b158b3ce927d0502893fe Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Wed, 12 Feb 2025 14:26:53 +0100 Subject: [PATCH 45/55] chore: gitignore zarr files --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 6f4df52..bcc0115 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ wheels .cargo *traces* .pyrightconfig.json +*.zarr From 6a1d3efaf28de0a76bd571aae7c7fa846f510467 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Wed, 12 Feb 2025 14:29:11 +0100 Subject: [PATCH 46/55] build: allow python 3.13 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 3ca3439..e0443f8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,7 +8,7 @@ description = "Sample Stan or PyMC models" version = "0.14.0" authors = [{ name = "PyMC Developers", email = "pymc.devs@gmail.com" }] readme = "README.md" -requires-python = ">=3.10,<3.13" +requires-python = ">=3.10,<3.14" license = { text = "MIT" } classifiers = [ "Programming Language :: Rust", From df358ca6ac8a724899b0b72327d78e688b4b09ee Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Wed, 12 Feb 2025 16:24:16 +0100 Subject: [PATCH 47/55] chore: update dependencies --- Cargo.lock | 400 ++++++++++++++++++++----------------------------- Cargo.toml | 16 +- pyproject.toml | 10 ++ src/pyfunc.rs | 2 +- src/stan.rs | 4 +- src/wrapper.rs | 8 +- 6 files changed, 191 insertions(+), 249 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b0860cc..15c0f85 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -77,9 +77,9 @@ checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" [[package]] name = "arrow" -version = "53.4.0" +version = "54.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaf3437355979f1e93ba84ba108c38be5767713051f3c8ffbf07c094e2e61f9f" +checksum = "6422e12ac345a0678d7a17e316238e3a40547ae7f92052b77bd86d5e0239f3fc" dependencies = [ "arrow-arith", "arrow-array", @@ -95,24 +95,23 @@ dependencies = [ [[package]] name = "arrow-arith" -version = "53.4.0" +version = "54.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31dce77d2985522288edae7206bffd5fc4996491841dda01a13a58415867e681" +checksum = "23cf34bb1f48c41d3475927bcc7be498665b8e80b379b88f62a840337f8b8248" dependencies = [ "arrow-array", "arrow-buffer", "arrow-data", "arrow-schema", "chrono", - "half", "num", ] [[package]] name = "arrow-array" -version = "53.4.0" +version = "54.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d45fe6d3faed0435b7313e59a02583b14c6c6339fa7729e94c32a20af319a79" +checksum = "fb4a06d507f54b70a277be22a127c8ffe0cec6cd98c0ad8a48e77779bbda8223" dependencies = [ "ahash", "arrow-buffer", @@ -126,9 +125,9 @@ dependencies = [ [[package]] name = "arrow-buffer" -version = "53.4.0" +version = "54.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b02656a35cc103f28084bc80a0159668e0a680d919cef127bd7e0aaccb06ec1" +checksum = "d69d326d5ad1cb82dcefa9ede3fee8fdca98f9982756b16f9cb142f4aa6edc89" dependencies = [ "bytes", "half", @@ -137,9 +136,9 @@ dependencies = [ [[package]] name = "arrow-cast" -version = "53.4.0" +version = "54.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c73c6233c5b5d635a56f6010e6eb1ab9e30e94707db21cea03da317f67d84cf3" +checksum = "626e65bd42636a84a238bed49d09c8777e3d825bf81f5087a70111c2831d9870" dependencies = [ "arrow-array", "arrow-buffer", @@ -157,9 +156,9 @@ dependencies = [ [[package]] name = "arrow-data" -version = "53.4.0" +version = "54.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f2861ffa86f107b8ab577d86cff7c7a490243eabe961ba1e1af4f27542bb79" +checksum = "1858e7c7d01c44cf71c21a85534fd1a54501e8d60d1195d0d6fbcc00f4b10754" dependencies = [ "arrow-buffer", "arrow-schema", @@ -169,26 +168,23 @@ dependencies = [ [[package]] name = "arrow-ord" -version = "53.4.0" +version = "54.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6f202a879d287099139ff0d121e7f55ae5e0efe634b8cf2106ebc27a8715dee" +checksum = "8aa06e5f267dc53efbacb933485c79b6fc1685d3ffbe870a16ce4e696fb429da" dependencies = [ "arrow-array", "arrow-buffer", "arrow-data", "arrow-schema", "arrow-select", - "half", - "num", ] [[package]] name = "arrow-row" -version = "53.4.0" +version = "54.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f936954991c360ba762dff23f5dda16300774fafd722353d9683abd97630ae" +checksum = "66f1144bb456a2f9d82677bd3abcea019217e572fc8f07de5a7bac4b2c56eb2c" dependencies = [ - "ahash", "arrow-array", "arrow-buffer", "arrow-data", @@ -198,18 +194,18 @@ dependencies = [ [[package]] name = "arrow-schema" -version = "53.4.0" +version = "54.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9579b9d8bce47aa41389fe344f2c6758279983b7c0ebb4013e283e3e91bb450e" +checksum = "105f01ec0090259e9a33a9263ec18ff223ab91a0ea9fbc18042f7e38005142f6" dependencies = [ "bitflags", ] [[package]] name = "arrow-select" -version = "53.4.0" +version = "54.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7471ba126d0b0aaa24b50a36bc6c25e4e74869a1fd1a5553357027a0b1c8d1f1" +checksum = "f690752fdbd2dee278b5f1636fefad8f2f7134c85e20fd59c4199e15a39a6807" dependencies = [ "ahash", "arrow-array", @@ -221,9 +217,9 @@ dependencies = [ [[package]] name = "arrow-string" -version = "53.4.0" +version = "54.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72993b01cb62507b06f1fb49648d7286c8989ecfabdb7b77a750fcb54410731b" +checksum = "d0fff9cd745a7039b66c47ecaf5954460f9fa12eed628f65170117ea93e64ee0" dependencies = [ "arrow-array", "arrow-buffer", @@ -487,12 +483,6 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" -[[package]] -name = "coe-rs" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8f1e641542c07631228b1e0dc04b69ae3c1d58ef65d5691a439711d805c698" - [[package]] name = "console" version = "0.15.10" @@ -633,12 +623,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "dbgf" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ca96b45ca70b8045e0462f191bd209fcb3c3bfe8dbfb1257ada54c4dd59169" - [[package]] name = "deranged" version = "0.3.11" @@ -659,16 +643,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "dyn-stack" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e53799688f5632f364f8fb387488dd05db9fe45db7011be066fc20e7027f8b" -dependencies = [ - "bytemuck", - "reborrow", -] - [[package]] name = "dyn-stack" version = "0.13.0" @@ -702,33 +676,13 @@ dependencies = [ "syn", ] -[[package]] -name = "equator" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c35da53b5a021d2484a7cc49b2ac7f2d840f8236a286f84202369bd338d761ea" -dependencies = [ - "equator-macro 0.2.1", -] - [[package]] name = "equator" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" dependencies = [ - "equator-macro 0.4.2", -] - -[[package]] -name = "equator-macro" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bf679796c0322556351f287a51b49e48f7c4986e727b5dd78c972d30e2e16cc" -dependencies = [ - "proc-macro2", - "quote", - "syn", + "equator-macro", ] [[package]] @@ -744,39 +698,50 @@ dependencies = [ [[package]] name = "faer" -version = "0.19.4" +version = "0.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64bc4855cb2792ae3520e8af22051a47a6d6dc8300ebc0ddf51ad73f65bd0dc9" +checksum = "4fe562e9ab13fe9d1249786e560a8f52237f6ab7520bdda9a022997fb0c081fe" dependencies = [ "bytemuck", - "coe-rs", - "dbgf", - "dyn-stack 0.10.0", - "equator 0.4.2", - "faer-entity", + "dyn-stack", + "equator", + "faer-macros", + "faer-traits", "gemm", + "generativity", "libm", - "matrixcompare", - "matrixcompare-core", - "nano-gemm", + "npyz", "num-complex", "num-traits", - "paste", + "pulp", "reborrow", ] [[package]] -name = "faer-entity" -version = "0.19.2" +name = "faer-macros" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d0a255d1442b5825c61812a7eafda9034ec53d969c98555251085e148428e6a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "faer-traits" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9c752ab2bff6f0b9597c6a1adc0112f7fd41fb343bc5a009a6274ae9d32fd03" +checksum = "a2d0172aefb5f869561e558d5390657f1aa98ca3c51a09be69a4687064ebfb9a" dependencies = [ "bytemuck", - "coe-rs", + "dyn-stack", + "faer-macros", + "generativity", "libm", "num-complex", "num-traits", - "pulp 0.18.22", + "pulp", "reborrow", ] @@ -796,7 +761,7 @@ version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab96b703d31950f1aeddded248bc95543c9efc7ac9c4a21fda8703a83ee35451" dependencies = [ - "dyn-stack 0.13.0", + "dyn-stack", "gemm-c32", "gemm-c64", "gemm-common", @@ -816,7 +781,7 @@ version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6db9fd9f40421d00eea9dd0770045a5603b8d684654816637732463f4073847" dependencies = [ - "dyn-stack 0.13.0", + "dyn-stack", "gemm-common", "num-complex", "num-traits", @@ -831,7 +796,7 @@ version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfcad8a3d35a43758330b635d02edad980c1e143dc2f21e6fd25f9e4eada8edf" dependencies = [ - "dyn-stack 0.13.0", + "dyn-stack", "gemm-common", "num-complex", "num-traits", @@ -847,14 +812,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a352d4a69cbe938b9e2a9cb7a3a63b7e72f9349174a2752a558a8a563510d0f3" dependencies = [ "bytemuck", - "dyn-stack 0.13.0", + "dyn-stack", "half", "libm", "num-complex", "num-traits", "once_cell", "paste", - "pulp 0.21.4", + "pulp", "raw-cpuid", "seq-macro", "sysctl", @@ -866,7 +831,7 @@ version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cff95ae3259432f3c3410eaa919033cd03791d81cebd18018393dc147952e109" dependencies = [ - "dyn-stack 0.13.0", + "dyn-stack", "gemm-common", "gemm-f32", "half", @@ -883,7 +848,7 @@ version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc8d3d4385393304f407392f754cd2dc4b315d05063f62cf09f47b58de276864" dependencies = [ - "dyn-stack 0.13.0", + "dyn-stack", "gemm-common", "num-complex", "num-traits", @@ -898,7 +863,7 @@ version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35b2a4f76ce4b8b16eadc11ccf2e083252d8237c1b589558a49b0183545015bd" dependencies = [ - "dyn-stack 0.13.0", + "dyn-stack", "gemm-common", "num-complex", "num-traits", @@ -907,6 +872,12 @@ dependencies = [ "seq-macro", ] +[[package]] +name = "generativity" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5881e4c3c2433fe4905bb19cfd2b5d49d4248274862b68c27c33d9ba4e13f9ec" + [[package]] name = "generic-array" version = "0.14.7" @@ -1197,22 +1168,6 @@ version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" -[[package]] -name = "matrixcompare" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37832ba820e47c93d66b4360198dccb004b43c74abc3ac1ce1fed54e65a80445" -dependencies = [ - "matrixcompare-core", - "num-traits", -] - -[[package]] -name = "matrixcompare-core" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0bdabb30db18805d5290b3da7ceaccbddba795620b86c02145d688e04900a73" - [[package]] name = "matrixmultiply" version = "0.3.9" @@ -1275,89 +1230,6 @@ dependencies = [ "target-features", ] -[[package]] -name = "nano-gemm" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f563548d38f390ef9893e4883ec38c1fb312f569e98d76bededdd91a3b41a043" -dependencies = [ - "equator 0.2.2", - "nano-gemm-c32", - "nano-gemm-c64", - "nano-gemm-codegen", - "nano-gemm-core", - "nano-gemm-f32", - "nano-gemm-f64", - "num-complex", -] - -[[package]] -name = "nano-gemm-c32" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a40449e57a5713464c3a1208c4c3301c8d29ee1344711822cf022bc91373a91b" -dependencies = [ - "nano-gemm-codegen", - "nano-gemm-core", - "num-complex", -] - -[[package]] -name = "nano-gemm-c64" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743a6e6211358fba85d1009616751e4107da86f4c95b24e684ce85f25c25b3bf" -dependencies = [ - "nano-gemm-codegen", - "nano-gemm-core", - "num-complex", -] - -[[package]] -name = "nano-gemm-codegen" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "963bf7c7110d55430169dc74c67096375491ed580cd2ef84842550ac72e781fa" - -[[package]] -name = "nano-gemm-core" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe3fc4f83ae8861bad79dc3c016bd6b0220da5f9de302e07d3112d16efc24aa6" - -[[package]] -name = "nano-gemm-f32" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e3681b7ce35658f79da94b7f62c60a005e29c373c7111ed070e3bf64546a8bb" -dependencies = [ - "nano-gemm-codegen", - "nano-gemm-core", -] - -[[package]] -name = "nano-gemm-f64" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc1e619ed04d801809e1f63e61b669d380c4119e8b0cdd6ed184c6b111f046d8" -dependencies = [ - "nano-gemm-codegen", - "nano-gemm-core", -] - -[[package]] -name = "ndarray" -version = "0.15.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32" -dependencies = [ - "matrixmultiply", - "num-complex", - "num-integer", - "num-traits", - "rawpointer", -] - [[package]] name = "ndarray" version = "0.16.1" @@ -1383,6 +1255,17 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "npyz" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13f27ea175875c472b3df61ece89a6d6ef4e0627f43704e400c782f174681ebd" +dependencies = [ + "byteorder", + "num-bigint", + "py_literal", +] + [[package]] name = "num" version = "0.4.3" @@ -1477,7 +1360,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b94caae805f998a07d33af06e6a3891e38556051b8045c615470a71590e13e78" dependencies = [ "libc", - "ndarray 0.16.1", + "ndarray", "num-complex", "num-integer", "num-traits", @@ -1498,7 +1381,7 @@ dependencies = [ "numpy", "nuts-rs", "pyo3", - "rand", + "rand 0.9.0", "rand_chacha 0.9.0", "rand_distr", "rayon", @@ -1511,18 +1394,16 @@ dependencies = [ [[package]] name = "nuts-rs" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "975b57d4d2a3c0755252745d0afc55886b8a0b482be224cb615591b35280f99d" +version = "0.15.0" dependencies = [ "anyhow", "arrow", "faer", - "itertools 0.13.0", + "itertools 0.14.0", "multiversion", - "pulp 0.20.1", - "rand", - "rand_chacha 0.3.1", + "pulp", + "rand 0.9.0", + "rand_chacha 0.9.0", "rand_distr", "rayon", "thiserror 2.0.11", @@ -1587,6 +1468,51 @@ dependencies = [ "sha2", ] +[[package]] +name = "pest" +version = "2.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" +dependencies = [ + "memchr", + "thiserror 2.0.11", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "816518421cfc6887a0d62bf441b6ffb4536fcc926395a69e1a85852d4363f57e" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d1396fd3a870fc7838768d171b4616d5c91f6cc25e377b673d714567d99377b" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pest_meta" +version = "2.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1e58089ea25d717bfd31fb534e4f3afcc2cc569c70de3e239778991ea3b7dea" +dependencies = [ + "once_cell", + "pest", + "sha2", +] + [[package]] name = "pkg-config" version = "0.3.31" @@ -1672,40 +1598,29 @@ dependencies = [ [[package]] name = "pulp" -version = "0.18.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0a01a0dc67cf4558d279f0c25b0962bd08fc6dec0137699eae304103e882fe6" -dependencies = [ - "bytemuck", - "libm", - "num-complex", - "reborrow", -] - -[[package]] -name = "pulp" -version = "0.20.1" +version = "0.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e3f19bdeda2e49d16c8ae90f9615adc2298ee16974bb250d0afb705e33043f" +checksum = "95fb7a99b37aaef4c7dd2fd15a819eb8010bfc7a2c2155230d51f497316cad6d" dependencies = [ "bytemuck", + "cfg-if", "libm", "num-complex", "reborrow", + "version_check", ] [[package]] -name = "pulp" -version = "0.21.4" +name = "py_literal" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95fb7a99b37aaef4c7dd2fd15a819eb8010bfc7a2c2155230d51f497316cad6d" +checksum = "102df7a3d46db9d3891f178dcc826dc270a6746277a9ae6436f8d29fd490a8e1" dependencies = [ - "bytemuck", - "cfg-if", - "libm", + "num-bigint", "num-complex", - "reborrow", - "version_check", + "num-traits", + "pest", + "pest_derive", ] [[package]] @@ -1792,6 +1707,17 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rand" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.0", + "zerocopy 0.8.17", +] + [[package]] name = "rand_chacha" version = "0.3.1" @@ -1833,12 +1759,12 @@ dependencies = [ [[package]] name = "rand_distr" -version = "0.4.3" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" +checksum = "ddc3b5afe4c995c44540865b8ca5c52e6a59fa362da96c5d30886930ddc8da1c" dependencies = [ "num-traits", - "rand", + "rand 0.9.0", ] [[package]] @@ -2071,15 +1997,15 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tch" -version = "0.18.1" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb3500c87ef72447c23b33ed6f15fac45a616b09bcac53e62e0e4386bddb3b9d" +checksum = "aa1ed622c8f13b0c42f8b1afa0e5e9ccccd82ecb6c0e904120722ab52fdc5234" dependencies = [ "half", "lazy_static", "libc", - "ndarray 0.15.6", - "rand", + "ndarray", + "rand 0.8.5", "safetensors", "thiserror 1.0.69", "torch-sys", @@ -2172,9 +2098,9 @@ dependencies = [ [[package]] name = "torch-sys" -version = "0.18.1" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61b87ed41261d4278060c3ba3e735c224687cf312403e4565f2ca75310279d73" +checksum = "ef14f5d239e3d60f4919f536a5dfe1d4f71b27b7abf6fe6875fd3a4b22c2dcd5" dependencies = [ "anyhow", "cc", @@ -2188,6 +2114,12 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + [[package]] name = "unicode-ident" version = "1.0.16" @@ -2208,9 +2140,9 @@ checksum = "c7de7d73e1754487cb58364ee906a499937a0dfabd86bcb980fa99ec8c8fa2ce" [[package]] name = "upon" -version = "0.8.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fe29601d1624f104fa9a35ea71a5f523dd8bd1cfc8c31f8124ad2b829f013c0" +checksum = "cc1243af2969e332d5b9b99087eddd44d04a41da8630ed53e06df497b7f5c747" [[package]] name = "version_check" diff --git a/Cargo.toml b/Cargo.toml index 2f4948f..8f65ff1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,8 +2,8 @@ name = "nutpie" version = "0.14.0" authors = [ - "Adrian Seyboldt ", - "PyMC Developers ", + "Adrian Seyboldt ", + "PyMC Developers ", ] edition = "2021" license = "MIT" @@ -22,23 +22,23 @@ name = "_lib" crate-type = ["cdylib"] [dependencies] -nuts-rs = "0.14.0" +nuts-rs = "0.15.0" numpy = "0.23.0" -rand = "0.8.5" +rand = "0.9.0" thiserror = "2.0.3" rand_chacha = "0.9.0" rayon = "1.10.0" # Keep arrow in sync with nuts-rs requirements -arrow = { version = "53.1.0", default-features = false, features = ["ffi"] } +arrow = { version = "54.1.0", default-features = false, features = ["ffi"] } anyhow = "1.0.72" itertools = "0.14.0" bridgestan = "2.6.1" -rand_distr = "0.4.3" +rand_distr = "0.5.0" smallvec = "1.13.0" -upon = { version = "0.8.1", default-features = false, features = [] } +upon = { version = "0.9.0", default-features = false, features = [] } time-humanize = { version = "0.1.3", default-features = false } indicatif = "0.17.8" -tch = { version = "0.18.0", optional = true } +tch = { version = "0.19.0", optional = true } [dependencies.pyo3] version = "0.23.3" diff --git a/pyproject.toml b/pyproject.toml index e0443f8..5703ca3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,11 +28,21 @@ dynamic = ["version"] stan = ["bridgestan >= 2.6.1"] pymc = ["pymc >= 5.20.1", "numba >= 0.60.0"] pymc-jax = ["pymc >= 5.20.1", "jax >= 0.4.27"] +nnflow = ["flowjax >= 17.0.2"] +dev = [ + "bridgestan >= 2.6.1", + "pymc >= 5.20.1", + "numba >= 0.60.0", + "jax >= 0.4.27", + "flowjax >= 17.0.2", + "pytest", +] all = [ "bridgestan >= 2.6.1", "pymc >= 5.20.1", "numba >= 0.60.0", "jax >= 0.4.27", + "flowjax >= 17.0.2", ] [tool.ruff] diff --git a/src/pyfunc.rs b/src/pyfunc.rs index e9399ff..f23145e 100644 --- a/src/pyfunc.rs +++ b/src/pyfunc.rs @@ -641,7 +641,7 @@ impl Model for PyModel { position: &mut [f64], ) -> Result<()> { let Some(init_func) = self.init_point_func.as_ref() else { - let dist = Uniform::new(-2f64, 2f64); + let dist = Uniform::new(-2f64, 2f64).expect("Could not create uniform distribution"); position.iter_mut().for_each(|x| *x = dist.sample(rng)); return Ok(()); }; diff --git a/src/stan.rs b/src/stan.rs index 52e6694..e258096 100644 --- a/src/stan.rs +++ b/src/stan.rs @@ -12,7 +12,7 @@ use pyo3::prelude::*; use pyo3::types::{PyDict, PyTuple}; use pyo3::{exceptions::PyValueError, pyclass, pymethods, PyResult}; use rand::prelude::Distribution; -use rand::{thread_rng, RngCore}; +use rand::{rng, RngCore}; use rand_distr::StandardNormal; use smallvec::{SmallVec, ToSmallVec}; @@ -149,7 +149,7 @@ impl StanModel { ) -> anyhow::Result { let seed = match seed { Some(seed) => seed, - None => thread_rng().next_u32(), + None => rng().next_u32(), }; let data: Option = data.map(CString::new).transpose()?; let model = Arc::new( diff --git a/src/wrapper.rs b/src/wrapper.rs index 55472e7..bb1a523 100644 --- a/src/wrapper.rs +++ b/src/wrapper.rs @@ -26,7 +26,7 @@ use pyo3::{ prelude::*, types::{PyList, PyTuple}, }; -use rand::{thread_rng, RngCore}; +use rand::{rng, RngCore}; #[pyclass] struct PyChainProgress(ChainProgress); @@ -85,7 +85,7 @@ enum Settings { impl PyNutsSettings { fn new_diag(seed: Option) -> Self { let seed = seed.unwrap_or_else(|| { - let mut rng = thread_rng(); + let mut rng = rng(); rng.next_u64() }); let settings = DiagGradNutsSettings { @@ -100,7 +100,7 @@ impl PyNutsSettings { fn new_low_rank(seed: Option) -> Self { let seed = seed.unwrap_or_else(|| { - let mut rng = thread_rng(); + let mut rng = rng(); rng.next_u64() }); let settings = LowRankNutsSettings { @@ -115,7 +115,7 @@ impl PyNutsSettings { fn new_tranform_adapt(seed: Option) -> Self { let seed = seed.unwrap_or_else(|| { - let mut rng = thread_rng(); + let mut rng = rng(); rng.next_u64() }); let settings = TransformedNutsSettings { From 61bad2fbe41d5764dc55d511325d7368d3070bba Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Thu, 13 Feb 2025 12:28:08 +0100 Subject: [PATCH 48/55] work on docs --- docs/SUMMARY.md | 2 +- docs/nf-adapt.md | 2 +- docs/pymc-usage.md | 178 +++++++++++++++++++++++++++++++++++++++++++++ docs/quickstart.md | 78 ++++++++++++++++++++ 4 files changed, 258 insertions(+), 2 deletions(-) create mode 100644 docs/quickstart.md diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 279cdd3..23a52a9 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -1,6 +1,6 @@ # Summary -[Introduction](../README.md) +[Introduction](./quickstart.md) - [Usage with PyMC](./pymc-usage.md) - [Usage with Stan](./stan-usage.md) diff --git a/docs/nf-adapt.md b/docs/nf-adapt.md index d9d0325..f6fa300 100644 --- a/docs/nf-adapt.md +++ b/docs/nf-adapt.md @@ -1,3 +1,3 @@ # Adaptation with normalizing flows -**Experimental** +**Experimental and subject to change** diff --git a/docs/pymc-usage.md b/docs/pymc-usage.md index e66c098..54819b1 100644 --- a/docs/pymc-usage.md +++ b/docs/pymc-usage.md @@ -1 +1,179 @@ # Usage with PyMC models + +This document shows how to use `nutpie` with PyMC models. We will use the +`pymc` package to define a simple model and sample from it using `nutpie`. + +## Installation + +The recommended way to install `pymc` is through the `conda` ecosystem. A good +package manager for conda packages is `pixi`. See for the [pixi +documentation](https://pixi.sh) for instructions on how to install it. + +We create a new project for this example: + +```bash +pixi new pymc-example +``` + +This will create a new directory `pymc-example` with a `pixi.toml` file, that +you can edit to add meta information. + +We then add the `pymc` and `nutpie` packages to the project: + +```bash +cd pymc-example +pixi add pymc nutpie arviz +``` + +You can use Visual Studio Code (VSCode) or JupyterLab to write and run our code. +Both are excellent tools for working with Python and data science projects. + +### Using VSCode + +1. Open VSCode. +2. Open the `pymc-example` directory created earlier. +3. Create a new file named `model.ipynb`. +4. Select the pixi kernel to run the code. + +### Using JupyterLab + +1. Add jupyter labs to the project by running `pixi add jupyterlab`. +1. Open JupyterLab by running `pixi run jupyter lab` in your terminal. +3. Create a new Python notebook. + +## Defining and Sampling a Simple Model + +We will define a simple Bayesian model using `pymc` and sample from it using +`nutpie`. + +### Model Definition + +In your `model.ipypy` file or Jupyter notebook, add the following code: + +```python +import pymc as pm +import nutpie +import pandas as pd + +coords = {"observation": range(3)} + +with pm.Model(coords=coords) as model: + # Prior distributions for the intercept and slope + intercept = pm.Normal("intercept", mu=0, sigma=1) + slope = pm.Normal("slope", mu=0, sigma=1) + + # Likelihood (sampling distribution) of observations + x = [1, 2, 3] + + mu = intercept + slope * x + sigma = pm.HalfNormal("sigma", sigma=1) + y = pm.Normal("y", mu=mu, sigma=sigma, observed=[1, 2, 3], dims="observation") +``` + +### Sampling + +We can now compile the model using the numba backend: + +```python +compiled = nutpie.compile_pymc_model(model) +trace = nutpie.sample(compiled) +``` + +While sampling, nutpie shows a progress bar for each chain. It also includes +information about how each chain is doing: + +- It shows the current number of draws +- The step size of the integrator (very small stepsizes are typically a bad + sign) +- The number of divergences (if there are divergences, that means that nutpie is + probably not sampling the posterior correctly) +- The number of gradient evaluation nutpie uses for each draw. Large numbers + (100 to 1000) are a sign that the parameterization of the model is not ideal, + and the sampler is very inefficient. + +After sampling, this returns an `arviz` InferenceData object that you can use to +analyze the trace. + +For example, we should check the effective sample size: + +```python +import arviz as az +az.ess(trace) +``` + +and have a look at a trace plot: + +```python +az.plot_trace(trace) +``` + +### Choosing the backend + +Right now, we have been using the numba backend. This is the default backend for +`nutpie`, when sampling from pymc models. It tends to have relatively long +compilation times, but samples small models very efficiently. For larger models +the `jax` backend sometimes outperforms `numba`. + +First, we need to install the `jax` package: + +```bash +pixi add jax +``` + +We can select the backend by passing the `backend` argument to the `compile_pymc_model`: + +```python +compiled_jax = nutpie.compiled_pymc_model(model, backend="jax") +trace = nutpie.sample(compiled_jax) +``` + +If you have an nvidia GPU, you can also use the `jax` backend with the `gpu`. We +will have to install the `jaxlib` package with the `cuda` option + +```bash +pixi add jaxlib --build 'cuda12' +``` + +Restart the kernel and check that the GPU is available: + +```python +import jax + +# Should list the cuda device +jax.devices() +``` + +Sampling again, should now use the GPU, which you can observe by checking the +GPU usage with `nvidia-smi` or `nvtop`. + +### Changing the dataset without recompilation + +If you want to use the same model with different datasets, you can modify +datasets after compilation. Since jax does not like changes in shapes, this is +only recommended with the numba backend. + +First, we define the model, but put our dataset in a `pm.Data` structure: + +```python +with pm.Model(): + x = pm.Data("x", [1, 2, 3]) + intercept = pm.Normal("intercept", mu=0, sigma=1) + slope = pm.Normal("slope", mu=0, sigma=1) + mu = intercept + slope * x + sigma = pm.HalfNormal("sigma", sigma=1) + y = pm.Normal("y", mu=mu, sigma=sigma, observed=[1, 2, 3]) +``` + +We can now compile the model: + +```python +compiled = nutpie.compile_pymc_model(model) +trace = nutpie.sample(compiled) +``` + +After compilation, we can change the dataset: + +```python +compiled2 = compiled.with_data({"x": [4, 5, 6]}) +trace2 = nutpie.sample(compiled2) +``` diff --git a/docs/quickstart.md b/docs/quickstart.md new file mode 100644 index 0000000..20e2d63 --- /dev/null +++ b/docs/quickstart.md @@ -0,0 +1,78 @@ +# Nutpie Documentation + +`nutpie` is a high-performance library designed for Bayesian inference, that +provides efficient sampling algorithms for probabilistic models. It can sample +models that are defined in PyMC or Stan (numpyro and custom hand-coded +likelihoods with gradient are coming soon). + +- Faster sampling than either the PyMC or Stan default samplers. (An average + ~2x speedup on `posteriordb` compared to Stan) +- All the diagnostic information of PyMC and Stan and some more. +- GPU support for PyMC models through jax. +- A more informative progress bar. +- Access to the incomplete trace during sampling. +- *Experimental* normalizing flow adaptation for more efficient sampling of + difficult posteriors. + +## Quickstart + +Install `nutpie` with pip, uv, pixi, or conda: + +For usage with pymc: + +```bash +# One of +pip install "nutpie[pymc]" +uv add "nutpie[pymc]" +pixi add nutpie pymc numba +conda install -c conda-forge nutpie pymc numba +``` + +And then sample with + +```python +import nutpie +import pymc as pm + +with pm.Model() as model: + mu = pm.Normal("mu", mu=0, sigma=1) + obs = pm.Normal("obs", mu=mu, sigma=1, observed=[1, 2, 3]) + +compiled = nutpie.compile_pymc_model(model) +trace = nutpie.sample(compiled) +``` + +Stan needs access to a compiler toolchain, you can find instructions for those +[here](https://mc-stan.org/docs/cmdstan-guide/installation.html#cpp-toolchain). +You can then install nutpie through pip or uv: + +```bash +# One of +pip install "nutpie[stan]" +uv add "nutpie[stan]" +``` + +```python +import nutpie + +model = """ +data { + int N; + real y[N]; +} +parameters { + real mu; +} +model { + mu ~ normal(0, 1); + y ~ normal(mu, 1); +} +""" + +compiled = ( + nutpie + .compile_stan_model(code=model) + .with_data({"N": 3, "y": [1, 2, 3]}) +) +trace = nutpie.sample(compiled) +``` From db139d66764d32d4a092bc721e9227891d72f9e9 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Thu, 13 Feb 2025 12:28:39 +0100 Subject: [PATCH 49/55] ci: don't shadow python versions with uv --- .github/workflows/ci.yml | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5ab1d1b..7eb6740 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -31,11 +31,15 @@ jobs: target: aarch64 steps: - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 - with: - python-version: "3.12" - name: Install uv uses: astral-sh/setup-uv@v5 + - uses: actions/setup-python@v5 + with: + python-version: | + 3.10 + 3.11 + 3.12 + 3.13 - name: Build wheels uses: PyO3/maturin-action@v1 with: @@ -160,7 +164,11 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: | + 3.10 + 3.11 + 3.12 + 3.13 architecture: ${{ matrix.platform.target }} - name: Install uv uses: astral-sh/setup-uv@v5 @@ -211,7 +219,11 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: | + 3.10 + 3.11 + 3.12 + 3.13 - name: Install uv uses: astral-sh/setup-uv@v5 - uses: maxim-lobanov/setup-xcode@v1 From 2e347eeb8911fdeaca8fb66fbc9803fad35f13a1 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Thu, 13 Feb 2025 15:03:24 +0100 Subject: [PATCH 50/55] style: Reformat code --- python/nutpie/normalizing_flow.py | 81 ++++++++++++++---------------- python/nutpie/transform_adapter.py | 46 +++++++---------- 2 files changed, 56 insertions(+), 71 deletions(-) diff --git a/python/nutpie/normalizing_flow.py b/python/nutpie/normalizing_flow.py index 021a687..3bdd524 100644 --- a/python/nutpie/normalizing_flow.py +++ b/python/nutpie/normalizing_flow.py @@ -9,7 +9,7 @@ import flowjax.distributions import flowjax.flows import numpy as np -from paramax import Parameterize, unwrap +from paramax import Parameterize def _generate_sequences(k, r_vals): @@ -35,6 +35,7 @@ def _generate_sequences(k, r_vals): all_sequences.append(sequences) return np.concatenate(all_sequences, axis=0) + def _max_run_length(seq): """ Given a 1D boolean NumPy array 'seq', compute the maximum run length of consecutive @@ -68,6 +69,7 @@ def _max_run_length(seq): run_lengths = np.diff(boundaries) return int(run_lengths.max()) + def _filter_sequences(sequences, m): """ Filter a 2D NumPy boolean array 'sequences' (each row a binary sequence) so that @@ -103,7 +105,9 @@ def _generate_permutations(rng, n_dim, n_layers, max_run=3): all_sequences = _generate_sequences(n_layers, r) valid_sequences = _filter_sequences(all_sequences, max_run) - valid_sequences = np.repeat(valid_sequences, n_dim // len(valid_sequences) + 1, axis=0) + valid_sequences = np.repeat( + valid_sequences, n_dim // len(valid_sequences) + 1, axis=0 + ) rng.shuffle(valid_sequences, axis=0) is_in_first = valid_sequences[:n_dim] rng = np.random.default_rng(42) @@ -149,7 +153,6 @@ def __init__( Likewise `out_features` can also be a string `"scalar"`, in which case the output from the layer will have shape `()`. """ - #dtype = default_floating_dtype() if dtype is None else dtype dtype = np.float32 if dtype is None else dtype wkey, bkey = jax.random.split(key, 2) in_features_ = 1 if in_features == "scalar" else in_features @@ -161,7 +164,9 @@ def __init__( wshape = (out_features_, in_features_) self.weight = eqx.nn._misc.default_init(wkey, wshape, dtype, lim) bshape = (out_features_,) - self.bias = eqx.nn._misc.default_init(bkey, bshape, dtype, lim) if use_bias else None + self.bias = ( + eqx.nn._misc.default_init(bkey, bshape, dtype, lim) if use_bias else None + ) self.in_features = in_features self.out_features = out_features @@ -205,6 +210,7 @@ def __call__(self, x: jax.Array, *, key=None) -> jax.Array: x = jnp.squeeze(x) return x + class FactoredMLP(eqx.Module, strict=True): """Standard Multi-Layer Perceptron; also known as a feed-forward network. @@ -268,7 +274,6 @@ def __init__( Likewise `out_size` can also be a string `"scalar"`, in which case the output from the module will have shape `()`. """ - #dtype = default_floating_dtype() if dtype is None else dtype keys = jax.random.split(key, depth + 1) layers = [] if isinstance(width_size, int): @@ -290,9 +295,7 @@ def __init__( layers.append((U, K)) else: k = width_size[0] - layers.append( - Linear(in_size, k, use_bias, dtype=dtype, key=keys[0]) - ) + layers.append(Linear(in_size, k, use_bias, dtype=dtype, key=keys[0])) activations.append(eqx.filter_vmap(lambda: activation, axis_size=k)()) for i in range(depth - 1): @@ -331,9 +334,6 @@ def __init__( # In case `activation` or `final_activation` are learnt, then make a separate # copy of their weights for every neuron. self.activation = tuple(activations) - #self.activation = eqx.filter_vmap( - # eqx.filter_vmap(lambda: activation), axis_size=depth - #)() if out_size == "scalar": self.final_activation = final_activation else: @@ -344,7 +344,7 @@ def __init__( self.use_final_bias = use_final_bias @jax.named_scope("eqx.nn.MLP") - def __call__(self, x: jax.Array, *, key = None) -> jax.Array: + def __call__(self, x: jax.Array, *, key=None) -> jax.Array: """**Arguments:** - `x`: A JAX array with shape `(in_size,)`. (Or shape `()` if @@ -382,7 +382,6 @@ def __call__(self, x: jax.Array, *, key = None) -> jax.Array: return x - def make_mvscale(key, n_dim, size, randomize_base=False): def make_single_hh(key, idx): key1, key2 = jax.random.split(key) @@ -399,7 +398,10 @@ def make_single_hh(key, idx): else: indices = [val % n_dim for val in range(size)] - return bijections.Chain([make_single_hh(key, idx) for key, idx in zip(keys, indices)]) + return bijections.Chain( + [make_single_hh(key, idx) for key, idx in zip(keys, indices)] + ) + def make_hh(key, n_dim, size, randomize_base=False): def make_single_hh(key, idx): @@ -415,19 +417,16 @@ def make_single_hh(key, idx): else: indices = [val % n_dim for val in range(size)] - return bijections.Chain([make_single_hh(key, idx) for key, idx in zip(keys, indices)]) + return bijections.Chain( + [make_single_hh(key, idx) for key, idx in zip(keys, indices)] + ) + def make_elemwise_trafo(key, n_dim, *, count=1): def make_elemwise(key, loc): key1, key2 = jax.random.split(key) - scale = Parameterize( - lambda x: x + jnp.sqrt(1 + x**2), - jnp.zeros(()) - ) - theta = Parameterize( - lambda x: x + jnp.sqrt(1 + x**2), - jnp.zeros(()) - ) + scale = Parameterize(lambda x: x + jnp.sqrt(1 + x**2), jnp.zeros(())) + theta = Parameterize(lambda x: x + jnp.sqrt(1 + x**2), jnp.zeros(())) affine = bijections.AsymmetricAffine( loc, @@ -459,6 +458,7 @@ def make(key): make_affine = eqx.filter_vmap(make, axis_size=n_dim)(keys) return bijections.Vmap(make_affine, in_axes=eqx.if_array(0)) + def make_elemwise_trafo_(key, n_dim, *, count=1): def make_elemwise(key): scale = Parameterize( @@ -497,6 +497,7 @@ def make(key): make_affine = eqx.filter_vmap(make)(keys) return bijections.Vmap(make_affine()) + def make_coupling(key, dim, n_untransformed, **kwargs): n_transformed = dim - n_untransformed @@ -510,10 +511,12 @@ def make_coupling(key, dim, n_untransformed, **kwargs): else: nn_width = 2 * dim - transformer = bijections.Chain([ - make_elemwise_trafo(key, n_transformed, count=3), - mvscale, - ]) + transformer = bijections.Chain( + [ + make_elemwise_trafo(key, n_transformed, count=3), + mvscale, + ] + ) def make_mlp(out_size): if isinstance(nn_width, tuple): @@ -541,6 +544,7 @@ def make_mlp(out_size): **kwargs, ) + def make_flow( seed, positions, @@ -601,16 +605,6 @@ def make_flow( if n_layers == 0: return bijections.Chain(flows) - scale = Parameterize( - lambda x: x + jnp.sqrt(1 + x**2), - jnp.zeros(n_dim), - ) - affine = eqx.tree_at( - where=lambda aff: aff.scale, - pytree=bijections.Affine(jnp.zeros(n_dim), jnp.ones(n_dim)), - replace=scale, - ) - def make_layer(key, untransformed_dim: int | None, permutation=None): key, key_couple, key_permute, key_hh = jax.random.split(key, 4) @@ -625,7 +619,7 @@ def make_layer(key, untransformed_dim: int | None, permutation=None): n_dim, untransformed_dim, nn_activation=jax.nn.gelu, - nn_width=nn_width + nn_width=nn_width, ) if zero_init: @@ -646,9 +640,7 @@ def add_default_permute(bijection, dim, key): if dim == 2: outer = bijections.Flip((dim,)) else: - outer = bijections.Permute( - jax.random.permutation(key, jnp.arange(dim)) - ) + outer = bijections.Permute(jax.random.permutation(key, jnp.arange(dim))) return bijections.Sandwich(outer, bijection) @@ -698,6 +690,7 @@ def add_default_permute(bijection, dim, key): return bijections.Chain([bijection, *flows]) + def extend_flow( key, base, @@ -714,6 +707,8 @@ def extend_flow( dct: bool = False, extension_var_trafo_count=2, verbose: bool = False, + nn_width=None, + nn_depth=None, ): n_draws, n_dim = positions.shape @@ -871,9 +866,7 @@ def extend_flow( inner.outer, bijections.Chain( [ - bijections.Sandwich( - bijections.Flip(shape=(n_dim,)), coupling - ), + bijections.Sandwich(bijections.Flip(shape=(n_dim,)), coupling), inner.inner, ] ), diff --git a/python/nutpie/transform_adapter.py b/python/nutpie/transform_adapter.py index 9721d7c..02eef36 100644 --- a/python/nutpie/transform_adapter.py +++ b/python/nutpie/transform_adapter.py @@ -1,5 +1,3 @@ -from typing import Callable, Literal, Union, cast -import math from functools import partial import numpy as np @@ -10,9 +8,8 @@ import flowjax import flowjax.flows import flowjax.train -from flowjax import bijections import optax -from paramax import Parameterize, unwrap +from paramax import unwrap from nutpie.normalizing_flow import extend_flow, make_flow @@ -66,9 +63,7 @@ def compute_loss(bijection, draw, grad, logp): if self._gamma is None: def compute_loss(bijection, draw, grad, logp): - draw, grad, logp = bijection.inverse_gradient_and_val_( - draw, grad, logp - ) + draw, grad, logp = bijection.inverse_gradient_and_val_(draw, grad, logp) cost = ((draw + grad) ** 2).sum() return cost @@ -138,6 +133,7 @@ def _init_from_transformed_position(logp_fn, bijection, transformed_position): transformed_gradient, ) + @eqx.filter_jit def _init_from_transformed_position_part1(logp_fn, bijection, transformed_position): bijection = unwrap(bijection) @@ -147,6 +143,7 @@ def _init_from_transformed_position_part1(logp_fn, bijection, transformed_positi return (logdet, untransformed_position) + @eqx.filter_jit def _init_from_transformed_position_part2( bijection, @@ -162,6 +159,7 @@ def _init_from_transformed_position_part2( transformed_gradient, ) + @eqx.filter_jit def _init_from_untransformed_position(logp_fn, bijection, untransformed_position): logp, untransformed_gradient = jax.value_and_grad(lambda x: logp_fn(x)[0])( @@ -178,6 +176,7 @@ def _init_from_untransformed_position(logp_fn, bijection, untransformed_position transformed_gradient, ) + @eqx.filter_jit def _inv_transform(bijection, untransformed_position, untransformed_gradient): bijection = unwrap(bijection) @@ -188,6 +187,7 @@ def _inv_transform(bijection, untransformed_position, untransformed_gradient): ) return logdet, transformed_position, transformed_gradient + class TransformAdapter: def __init__( self, @@ -228,9 +228,7 @@ def __init__( self._num_layers = num_layers if make_optimizer is None: self._make_optimizer = lambda: optax.apply_if_finite( - #optax.adamw(learning_rate), 50 - optax.adabelief(learning_rate), 50 - #optax.adam(learning_rate), 50 + optax.adamw(learning_rate), 50 ) else: self._make_optimizer = make_optimizer @@ -303,9 +301,7 @@ def update(self, seed, positions, gradients, logps): flowjax.distributions.StandardNormal(fit.shape), fit ) params, static = eqx.partition(flow, eqx.is_inexact_array) - new_loss = self._loss_fn( - params, static, positions, gradients, logps - ) + new_loss = self._loss_fn(params, static, positions, gradients, logps) if self._verbose: print("loss from diag:", new_loss) @@ -316,12 +312,8 @@ def update(self, seed, positions, gradients, logps): return - positions = np.array( - positions[self._initial_skip :][-self._window_size :] - ) - gradients = np.array( - gradients[self._initial_skip :][-self._window_size :] - ) + positions = np.array(positions[self._initial_skip :][-self._window_size :]) + gradients = np.array(gradients[self._initial_skip :][-self._window_size :]) logps = np.array(logps[self._initial_skip :][-self._window_size :]) if len(positions) < 10: @@ -431,9 +423,7 @@ def update(self, seed, positions, gradients, logps): ) if self._verbose: - print( - f"Chain {self._chain}: New loss {new_loss}, old loss {old_loss}" - ) + print(f"Chain {self._chain}: New loss {new_loss}, old loss {old_loss}") if not np.isfinite(old_loss): flow = flowjax.flows.Transformed( @@ -473,14 +463,17 @@ def update(self, seed, positions, gradients, logps): (self.index, fit, (positions, gradients, logps)) ) - def valid_new_logp(): logdet, pos, grad = _inv_transform( fit, jnp.array(positions[-1]), jnp.array(gradients[-1]), ) - return np.isfinite(logdet) and np.isfinite(pos[0]).all() and np.isfinite(grad[0]).all() + return ( + np.isfinite(logdet) + and np.isfinite(pos[0]).all() + and np.isfinite(grad[0]).all() + ) if (not np.isfinite(old_loss)) and (not np.isfinite(new_loss)): self._bijection = self._make_flow_fn( @@ -555,9 +548,7 @@ def init_from_transformed_position_part2( part1, untransformed_gradient, ) - return float(logdet), *[ - np.array(val, dtype="float64") for val in arrays - ] + return float(logdet), *[np.array(val, dtype="float64") for val in arrays] except Exception as e: print(e) print(traceback.format_exc()) @@ -588,6 +579,7 @@ def inv_transform(self, position, gradient): print(traceback.format_exc()) raise + def make_transform_adapter( *, verbose=False, From 09f0b3c5fcd08aacf7094c2342b15ae87b3b9474 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Thu, 13 Feb 2025 15:20:15 +0100 Subject: [PATCH 51/55] chore: fix windows ci issue --- .github/workflows/ci.yml | 16 ++++++++++++++-- Cargo.lock | 2 ++ Cargo.toml | 2 +- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7eb6740..41609a5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -40,11 +40,23 @@ jobs: 3.11 3.12 3.13 + # Leave out 3.13 on aarch due to an issue in pyo3/rust-numpy 0.23.4 - name: Build wheels uses: PyO3/maturin-action@v1 + if: ${{ matrix.platform.target == 'aarch64' }} with: target: ${{ matrix.platform.target }} - args: --release --out dist --find-interpreter --zig + args: --release --out dist --interpreter 3.10 3.11 3.12 --zig + sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} + manylinux: auto + before-script-linux: | + dnf install -y clang-libs clang || sudo apt install llvm-dev libclang-dev clang + - name: Build wheels + uses: PyO3/maturin-action@v1 + if: ${{ matrix.platform.target == 'x86_64' }} + with: + target: ${{ matrix.platform.target }} + args: --release --out dist --interpreter 3.10 3.11 3.12 3.13 --zig sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} manylinux: auto before-script-linux: | @@ -168,7 +180,7 @@ jobs: 3.10 3.11 3.12 - 3.13 + # 3.13 leave out 3.13 due to a segfault architecture: ${{ matrix.platform.target }} - name: Install uv uses: astral-sh/setup-uv@v5 diff --git a/Cargo.lock b/Cargo.lock index 15c0f85..1107cae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1395,6 +1395,8 @@ dependencies = [ [[package]] name = "nuts-rs" version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10e87924d332fce1202087bc67db7ed8f7ef9229da5ec74a5130568f5b7f6ac7" dependencies = [ "anyhow", "arrow", diff --git a/Cargo.toml b/Cargo.toml index 8f65ff1..587aa2f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,7 +41,7 @@ indicatif = "0.17.8" tch = { version = "0.19.0", optional = true } [dependencies.pyo3] -version = "0.23.3" +version = "0.23.4" features = ["extension-module", "anyhow"] [dev-dependencies] From 42b1f7464f5b674883fc5799c12e97165d41367f Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Sat, 15 Feb 2025 23:58:17 +0100 Subject: [PATCH 52/55] Add more documentation using quarto --- .gitignore | 5 + docs/SUMMARY.md | 8 - docs/_quarto.yml | 28 +++ docs/about.qmd | 5 + docs/{quickstart.md => index.qmd} | 14 +- docs/{nf-adapt.md => nf-adapt.qmd} | 0 docs/{pymc-usage.md => pymc-usage.qmd} | 28 ++- docs/sample-stats.qmd | 0 docs/stan-usage.md | 3 - docs/stan-usage.qmd | 230 +++++++++++++++++++++++++ docs/styles.css | 1 + pixi.toml | 6 + 12 files changed, 298 insertions(+), 30 deletions(-) delete mode 100644 docs/SUMMARY.md create mode 100644 docs/_quarto.yml create mode 100644 docs/about.qmd rename docs/{quickstart.md => index.qmd} (91%) rename docs/{nf-adapt.md => nf-adapt.qmd} (100%) rename docs/{pymc-usage.md => pymc-usage.qmd} (91%) create mode 100644 docs/sample-stats.qmd delete mode 100644 docs/stan-usage.md create mode 100644 docs/stan-usage.qmd create mode 100644 docs/styles.css diff --git a/.gitignore b/.gitignore index bcc0115..088a555 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,8 @@ wheels *traces* .pyrightconfig.json *.zarr +book +docs/_site +.quarto +example-iree +posteriordb diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md deleted file mode 100644 index 23a52a9..0000000 --- a/docs/SUMMARY.md +++ /dev/null @@ -1,8 +0,0 @@ -# Summary - -[Introduction](./quickstart.md) - -- [Usage with PyMC](./pymc-usage.md) -- [Usage with Stan](./stan-usage.md) -- [Adaptation with normalizing flows](./nf-adapt.md) -- [Benchmarks](./benchmarks.md) diff --git a/docs/_quarto.yml b/docs/_quarto.yml new file mode 100644 index 0000000..d443541 --- /dev/null +++ b/docs/_quarto.yml @@ -0,0 +1,28 @@ +project: + type: website + +website: + title: "Nutpie" + navbar: + left: + - href: index.qmd + text: Home + - href: pymc-usage.qmd + text: Usage with PyMC + - href: stan-usage.qmd + text: Usage with Stan + - href: sampling-options.qmd + text: Sampling Options + - href: nf-adapt.qmd + text: Normalizing flow adaptation + - href: sample-stats.qmd + text: Diagnostic information + - about.qmd + +format: + html: + theme: + - cosmo + - brand + css: styles.css + toc: true diff --git a/docs/about.qmd b/docs/about.qmd new file mode 100644 index 0000000..07c5e7f --- /dev/null +++ b/docs/about.qmd @@ -0,0 +1,5 @@ +--- +title: "About" +--- + +About this site diff --git a/docs/quickstart.md b/docs/index.qmd similarity index 91% rename from docs/quickstart.md rename to docs/index.qmd index 20e2d63..752d937 100644 --- a/docs/quickstart.md +++ b/docs/index.qmd @@ -30,7 +30,7 @@ conda install -c conda-forge nutpie pymc numba And then sample with -```python +```{python} import nutpie import pymc as pm @@ -52,13 +52,19 @@ pip install "nutpie[stan]" uv add "nutpie[stan]" ``` -```python +```{python} +#| echo: false +import os +os.environ["TBB_CXX_TYPE"] = "clang" +``` + +```{python} import nutpie model = """ data { int N; - real y[N]; + vector[N] y; } parameters { real mu; @@ -72,7 +78,7 @@ model { compiled = ( nutpie .compile_stan_model(code=model) - .with_data({"N": 3, "y": [1, 2, 3]}) + .with_data(N=3, y=[1, 2, 3]) ) trace = nutpie.sample(compiled) ``` diff --git a/docs/nf-adapt.md b/docs/nf-adapt.qmd similarity index 100% rename from docs/nf-adapt.md rename to docs/nf-adapt.qmd diff --git a/docs/pymc-usage.md b/docs/pymc-usage.qmd similarity index 91% rename from docs/pymc-usage.md rename to docs/pymc-usage.qmd index 54819b1..e623eb4 100644 --- a/docs/pymc-usage.md +++ b/docs/pymc-usage.qmd @@ -50,7 +50,7 @@ We will define a simple Bayesian model using `pymc` and sample from it using In your `model.ipypy` file or Jupyter notebook, add the following code: -```python +```{python} import pymc as pm import nutpie import pandas as pd @@ -66,15 +66,14 @@ with pm.Model(coords=coords) as model: x = [1, 2, 3] mu = intercept + slope * x - sigma = pm.HalfNormal("sigma", sigma=1) - y = pm.Normal("y", mu=mu, sigma=sigma, observed=[1, 2, 3], dims="observation") + y = pm.Normal("y", mu=mu, sigma=0.1, observed=[1, 2, 3], dims="observation") ``` ### Sampling We can now compile the model using the numba backend: -```python +```{python} compiled = nutpie.compile_pymc_model(model) trace = nutpie.sample(compiled) ``` @@ -96,15 +95,15 @@ analyze the trace. For example, we should check the effective sample size: -```python +```{python} import arviz as az az.ess(trace) ``` -and have a look at a trace plot: +and take a look at a trace plot: -```python -az.plot_trace(trace) +```{python} +az.plot_trace(trace); ``` ### Choosing the backend @@ -154,26 +153,25 @@ only recommended with the numba backend. First, we define the model, but put our dataset in a `pm.Data` structure: -```python -with pm.Model(): +```{python} +with pm.Model() as model: x = pm.Data("x", [1, 2, 3]) intercept = pm.Normal("intercept", mu=0, sigma=1) slope = pm.Normal("slope", mu=0, sigma=1) mu = intercept + slope * x - sigma = pm.HalfNormal("sigma", sigma=1) - y = pm.Normal("y", mu=mu, sigma=sigma, observed=[1, 2, 3]) + y = pm.Normal("y", mu=mu, sigma=0.1, observed=[1, 2, 3]) ``` We can now compile the model: -```python +```{python} compiled = nutpie.compile_pymc_model(model) trace = nutpie.sample(compiled) ``` After compilation, we can change the dataset: -```python -compiled2 = compiled.with_data({"x": [4, 5, 6]}) +```{python} +compiled2 = compiled.with_data(x=[4, 5, 6]) trace2 = nutpie.sample(compiled2) ``` diff --git a/docs/sample-stats.qmd b/docs/sample-stats.qmd new file mode 100644 index 0000000..e69de29 diff --git a/docs/stan-usage.md b/docs/stan-usage.md deleted file mode 100644 index 78259ef..0000000 --- a/docs/stan-usage.md +++ /dev/null @@ -1,3 +0,0 @@ -# Usage with Stan models - -foobar diff --git a/docs/stan-usage.qmd b/docs/stan-usage.qmd new file mode 100644 index 0000000..7296231 --- /dev/null +++ b/docs/stan-usage.qmd @@ -0,0 +1,230 @@ +# Usage with Stan models + +This document shows how to use `nutpie` with Stan models. We will use the +`nutpie` package to define a simple model and sample from it using Stan. + +## Installation + +For Stan, it is more common to use `pip` or `uv` to install the necessary +packages. However, `conda` is also an option if you prefer. + +To install using `pip`: + +```bash +pip install "nutpie[stan]" +``` + +To install using `uv`: + +```bash +uv add "nutpie[stan]" +``` + +To install using `conda`: + +```bash +conda install -c conda-forge nutpie +``` + +## Compiler Toolchain + +Stan requires a compiler toolchain to be installed on your system. This is +necessary for compiling the Stan models. You can find detailed instructions for +setting up the compiler toolchain in the [CmdStan +Guide](https://mc-stan.org/docs/cmdstan-guide/installation.html#cpp-toolchain). + +Additionally, since Stan uses Intel's Threading Building Blocks (TBB) for +parallelism, you might need to set the `TBB_CXX_TYPE` environment variable to +specify the compiler type. Depending on your system, you can set it to either +`clang` or `gcc`. For example: + +```{python} +import os +os.environ["TBB_CXX_TYPE"] = "clang" # or 'gcc' +``` + +Make sure to set this environment variable before compiling your Stan models to ensure proper configuration. + +## Defining and Sampling a Simple Model + +We will define a simple Bayesian model using Stan and sample from it using +`nutpie`. + +### Model Definition + +In your Python script or Jupyter notebook, add the following code: + +```{python} +import nutpie + +model_code = """ +data { + int N; + vector[N] y; +} +parameters { + real mu; +} +model { + mu ~ normal(0, 1); + y ~ normal(mu, 1); +} +""" + +compiled_model = nutpie.compile_stan_model(code=model_code) +``` + +### Sampling + +We can now compile the model and sample from it: + +```{python} +compiled_model_with_data = compiled_model.with_data(N=3, y=[1, 2, 3]) +trace = nutpie.sample(compiled_model_with_data) +``` + +### Using Dimensions + +We'll use the radon model from +[this](https://mc-stan.org/learn-stan/case-studies/radon_cmdstanpy_plotnine.html) +case-study from the stan documentation, to show how we can use coordinates and +dimension names to simplify working with trace objects. + +We follow the same data preparation as in the case-study: + +```{python} +import pandas as pd +import numpy as np +import arviz as az +import seaborn as sns + +home_data = pd.read_csv( + "https://github.com/pymc-devs/pymc-examples/raw/refs/heads/main/examples/data/srrs2.dat", + index_col="idnum", +) +county_data = pd.read_csv( + "https://github.com/pymc-devs/pymc-examples/raw/refs/heads/main/examples/data/cty.dat", +) + +radon_data = ( + home_data + .rename(columns=dict(cntyfips="ctfips")) + .merge( + ( + county_data + .drop_duplicates(['stfips', 'ctfips', 'st', 'cty', 'Uppm']) + .set_index(["ctfips", "stfips"]) + ), + right_index=True, + left_on=["ctfips", "stfips"], + ) + .assign(log_radon=lambda x: np.log(np.clip(x.activity, 0.1, np.inf))) + .assign(log_uranium=lambda x: np.log(np.clip(x["Uppm"], 0.1, np.inf))) + .query("state == 'MN'") +) +``` + +And also use the partially pooled model from the case-study: + +```{python} +model_code = """ +data { + int N; // observations + int J; // counties + array[N] int county; + vector[N] x; + vector[N] y; +} +parameters { + real mu_alpha; + real sigma_alpha; + vector[J] alpha; // non-centered parameterization + real beta; + real sigma; +} +model { + y ~ normal(alpha[county] + beta * x, sigma); + alpha ~ normal(mu_alpha, sigma_alpha); // partial-pooling + beta ~ normal(0, 10); + sigma ~ normal(0, 10); + mu_alpha ~ normal(0, 10); + sigma_alpha ~ normal(0, 10); +} +generated quantities { + array[N] real y_rep = normal_rng(alpha[county] + beta * x, sigma); +} +""" +``` + +We collect the dataset in the format that the stan model requires, +and specify the dimensions of each of the non-scalar variables in the model: + +```{python} +county_idx, counties = pd.factorize(radon_data["county"], use_na_sentinel=False) +observations = radon_data.index + +coords = { + "county": counties, + "observation": observations, +} + +dims = { + "alpha": ["county"], + "y_rep": ["observation"], +} + +data = { + "N": len(observations), + "J": len(counties), + # Stan uses 1-based indexing! + "county": county_idx + 1, + "x": radon_data.log_uranium.values, + "y": radon_data.log_radon.values, +} +``` + +Then, we compile the model and provide the dimensions, coordinates and the +dataset we just defined: + +```{python} +compiled_model = ( + nutpie.compile_stan_model(code=model_code) + .with_data(**data) + .with_dims(**dims) + .with_coords(**coords) +) +``` + +```{python} +%%time +trace = nutpie.sample(compiled_model, seed=0) +``` + +As some basic convergance checking we verify that all Rhat values are smaller +than 1.02, all parameters have at least 500 effective draws and that we have no +divergences: + +```{python} +assert trace.sample_stats.diverging.sum() == 0 +assert az.ess(trace).min().min() > 500 +assert az.rhat(trace).max().max() > 1.02 +``` + +Thanks to the coordinates and dimensions we specified, the resulting trace will +now contain labeled data, so that plots based on it have properly set-up labels: + +```{python} +import arviz as az +import seaborn as sns +import xarray as xr + +sns.catplot( + data=trace.posterior.alpha.to_dataframe().reset_index(), + y="county", + x="alpha", + kind="boxen", + height=13, + aspect=1/2.5, + showfliers=False, +) +``` diff --git a/docs/styles.css b/docs/styles.css new file mode 100644 index 0000000..2ddf50c --- /dev/null +++ b/docs/styles.css @@ -0,0 +1 @@ +/* css styles */ diff --git a/pixi.toml b/pixi.toml index 9044b45..3c907c4 100644 --- a/pixi.toml +++ b/pixi.toml @@ -29,6 +29,12 @@ zarr = ">=2.18.3,<3" polars = ">=1.16.0,<2" viztracer = ">=1.0.0,<2" ipywidgets = ">=8.1.5,<9" +quarto = ">=1.6.40,<2" +yaml = ">=0.2.5,<0.3" +pyyaml = ">=6.0.2,<7" +nbformat = ">=5.10.4,<6" +nbclient = ">=0.10.2,<0.11" +cmdstanpy = ">=1.2.5,<2" # The jaxlib cuda build seems to be broken around version 0.4.34 #jax = ">=0.4.35,<0.5" #jaxlib = { version = "*", build = "*cuda12*" } From ccc87dfea93b430ca6517370ce9d733a68e441a5 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Thu, 20 Feb 2025 15:18:35 +0100 Subject: [PATCH 53/55] Fix bug that ignored nn_width --- pixi.lock | 2553 +++++++++++++++++++--------- pixi.toml | 5 +- pyproject.toml | 1 - python/nutpie/normalizing_flow.py | 10 +- python/nutpie/transform_adapter.py | 7 + 5 files changed, 1740 insertions(+), 836 deletions(-) diff --git a/pixi.lock b/pixi.lock index 7230225..da15dad 100644 --- a/pixi.lock +++ b/pixi.lock @@ -9,37 +9,51 @@ environments: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/arviz-0.20.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-47.0-unix_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/arviz-0.20.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/asciitree-0.3.3-py_2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-atk-2.38.0-h0630a04_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-core-2.40.3-h0630a04_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.43-h4bf12b8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.43-h4852527_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/blas-2.125-openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/blas-2.130-blis.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-30_hdec4247_blis.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/blis-0.9.0-h4ab18f5_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.3-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.2-h3394656_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cmdstan-2.36.0-h6b7b5dd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cmdstanpy-1.2.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cons-0.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cons-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py312h68727a3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.10-py312h2ec8cdc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dart-sass-1.58.3-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.12-py312h2ec8cdc_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/etuples-0.3.9-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/deno-1.46.3-hcab8b69_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/deno-dom-0.1.41-h4768de7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.18-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/epoxy-1.5.10-h166bdaf_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/esbuild-0.24.2-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/etuples-0.3.9-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.1.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fasteners-0.17.3-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.4-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fasteners-0.19-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -47,221 +61,243 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.55.3-py312h178313f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.56.0-py312h178313f_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-13.3.0-h9576a4e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-13.3.0-hfea6d02_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-13.3.0-hc28eda2_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.12-hb9ae30d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.82.2-h4833e2c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-12.0.0-hba01fac_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h6470451_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-12.2.1-h5ae0cbf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.43-h021d004_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-13.3.0-h9576a4e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-13.3.0-hdbfa832_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-13.3.0-h6834431_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h5netcdf-1.4.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.12.1-nompi_py312hedeef09_102.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-9.0.0-hda332d3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h2d575fe_108.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h5netcdf-1.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.13.0-nompi_py312hedeef09_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-10.2.0-h4bba637_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h2d575fe_109.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hicolor-icon-theme-0.17-ha770c72_2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-6.29.5-pyh3099207_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-8.30.0-pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-8.32.0-pyh907856f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.5-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.7.2-pyh31011fe_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.13-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-3.10.0-he073ed8_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py312h68727a3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.8-py312h84d6215_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-30_h66dfbfd_blis.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-25_linux64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.11.1-h332b0f4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.22-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-30_hba4ea11_blis.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-13.3.0-h84ea5a7_101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-hd3e95f3_10.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h6f5c62b_11.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.2.0-hd5240d6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.2-default_h0d58e46_1001.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-25_linux64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-25_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-9_h9f1adc1_netlib.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-9_h0ad7b2f_netlib.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm14-14.0.6-hcd5def8_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.3-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.4-hc0ffecb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.4-h49af25d_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-13.3.0-heb74ff8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.2-hee588c1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-13.3.0-h84ea5a7_101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hc4654cb_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.5-h8d12d68_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.8.0-hc4a0caf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-19.1.5-h024ca30_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-19.1.7-h024ca30_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.43.0-py312h374181b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/logical-unification-0.4.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/make-4.4.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.3-py312hd3ec401_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.0-py312hd3ec401_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/maturin-1.7.8-py312h6ab59e4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/maturin-1.8.2-py312h6ab59e4_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/minikanren-1.0.3-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/minikanren-1.0.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-service-2.4.2-py312hf224ee7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.0-py312h68727a3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/multipledispatch-0.6.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numba-0.60.0-py312h83e6fd3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.14.1-py312hf9745cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.15.1-py312hf9745cd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/objprint-0.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.28-pthreads_h6ec200e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/orjson-3.10.12-py312h12e396e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orjson-3.10.15-py312h12e396e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.3-py312hf9745cd_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.54.0-h3a902e7_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.4-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.1-h861ebed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/patsy-1.0.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.0.0-py312h7b63e92_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py312h80c1187_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.44.2-h29eaf8c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/polars-1.17.1-py312hda0fa55_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.48-pyha770c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.0-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/polars-1.22.0-py312hda0fa55_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.50-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.1-py312h66e93f0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pymc-5.19.1-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pymc-base-5.19.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.0-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytensor-2.26.4-py312h97902ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pytensor-base-2.26.4-py312h25a0e75_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pymc-5.20.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pymc-base-5.20.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytensor-2.27.1-py312h97902ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pytensor-base-2.27.1-py312h25a0e75_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.8-h9e4cc4f_1_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.20.3-pyh91182bf_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.0-py312hbf22597_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/quarto-1.6.40-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py312h62794b6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.22.3-py312h12e396e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py312ha707e6e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-base-0.13.2-pyhd8ed1ab_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.6.0-pyhff2d567_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/stanio-0.5.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.4-py312hc0a28a1_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h4a8ded7_18.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h0157908_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-devel-2021.13.0-h1f99690_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.2.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.2-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py312h66e93f0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/viztracer-1.0.0-py312h3a80f7f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/typst-0.11.0-he8a937b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/viztracer-1.0.2-py312h0f154a2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.13-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2024.11.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-einstats-0.8.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hb9d3cd8_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-he73a12e_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.2-py312h66e93f0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2025.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-einstats-0.8.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.43-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.5-he73a12e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.11-h4f16b4b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.6-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-2.18.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxinerama-1.1.5-h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-2.18.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_0.conda - pypi: https://files.pythonhosted.org/packages/a2/ad/e0d3c824784ff121c03cc031f944bc7e139a8f1870ffd2845cc2dd76f6c4/absl_py-2.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8c/ce/b9a154415fe7f51a481bece2bd998c679ce0ef93833ad4e7c87c60f0e461/bridgestan-2.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/16/92/92a76dc2ff3a12e69ba94e7e05168d37d0345fa08c87e1fe24d0c2a42223/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/58/a0/e4bebe76bdd0a68077030f1b5e48b545597473ae1b773c84150311152efc/chex-0.1.88-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e9/59/f189b03d743364a350c972b89fe08a6db5bbbdc5f1ea6b604b3eee0a7967/dllist-1.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3a/af/411e94c165229882eb2d0a329114826aa52c7c61ef3108d0d3d8ad7189ed/equinox-0.11.10-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4f/4a/ff8aa2c57300613b69905308c5afe92c5b01112d766c25a305fd6796170a/etils-1.11.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7b/07/a212ca4cfe56fa35c8315307e37df218e5946c726a792b5c7a795b245c10/dllist-2.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/2c/90dd8d90acae15cab7ad344398030a0ba6a1cb1257d5e7da57f41e566940/equinox-0.11.11-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/05/83/bb4a4518bfa32a160dc455d8d944a6e00a7eb6759f449cb20c7b7879090e/etils-1.12.0-py3-none-any.whl - pypi: git+https://github.com/aseyboldt/flowjax?rev=07e7e32217bcfcaa7d68a304f332c925d26ab76f#07e7e32217bcfcaa7d68a304f332c925d26ab76f - pypi: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/20/6c57c50c0ccc645fea1895950f1e5cd02f961ee44b3ffe83617fa46b0c1d/jax-0.4.35-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d7/aa/f15ea857ad9bcff7a0c942dc570ca718b026cc0cc5c513525bb08cacf3c0/jax_cuda12_pjrt-0.4.35-py3-none-manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/23/a1/781f98da41b9abf63a1468c5babbafa7b1bdb766c081386644a4034fbdef/jax_cuda12_plugin-0.4.35-cp312-cp312-manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/e7/0d/4faf839e3c8ce2a5b615df64427be3e870899c72c0ebfb5859348150aba1/jaxlib-0.4.34-cp312-cp312-manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/94/99/c83c6a97f4382caf1c9bfeeeca935d3eb1f479f711665aeadf4408048107/jaxtyping-0.2.36-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6f/d3/1321715a95e856d4ef4fba24e4351cf5e4c89d459ad132a8cba5fe257d72/ml_dtypes-0.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/af/eb/ff4b8c503fa1f1796679dce648854d58751982426e4e4b37d6fce49d259c/nvidia_cublas_cu12-12.6.4.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/49/60/7b6497946d74bcf1de852a21824d63baad12cd417db4195fc1bfe59db953/nvidia_cuda_cupti_cu12-12.6.80-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/25/1f/faf9b791027ebd6354be68700da3c3d8a3b3db3bdcf2f8070f2e6871a7f1/nvidia_cuda_nvcc_cu12-12.6.85-py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/e1/23/e717c5ac26d26cf39a27fbc076240fad2e3b817e5889d671b67f4f9f49c5/nvidia_cuda_runtime_cu12-12.6.77-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/67/4c/0f18ddce75f2c17cf028d16e067c07f11c421c981b8c2a45c99bc6169af6/nvidia_cudnn_cu12-9.6.0.74-py3-none-manylinux_2_27_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/8f/16/73727675941ab8e6ffd86ca3a4b7b47065edcca7a997920b831f8147c99d/nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/f0/6e/c2cf12c9ff8b872e92b4a5740701e51ff17689c4d726fca91875b07f655d/nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/06/1e/b8b7c2f4099a37b96af5c9bb158632ea9e5d9d27d7391d7eb8fc45236674/nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/ed/1f/6482380ec8dcec4894e7503490fc536d846b0d59694acad9cf99f27d0e7d/nvidia_nccl_cu12-2.23.4-py3-none-manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/9d/d7/c5383e47c7e9bf1c99d5bd2a8c935af2b6d705ad831a7ec5c97db4d82f4f/nvidia_nvjitlink_cu12-12.6.85-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f4/58/cc0721a1030fcbab0984beea0bf3c4610ec103f738423cdfa9c4ceb40598/jax-0.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/66/e9/211ba3e46ec22c722c4d61a739cfccf79b0618006d6f5fa53eb4eb93ed6d/jaxlib-0.5.0-cp312-cp312-manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/db/7e/da7b57a1f3af7303a0f3c8594d820fc0d3a9bbe3810a357eb21eb166e76b/jaxtyping-0.2.38-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/57/5d58fad4124192b1be42f68bd0c0ddaa26e44a730ff8c9337adade2f5632/ml_dtypes-0.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/5c/24/28d0bb21600a78e46754947333ec9a297044af884d360092eb8561575fe9/optax-0.2.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/20/f8/7b1f5b84f84e43face7349ac2df23f0f75d36b5b4a1c1c0305edce82bcc8/paramax-0.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/4d/b72e0782abec07f3d8dabf24cf12673d26b173af2046eb4e67365c776ccf/posteriordb-0.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl - - pypi: git+https://github.com/aseyboldt/samplerlab#5ae57577f2a586fd941d77afd1f450bbdda796ac - - pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl + - pypi: git+https://github.com/aseyboldt/samplerlab#9edea2da1c5b336e53b9238440a2317cf1baba14 + - pypi: https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/39/3b/5b918a0da0d6920e7f7328cf0ab00df31b905d709f458596304f09096785/wadler_lindig-0.1.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c3/ac/1847959031ce09eb65a70b16d0f07633d7ddaf8a97752cc924f9a8cbe253/watermark-2.5.0-py2.py3-none-any.whl packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 md5: d7c89558ba9fa0495403155b64376d81 + arch: x86_64 + platform: linux license: None purls: [] size: 2562 @@ -273,6 +309,8 @@ packages: depends: - _libgcc_mutex 0.1 conda_forge - llvm-openmp >=9.0.1 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] @@ -283,9 +321,21 @@ packages: version: 2.1.0 sha256: 526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308 requires_python: '>=3.7' -- conda: https://conda.anaconda.org/conda-forge/noarch/arviz-0.20.0-pyhd8ed1ab_0.conda - sha256: 2e86300d089555741c8f81a73e72aa90f90cda35b494329e1b940e2d31845936 - md5: 7e13efee221dc6ad25fcc2e4d65df7e3 +- conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-47.0-unix_0.conda + sha256: 188dca9a847f474b3df71eda9fe828fbe10b53aa6f4313c7e117f3114b1dd84e + md5: 49436a5c604f99058473d84580f0e341 + depends: + - __unix + - hicolor-icon-theme + - librsvg + license: LGPL-3.0-or-later OR CC-BY-SA-3.0 + license_family: LGPL + purls: [] + size: 566980 + timestamp: 1728314504182 +- conda: https://conda.anaconda.org/conda-forge/noarch/arviz-0.20.0-pyhd8ed1ab_1.conda + sha256: a41ee718207a4defccf6eae8e85f622e82fa45323744dd49af8657cb5872ab43 + md5: 03111f1a24b520153bf7912a36eb65f3 depends: - h5netcdf >=1.0.2 - matplotlib-base >=3.5 @@ -302,8 +352,8 @@ packages: license_family: Apache purls: - pkg:pypi/arviz?source=hash-mapping - size: 1473292 - timestamp: 1727611803479 + size: 1473775 + timestamp: 1734087589897 - conda: https://conda.anaconda.org/conda-forge/noarch/asciitree-0.3.3-py_2.tar.bz2 sha256: b3e9369529fe7d721b66f18680ff4b561e20dbf6507e209e1f60eac277c97560 md5: c0481c9de49f040272556e2cedf42816 @@ -328,6 +378,39 @@ packages: - pkg:pypi/asttokens?source=hash-mapping size: 28206 timestamp: 1733250564754 +- conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-atk-2.38.0-h0630a04_3.tar.bz2 + sha256: 26ab9386e80bf196e51ebe005da77d57decf6d989b4f34d96130560bc133479c + md5: 6b889f174df1e0f816276ae69281af4d + depends: + - at-spi2-core >=2.40.0,<2.41.0a0 + - atk-1.0 >=2.36.0 + - dbus >=1.13.6,<2.0a0 + - libgcc-ng >=9.3.0 + - libglib >=2.68.1,<3.0a0 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + license_family: LGPL + purls: [] + size: 339899 + timestamp: 1619122953439 +- conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-core-2.40.3-h0630a04_0.tar.bz2 + sha256: c4f9b66bd94c40d8f1ce1fad2d8b46534bdefda0c86e3337b28f6c25779f258d + md5: 8cb2fc4cd6cc63f1369cfa318f581cc3 + depends: + - dbus >=1.13.6,<2.0a0 + - libgcc-ng >=9.3.0 + - libglib >=2.68.3,<3.0a0 + - xorg-libx11 + - xorg-libxi + - xorg-libxtst + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + license_family: LGPL + purls: [] + size: 658390 + timestamp: 1625848454791 - conda: https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda sha256: df682395d05050cd1222740a42a551281210726a67447e5258968dd55854302e md5: f730d54ba9cd543666d7220c9f7ed563 @@ -337,17 +420,32 @@ packages: - libstdcxx-ng >=12 constrains: - atk-1.0 2.38.0 + arch: x86_64 + platform: linux license: LGPL-2.0-or-later license_family: LGPL purls: [] size: 355900 timestamp: 1713896169874 +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.1.0-pyh71513ae_0.conda + sha256: 1f267886522dfb9ae4e5ebbc3135b5eb13cff27bdbfe8d881a4d893459166ab4 + md5: 2cc3f588512f04f3a0c64b4e9bedc02d + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/attrs?source=compressed-mapping + size: 56370 + timestamp: 1737819298139 - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.43-h4bf12b8_2.conda sha256: 267e78990247369b13234bda270f31beb56a600b4851a8244e31dd9ad85b3b17 md5: cf0c5521ac2a20dfa6c662a4009eeef6 depends: - ld_impl_linux-64 2.43 h712a8e2_2 - sysroot_linux-64 + arch: x86_64 + platform: linux license: GPL-3.0-only license_family: GPL purls: [] @@ -358,48 +456,55 @@ packages: md5: 18aba879ddf1f8f28145ca6fcb873d8c depends: - binutils_impl_linux-64 2.43 h4bf12b8_2 + arch: x86_64 + platform: linux license: GPL-3.0-only license_family: GPL purls: [] size: 34945 timestamp: 1729655404893 -- conda: https://conda.anaconda.org/conda-forge/linux-64/blas-2.125-openblas.conda - build_number: 25 - sha256: 23498a320b65c514c132c2b01bdedc2e08ffc9dfd8c7fd46609ac16ff4bc8a90 - md5: 0c46b8a31a587738befc587dd8e52558 - depends: - - __glibc >=2.17,<3.0.a0 - - _openmp_mutex * *_llvm - - _openmp_mutex >=4.5 - - blas-devel 3.9.0 25_linux64_openblas - - libblas 3.9.0 25_linux64_openblas - - libcblas 3.9.0 25_linux64_openblas - - libgcc >=13 - - libgfortran - - libgfortran5 >=13.3.0 - - liblapack 3.9.0 25_linux64_openblas - - liblapacke 3.9.0 25_linux64_openblas - - llvm-openmp >=19.1.2 +- conda: https://conda.anaconda.org/conda-forge/linux-64/blas-2.130-blis.conda + build_number: 30 + sha256: 2b729e6a31be5a82e2885b05e9ac7a1bbc6dd99f368685bd71d581ae0052f4df + md5: 9dafabe6baf2f6660a0922311e97aabd + depends: + - blas-devel 3.9.0 30*_blis + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] - size: 15793 - timestamp: 1729642984458 -- conda: https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-25_linux64_openblas.conda - build_number: 25 - sha256: 69483b31161b62716ee529f206f7614bcb45fd230fc9bf47f2fb1840ed406b6f - md5: 02c516384c77f5a7b4d03ed6c0412c57 + size: 16759 + timestamp: 1739836358004 +- conda: https://conda.anaconda.org/conda-forge/linux-64/blas-devel-3.9.0-30_hdec4247_blis.conda + build_number: 30 + sha256: 320cfbe67fac6dc33445386372f07029706bd9422765d4dee2e006034de9843c + md5: 75470f91acc0b1f1966837d5b6ff76f5 + depends: + - blis 0.9.0.* + - libblas 3.9.0 30_h66dfbfd_blis + - libcblas 3.9.0 30_hba4ea11_blis + - liblapack 3.9.0 *_netlib + - liblapacke 3.9.0 *_netlib + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 16561 + timestamp: 1739836226671 +- conda: https://conda.anaconda.org/conda-forge/linux-64/blis-0.9.0-h4ab18f5_2.conda + sha256: 3e501cbf98ccb69210e6145d38295dc14ca11417e9c86fec988f06adea8456fd + md5: 6f77ba1352b69c4a6f8a6d20def30e4e depends: - - libblas 3.9.0 25_linux64_openblas - - libcblas 3.9.0 25_linux64_openblas - - liblapack 3.9.0 25_linux64_openblas - - liblapacke 3.9.0 25_linux64_openblas - - openblas 0.3.28.* + - libgcc-ng >=12 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] - size: 15609 - timestamp: 1729642921261 + size: 3547115 + timestamp: 1713877874618 - pypi: https://files.pythonhosted.org/packages/8c/ce/b9a154415fe7f51a481bece2bd998c679ce0ef93833ad4e7c87c60f0e461/bridgestan-2.6.1-py3-none-any.whl name: bridgestan version: 2.6.1 @@ -420,6 +525,8 @@ packages: - libbrotlidec 1.1.0 hb9d3cd8_2 - libbrotlienc 1.1.0 hb9d3cd8_2 - libgcc >=13 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] @@ -433,6 +540,8 @@ packages: - libbrotlidec 1.1.0 hb9d3cd8_2 - libbrotlienc 1.1.0 hb9d3cd8_2 - libgcc >=13 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] @@ -444,29 +553,35 @@ packages: depends: - __glibc >=2.17,<3.0.a0 - libgcc-ng >=12 + arch: x86_64 + platform: linux license: bzip2-1.0.6 license_family: BSD purls: [] size: 252783 timestamp: 1720974456583 -- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.3-hb9d3cd8_1.conda - sha256: 732571ba6286dbccbf4c6450078a581b7a5620204faf876ff0ef282d77a6bfa8 - md5: ee228789a85f961d14567252a03e725f +- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.4-hb9d3cd8_0.conda + sha256: d4f28d87b6339b94f74762c0076e29c8ef8ddfff51a564a92da2843573c18320 + md5: e2775acf57efd5af15b8e3d1d74d72d3 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] - size: 204857 - timestamp: 1732447031823 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda - sha256: afee721baa6d988e27fef1832f68d6f32ac8cc99cdf6015732224c2841a09cea - md5: c27d1c142233b5bc9ca570c6e2e0c244 + size: 206085 + timestamp: 1734208189009 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2025.1.31-hbcca054_0.conda + sha256: bf832198976d559ab44d6cdb315642655547e26d826e34da67cbee6624cda189 + md5: 19f3a56f68d2fd06c516076bff482c52 + arch: x86_64 + platform: linux license: ISC purls: [] - size: 159003 - timestamp: 1725018903918 + size: 158144 + timestamp: 1738298224464 - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 noarch: python sha256: 561e6660f26c35d137ee150187d89767c988413c978e1b712d53f27ddf70ea17 @@ -489,17 +604,17 @@ packages: - pkg:pypi/cached-property?source=hash-mapping size: 11065 timestamp: 1615209567874 -- conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.0-pyhd8ed1ab_1.conda - sha256: d67d8683b34d7074bf99683aa1d71b2e42cee44da70ccd02a2863fb2c3df005b - md5: 0a99af03ccbd19113c1de1c7f16a53d2 +- conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.1-pyhd8ed1ab_0.conda + sha256: 04cd27394393d5e9c6315e7e6a344ba38ddfa49f899c05643208ccba07968430 + md5: 6eb7c1074d938746b195f556abf9a28f depends: - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/cachetools?source=hash-mapping - size: 14846 - timestamp: 1733624331838 + size: 14948 + timestamp: 1737517675303 - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.2-h3394656_1.conda sha256: de7d0d094e53decc005cb13e527be2635b8f604978da497d4c0d282c7dc08385 md5: b34c2833a1f56db610aeb27f206d800d @@ -522,25 +637,22 @@ packages: - xorg-libx11 >=1.8.10,<2.0a0 - xorg-libxext >=1.3.6,<2.0a0 - xorg-libxrender >=0.9.11,<0.10.0a0 + arch: x86_64 + platform: linux license: LGPL-2.1-only or MPL-1.1 purls: [] size: 978868 timestamp: 1733790976384 -- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda - sha256: 7020770df338c45ac6b560185956c32f0a5abf4b76179c037f115fc7d687819f - md5: 12f7d00853807b0531775e9be891cb11 - depends: - - python >=3.7 - license: ISC - purls: - - pkg:pypi/certifi?source=hash-mapping - size: 163752 - timestamp: 1725278204397 -- pypi: https://files.pythonhosted.org/packages/16/92/92a76dc2ff3a12e69ba94e7e05168d37d0345fa08c87e1fe24d0c2a42223/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl + name: certifi + version: 2025.1.31 + sha256: ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe + requires_python: '>=3.6' +- pypi: https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl name: charset-normalizer - version: 3.4.0 - sha256: 8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15 - requires_python: '>=3.7.0' + version: 3.4.1 + sha256: bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d + requires_python: '>=3.7' - pypi: https://files.pythonhosted.org/packages/58/a0/e4bebe76bdd0a68077030f1b5e48b545597473ae1b773c84150311152efc/chex-0.1.88-py3-none-any.whl name: chex version: 0.1.88 @@ -554,17 +666,53 @@ packages: - setuptools ; python_full_version >= '3.12' - toolz>=0.9.0 requires_python: '>=3.9' -- conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.0-pyhd8ed1ab_1.conda - sha256: 5a33d0d3ef33121c546eaf78b3dac2141fc4d30bbaeb3959bbc66fcd5e99ced6 - md5: c88ca2bb7099167912e3b26463fff079 +- conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.1-pyhd8ed1ab_0.conda + sha256: 21ecead7268241007bf65691610cd7314da68c1f88113092af690203b5780db5 + md5: 364ba6c9fb03886ac979b482f39ebb92 depends: - - python >=3.8 + - python >=3.9 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/cloudpickle?source=hash-mapping - size: 25952 - timestamp: 1729059365471 + size: 25870 + timestamp: 1736947650712 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cmdstan-2.36.0-h6b7b5dd_0.conda + sha256: d475cfa2ebf3fa4f4d1cda77740f57c890ca851cf7e1b9f511d4f67791b2f0f4 + md5: 7c833c27c240b57fd29d1543b41f95a8 + depends: + - __glibc >=2.17,<3.0.a0 + - gxx_linux-64 13.* + - gxx_linux-64 >=13 + - libgcc >=13 + - libstdcxx >=13 + - make + - sysroot_linux-64 2.17.* + - tbb >=2021.13.0 + - tbb-devel + arch: x86_64 + platform: linux + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 32912355 + timestamp: 1733858441087 +- conda: https://conda.anaconda.org/conda-forge/noarch/cmdstanpy-1.2.5-pyhd8ed1ab_0.conda + sha256: 3654832b719b29c7d7c05f7fb031127190ca059575f74310eb55ab9e27e6a87b + md5: 4046ad21a0f33a10c1ea4fcbed72856c + depends: + - cmdstan + - numpy >=1.21 + - pandas + - python >=3.9 + - stanio >=0.4.0,<2.0.0 + - tqdm + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/cmdstanpy?source=hash-mapping + size: 70880 + timestamp: 1734212972209 - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 md5: 962b9857ee8e7018c22f2776ffa0b2d7 @@ -588,18 +736,18 @@ packages: - pkg:pypi/comm?source=hash-mapping size: 12103 timestamp: 1733503053903 -- conda: https://conda.anaconda.org/conda-forge/noarch/cons-0.4.6-pyhd8ed1ab_0.conda - sha256: d814c65f7f9c9f48658a4499b93fcb99a6f468768751912e79b7af8283c841c9 - md5: 38c162ffeb9a31493d0ef33c09a5ba9f +- conda: https://conda.anaconda.org/conda-forge/noarch/cons-0.4.6-pyhd8ed1ab_1.conda + sha256: 444f2df4c59f624bf82c9bc23e5d0e4d50f26fbb477197b5b1d2dd151a3bcd69 + md5: 407ddb4cf0d95f21326af9e3df56627f depends: - logical-unification >=0.4.1 - - python >=3.6 + - python >=3.9 license: LGPL-3.0-only license_family: LGPL purls: - pkg:pypi/cons?source=hash-mapping - size: 14401 - timestamp: 1687647866301 + size: 14424 + timestamp: 1734526937473 - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.1-py312h68727a3_0.conda sha256: e977af50b844b5b8cfec358131a4e923f0aa718e8334321cf8d84f5093576259 md5: f5fbba0394ee45e9a64a73c2a994126a @@ -610,6 +758,8 @@ packages: - numpy >=1.23 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: @@ -627,21 +777,47 @@ packages: - pkg:pypi/cycler?source=hash-mapping size: 13399 timestamp: 1733332563512 -- conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.10-py312h2ec8cdc_0.conda - sha256: 534a57b12b92b7af802d48633d96610564e9b41229869d4334d5e776a8f3ee08 - md5: ec2f6e5f137d0767686f7348e6003d78 +- conda: https://conda.anaconda.org/conda-forge/linux-64/dart-sass-1.58.3-ha770c72_1.conda + sha256: a94f8024ac8a09cbf265c62d2bd57e709802868ef656c6cafe5864ed20bf94af + md5: d54982a58cd9be3d00a7efe76ba6f60c + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 2961769 + timestamp: 1683598364427 +- conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2 + sha256: 8f5f995699a2d9dbdd62c61385bfeeb57c82a681a7c8c5313c395aa0ccab68a5 + md5: ecfff944ba3960ecb334b9a2663d708d + depends: + - expat >=2.4.2,<3.0a0 + - libgcc-ng >=9.4.0 + - libglib >=2.70.2,<3.0a0 + arch: x86_64 + platform: linux + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 618596 + timestamp: 1640112124844 +- conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.12-py312h2ec8cdc_0.conda + sha256: f88c3a7ff384d1726aea2cb2342cf67f1502915391860335c40ab81d7e381e30 + md5: 6be6dcb4bffd1d456bdad28341d507bd depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libstdcxx >=13 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: - pkg:pypi/debugpy?source=hash-mapping - size: 2622505 - timestamp: 1733945377151 + size: 2646757 + timestamp: 1737269937348 - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_1.conda sha256: 84e5120c97502a3785e8c3241c3bf51f64b4d445f13b4d2445db00d9816fe479 md5: d622d8d7ee8868870f9cbe259f381181 @@ -653,27 +829,91 @@ packages: - pkg:pypi/decorator?source=hash-mapping size: 14068 timestamp: 1733236549190 -- pypi: https://files.pythonhosted.org/packages/e9/59/f189b03d743364a350c972b89fe08a6db5bbbdc5f1ea6b604b3eee0a7967/dllist-1.2.0-py3-none-any.whl +- conda: https://conda.anaconda.org/conda-forge/linux-64/deno-1.46.3-hcab8b69_0.conda + sha256: 704bb88a744aacab35c159929d6aee8216e7731e920f7d28254a721059dde4b1 + md5: f8410ffda105ab8d380990bbdf9f266f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 39585861 + timestamp: 1726025052074 +- conda: https://conda.anaconda.org/conda-forge/linux-64/deno-dom-0.1.41-h4768de7_0.conda + sha256: 2726829e1a6117dc9555a2088a4ebaa05035218b8791106f036ba73f15b1b13e + md5: 89e80615c6b1b1ae4f5267bfc5fc7f66 + depends: + - __glibc >=2.17,<3.0.a0 + - deno >=1.24.2 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 433150 + timestamp: 1736703310469 +- conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.18-pyhd8ed1ab_0.conda + sha256: d614bcff10696f1efc714df07651b50bf3808401fcc03814309ecec242cc8870 + md5: 0cef44b1754ae4d6924ac0eef6b9fdbe + depends: + - python >=3.9 + - wrapt <2,>=1.10 + license: MIT + license_family: MIT + purls: + - pkg:pypi/deprecated?source=hash-mapping + size: 14382 + timestamp: 1737987072859 +- pypi: https://files.pythonhosted.org/packages/7b/07/a212ca4cfe56fa35c8315307e37df218e5946c726a792b5c7a795b245c10/dllist-2.0.0-py3-none-any.whl name: dllist - version: 1.2.0 - sha256: f2ca5fd60d12161b6a472bc340bbae5de53ddd40c5923d9df84e85170b9a8629 + version: 2.0.0 + sha256: cd307b1a91bc46fae084f8c817d79be7e34951b149a2fd69004772e03573bfb3 requires_dist: - pytest ; extra == 'test' - pytest-cov ; extra == 'test' requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/3a/af/411e94c165229882eb2d0a329114826aa52c7c61ef3108d0d3d8ad7189ed/equinox-0.11.10-py3-none-any.whl +- conda: https://conda.anaconda.org/conda-forge/linux-64/epoxy-1.5.10-h166bdaf_1.tar.bz2 + sha256: 1e58ee2ed0f4699be202f23d49b9644b499836230da7dd5b2f63e6766acff89e + md5: a089d06164afd2d511347d3f87214e0b + depends: + - libgcc-ng >=10.3.0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 1440699 + timestamp: 1648505042260 +- pypi: https://files.pythonhosted.org/packages/20/2c/90dd8d90acae15cab7ad344398030a0ba6a1cb1257d5e7da57f41e566940/equinox-0.11.11-py3-none-any.whl name: equinox - version: 0.11.10 - sha256: ee6809e31664b92487b247f811fca48a2107f7ec958084b2294af2ee8a750e3b + version: 0.11.11 + sha256: 49e9674f9bff0cde7ebcfbf2cdf4585c9231eb377eda31168bbf6467f88241e5 requires_dist: - - jax>=0.4.13,!=0.4.27 + - jax>=0.4.38 - jaxtyping>=0.2.20 - typing-extensions>=4.5.0 - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/4f/4a/ff8aa2c57300613b69905308c5afe92c5b01112d766c25a305fd6796170a/etils-1.11.0-py3-none-any.whl + requires_python: '>=3.10' +- conda: https://conda.anaconda.org/conda-forge/linux-64/esbuild-0.24.2-ha770c72_0.conda + sha256: f3e5eef234c5eda3f7841790e72e2bfdf8c19cd5fc2ff452c1015445d8eec921 + md5: ad079d8d346d153ac11600626fe1ea38 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 3640554 + timestamp: 1736588042523 +- pypi: https://files.pythonhosted.org/packages/05/83/bb4a4518bfa32a160dc455d8d944a6e00a7eb6759f449cb20c7b7879090e/etils-1.12.0-py3-none-any.whl name: etils - version: 1.11.0 - sha256: a394cf3476bcec51c221426a70c39cd1006e889456ba41e4d7f12fd6814be7a5 + version: 1.12.0 + sha256: f80c2ff4289cc504b58b7e7a9f9db8b373a33227e43694a66808bcc81e51ffb8 requires_dist: - etils[array-types] ; extra == 'all' - etils[eapp] ; extra == 'all' @@ -742,19 +982,19 @@ packages: - etils[etree] ; extra == 'etree-tf' - etils[ecolab] ; extra == 'lazy-imports' requires_python: '>=3.10' -- conda: https://conda.anaconda.org/conda-forge/noarch/etuples-0.3.9-pyhd8ed1ab_0.conda - sha256: 7e0742833d2348f4b0607575c98b9d05e3fa323d265bb57f787d410e6970111d - md5: bc1fc711e8ec404bd6109ab4eb0e4a67 +- conda: https://conda.anaconda.org/conda-forge/noarch/etuples-0.3.9-pyhd8ed1ab_1.conda + sha256: a2eb1d51f46b372bf1f514975b78c5492b431749bc86709969732c313bc2988e + md5: f2a2e0b6f6b043bcfa812408aa48a241 depends: - cons - multipledispatch - - python >=3.6 + - python >=3.9 license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/etuples?source=hash-mapping - size: 17451 - timestamp: 1684304361743 + size: 17573 + timestamp: 1734526891894 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda sha256: cbde2c64ec317118fc06b223c5fd87c8a680255e7348dd60e7b292d2e103e701 md5: a16662747cdeb9abbac74d0057cc976e @@ -776,27 +1016,41 @@ packages: - pkg:pypi/executing?source=hash-mapping size: 28348 timestamp: 1733569440265 -- conda: https://conda.anaconda.org/conda-forge/noarch/fasteners-0.17.3-pyhd8ed1ab_0.tar.bz2 - sha256: 42be6ac8478051b26751d778490d6a71de12e5c6443e145ff3eddbc577d9bcda - md5: 348e27e78a5e39090031448c72f66d5e +- conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.4-h5888daf_0.conda + sha256: 1848c7db9e264e3b8036ee133d570dd880422983cd20dd9585a505289606d276 + md5: 1d6afef758879ef5ee78127eb4cd2c4a depends: - - python >=3.6 + - __glibc >=2.17,<3.0.a0 + - libexpat 2.6.4 h5888daf_0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 138145 + timestamp: 1730967050578 +- conda: https://conda.anaconda.org/conda-forge/noarch/fasteners-0.19-pyhd8ed1ab_1.conda + sha256: 42fb170778b47303e82eddfea9a6d1e1b8af00c927cd5a34595eaa882b903a16 + md5: dbe9d42e94b5ff7af7b7893f4ce052e7 + depends: + - python >=3.9 license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/fasteners?source=hash-mapping - size: 19975 - timestamp: 1643971626978 -- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_1.conda - sha256: 18dca6e2194732df7ebf824abaefe999e4765ebe8e8a061269406ab88fc418b9 - md5: d692e9ba6f92dc51484bf3477e36ce7c + size: 20711 + timestamp: 1734943237791 +- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda + sha256: 006d7e5a0c17a6973596dd86bfc80d74ce541144d2aee2d22d46fd41df560a63 + md5: 7f402b4a1007ee355bc50ce4d24d4a57 depends: - python >=3.9 license: Unlicense purls: - pkg:pypi/filelock?source=hash-mapping - size: 17441 - timestamp: 1733240909987 + size: 17544 + timestamp: 1737517924333 - pypi: git+https://github.com/aseyboldt/flowjax?rev=07e7e32217bcfcaa7d68a304f332c925d26ab76f#07e7e32217bcfcaa7d68a304f332c925d26ab76f name: flowjax version: 17.0.2 @@ -860,6 +1114,8 @@ packages: - libgcc >=13 - libuuid >=2.38.1,<3.0a0 - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] @@ -888,9 +1144,9 @@ packages: purls: [] size: 4102 timestamp: 1566932280397 -- conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.55.3-py312h178313f_0.conda - sha256: a5d26a5311fecbf8546a2fd056c7f4c350fa54da998e223b7d5cc74eab3971e1 - md5: 968104bfe69e21fadeb30edd9c3785f9 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.56.0-py312h178313f_0.conda + sha256: 76ca95b4111fe27e64d74111b416b3462ad3db99f7109cbdf50e6e4b67dcf5b7 + md5: 2f8a66f2f9eb931cdde040d02c6ab54c depends: - __glibc >=2.17,<3.0.a0 - brotli @@ -899,12 +1155,14 @@ packages: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - unicodedata2 >=15.1.0 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: - pkg:pypi/fonttools?source=hash-mapping - size: 2860392 - timestamp: 1733909107861 + size: 2834054 + timestamp: 1738940929849 - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda sha256: b2e3c449ec9d907dd4656cb0dc93e140f447175b125a3824b31368b06c666bb6 md5: 9ae35c3d96db2c94ce0cef86efdfa2cb @@ -912,6 +1170,8 @@ packages: - libgcc-ng >=12 - libpng >=1.6.39,<1.7.0a0 - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux license: GPL-2.0-only OR FTL purls: [] size: 634972 @@ -921,6 +1181,8 @@ packages: md5: ac7bc6a654f8f41b352b38f4051135f8 depends: - libgcc-ng >=7.5.0 + arch: x86_64 + platform: linux license: LGPL-2.1 purls: [] size: 114383 @@ -930,6 +1192,8 @@ packages: md5: 606924335b5bcdf90e9aed9a2f5d22ed depends: - gcc_impl_linux-64 13.3.0.* + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] @@ -946,6 +1210,8 @@ packages: - libsanitizer 13.3.0 heb74ff8_1 - libstdcxx >=13.3.0 - sysroot_linux-64 + arch: x86_64 + platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] @@ -958,6 +1224,8 @@ packages: - binutils_linux-64 - gcc_impl_linux-64 13.3.0.* - sysroot_linux-64 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] @@ -972,68 +1240,109 @@ packages: - libjpeg-turbo >=3.0.0,<4.0a0 - libpng >=1.6.43,<1.7.0a0 - libtiff >=4.6.0,<4.8.0a0 + arch: x86_64 + platform: linux license: LGPL-2.1-or-later license_family: LGPL purls: [] size: 528149 timestamp: 1715782983957 +- conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.82.2-h4833e2c_1.conda + sha256: 5d8a48abdb1bc2b54f1380d2805cb9cd6cd9609ed0e5c3ed272aef92ab53b190 + md5: e2e44caeaef6e4b107577aa46c95eb12 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libglib 2.82.2 h2ff4ddf_1 + arch: x86_64 + platform: linux + license: LGPL-2.1-or-later + purls: [] + size: 115452 + timestamp: 1737037532892 - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda sha256: 0595b009f20f8f60f13a6398e7cdcbd2acea5f986633adcf85f5a2283c992add md5: f87c7b7c2cb45f323ffbce941c78ab7c depends: - libgcc-ng >=12 - libstdcxx-ng >=12 + arch: x86_64 + platform: linux license: LGPL-2.0-or-later license_family: LGPL purls: [] size: 96855 timestamp: 1711634169756 -- conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-12.0.0-hba01fac_0.conda - sha256: 2eb794ae1de42b688f89811113ae3dcb63698272ee8f87029abce5f77c742c2a - md5: 953e31ea00d46beb7e64a79fc291ec44 +- conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-12.2.1-h5ae0cbf_1.conda + sha256: e6866409ba03df392ac5ec6f0d6ff9751a685ed917bfbcd8a73f550c5fe83c2b + md5: df7835d2c73cd1889d377cfd6694ada4 depends: - __glibc >=2.17,<3.0.a0 - - cairo >=1.18.0,<2.0a0 + - adwaita-icon-theme + - cairo >=1.18.2,<2.0a0 - fonts-conda-ecosystem - gdk-pixbuf >=2.42.12,<3.0a0 - - gtk2 + - gtk3 >=3.24.43,<4.0a0 - gts >=0.7.6,<0.8.0a0 - - libexpat >=2.6.2,<3.0a0 - - libgcc-ng >=12 + - libexpat >=2.6.4,<3.0a0 + - libgcc >=13 - libgd >=2.3.3,<2.4.0a0 - - libglib >=2.80.3,<3.0a0 - - librsvg >=2.58.2,<3.0a0 - - libstdcxx-ng >=12 - - libwebp-base >=1.4.0,<2.0a0 + - libglib >=2.82.2,<3.0a0 + - librsvg >=2.58.4,<3.0a0 + - libstdcxx >=13 + - libwebp-base >=1.5.0,<2.0a0 - libzlib >=1.3.1,<2.0a0 - - pango >=1.50.14,<2.0a0 + - pango >=1.56.1,<2.0a0 + arch: x86_64 + platform: linux license: EPL-1.0 license_family: Other purls: [] - size: 2303111 - timestamp: 1722673717117 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h6470451_5.conda - sha256: 16644d036321b32635369c183502974c8b989fa516c313bd379f9aa4adcdf642 - md5: 1483ba046164be27df7f6eddbcec3a12 + size: 2413095 + timestamp: 1738602910851 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.43-h021d004_3.conda + sha256: c8f939497b43d90fa2ac9d99b44ed25759a798c305237300508e526de5e78de7 + md5: 56c679bcdb8c1d824e927088725862cb depends: - __glibc >=2.17,<3.0.a0 + - at-spi2-atk >=2.38.0,<3.0a0 - atk-1.0 >=2.38.0 - - cairo >=1.18.0,<2.0a0 - - fontconfig >=2.14.2,<3.0a0 + - cairo >=1.18.2,<2.0a0 + - epoxy >=1.5.10,<1.6.0a0 + - fontconfig >=2.15.0,<3.0a0 - fonts-conda-ecosystem - - freetype >=2.12.1,<3.0a0 + - fribidi >=1.0.10,<2.0a0 - gdk-pixbuf >=2.42.12,<3.0a0 - - harfbuzz >=9.0.0,<10.0a0 - - libgcc-ng >=12 - - libglib >=2.80.3,<3.0a0 - - pango >=1.54.0,<2.0a0 - - xorg-libx11 >=1.8.9,<2.0a0 - - xorg-libxext >=1.3.4,<2.0a0 - - xorg-libxrender >=0.9.11,<0.10.0a0 - license: LGPL-2.1-or-later + - glib-tools + - harfbuzz >=10.2.0,<11.0a0 + - hicolor-icon-theme + - libcups >=2.3.3,<2.4.0a0 + - libcups >=2.3.3,<3.0a0 + - libexpat >=2.6.4,<3.0a0 + - libgcc >=13 + - libglib >=2.82.2,<3.0a0 + - liblzma >=5.6.3,<6.0a0 + - libxkbcommon >=1.7.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pango >=1.56.0,<2.0a0 + - wayland >=1.23.1,<2.0a0 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxcomposite >=0.4.6,<1.0a0 + - xorg-libxcursor >=1.2.3,<2.0a0 + - xorg-libxdamage >=1.1.6,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + - xorg-libxi >=1.8.2,<2.0a0 + - xorg-libxinerama >=1.1.5,<1.2.0a0 + - xorg-libxrandr >=1.5.4,<2.0a0 + - xorg-libxrender >=0.9.12,<0.10.0a0 + arch: x86_64 + platform: linux + license: LGPL-2.0-or-later + license_family: LGPL purls: [] - size: 6501561 - timestamp: 1721285940408 + size: 5565328 + timestamp: 1737497685605 - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda sha256: b5cd16262fefb836f69dc26d879b6508d29f8a5c5948a966c47fe99e2e19c99b md5: 4d8df0b0db060d33c9a702ada998a8fe @@ -1041,6 +1350,8 @@ packages: - libgcc-ng >=12 - libglib >=2.76.3,<3.0a0 - libstdcxx-ng >=12 + arch: x86_64 + platform: linux license: LGPL-2.0-or-later license_family: LGPL purls: [] @@ -1052,6 +1363,8 @@ packages: depends: - gcc 13.3.0.* - gxx_impl_linux-64 13.3.0.* + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] @@ -1065,6 +1378,8 @@ packages: - libstdcxx-devel_linux-64 13.3.0 h84ea5a7_101 - sysroot_linux-64 - tzdata + arch: x86_64 + platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] @@ -1078,14 +1393,16 @@ packages: - gcc_linux-64 13.3.0 hc28eda2_7 - gxx_impl_linux-64 13.3.0.* - sysroot_linux-64 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] size: 30356 timestamp: 1731939612705 -- conda: https://conda.anaconda.org/conda-forge/noarch/h5netcdf-1.4.1-pyhd8ed1ab_1.conda - sha256: 1201924ea11ef5bdb0f9fc8793dea1befebef6903536af1f9159202ae8796ea7 - md5: 413d6a08f8fe17af2c6cd1142ba8dccf +- conda: https://conda.anaconda.org/conda-forge/noarch/h5netcdf-1.5.0-pyhd8ed1ab_0.conda + sha256: 2dd1aa54eb0b0f0e15db77d6dd3f16e532903f99a0375283142dd3df4d990e46 + md5: af8ab1ff0815078c40ba96f47f48f353 depends: - h5py - packaging @@ -1094,11 +1411,11 @@ packages: license_family: BSD purls: - pkg:pypi/h5netcdf?source=hash-mapping - size: 47573 - timestamp: 1733807542899 -- conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.12.1-nompi_py312hedeef09_102.conda - sha256: 5acc7c221e792c7aa9bbb2c57d5e0104d7a6e81c2cd29a47a77d574552cd4fd0 - md5: ee52559d324594141ce369c527d6d029 + size: 46375 + timestamp: 1737887368948 +- conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.13.0-nompi_py312hedeef09_100.conda + sha256: 76bb853325f0c756599edb0be014723b01fea61e24817fd2f0b9ddfe4c570c0f + md5: ed73cf6f5e1ce5e823e6efcf54cbdc51 depends: - __glibc >=2.17,<3.0.a0 - cached-property @@ -1107,47 +1424,65 @@ packages: - numpy >=1.19,<3 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/h5py?source=hash-mapping - size: 1380838 - timestamp: 1729617970564 -- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-9.0.0-hda332d3_1.conda - sha256: 973afa37840b4e55e2540018902255cfb0d953aaed6353bb83a4d120f5256767 - md5: 76b32dcf243444aea9c6b804bcfa40b8 + size: 1388165 + timestamp: 1739952623855 +- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-10.2.0-h4bba637_0.conda + sha256: 94426eca8c60b43f57beb3338d3298dda09452c7a42314bbbb4ebfa552542a84 + md5: 9e38e86167e8b1ea0094747d12944ce4 depends: - __glibc >=2.17,<3.0.a0 - - cairo >=1.18.0,<2.0a0 + - cairo >=1.18.2,<2.0a0 - freetype >=2.12.1,<3.0a0 - graphite2 - icu >=75.1,<76.0a0 - - libgcc-ng >=12 - - libglib >=2.80.3,<3.0a0 - - libstdcxx-ng >=12 + - libexpat >=2.6.4,<3.0a0 + - libgcc >=13 + - libglib >=2.82.2,<3.0a0 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] - size: 1603653 - timestamp: 1721186240105 -- conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h2d575fe_108.conda - sha256: 340b997d57eb89c058d8f2e80d426e4716661a51efcd1d857afb2b29f59177a4 - md5: b74598031529dafb2a66f9e90f26f2dc + size: 1646987 + timestamp: 1736702906600 +- conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h2d575fe_109.conda + sha256: e8669a6d76d415f4fdbe682507ac3a3b39e8f493d2f2bdc520817f80b7cc0753 + md5: e7a7a6e6f70553a31e6e79c65768d089 depends: - __glibc >=2.17,<3.0.a0 - libaec >=1.1.3,<2.0a0 - - libcurl >=8.10.1,<9.0a0 + - libcurl >=8.11.1,<9.0a0 - libgcc >=13 - libgfortran - libgfortran5 >=13.3.0 - libstdcxx >=13 - libzlib >=1.3.1,<2.0a0 - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] - size: 3899869 - timestamp: 1733668584836 + size: 3930078 + timestamp: 1737516601132 +- conda: https://conda.anaconda.org/conda-forge/linux-64/hicolor-icon-theme-0.17-ha770c72_2.tar.bz2 + sha256: 336f29ceea9594f15cc8ec4c45fdc29e10796573c697ee0d57ebb7edd7e92043 + md5: bbf6f174dcd3254e19a2f5d2295ce808 + arch: x86_64 + platform: linux + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 13841 + timestamp: 1605162808667 - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e md5: 8b189310083baabfb622af68fd9d3ae3 @@ -1155,6 +1490,8 @@ packages: - __glibc >=2.17,<3.0.a0 - libgcc-ng >=12 - libstdcxx-ng >=12 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] @@ -1170,18 +1507,32 @@ packages: - pytest>=8.3.2 ; extra == 'all' - flake8>=7.1.1 ; extra == 'all' requires_python: '>=3.6' -- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda - sha256: 13766b88fc5b23581530d3a0287c0c58ad82f60401afefab283bf158d2be55a9 - md5: 315607a3030ad5d5227e76e0733798ff +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.6.1-pyha770c72_0.conda + sha256: 598951ebdb23e25e4cec4bbff0ae369cec65ead80b50bc08b441d8e54de5cf03 + md5: f4b39bf00c69f56ac01e020ebfac066c depends: - python >=3.9 - zipp >=0.5 license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/importlib-metadata?source=compressed-mapping - size: 28623 - timestamp: 1733223207185 + - pkg:pypi/importlib-metadata?source=hash-mapping + size: 29141 + timestamp: 1737420302391 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + sha256: acc1d991837c0afb67c75b77fdc72b4bf022aac71fedd8b9ea45918ac9b08a80 + md5: c85c76dc67d75619a92f51dfbce06992 + depends: + - python >=3.9 + - zipp >=3.1.0 + constrains: + - importlib-resources >=6.5.2,<6.5.3.0a0 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/importlib-resources?source=hash-mapping + size: 33781 + timestamp: 1736252433366 - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda sha256: 0ec8f4d02053cd03b0f3e63168316530949484f80e16f5e2fb199a1d117a89ca md5: 6837f3eff7dcea42ecd714ce1ac2b108 @@ -1217,29 +1568,30 @@ packages: - pkg:pypi/ipykernel?source=hash-mapping size: 119084 timestamp: 1719845605084 -- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-8.30.0-pyh707e725_0.conda - sha256: 65cdc105e5effea2943d3979cc1592590c923a589009b484d07672faaf047af1 - md5: 5d6e5cb3a4b820f61b2073f0ad5431f1 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-8.32.0-pyh907856f_0.conda + sha256: b1b940cfe85d5f0aaed83ef8c9f07ee80daa68acb05feeb5142d620472b01e0d + md5: 9de86472b8f207fb098c69daaad50e67 depends: - __unix + - pexpect >4.3 + - python >=3.10 - decorator - exceptiongroup - jedi >=0.16 - matplotlib-inline - - pexpect >4.3 - pickleshare - prompt-toolkit >=3.0.41,<3.1.0 - pygments >=2.4.0 - - python >=3.10 - stack_data - traitlets >=5.13.0 - typing_extensions >=4.6 + - python license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/ipython?source=hash-mapping - size: 600248 - timestamp: 1732897026255 + size: 636676 + timestamp: 1738421264236 - conda: https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.5-pyhd8ed1ab_1.conda sha256: f419657566e3d9bea85b288a0ce3a8e42d76cd82ac1697c6917891df3ae149ab md5: bb19ad65196475ab6d0bb3532d7f8d96 @@ -1256,72 +1608,51 @@ packages: - pkg:pypi/ipywidgets?source=hash-mapping size: 113982 timestamp: 1733493669268 -- pypi: https://files.pythonhosted.org/packages/62/20/6c57c50c0ccc645fea1895950f1e5cd02f961ee44b3ffe83617fa46b0c1d/jax-0.4.35-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/f4/58/cc0721a1030fcbab0984beea0bf3c4610ec103f738423cdfa9c4ceb40598/jax-0.5.0-py3-none-any.whl name: jax - version: 0.4.35 - sha256: fa99e909a31424abfec750019a6dd36f6acc18a6e7d40e2c0086b932cc351325 + version: 0.5.0 + sha256: b3907aa87ae2c340b39cdbf80c07a74550369cafcaf7398fb60ba58d167345ab requires_dist: - - jaxlib>=0.4.34,<=0.4.35 + - jaxlib<=0.5.0,>=0.5.0 - ml-dtypes>=0.4.0 - - numpy>=1.24 - - opt-einsum - - scipy>=1.10 + - numpy>=1.25 - numpy>=1.26.0 ; python_full_version >= '3.12' - - scipy>=1.11.1 ; python_full_version >= '3.12' - - jaxlib==0.4.34 ; extra == 'ci' - - jaxlib==0.4.34 ; extra == 'cuda' - - jax-cuda12-plugin[with-cuda]>=0.4.34,<=0.4.35 ; extra == 'cuda' - - jaxlib==0.4.34 ; extra == 'cuda12' - - jax-cuda12-plugin[with-cuda]>=0.4.34,<=0.4.35 ; extra == 'cuda12' - - jaxlib==0.4.34 ; extra == 'cuda12-local' - - jax-cuda12-plugin==0.4.34 ; extra == 'cuda12-local' - - jaxlib==0.4.34 ; extra == 'cuda12-pip' - - jax-cuda12-plugin[with-cuda]>=0.4.34,<=0.4.35 ; extra == 'cuda12-pip' - - kubernetes ; extra == 'k8s' - - jaxlib==0.4.34 ; extra == 'minimum-jaxlib' - - jaxlib>=0.4.34,<=0.4.35 ; extra == 'tpu' + - opt-einsum + - scipy>=1.11.1 + - jaxlib==0.5.0 ; extra == 'minimum-jaxlib' + - jaxlib==0.4.38 ; extra == 'ci' + - jaxlib<=0.5.0,>=0.5.0 ; extra == 'tpu' - libtpu-nightly==0.1.dev20241010+nightly.cleanup ; extra == 'tpu' - - libtpu==0.0.2 ; extra == 'tpu' + - libtpu==0.0.8 ; extra == 'tpu' - requests ; extra == 'tpu' + - jaxlib==0.5.0 ; extra == 'cuda' + - jax-cuda12-plugin[with-cuda]<=0.5.0,>=0.5.0 ; extra == 'cuda' + - jaxlib==0.5.0 ; extra == 'cuda12' + - jax-cuda12-plugin[with-cuda]<=0.5.0,>=0.5.0 ; extra == 'cuda12' + - jaxlib==0.5.0 ; extra == 'cuda12-pip' + - jax-cuda12-plugin[with-cuda]<=0.5.0,>=0.5.0 ; extra == 'cuda12-pip' + - jaxlib==0.5.0 ; extra == 'cuda12-local' + - jax-cuda12-plugin==0.5.0 ; extra == 'cuda12-local' + - jaxlib==0.5.0 ; extra == 'rocm' + - jax-rocm60-plugin<=0.5.0,>=0.5.0 ; extra == 'rocm' + - kubernetes ; extra == 'k8s' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/d7/aa/f15ea857ad9bcff7a0c942dc570ca718b026cc0cc5c513525bb08cacf3c0/jax_cuda12_pjrt-0.4.35-py3-none-manylinux2014_x86_64.whl - name: jax-cuda12-pjrt - version: 0.4.35 - sha256: 0ffe7e1ba65659bd5738c2cc5addaf0a56205d2188eec5da194b63c068e1fdd2 -- pypi: https://files.pythonhosted.org/packages/23/a1/781f98da41b9abf63a1468c5babbafa7b1bdb766c081386644a4034fbdef/jax_cuda12_plugin-0.4.35-cp312-cp312-manylinux2014_x86_64.whl - name: jax-cuda12-plugin - version: 0.4.35 - sha256: 80aa5e628e8e9dd4f89b767f73900152033c3bf6d5f49dc2081e93f9bac1c9dc - requires_dist: - - jax-cuda12-pjrt==0.4.35 - - nvidia-cublas-cu12>=12.1.3.1 ; extra == 'with-cuda' - - nvidia-cuda-cupti-cu12>=12.1.105 ; extra == 'with-cuda' - - nvidia-cuda-nvcc-cu12>=12.1.105 ; extra == 'with-cuda' - - nvidia-cuda-runtime-cu12>=12.1.105 ; extra == 'with-cuda' - - nvidia-cudnn-cu12>=9.1,<10.0 ; extra == 'with-cuda' - - nvidia-cufft-cu12>=11.0.2.54 ; extra == 'with-cuda' - - nvidia-cusolver-cu12>=11.4.5.107 ; extra == 'with-cuda' - - nvidia-cusparse-cu12>=12.1.0.106 ; extra == 'with-cuda' - - nvidia-nccl-cu12>=2.18.1 ; extra == 'with-cuda' - - nvidia-nvjitlink-cu12>=12.1.105 ; extra == 'with-cuda' - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/e7/0d/4faf839e3c8ce2a5b615df64427be3e870899c72c0ebfb5859348150aba1/jaxlib-0.4.34-cp312-cp312-manylinux2014_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/66/e9/211ba3e46ec22c722c4d61a739cfccf79b0618006d6f5fa53eb4eb93ed6d/jaxlib-0.5.0-cp312-cp312-manylinux2014_x86_64.whl name: jaxlib - version: 0.4.34 - sha256: 48272e9034ff868d4328cf0055a07882fd2be93f59dfb6283af7de491f9d1290 + version: 0.5.0 + sha256: f980c733e98c998a8da87c9a8cc61b6726d0be667a58bd664c1d717b4b4eae75 requires_dist: - - scipy>=1.10 - - numpy>=1.24 + - scipy>=1.11.1 + - numpy>=1.25 - ml-dtypes>=0.2.0 - - scipy>=1.11.1 ; python_full_version >= '3.12' requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/94/99/c83c6a97f4382caf1c9bfeeeca935d3eb1f479f711665aeadf4408048107/jaxtyping-0.2.36-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/db/7e/da7b57a1f3af7303a0f3c8594d820fc0d3a9bbe3810a357eb21eb166e76b/jaxtyping-0.2.38-py3-none-any.whl name: jaxtyping - version: 0.2.36 - sha256: b19bcbd4009df8734602203402483a4066ad2eb3382904432e370588e9c9707d + version: 0.2.38 + sha256: bc209ab8ec29917b6f0c7dec4a8ea1fc276f7d94f25b71c01d1243ec2b21ae12 requires_dist: - - typing-extensions ; python_full_version < '3.10' - requires_python: '>=3.9' + - wadler-lindig>=0.1.3 + requires_python: '>=3.10' - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda sha256: 92c4d217e2dc68983f724aa983cca5464dcb929c566627b26a2511159667dba8 md5: a4f4c5dc9b80bc50e0d3dc4e6e8f1bd9 @@ -1333,6 +1664,35 @@ packages: - pkg:pypi/jedi?source=hash-mapping size: 843646 timestamp: 1733300981994 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_1.conda + sha256: be992a99e589146f229c58fe5083e0b60551d774511c494f91fe011931bd7893 + md5: a3cead9264b331b32fe8f0aabc967522 + depends: + - attrs >=22.2.0 + - importlib_resources >=1.4.0 + - jsonschema-specifications >=2023.03.6 + - pkgutil-resolve-name >=1.3.10 + - python >=3.9 + - referencing >=0.28.4 + - rpds-py >=0.7.1 + license: MIT + license_family: MIT + purls: + - pkg:pypi/jsonschema?source=hash-mapping + size: 74256 + timestamp: 1733472818764 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2024.10.1-pyhd8ed1ab_1.conda + sha256: 37127133837444cf0e6d1a95ff5a505f8214ed4e89e8e9343284840e674c6891 + md5: 3b519bc21bc80e60b456f1e62962a766 + depends: + - python >=3.9 + - referencing >=0.31.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/jsonschema-specifications?source=hash-mapping + size: 16170 + timestamp: 1733493624968 - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.3-pyhd8ed1ab_1.conda sha256: 19d8bd5bb2fde910ec59e081eeb59529491995ce0d653a5209366611023a0b3a md5: 4ebae00eae9705b0c3d6d1018a81d047 @@ -1392,25 +1752,29 @@ packages: md5: 30186d27e2c9fa62b45fb1476b7200e3 depends: - libgcc-ng >=10.3.0 + arch: x86_64 + platform: linux license: LGPL-2.1-or-later purls: [] size: 117831 timestamp: 1646151697040 -- conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.7-py312h68727a3_0.conda - sha256: d752c53071ee5d712baa9742dd1629e60388c5ce4ab11d4e73a1690443e41769 - md5: 444266743652a4f1538145e9362f6d3b +- conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.8-py312h84d6215_0.conda + sha256: 3ce99d721c1543f6f8f5155e53eef11be47b2f5942a8d1060de6854f9d51f246 + md5: 6713467dc95509683bfa3aca08524e8a depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libstdcxx >=13 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/kiwisolver?source=hash-mapping - size: 70922 - timestamp: 1725459412788 + size: 71649 + timestamp: 1736908364705 - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 md5: 3f43953b7d3fb3aaa1d0d0723d91e368 @@ -1421,23 +1785,28 @@ packages: - libgcc-ng >=12 - libstdcxx-ng >=12 - openssl >=3.3.1,<4.0a0 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] size: 1370023 timestamp: 1719463201255 -- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda - sha256: 5c878d104b461b7ef922abe6320711c0d01772f4cd55de18b674f88547870041 - md5: 51bb7010fc86f70eee639b4bb7a894f5 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda + sha256: d6a61830a354da022eae93fa896d0991385a875c6bba53c82263a289deda9db8 + md5: 000e85703f0fd9594c81710dd5066471 depends: - - libgcc-ng >=12 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.6.0,<4.8.0a0 + - libtiff >=4.7.0,<4.8.0a0 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] - size: 245247 - timestamp: 1701647787198 + size: 248046 + timestamp: 1739160907615 - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda sha256: 7c91cea91b13f4314d125d1bedb9d03a29ebbd5080ccdea70260363424646dbe md5: 048b02e3962f066da18efe3a21b77672 @@ -1445,6 +1814,8 @@ packages: - __glibc >=2.17,<3.0.a0 constrains: - binutils_impl_linux-64 2.43 + arch: x86_64 + platform: linux license: GPL-3.0-only license_family: GPL purls: [] @@ -1456,6 +1827,8 @@ packages: depends: - libgcc-ng >=12 - libstdcxx-ng >=12 + arch: x86_64 + platform: linux license: Apache-2.0 license_family: Apache purls: [] @@ -1467,34 +1840,40 @@ packages: depends: - libgcc-ng >=12 - libstdcxx-ng >=12 + arch: x86_64 + platform: linux license: BSD-2-Clause license_family: BSD purls: [] size: 35446 timestamp: 1711021212685 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-25_linux64_openblas.conda - build_number: 25 - sha256: d6d12dc437d060f838820e9e61bf73baab651f91935ac594cf10beb9ef1b4450 - md5: 8ea26d42ca88ec5258802715fe1ee10b +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-30_h66dfbfd_blis.conda + build_number: 30 + sha256: 4b2743e2172a85eb984f3c167d6027295468b6c8a87b4445eb6551c55a1dbd23 + md5: e566a0d2bf6341d06ce06b74f2f9dc17 depends: - - libopenblas >=0.3.28,<0.3.29.0a0 - - libopenblas >=0.3.28,<1.0a0 + - blis >=0.9.0,<0.9.1.0a0 + - mkl >=2024.2.2,<2025.0a0 constrains: - - liblapack 3.9.0 25_linux64_openblas - - libcblas 3.9.0 25_linux64_openblas - - blas * openblas - - liblapacke 3.9.0 25_linux64_openblas + - blas =2.130=blis + - libcblas =3.9.0=30*_blis + arch: x86_64 + platform: linux + track_features: + - blas_blis license: BSD-3-Clause license_family: BSD purls: [] - size: 15677 - timestamp: 1729642900350 + size: 16949 + timestamp: 1739836207638 - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hb9d3cd8_2.conda sha256: d9db2de60ea917298e658143354a530e9ca5f9c63471c65cf47ab39fd2f429e3 md5: 41b599ed2b02abcfdd84302bff174b23 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] @@ -1507,6 +1886,8 @@ packages: - __glibc >=2.17,<3.0.a0 - libbrotlicommon 1.1.0 hb9d3cd8_2 - libgcc >=13 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] @@ -1519,29 +1900,49 @@ packages: - __glibc >=2.17,<3.0.a0 - libbrotlicommon 1.1.0 hb9d3cd8_2 - libgcc >=13 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] size: 281750 timestamp: 1725267679782 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-25_linux64_openblas.conda - build_number: 25 - sha256: ab87b0477078837c91d9cda62a9faca18fba7c57cc77aa779ae24b3ac783b5dd - md5: 5dbd1b0fc0d01ec5e0e1fbe667281a11 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-30_hba4ea11_blis.conda + build_number: 30 + sha256: 48c142e0bec47c0d1f3c2d67373b91812058e78746565b70e388ec5ddde2366e + md5: addf030df95030b6c91f346d39995ce8 depends: - - libblas 3.9.0 25_linux64_openblas + - libblas 3.9.0 30_h66dfbfd_blis + - mkl >=2024.2.2,<2025.0a0 constrains: - - liblapack 3.9.0 25_linux64_openblas - - blas * openblas - - liblapacke 3.9.0 25_linux64_openblas + - blas =2.130=blis + arch: x86_64 + platform: linux + track_features: + - blas_blis license: BSD-3-Clause license_family: BSD purls: [] - size: 15613 - timestamp: 1729642905619 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.11.1-h332b0f4_0.conda - sha256: 3cd4075b2a7b5562e46c8ec626f6f9ca57aeecaa94ff7df57eca26daa94c9906 - md5: 2b3e0081006dc21e8bf53a91c83a055c + size: 16921 + timestamp: 1739836217216 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda + sha256: bc67b9b21078c99c6bd8595fe7e1ed6da1f721007726e717f0449de7032798c4 + md5: d4529f4dff3057982a7617c7ac58fde3 + depends: + - krb5 >=1.21.1,<1.22.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 4519402 + timestamp: 1689195353551 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.12.1-h332b0f4_0.conda + sha256: 2ebc3039af29269e4cdb858fca36265e5e400c1125a4bcd84ae73a596e0e76ca + md5: 45e9dc4e7b25e2841deb392be085500e depends: - __glibc >=2.17,<3.0.a0 - krb5 >=1.21.3,<1.22.0a0 @@ -1549,40 +1950,50 @@ packages: - libnghttp2 >=1.64.0,<2.0a0 - libssh2 >=1.11.1,<2.0a0 - libzlib >=1.3.1,<2.0a0 - - openssl >=3.4.0,<4.0a0 + - openssl >=3.4.1,<4.0a0 - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux license: curl license_family: MIT purls: [] - size: 423011 - timestamp: 1733999897624 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.22-hb9d3cd8_0.conda - sha256: 780f0530a3adfc1497ba49d626931c6afc978c540e1abfde6ccd57128ded6ad6 - md5: b422943d5d772b7cc858b36ad2a92db5 + size: 426675 + timestamp: 1739512336799 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.23-h4ddbbb0_0.conda + sha256: 511d801626d02f4247a04fff957cc6e9ec4cc7e8622bd9acd076bcdc5de5fe66 + md5: 8dfae1d2e74767e9ce36d5fa0d8605db depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] - size: 72242 - timestamp: 1728177071251 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 - sha256: a57d37c236d8f7c886e01656f4949d9dcca131d2a0728609c6f7fa338b65f1cf - md5: 4d331e44109e3f0e19b4cb8f9b82f3e1 + size: 72255 + timestamp: 1734373823254 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b depends: - - libgcc-ng >=7.5.0 - - ncurses >=6.2,<7.0.0a0 + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + arch: x86_64 + platform: linux license: BSD-2-Clause license_family: BSD purls: [] - size: 123878 - timestamp: 1597616541093 + size: 134676 + timestamp: 1738479519902 - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4 md5: 172bf1cd1ff8629f2b1179945ed45055 depends: - libgcc-ng >=12 + arch: x86_64 + platform: linux license: BSD-2-Clause license_family: BSD purls: [] @@ -1596,21 +2007,26 @@ packages: - libgcc >=13 constrains: - expat 2.6.4.* + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] size: 73304 timestamp: 1730967041968 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 - sha256: ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e - md5: d645c6d2ac96843a2bfaccd2d62b3ac3 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_0.conda + sha256: 67a6c95e33ebc763c1adc3455b9a9ecde901850eb2fceb8e646cc05ef3a663da + md5: e3eb7806380bc8bcecba6d749ad5f026 depends: - - libgcc-ng >=9.4.0 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] - size: 58292 - timestamp: 1636488182923 + size: 53415 + timestamp: 1739260413716 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda sha256: 53eb8a79365e58849e7b1a068d31f4f9e718dc938d6f2c03e960345739a03569 md5: 3cb76c3f10d3bc7f1105b2fc9db984df @@ -1620,6 +2036,8 @@ packages: constrains: - libgomp 14.2.0 h77fa898_1 - libgcc-ng ==14.2.0=*_1 + arch: x86_64 + platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] @@ -1640,32 +2058,36 @@ packages: md5: e39480b9ca41323497b05492a63bc35b depends: - libgcc 14.2.0 h77fa898_1 + arch: x86_64 + platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] size: 54142 timestamp: 1729027726517 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-hd3e95f3_10.conda - sha256: b0fa27d4d09fb24750c04e89dbd0aee898dc028bde99e62621065a9bde43efe8 - md5: 30ee3a29c84cf7b842a8c5828c4b7c13 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h6f5c62b_11.conda + sha256: 19e5be91445db119152217e8e8eec4fd0499d854acc7d8062044fb55a70971cd + md5: 68fc66282364981589ef36868b1a7c78 depends: - __glibc >=2.17,<3.0.a0 - - fontconfig >=2.14.2,<3.0a0 + - fontconfig >=2.15.0,<3.0a0 - fonts-conda-ecosystem - freetype >=2.12.1,<3.0a0 - icu >=75.1,<76.0a0 - - libexpat >=2.6.2,<3.0a0 - - libgcc-ng >=12 + - libexpat >=2.6.4,<3.0a0 + - libgcc >=13 - libjpeg-turbo >=3.0.0,<4.0a0 - - libpng >=1.6.43,<1.7.0a0 - - libtiff >=4.6.0,<4.8.0a0 - - libwebp-base >=1.4.0,<2.0a0 + - libpng >=1.6.45,<1.7.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.5.0,<2.0a0 - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux license: GD license_family: BSD purls: [] - size: 225113 - timestamp: 1722928278395 + size: 177082 + timestamp: 1737548051015 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-14.2.0-h69a702a_1.conda sha256: fc9e7f22a17faf74da904ebfc4d88699013d2992e55505e4aa0eb01770290977 md5: f1fd30127802683586f768875127a987 @@ -1673,6 +2095,8 @@ packages: - libgfortran5 14.2.0 hd5240d6_1 constrains: - libgfortran-ng ==14.2.0=*_1 + arch: x86_64 + platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] @@ -1685,14 +2109,16 @@ packages: - libgcc >=14.2.0 constrains: - libgfortran 14.2.0 + arch: x86_64 + platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] size: 1462645 timestamp: 1729027735353 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_0.conda - sha256: 49ee9401d483a76423461c50dcd37f91d070efaec7e4dc2828d8cdd2ce694231 - md5: 13e8e54035ddd2b91875ba399f0f7c04 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_1.conda + sha256: f0804a9e46ae7b32ca698d26c1c95aa82a91f71b6051883d4a46bea725be9ea4 + md5: 37d1af619d999ee8f1f73cf5a06f4e2f depends: - __glibc >=2.17,<3.0.a0 - libffi >=3.4,<4.0a0 @@ -1701,16 +2127,20 @@ packages: - libzlib >=1.3.1,<2.0a0 - pcre2 >=10.44,<10.45.0a0 constrains: - - glib 2.82.2 *_0 + - glib 2.82.2 *_1 + arch: x86_64 + platform: linux license: LGPL-2.1-or-later purls: [] - size: 3931898 - timestamp: 1729191404130 + size: 3923974 + timestamp: 1737037491054 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda sha256: 1911c29975ec99b6b906904040c855772ccb265a1c79d5d75c8ceec4ed89cd63 md5: cc3573974587f12dda90d96e3e55a702 depends: - _libgcc_mutex 0.1 conda_forge + arch: x86_64 + platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] @@ -1724,20 +2154,25 @@ packages: - libgcc >=13 - libstdcxx >=13 - libxml2 >=2.13.4,<3.0a0 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] size: 2423200 timestamp: 1731374922090 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - sha256: 8ac2f6a9f186e76539439e50505d98581472fedb347a20e7d1f36429849f05c9 - md5: d66573916ffcf376178462f1b61c941e +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h4ce23a2_0.conda + sha256: 659a83c0c184a30336ca512d670a7db56bfb5e289caa9ee641e6f78fd2326463 + md5: 0743bcd51fc4e6e0367e0aaf41e9bebc depends: - - libgcc-ng >=12 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux license: LGPL-2.1-only purls: [] - size: 705775 - timestamp: 1702682170569 + size: 713745 + timestamp: 1739866934640 - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda sha256: b954e09b7e49c2f2433d6f3bb73868eda5e378278b0f8c1dd10a7ef090e14f2f md5: ea25936bb4080d843790b586850f82b8 @@ -1745,40 +2180,56 @@ packages: - libgcc-ng >=12 constrains: - jpeg <0.0.0a + arch: x86_64 + platform: linux license: IJG AND BSD-3-Clause AND Zlib purls: [] size: 618575 timestamp: 1694474974816 -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-25_linux64_openblas.conda - build_number: 25 - sha256: 9d1ff017714edb2d84868f0f931a4a0e7c289a971062b2ac66cfc8145df7e20e - md5: 4dc03a53fc69371a6158d0ed37214cd3 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-9_h9f1adc1_netlib.conda + build_number: 9 + sha256: b2d7d3ae78113afd8c147b91cc54bfdf7a3b1bcec7e9b2b562f3f9a3ba0edf7c + md5: e35381a8ed8c80a987dc804384c34aed depends: - - libblas 3.9.0 25_linux64_openblas - constrains: - - liblapacke 3.9.0 25_linux64_openblas - - libcblas 3.9.0 25_linux64_openblas - - blas * openblas + - __glibc >=2.17,<3.0.a0 + - libblas 3.9.0.* + - libgcc >=13 + - libgfortran + - libgfortran5 >=13.3.0 + - mkl >=2024.2.2,<2025.0a0 + arch: x86_64 + platform: linux + track_features: + - blas_netlib + - blas_netlib_2 license: BSD-3-Clause license_family: BSD purls: [] - size: 15608 - timestamp: 1729642910812 -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-25_linux64_openblas.conda - build_number: 25 - sha256: f8bc6fe22126ca0bf204c27f829d1e0006069cc98776a33122bf8d0548940b3c - md5: 8f5ead31b3a168aedd488b8a87736c41 + size: 2781524 + timestamp: 1739843060105 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-9_h0ad7b2f_netlib.conda + build_number: 9 + sha256: e0ac9d2e61819d77564f168706325b443c87480f4f240321aa6ef2bc60dd7acd + md5: df14f215234841c75debd3618a9e1e8c depends: - - libblas 3.9.0 25_linux64_openblas - - libcblas 3.9.0 25_linux64_openblas - - liblapack 3.9.0 25_linux64_openblas - constrains: - - blas * openblas + - __glibc >=2.17,<3.0.a0 + - libblas 3.9.0.* + - libcblas 3.9.0.* + - libgcc >=13 + - libgfortran + - libgfortran5 >=13.3.0 + - liblapack 3.9.0.* + - mkl >=2024.2.2,<2025.0a0 + arch: x86_64 + platform: linux + track_features: + - blas_netlib + - blas_netlib_2 license: BSD-3-Clause license_family: BSD purls: [] - size: 15609 - timestamp: 1729642916038 + size: 496051 + timestamp: 1739843076862 - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm14-14.0.6-hcd5def8_4.conda sha256: 225cc7c3b20ac1db1bdb37fa18c95bf8aecef4388e984ab2f7540a9f4382106a md5: 73301c133ded2bf71906aa2104edae8b @@ -1786,21 +2237,25 @@ packages: - libgcc-ng >=12 - libstdcxx-ng >=12 - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux license: Apache-2.0 WITH LLVM-exception license_family: Apache purls: [] size: 31484415 timestamp: 1690557554081 -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.3-hb9d3cd8_1.conda - sha256: e6e425252f3839e2756e4af1ea2074dffd3396c161bf460629f9dfd6a65f15c6 - md5: 2ecf2f1c7e4e21fcfe6423a51a992d84 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.6.4-hb9d3cd8_0.conda + sha256: cad52e10319ca4585bc37f0bc7cce99ec7c15dc9168e42ccb96b741b0a27db3f + md5: 42d5b6a0f30d3c10cd88cb8584fda1cb depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 + arch: x86_64 + platform: linux license: 0BSD purls: [] - size: 111132 - timestamp: 1733407410083 + size: 111357 + timestamp: 1738525339684 - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.64.0-h161d5f1_0.conda sha256: b0f2b3695b13a989f75d8fd7f4778e1c7aabe3b36db83f0fe80b2cd812c0e975 md5: 19e57602824042dfd0446292ef90488b @@ -1813,6 +2268,8 @@ packages: - libstdcxx >=13 - libzlib >=1.3.1,<2.0a0 - openssl >=3.3.2,<4.0a0 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] @@ -1823,63 +2280,56 @@ packages: md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 depends: - libgcc-ng >=12 + arch: x86_64 + platform: linux license: LGPL-2.1-only license_family: GPL purls: [] size: 33408 timestamp: 1697359010159 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.28-pthreads_h94d23a6_1.conda - sha256: 99ba271d8a80a1af2723f2e124ffd91d850074c0389c067e6d96d72a2dbfeabe - md5: 62857b389e42b36b686331bec0922050 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libgfortran - - libgfortran5 >=14.2.0 - constrains: - - openblas >=0.3.28,<0.3.29.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 5578513 - timestamp: 1730772671118 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda - sha256: e5b14f7a01c2db4362d8591f42f82f336ed48d5e4079e4d1f65d0c2a3637ea78 - md5: f4cc49d7aa68316213e4b12be35308d1 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.47-h943b412_0.conda + sha256: 23367d71da58c9a61c8cbd963fcffb92768d4ae5ffbef9a47cdf1f54f98c5c36 + md5: 55199e2ae2c3651f6f9b2a447b47bdc9 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux license: zlib-acknowledgement purls: [] - size: 290661 - timestamp: 1726234747153 -- conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.4-hc0ffecb_0.conda - sha256: fda3197ffb24512e719d55defa02f9f70286038e56cad8c1d580ed6460f417fa - md5: 83f045969988f5c7a65f3950b95a8b35 + size: 288701 + timestamp: 1739952993639 +- conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.4-h49af25d_2.conda + sha256: 475013475a3209c24a82f9e80c545d56ccca2fa04df85952852f3d73caa38ff9 + md5: b9846db0abffb09847e2cb0fec4b4db6 depends: - __glibc >=2.17,<3.0.a0 - - cairo >=1.18.0,<2.0a0 + - cairo >=1.18.2,<2.0a0 - freetype >=2.12.1,<3.0a0 - gdk-pixbuf >=2.42.12,<3.0a0 - - harfbuzz >=9.0.0,<10.0a0 + - harfbuzz >=10.1.0,<11.0a0 - libgcc >=13 - - libglib >=2.80.3,<3.0a0 - - libpng >=1.6.43,<1.7.0a0 - - libxml2 >=2.12.7,<3.0a0 + - libglib >=2.82.2,<3.0a0 + - libpng >=1.6.44,<1.7.0a0 + - libxml2 >=2.13.5,<3.0a0 - pango >=1.54.0,<2.0a0 constrains: - __glibc >=2.17 + arch: x86_64 + platform: linux license: LGPL-2.1-or-later purls: [] - size: 6390511 - timestamp: 1726227212382 + size: 6342757 + timestamp: 1734902068235 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-13.3.0-heb74ff8_1.conda sha256: c86d130f0a3099e46ff51aa7ffaab73cb44fc420d27a96076aab3b9a326fc137 md5: c4cb22f270f501f5c59a122dc2adf20a depends: - libgcc >=13.3.0 - libstdcxx >=13.3.0 + arch: x86_64 + platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] @@ -1890,21 +2340,25 @@ packages: md5: a587892d3c13b6621a6091be690dbca2 depends: - libgcc-ng >=12 + arch: x86_64 + platform: linux license: ISC purls: [] size: 205978 timestamp: 1716828628198 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.2-hee588c1_0.conda - sha256: 48af21ebc2cbf358976f1e0f4a0ab9e91dfc83d0ef337cf3837c6f5bc22fb352 - md5: b58da17db24b6e08bcbf8fed2fb8c915 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_1.conda + sha256: 7a09eef804ef7cf4d88215c2297eabb72af8ad0bd5b012060111c289f14bbe7d + md5: 73cea06049cc4174578b432320a003b8 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux license: Unlicense purls: [] - size: 873551 - timestamp: 1733761824646 + size: 915956 + timestamp: 1739953155793 - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hf672d98_0.conda sha256: 0407ac9fda2bb67e11e357066eff144c845801d00b5f664efbc48813af1e7bb9 md5: be2de152d8073ef1c01b7728475f2fe7 @@ -1913,6 +2367,8 @@ packages: - libgcc >=13 - libzlib >=1.3.1,<2.0a0 - openssl >=3.4.0,<4.0a0 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] @@ -1923,6 +2379,8 @@ packages: md5: 234a5554c53625688d51062645337328 depends: - libgcc 14.2.0 h77fa898_1 + arch: x86_64 + platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] @@ -1943,18 +2401,20 @@ packages: md5: 8371ac6457591af2cf6159439c1fd051 depends: - libstdcxx 14.2.0 hc0a3c3a_1 + arch: x86_64 + platform: linux license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL purls: [] size: 54105 timestamp: 1729027780628 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hc4654cb_2.conda - sha256: 18653b4a5c73e19c5e86ff72dab9bf59f5cc43d7f404a6be705d152dfd5e0660 - md5: be54fb40ea32e8fe9dbaa94d4528b57e +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-hd9ff511_3.conda + sha256: b224e16b88d76ea95e4af56e2bc638c603bd26a770b98d117d04541d3aafa002 + md5: 0ea6510969e1296cc19966fad481f6de depends: - __glibc >=2.17,<3.0.a0 - lerc >=4.0.0,<5.0a0 - - libdeflate >=1.22,<1.23.0a0 + - libdeflate >=1.23,<1.24.0a0 - libgcc >=13 - libjpeg-turbo >=3.0.0,<4.0a0 - liblzma >=5.6.3,<6.0a0 @@ -1962,32 +2422,39 @@ packages: - libwebp-base >=1.4.0,<2.0a0 - libzlib >=1.3.1,<2.0a0 - zstd >=1.5.6,<1.6.0a0 + arch: x86_64 + platform: linux license: HPND purls: [] - size: 429018 - timestamp: 1733443013288 + size: 428173 + timestamp: 1734398813264 - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 md5: 40b61aab5c7ba9ff276c41cfffe6b80b depends: - libgcc-ng >=12 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] size: 33601 timestamp: 1680112270483 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda - sha256: 49bc5f6b1e11cb2babf2a2a731d1a680a5e08a858280876a779dbda06c78c35f - md5: b26e8aa824079e1be0294e7152ca4559 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.5.0-h851e524_0.conda + sha256: c45283fd3e90df5f0bd3dbcd31f59cdd2b001d424cf30a07223655413b158eaf + md5: 63f790534398730f59e1b899c3644d4a depends: - - libgcc-ng >=12 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 constrains: - - libwebp 1.4.0 + - libwebp 1.5.0 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] - size: 438953 - timestamp: 1713199854503 + size: 429973 + timestamp: 1734777489810 - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa md5: 92ed62436b625154323d40d5f2f11dd7 @@ -1997,6 +2464,8 @@ packages: - pthread-stubs - xorg-libxau >=1.0.11,<2.0a0 - xorg-libxdmcp + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] @@ -2007,25 +2476,47 @@ packages: md5: 5aa797f8787fe7a17d1b0821485b5adc depends: - libgcc-ng >=12 + arch: x86_64 + platform: linux license: LGPL-2.1-or-later purls: [] size: 100393 timestamp: 1702724383534 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.5-h8d12d68_1.conda - sha256: c3b05bdc40d27a9249f0bb60f3f71718f94104b8bcd200163a6c9d4ade7aa052 - md5: 1a21e49e190d1ffe58531a81b6e400e1 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.8.0-hc4a0caf_0.conda + sha256: 583203155abcfb03938d8473afbf129156b5b30301a0f796c8ecca8c5b7b2ed2 + md5: f1656760dbf05f47f962bfdc59fc3416 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libxcb >=1.17.0,<2.0a0 + - libxml2 >=2.13.5,<3.0a0 + - xkeyboard-config + - xorg-libxau >=1.0.12,<2.0a0 + arch: x86_64 + platform: linux + license: MIT/X11 Derivative + license_family: MIT + purls: [] + size: 642349 + timestamp: 1738735301999 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.13.6-h8d12d68_0.conda + sha256: db8af71ea9c0ae95b7cb4a0f59319522ed2243942437a1200ceb391493018d85 + md5: 328382c0e0ca648e5c189d5ec336c604 depends: - __glibc >=2.17,<3.0.a0 - icu >=75.1,<76.0a0 - libgcc >=13 - - libiconv >=1.17,<2.0a0 - - liblzma >=5.6.3,<6.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.6.4,<6.0a0 - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] - size: 690589 - timestamp: 1733443667823 + size: 690296 + timestamp: 1739952967309 - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 md5: edb0dca6bc32e4f4789199455a1dbeb8 @@ -2034,23 +2525,27 @@ packages: - libgcc >=13 constrains: - zlib 1.3.1 *_2 + arch: x86_64 + platform: linux license: Zlib license_family: Other purls: [] size: 60963 timestamp: 1727963148474 -- conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-19.1.5-h024ca30_0.conda - sha256: e319db1e18dabe23ddeb4a1e04ff1ab5e331069a5a558891ffeb60c8b76d5e6a - md5: dc90d15c25a57f641f0b84c271e4761e +- conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-19.1.7-h024ca30_0.conda + sha256: 5383e32604e03814b6011fa01a5332057934181a7ea0e90abba7890c17cabce6 + md5: 9915f85a72472011550550623cce2d53 depends: - __glibc >=2.17,<3.0.a0 constrains: - - openmp 19.1.5|19.1.5.* + - openmp 19.1.7|19.1.7.* + arch: x86_64 + platform: linux license: Apache-2.0 WITH LLVM-exception license_family: APACHE purls: [] - size: 3191882 - timestamp: 1733375922702 + size: 3190529 + timestamp: 1736986301022 - conda: https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.43.0-py312h374181b_1.conda sha256: b260285b29834f9b003e2928d778c19b8ed0ca1aff5aa8aa7ec8f21f9b23c2e4 md5: ed6ead7e9ab9469629c6cfb363b5c6e2 @@ -2062,6 +2557,8 @@ packages: - libzlib >=1.3.1,<2.0a0 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux license: BSD-2-Clause license_family: BSD purls: @@ -2081,6 +2578,19 @@ packages: - pkg:pypi/logical-unification?source=hash-mapping size: 18160 timestamp: 1683416555508 +- conda: https://conda.anaconda.org/conda-forge/linux-64/make-4.4.1-hb9d3cd8_2.conda + sha256: d652c7bd4d3b6f82b0f6d063b0d8df6f54cc47531092d7ff008e780f3261bdda + md5: 33405d2a66b1411db9f7242c8b97c9e7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + arch: x86_64 + platform: linux + license: GPL-3.0-or-later + license_family: GPL + purls: [] + size: 513088 + timestamp: 1727801714848 - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda sha256: 0fbacdfb31e55964152b24d5567e9a9996e1e7902fb08eb7d91b5fd6ce60803a md5: fee3164ac23dfca50cfcc8b85ddefb81 @@ -2093,12 +2603,11 @@ packages: - pkg:pypi/markdown-it-py?source=hash-mapping size: 64430 timestamp: 1733250550053 -- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.3-py312hd3ec401_0.conda - sha256: 8e8f4e20eccc2473ad14d649609dbaae74354630dbd34e58b53870d8f15d663d - md5: b023c7b33ecc2aa6726232dc3061ac6c +- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.0-py312hd3ec401_0.conda + sha256: eed67ea988883a3c05160c6d02f34f5a4b6405713cf699d9117eb68fb4743017 + md5: c27a17a8c54c0d35cf83bbc0de8f7f77 depends: - __glibc >=2.17,<3.0.a0 - - certifi >=2020.06.20 - contourpy >=1.0.1 - cycler >=0.10 - fonttools >=4.22.0 @@ -2116,12 +2625,14 @@ packages: - python_abi 3.12.* *_cp312 - qhull >=2020.2,<2020.3.0a0 - tk >=8.6.13,<8.7.0a0 + arch: x86_64 + platform: linux license: PSF-2.0 license_family: PSF purls: - pkg:pypi/matplotlib?source=hash-mapping - size: 7923928 - timestamp: 1733176194348 + size: 8210655 + timestamp: 1734380560683 - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_1.conda sha256: 69b7dc7131703d3d60da9b0faa6dd8acbf6f6c396224cf6aef3e855b8c0c41c6 md5: af6ab708897df59bd6e7283ceab1b56b @@ -2134,9 +2645,9 @@ packages: - pkg:pypi/matplotlib-inline?source=hash-mapping size: 14467 timestamp: 1733417051523 -- conda: https://conda.anaconda.org/conda-forge/linux-64/maturin-1.7.8-py312h6ab59e4_0.conda - sha256: 19a8adcb4a1b3db4ba2f45f3b2e302d2b039c4647241e5cfc4fceaf4fd4e3289 - md5: 0a2dbad1854d6ed324d7ea1ea4fb83fe +- conda: https://conda.anaconda.org/conda-forge/linux-64/maturin-1.8.2-py312h6ab59e4_0.conda + sha256: 580b95a925375b0aa7cf6ed61501f6464601946b8104fa0bc4d90e3544fadc5a + md5: a64484deff2212624f77f4e505e54fbd depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 @@ -2144,12 +2655,14 @@ packages: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - tomli >=1.1.0 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: - pkg:pypi/maturin?source=hash-mapping - size: 6425132 - timestamp: 1733434151515 + size: 6454927 + timestamp: 1738795289777 - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 md5: 592132998493b3ff25fd7479396e8351 @@ -2161,22 +2674,22 @@ packages: - pkg:pypi/mdurl?source=hash-mapping size: 14465 timestamp: 1733255681319 -- conda: https://conda.anaconda.org/conda-forge/noarch/minikanren-1.0.3-pyhd8ed1ab_0.tar.bz2 - sha256: f0873262d9ea246dabc7e9c17190b9b04c1f973df1fd26426e14208c4ca62236 - md5: 0726bd0e32c2edfa48dfbf744579520e +- conda: https://conda.anaconda.org/conda-forge/noarch/minikanren-1.0.3-pyhd8ed1ab_1.conda + sha256: 74081492f48c70681cc38e4f85c5f1c1ea5787b25061bcae544b04b5ea7c08c1 + md5: b48b29582e413aca4de7a366fe98d928 depends: - cons >=0.4.0 - etuples >=0.3.1 - logical-unification >=0.4.1 - multipledispatch - - python >=3.6 + - python >=3.9 - toolz license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/minikanren?source=hash-mapping - size: 23617 - timestamp: 1642650983911 + size: 26338 + timestamp: 1734538707128 - conda: https://conda.anaconda.org/conda-forge/linux-64/mkl-2024.2.2-ha957f24_16.conda sha256: 77906b0acead8f86b489da46f53916e624897338770dbf70b04b8f673c9273c1 md5: 1459379c79dda834673426504d52b319 @@ -2185,6 +2698,8 @@ packages: - _openmp_mutex >=4.5 - llvm-openmp >=19.1.2 - tbb 2021.* + arch: x86_64 + platform: linux license: LicenseRef-IntelSimplifiedSoftwareOct2022 license_family: Proprietary purls: [] @@ -2199,16 +2714,18 @@ packages: - mkl >=2024.2.2,<2025.0a0 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/mkl-service?source=hash-mapping size: 73420 timestamp: 1728843500808 -- pypi: https://files.pythonhosted.org/packages/6f/d3/1321715a95e856d4ef4fba24e4351cf5e4c89d459ad132a8cba5fe257d72/ml_dtypes-0.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/08/57/5d58fad4124192b1be42f68bd0c0ddaa26e44a730ff8c9337adade2f5632/ml_dtypes-0.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl name: ml-dtypes - version: 0.5.0 - sha256: a38df8df61194aeaae1ab7579075779b4ad32cd1cffd012c28be227fa7f2a70a + version: 0.5.1 + sha256: ad4953c5eb9c25a56d11a913c2011d7e580a435ef5145f804d98efa14477d390 requires_dist: - numpy>=1.21 - numpy>=1.21.2 ; python_full_version >= '3.10' @@ -2230,6 +2747,8 @@ packages: - libstdcxx >=13 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux license: Apache-2.0 license_family: Apache purls: @@ -2259,16 +2778,48 @@ packages: - pkg:pypi/munkres?source=hash-mapping size: 12452 timestamp: 1600387789153 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda - sha256: 6a1d5d8634c1a07913f1c525db6455918cbc589d745fac46d9d6e30340c8731a - md5: 70caf8bb6cf39a0b6b7efc885f51c0fe +- conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.2-pyhd8ed1ab_0.conda + sha256: a20cff739d66c2f89f413e4ba4c6f6b59c50d5c30b5f0d840c13e8c9c2df9135 + md5: 6bb0d77277061742744176ab555b723c + depends: + - jupyter_client >=6.1.12 + - jupyter_core >=4.12,!=5.0.* + - nbformat >=5.1 + - python >=3.8 + - traitlets >=5.4 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/nbclient?source=hash-mapping + size: 28045 + timestamp: 1734628936013 +- conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + sha256: 7a5bd30a2e7ddd7b85031a5e2e14f290898098dc85bea5b3a5bf147c25122838 + md5: bbe1963f1e47f594070ffe87cdf612ea + depends: + - jsonschema >=2.6 + - jupyter_core >=4.12,!=5.0.* + - python >=3.9 + - python-fastjsonschema >=2.15 + - traitlets >=5.1 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/nbformat?source=hash-mapping + size: 100945 + timestamp: 1733402844974 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + md5: 47e340acb35de30501a76c7c799c41d7 depends: - __glibc >=2.17,<3.0.a0 - - libgcc-ng >=12 + - libgcc >=13 + arch: x86_64 + platform: linux license: X11 AND BSD-3-Clause purls: [] - size: 889086 - timestamp: 1724658547447 + size: 891641 + timestamp: 1738195959188 - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda sha256: bb7b21d7fd0445ddc0631f64e66d91a179de4ba920b8381f29b9d006a42788c0 md5: 598fd7d4d0de2455fb74f56063969a97 @@ -2299,17 +2850,20 @@ packages: - scipy >=1.0 - libopenblas !=0.3.6 - cudatoolkit >=11.2 + arch: x86_64 + platform: linux license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/numba?source=hash-mapping size: 5695278 timestamp: 1718888170104 -- conda: https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.14.1-py312hf9745cd_0.conda - sha256: f31b39d05eb4c99f9611578ee045ebb0764aa1cc9fa700813362899f11161bc2 - md5: eff78da3a99c42c0950cfd25eb996c20 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.15.1-py312hf9745cd_0.conda + sha256: 209a84599e36db68865dce5618c3328a2d57267d339255204815885b220a20f2 + md5: 8a1f88d4985ee1c16b0db1af39a8554d depends: - __glibc >=2.17,<3.0.a0 + - deprecated - libgcc >=13 - libstdcxx >=13 - msgpack-python @@ -2317,12 +2871,14 @@ packages: - numpy >=1.24 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: - pkg:pypi/numcodecs?source=hash-mapping - size: 841354 - timestamp: 1732243783870 + size: 848654 + timestamp: 1739285119780 - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda sha256: fe3459c75cf84dcef6ef14efcc4adb0ade66038ddd27cadb894f34f4797687d8 md5: d8285bea2a350f63fab23bf460221f3f @@ -2336,72 +2892,14 @@ packages: - python_abi 3.12.* *_cp312 constrains: - numpy-base <0a0 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/numpy?source=hash-mapping size: 7484186 timestamp: 1707225809722 -- pypi: https://files.pythonhosted.org/packages/af/eb/ff4b8c503fa1f1796679dce648854d58751982426e4e4b37d6fce49d259c/nvidia_cublas_cu12-12.6.4.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - name: nvidia-cublas-cu12 - version: 12.6.4.1 - sha256: 08ed2686e9875d01b58e3cb379c6896df8e76c75e0d4a7f7dace3d7b6d9ef8eb - requires_python: '>=3' -- pypi: https://files.pythonhosted.org/packages/49/60/7b6497946d74bcf1de852a21824d63baad12cd417db4195fc1bfe59db953/nvidia_cuda_cupti_cu12-12.6.80-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - name: nvidia-cuda-cupti-cu12 - version: 12.6.80 - sha256: 6768bad6cab4f19e8292125e5f1ac8aa7d1718704012a0e3272a6f61c4bce132 - requires_python: '>=3' -- pypi: https://files.pythonhosted.org/packages/25/1f/faf9b791027ebd6354be68700da3c3d8a3b3db3bdcf2f8070f2e6871a7f1/nvidia_cuda_nvcc_cu12-12.6.85-py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl - name: nvidia-cuda-nvcc-cu12 - version: 12.6.85 - sha256: d75d9d74599f4d7c0865df19ed21b739e6cb77a6497a3f73d6f61e8038a765e4 - requires_python: '>=3' -- pypi: https://files.pythonhosted.org/packages/e1/23/e717c5ac26d26cf39a27fbc076240fad2e3b817e5889d671b67f4f9f49c5/nvidia_cuda_runtime_cu12-12.6.77-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - name: nvidia-cuda-runtime-cu12 - version: 12.6.77 - sha256: ba3b56a4f896141e25e19ab287cd71e52a6a0f4b29d0d31609f60e3b4d5219b7 - requires_python: '>=3' -- pypi: https://files.pythonhosted.org/packages/67/4c/0f18ddce75f2c17cf028d16e067c07f11c421c981b8c2a45c99bc6169af6/nvidia_cudnn_cu12-9.6.0.74-py3-none-manylinux_2_27_x86_64.whl - name: nvidia-cudnn-cu12 - version: 9.6.0.74 - sha256: cb700ea574ba8ffdbf9381fed2cdfa0b1847852c3811fb5f0d998d8d47a1cf1a - requires_dist: - - nvidia-cublas-cu12 - requires_python: '>=3' -- pypi: https://files.pythonhosted.org/packages/8f/16/73727675941ab8e6ffd86ca3a4b7b47065edcca7a997920b831f8147c99d/nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - name: nvidia-cufft-cu12 - version: 11.3.0.4 - sha256: ccba62eb9cef5559abd5e0d54ceed2d9934030f51163df018532142a8ec533e5 - requires_dist: - - nvidia-nvjitlink-cu12 - requires_python: '>=3' -- pypi: https://files.pythonhosted.org/packages/f0/6e/c2cf12c9ff8b872e92b4a5740701e51ff17689c4d726fca91875b07f655d/nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - name: nvidia-cusolver-cu12 - version: 11.7.1.2 - sha256: e9e49843a7707e42022babb9bcfa33c29857a93b88020c4e4434656a655b698c - requires_dist: - - nvidia-cublas-cu12 - - nvidia-nvjitlink-cu12 - - nvidia-cusparse-cu12 - requires_python: '>=3' -- pypi: https://files.pythonhosted.org/packages/06/1e/b8b7c2f4099a37b96af5c9bb158632ea9e5d9d27d7391d7eb8fc45236674/nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl - name: nvidia-cusparse-cu12 - version: 12.5.4.2 - sha256: 7556d9eca156e18184b94947ade0fba5bb47d69cec46bf8660fd2c71a4b48b73 - requires_dist: - - nvidia-nvjitlink-cu12 - requires_python: '>=3' -- pypi: https://files.pythonhosted.org/packages/ed/1f/6482380ec8dcec4894e7503490fc536d846b0d59694acad9cf99f27d0e7d/nvidia_nccl_cu12-2.23.4-py3-none-manylinux2014_x86_64.whl - name: nvidia-nccl-cu12 - version: 2.23.4 - sha256: b097258d9aab2fa9f686e33c6fe40ae57b27df60cedbd15d139701bb5509e0c1 - requires_python: '>=3' -- pypi: https://files.pythonhosted.org/packages/9d/d7/c5383e47c7e9bf1c99d5bd2a8c935af2b6d705ad831a7ec5c97db4d82f4f/nvidia_nvjitlink_cu12-12.6.85-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl - name: nvidia-nvjitlink-cu12 - version: 12.6.85 - sha256: eedc36df9e88b682efe4309aa16b5b4e78c2407eac59e8c10a6a47535164369a - requires_python: '>=3' - conda: https://conda.anaconda.org/conda-forge/noarch/objprint-0.3.0-pyhd8ed1ab_0.conda sha256: ff58f788e9e8c74a6eb2f194b4c18e5bc39a0000172f0b1ec016afae637961f2 md5: 8f8399ecb94bd96e0d73e02053525808 @@ -2413,16 +2911,6 @@ packages: - pkg:pypi/objprint?source=hash-mapping size: 38864 timestamp: 1731340445369 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openblas-0.3.28-pthreads_h6ec200e_1.conda - sha256: c558f49a262f43b0c5b6f9feb75b631d0b1eeba53579fd2bbce0df37f1884ef0 - md5: 8fe5d50db07e92519cc639cb0aef9b1b - depends: - - libopenblas 0.3.28 pthreads_h94d23a6_1 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 5727592 - timestamp: 1730772687576 - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h5fbd93e_0.conda sha256: 5bee706ea5ba453ed7fd9da7da8380dd88b865c8d30b5aaec14d2b6dd32dbc39 md5: 9e5816bc95d285c115a3ebc2f8563564 @@ -2433,23 +2921,27 @@ packages: - libstdcxx >=13 - libtiff >=4.7.0,<4.8.0a0 - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux license: BSD-2-Clause license_family: BSD purls: [] size: 342988 timestamp: 1733816638720 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda - sha256: 814b9dff1847b132c676ee6cc1a8cb2d427320779b93e1b6d76552275c128705 - md5: 23cc74f77eb99315c0360ec3533147a9 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda + sha256: cbf62df3c79a5c2d113247ddea5658e9ff3697b6e741c210656e239ecaf1768f + md5: 41adf927e746dc75ecf0ef841c454e48 depends: - __glibc >=2.17,<3.0.a0 - ca-certificates - libgcc >=13 + arch: x86_64 + platform: linux license: Apache-2.0 license_family: Apache purls: [] - size: 2947466 - timestamp: 1731377666602 + size: 2939306 + timestamp: 1739301879343 - pypi: https://files.pythonhosted.org/packages/23/cd/066e86230ae37ed0be70aae89aabf03ca8d9f39c8aea0dec8029455b5540/opt_einsum-3.4.0-py3-none-any.whl name: opt-einsum version: 3.4.0 @@ -2494,9 +2986,9 @@ packages: - scipy>=1.7.1 ; extra == 'test' - scikit-learn ; extra == 'test' requires_python: '>=3.9' -- conda: https://conda.anaconda.org/conda-forge/linux-64/orjson-3.10.12-py312h12e396e_0.conda - sha256: e765f9c8296fd5fc53bf55b6929f8f8e125c16ef04d6ab350af63ae103549357 - md5: d7472299039651dfc65ba320192fe666 +- conda: https://conda.anaconda.org/conda-forge/linux-64/orjson-3.10.15-py312h12e396e_0.conda + sha256: a28431bfb90c99d577bfcd848e05d819e7efe36c50f0b45ed0545f606eb3ee7d + md5: 543c7130b6949b6df40e378f9d1db91e depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 @@ -2504,12 +2996,14 @@ packages: - python_abi 3.12.* *_cp312 constrains: - __glibc >=2.17 + arch: x86_64 + platform: linux license: Apache-2.0 license_family: Apache purls: - pkg:pypi/orjson?source=hash-mapping - size: 305862 - timestamp: 1732413388776 + size: 303663 + timestamp: 1737229215301 - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda sha256: da157b19bcd398b9804c5c52fc000fcb8ab0525bdb9c70f95beaa0bb42f85af1 md5: 3bfed7e6228ebf2f7b9eaa47f1b4e2aa @@ -2535,15 +3029,27 @@ packages: - python-tzdata >=2022a - python_abi 3.12.* *_cp312 - pytz >=2020.1,<2024.2 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/pandas?source=hash-mapping size: 15436913 timestamp: 1726879054912 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.54.0-h3a902e7_3.conda - sha256: b04f43a7968cedb93cc0b52854f2cac21d8b8ac150b40305865d9ff3c3d4da72 - md5: 8c12547e7b143fb70873fb732a4056b9 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.4-ha770c72_0.conda + sha256: 8b6c7ddd9422cc6b7ddc10aa8d184f07c1534429e106c441f679f21e95db31c8 + md5: 61c94057aaa5ae6145137ce1fddb2c04 + arch: x86_64 + platform: linux + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 21006632 + timestamp: 1726013132144 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.1-h861ebed_0.conda + sha256: 20e5e280859a7803e8b5a09f18a7e43b56d1b8e61e4888c1a24cbb0d5b9cabd3 + md5: 59e660508a4de9401543303d5f576aeb depends: - __glibc >=2.17,<3.0.a0 - cairo >=1.18.2,<2.0a0 @@ -2551,15 +3057,18 @@ packages: - fonts-conda-ecosystem - freetype >=2.12.1,<3.0a0 - fribidi >=1.0.10,<2.0a0 - - harfbuzz >=9.0.0,<10.0a0 + - harfbuzz >=10.2.0,<11.0a0 - libexpat >=2.6.4,<3.0a0 - libgcc >=13 - libglib >=2.82.2,<3.0a0 - - libpng >=1.6.44,<1.7.0a0 + - libpng >=1.6.45,<1.7.0a0 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux license: LGPL-2.1-or-later purls: [] - size: 447446 - timestamp: 1733761801816 + size: 451406 + timestamp: 1737510786003 - pypi: https://files.pythonhosted.org/packages/20/f8/7b1f5b84f84e43face7349ac2df23f0f75d36b5b4a1c1c0305edce82bcc8/paramax-0.0.0-py3-none-any.whl name: paramax version: 0.0.0 @@ -2607,6 +3116,8 @@ packages: - bzip2 >=1.0.8,<2.0a0 - libgcc-ng >=12 - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] @@ -2620,7 +3131,7 @@ packages: - python >=3.9 license: ISC purls: - - pkg:pypi/pexpect?source=hash-mapping + - pkg:pypi/pexpect?source=compressed-mapping size: 53561 timestamp: 1733302019362 - conda: https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-pyhd8ed1ab_1004.conda @@ -2634,9 +3145,9 @@ packages: - pkg:pypi/pickleshare?source=hash-mapping size: 11748 timestamp: 1733327448200 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.0.0-py312h7b63e92_0.conda - sha256: 13a464bea02c0df0199c20ef6bad24a6bc336aaf55bf8d6a133d0fe664463224 - md5: 385f46a4df6f97892503a841121a9acf +- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.1.0-py312h80c1187_0.conda + sha256: 5c347962202b55ae4d8a463e0555c5c6ca33396266a08284bf1384399894e541 + md5: d3894405f05b2c0f351d5de3ae26fa9c depends: - __glibc >=2.17,<3.0.a0 - freetype >=2.12.1,<3.0a0 @@ -2644,31 +3155,33 @@ packages: - libgcc >=13 - libjpeg-turbo >=3.0.0,<4.0a0 - libtiff >=4.7.0,<4.8.0a0 - - libwebp-base >=1.4.0,<2.0a0 + - libwebp-base >=1.5.0,<2.0a0 - libxcb >=1.17.0,<2.0a0 - libzlib >=1.3.1,<2.0a0 - - openjpeg >=2.5.2,<3.0a0 + - openjpeg >=2.5.3,<3.0a0 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - tk >=8.6.13,<8.7.0a0 + arch: x86_64 + platform: linux license: HPND purls: - pkg:pypi/pillow?source=hash-mapping - size: 41948418 - timestamp: 1729065846594 -- conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_0.conda - sha256: 499313e72e20225f84c2e9690bbaf5b952c8d7e0bf34b728278538f766b81628 - md5: 5dd546fe99b44fda83963d15f84263b7 + size: 42749785 + timestamp: 1735929845390 +- conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.3.1-pyh8b19718_2.conda + sha256: da8c8888de10c1e4234ebcaa1550ac2b4b5408ac20f093fe641e4bc8c9c9f3eb + md5: 04e691b9fadd93a8a9fad87a81d4fd8f depends: - - python >=3.8,<3.13.0a0 + - python >=3.9,<3.13.0a0 - setuptools - wheel license: MIT license_family: MIT purls: - pkg:pypi/pip?source=hash-mapping - size: 1243168 - timestamp: 1730203795600 + size: 1245116 + timestamp: 1734466348103 - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.44.2-h29eaf8c_0.conda sha256: 747c58db800d5583fee78e76240bf89cbaeedf7ab1ef339c2990602332b9c4be md5: 5e2a7acfa2c24188af39e7944e1b3604 @@ -2676,11 +3189,23 @@ packages: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libstdcxx >=13 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] size: 381072 timestamp: 1733698987122 +- conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_2.conda + sha256: adb2dde5b4f7da70ae81309cce6188ed3286ff280355cf1931b45d91164d2ad8 + md5: 5a5870a74432aa332f7d32180633ad05 + depends: + - python >=3.9 + license: MIT AND PSF-2.0 + purls: + - pkg:pypi/pkgutil-resolve-name?source=hash-mapping + size: 10693 + timestamp: 1733344619659 - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 md5: 577852c7e53901ddccc7e6a9959ddebe @@ -2703,9 +3228,9 @@ packages: - pkg:pypi/pluggy?source=hash-mapping size: 23595 timestamp: 1733222855563 -- conda: https://conda.anaconda.org/conda-forge/linux-64/polars-1.17.1-py312hda0fa55_0.conda - sha256: 0ffd14a4f73ee1b24b2342a84295f8fb5f1848711865d55676515a1aac66f554 - md5: 7ac74b8f85b43224508108f850617dad +- conda: https://conda.anaconda.org/conda-forge/linux-64/polars-1.22.0-py312hda0fa55_0.conda + sha256: 5c9bd84bc4a2fed0e0f59938901e5e36a3da697df296d4301fd9da6a12d984fd + md5: ae768211e65e308125e783771938ab5e depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 @@ -2715,52 +3240,58 @@ packages: - python_abi 3.12.* *_cp312 constrains: - __glibc >=2.17 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: - pkg:pypi/polars?source=hash-mapping - size: 25634166 - timestamp: 1733806684601 + size: 24683878 + timestamp: 1739040110404 - pypi: https://files.pythonhosted.org/packages/8f/4d/b72e0782abec07f3d8dabf24cf12673d26b173af2046eb4e67365c776ccf/posteriordb-0.2.0-py3-none-any.whl name: posteriordb version: 0.2.0 sha256: b6d6f3a349d34db6d4a68da899c818a95e5824c5e23824fc0ebe422f4bd6bac1 requires_dist: - requests -- conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.48-pyha770c72_1.conda - sha256: 79fb7d1eeb490d4cc1b79f781bb59fe302ae38cf0a30907ecde75a7d399796cc - md5: 368d4aa48358439e07a97ae237491785 +- conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.50-pyha770c72_0.conda + sha256: 0749c49a349bf55b8539ce5addce559b77592165da622944a51c630e94d97889 + md5: 7d823138f550b14ecae927a5ff3286de depends: - python >=3.9 - wcwidth constrains: - - prompt_toolkit 3.0.48 + - prompt_toolkit 3.0.50 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/prompt-toolkit?source=compressed-mapping - size: 269848 - timestamp: 1733302634979 -- conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.0-py312h66e93f0_0.conda - sha256: 0f309b435174e037d5cfe5ed26c1c5ad8152c68cfe61af17709ec31ec3d9f096 - md5: 0524eb91d3d78d76d671c6e3cd7cee82 + - pkg:pypi/prompt-toolkit?source=hash-mapping + size: 271905 + timestamp: 1737453457168 +- conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-6.1.1-py312h66e93f0_0.conda + sha256: 55d4fd0b294aeada0d7810fcc25503b59ec34c4390630789bd61c085b9ce649f + md5: add2c79595fa8a9b6d653d7e4e2cf05f depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/psutil?source=hash-mapping - size: 488462 - timestamp: 1729847159916 + size: 487053 + timestamp: 1735327468212 - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 md5: b3c17d95b5a10c6e64a21fa17573e70e depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] @@ -2787,40 +3318,41 @@ packages: - pkg:pypi/pure-eval?source=hash-mapping size: 16668 timestamp: 1733569518868 -- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda - sha256: 0d6133545f268b2b89c2617c196fc791f365b538d4057ecd636d658c3b1e885d - md5: b38dc0206e2a530e5c2cf11dc086b31a +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.1-pyhd8ed1ab_0.conda + sha256: 28a3e3161390a9d23bc02b4419448f8d27679d9e2c250e29849e37749c8de86b + md5: 232fb4577b6687b2d503ef8e254270c9 depends: - python >=3.9 license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/pygments?source=hash-mapping - size: 876700 - timestamp: 1733221731178 -- conda: https://conda.anaconda.org/conda-forge/noarch/pymc-5.19.1-hd8ed1ab_0.conda + size: 888600 + timestamp: 1736243563082 +- conda: https://conda.anaconda.org/conda-forge/noarch/pymc-5.20.1-hd8ed1ab_0.conda noarch: python - sha256: 4d157090014b3890a4feb1652ab07c8ef839cd2b063f58bf6cf94c4229735100 - md5: 1759ccce965ff0a1f8f1c82dc3cb0866 + sha256: 2077549cd237ff61273da575c81d289ba4373748688351d688b6dff916c26e59 + md5: 4bb94e034b8e9408ec4b23a0a11ddb38 depends: - - pymc-base 5.19.1 pyhd8ed1ab_0 + - pymc-base 5.20.1 pyhd8ed1ab_0 - pytensor - python-graphviz license: Apache-2.0 license_family: Apache - purls: [] - size: 11591 - timestamp: 1733471168016 -- conda: https://conda.anaconda.org/conda-forge/noarch/pymc-base-5.19.1-pyhd8ed1ab_0.conda - sha256: 5591215ad8ac2fa6f4e8612d7ebde34242a84d1778571050a1f014903324b7e0 - md5: e89ef644f56ba52bc6a118f15974dd55 + purls: + - pkg:pypi/pymc?source=compressed-mapping + size: 11767 + timestamp: 1738867855599 +- conda: https://conda.anaconda.org/conda-forge/noarch/pymc-base-5.20.1-pyhd8ed1ab_0.conda + sha256: 44009910a448f322bdd3d906324f4b7e5aa3a0865cabdc0a66c5b3e254363c1f + md5: dfe6d235c12d3bd0145f3aed3976c1dc depends: - arviz >=0.13.0 - cachetools >=4.2.1 - cloudpickle - numpy >=1.25.0 - pandas >=0.24.0 - - pytensor-base >=2.26.1,<2.27 + - pytensor-base >=2.26.1,<2.28 - python >=3.10 - rich >=13.7.1 - scipy >=1.4.1 @@ -2830,40 +3362,42 @@ packages: license_family: Apache purls: - pkg:pypi/pymc?source=hash-mapping - size: 335825 - timestamp: 1733471164844 -- conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.0-pyhd8ed1ab_2.conda - sha256: 09a5484532e24a33649ab612674fd0857bbdcfd6640a79d13a6690fb742a36e1 - md5: 4c05a2bcf87bb495512374143b57cf28 + size: 347711 + timestamp: 1738867852390 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.2.1-pyhd8ed1ab_0.conda + sha256: f513fed4001fd228d3bf386269237b4ca6bff732c99ffc11fcbad8529b35407c + md5: 285e237b8f351e85e7574a2c7bfa6d46 depends: - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/pyparsing?source=hash-mapping - size: 92319 - timestamp: 1733222687746 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pytensor-2.26.4-py312h97902ae_0.conda - sha256: 134e2dac7ff950b954a4d27243a3378a3cadef25be7ce5c852e48e0be6ea628a - md5: fa443c8e7ef80000b6a361bb0fb9e6c5 + size: 93082 + timestamp: 1735698406955 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pytensor-2.27.1-py312h97902ae_0.conda + sha256: b52c0e3076fba01e2001d70237d85b698525a22bfaee13a15c02cd375b0a08e0 + md5: 3dcb98f87392898b974cfca9d581e91c depends: - blas - gcc_linux-64 13.* - gxx - gxx_linux-64 13.* - mkl-service - - pytensor-base 2.26.4 py312h25a0e75_0 + - pytensor-base 2.27.1 py312h25a0e75_0 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - sysroot_linux-64 2.17.* + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] - size: 9085 - timestamp: 1733304394344 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pytensor-base-2.26.4-py312h25a0e75_0.conda - sha256: 503dc12f9fd5758938ff7bb8ff40dc8b84af8d94f4ad7acb187f621474c7e070 - md5: 329130fd52aa66adc1991f62f8a4c8ae + size: 9130 + timestamp: 1738648470447 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pytensor-base-2.27.1-py312h25a0e75_0.conda + sha256: 96b752c66a1b83c56277df8446a5f0692a2d6dff97e1b929ed257d1249f5c414 + md5: e80d864b4d2259dbdd420783aff9b97b depends: - __glibc >=2.17,<3.0.a0 - cons @@ -2878,12 +3412,14 @@ packages: - python_abi 3.12.* *_cp312 - scipy >=1,<2 - setuptools >=59.0.0 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/pytensor?source=hash-mapping - size: 2317596 - timestamp: 1733304380924 + size: 2321283 + timestamp: 1738648453740 - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.4-pyhd8ed1ab_1.conda sha256: 75245ca9d0cbd6d38bb45ec02430189a9d4c21c055c5259739d738a2298d61b3 md5: 799ed216dc6af62520f32aa39bc1c2bb @@ -2903,10 +3439,9 @@ packages: - pkg:pypi/pytest?source=hash-mapping size: 259195 timestamp: 1733217599806 -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.8-h9e4cc4f_1_cpython.conda - build_number: 1 - sha256: 3f0e0518c992d8ccfe62b189125721309836fe48a010dc424240583e157f9ff0 - md5: 7fd2fd79436d9b473812f14e86746844 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.9-h9e4cc4f_0_cpython.conda + sha256: 64fed5178f1e9c8ac0f572ac0ce37955f5dee7b2bcac665202bc14f1f7dd618a + md5: 5665f0079432f8848079c811cdb537d5 depends: - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 @@ -2914,23 +3449,25 @@ packages: - libexpat >=2.6.4,<3.0a0 - libffi >=3.4,<4.0a0 - libgcc >=13 - - liblzma >=5.6.3,<6.0a0 + - liblzma >=5.6.4,<6.0a0 - libnsl >=2.0.1,<2.1.0a0 - - libsqlite >=3.47.0,<4.0a0 + - libsqlite >=3.48.0,<4.0a0 - libuuid >=2.38.1,<3.0a0 - libxcrypt >=4.4.36 - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - - openssl >=3.4.0,<4.0a0 + - openssl >=3.4.1,<4.0a0 - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata constrains: - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux license: Python-2.0 purls: [] - size: 31565686 - timestamp: 1733410597922 + size: 31581682 + timestamp: 1739521496324 - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhff2d567_1.conda sha256: a50052536f1ef8516ed11a844f9413661829aa083304dc624c5925298d078d79 md5: 5ba79d7c71f03c678c8ead841f347d6e @@ -2943,6 +3480,17 @@ packages: - pkg:pypi/python-dateutil?source=hash-mapping size: 222505 timestamp: 1733215763718 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.1-pyhd8ed1ab_0.conda + sha256: 1b09a28093071c1874862422696429d0d35bd0b8420698003ac004746c5e82a2 + md5: 38e34d2d1d9dca4fb2b9a0a04f604e2c + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/fastjsonschema?source=hash-mapping + size: 226259 + timestamp: 1733236073335 - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.20.3-pyh91182bf_2.conda sha256: c8f5d3d23b5962524217f33549add8d6c5af22fe839b49603f4588771154a51c md5: f822f0e13849c2283f72ec4aa120eeaa @@ -2955,23 +3503,25 @@ packages: - pkg:pypi/graphviz?source=hash-mapping size: 38220 timestamp: 1733792086212 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.2-pyhd8ed1ab_1.conda - sha256: 57c9a02ec25926fb48edca59b9ede107823e5d5c473b94a0e05cc0b9a193a642 - md5: c0def296b2f6d2dd7b030c2a7f66bb1f +- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.1-pyhd8ed1ab_0.conda + sha256: 1597d6055d34e709ab8915091973552a0b8764c8032ede07c4e99670da029629 + md5: 392c91c42edd569a7ec99ed8648f597a depends: - python >=3.9 license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/tzdata?source=hash-mapping - size: 142235 - timestamp: 1733235414217 + size: 143794 + timestamp: 1737541204030 - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda build_number: 5 sha256: d10e93d759931ffb6372b45d65ff34d95c6000c61a07e298d162a3bc2accebb0 md5: 0424ae29b104430108f5218a66db7260 constrains: - python 3.12.* *_cpython + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: [] @@ -2988,9 +3538,26 @@ packages: - pkg:pypi/pytz?source=hash-mapping size: 188538 timestamp: 1706886944988 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.0-py312hbf22597_3.conda - sha256: bc303f9b11e04a515f79cd5ad3bfa0e84b9dfec76552626d6263b38789fe6678 - md5: 746ce19f0829ec3e19c93007b1a224d3 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.2-py312h178313f_2.conda + sha256: 159cba13a93b3fe084a1eb9bda0a07afc9148147647f0d437c3c3da60980503b + md5: cf2485f39740de96e2a7f2bb18ed2fee + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - yaml >=0.2.5,<0.3.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/pyyaml?source=hash-mapping + size: 206903 + timestamp: 1737454910324 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.2.1-py312hbf22597_0.conda + sha256: 90ec0da0317d3d76990a40c61e1709ef859dd3d8c63838bad2814f46a63c8a2e + md5: 7cec8d0dac15a2d9fea8e49879aa779d depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 @@ -2999,12 +3566,14 @@ packages: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - zeromq >=4.3.5,<4.4.0a0 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/pyzmq?source=hash-mapping - size: 378126 - timestamp: 1728642454632 + size: 382698 + timestamp: 1738271121975 - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda sha256: 776363493bad83308ba30bcb88c2552632581b143e8ee25b1982c8c743e73abc md5: 353823361b1d27eb3960efb076dfcaf6 @@ -3012,21 +3581,57 @@ packages: - __glibc >=2.17,<3.0.a0 - libgcc-ng >=12 - libstdcxx-ng >=12 + arch: x86_64 + platform: linux license: LicenseRef-Qhull purls: [] size: 552937 timestamp: 1720813982144 +- conda: https://conda.anaconda.org/conda-forge/linux-64/quarto-1.6.40-ha770c72_0.conda + sha256: 7d1538903ae2cde212eb2075b2b745ae0c8e5386bae458aebb67311f4d63c126 + md5: 9b16208e735b988727af946e049af3e3 + depends: + - dart-sass + - deno >=1.46.3,<1.46.4.0a0 + - deno-dom >=0.1.41,<0.1.42.0a0 + - esbuild + - pandoc 3.4 + - typst 0.11.0 + arch: x86_64 + platform: linux + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 15989616 + timestamp: 1736717196147 - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda sha256: 5435cf39d039387fbdc977b0a762357ea909a7694d9528ab40f005e9208744d7 md5: 47d31b792659ce70f470b5c82fdfb7a4 depends: - libgcc-ng >=12 - ncurses >=6.3,<7.0a0 + arch: x86_64 + platform: linux license: GPL-3.0-only license_family: GPL purls: [] size: 281456 timestamp: 1679532220005 +- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.36.2-pyh29332c3_0.conda + sha256: e20909f474a6cece176dfc0dc1addac265deb5fa92ea90e975fbca48085b20c3 + md5: 9140f1c09dd5489549c6a33931b943c7 + depends: + - attrs >=22.2.0 + - python >=3.9 + - rpds-py >=0.7.0 + - typing_extensions >=4.4.0 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/referencing?source=hash-mapping + size: 51668 + timestamp: 1737836872415 - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl name: requests version: 2.32.3 @@ -3053,7 +3658,25 @@ packages: - pkg:pypi/rich?source=hash-mapping size: 185646 timestamp: 1733342347277 -- pypi: git+https://github.com/aseyboldt/samplerlab#5ae57577f2a586fd941d77afd1f450bbdda796ac +- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.22.3-py312h12e396e_0.conda + sha256: e8662d21ca3c912ac8941725392b838a29458b106ef22d9489cdf0f8de145fad + md5: bfb49da0cc9098597d527def04d66f8b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: + - pkg:pypi/rpds-py?source=hash-mapping + size: 354410 + timestamp: 1733366814237 +- pypi: git+https://github.com/aseyboldt/samplerlab#9edea2da1c5b336e53b9238440a2317cf1baba14 name: samplerlab version: '0.1' requires_dist: @@ -3061,9 +3684,9 @@ packages: - arviz - pymc requires_python: '>=3.11' -- conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.1-py312h62794b6_2.conda - sha256: 6e4916d610dc15f9b504517bd6c1f3dbbae019a3c7abf0aeb55f310c452a4474 - md5: 94688dd449f6c092e5f951780235aca1 +- conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.15.2-py312ha707e6e_0.conda + sha256: b9faaa024b77a3678a988c5a490f02c4029c0d5903998b585100e05bc7d4ff36 + md5: 00b999c5f9d01fb633db819d79186bd4 depends: - __glibc >=2.17,<3.0.a0 - libblas >=3.9.0,<4.0a0 @@ -3073,17 +3696,19 @@ packages: - libgfortran5 >=13.3.0 - liblapack >=3.9.0,<4.0a0 - libstdcxx >=13 - - numpy <2.3 + - numpy <2.5 - numpy >=1.19,<3 - numpy >=1.23.5 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/scipy?source=hash-mapping - size: 17444442 - timestamp: 1733621582568 + size: 17064784 + timestamp: 1739791925628 - conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda noarch: python sha256: ea29a69b14dd6be5cdeeaa551bf50d78cafeaf0351e271e358f9b820fcab4cb0 @@ -3113,17 +3738,17 @@ packages: - pkg:pypi/seaborn?source=hash-mapping size: 227843 timestamp: 1733730112409 -- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.6.0-pyhff2d567_1.conda - sha256: abb12e1dd515b13660aacb5d0fd43835bc2186cab472df25b7716cd65e095111 - md5: fc80f7995e396cbaeabd23cf46c413dc +- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.8.0-pyhff2d567_0.conda + sha256: e0778e4f276e9a81b51c56f51ec22a27b4d8fc955abc0be77ad09ca9bea06bb9 + md5: 8f28e299c11afdd79e0ec1e279dcdc52 depends: - python >=3.9 license: MIT license_family: MIT purls: - pkg:pypi/setuptools?source=hash-mapping - size: 774252 - timestamp: 1732632769210 + size: 775598 + timestamp: 1736512753595 - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda sha256: 41db0180680cc67c3fa76544ffd48d6a5679d96f4b71d7498a759e94edc9a2db md5: a451d576819089b0d672f18768be0f65 @@ -3149,6 +3774,18 @@ packages: - pkg:pypi/stack-data?source=hash-mapping size: 26988 timestamp: 1733569565672 +- conda: https://conda.anaconda.org/conda-forge/noarch/stanio-0.5.1-pyhd8ed1ab_1.conda + sha256: da73aba3babd557592d62f5c26646e16c386e4e8077466c818780f4b3060795a + md5: a4b46bbc8e0159f7970afef0ca758fdd + depends: + - numpy + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/stanio?source=hash-mapping + size: 13565 + timestamp: 1734581732441 - conda: https://conda.anaconda.org/conda-forge/linux-64/statsmodels-0.14.4-py312hc0a28a1_0.conda sha256: 6cc65ba902b32207e8a697b0e0408a28d6cc166be04f1882c40739a86a253d22 md5: 97dc960f3d9911964d73c2cf240baea5 @@ -3163,23 +3800,25 @@ packages: - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - scipy !=1.9.2,>=1.8 + arch: x86_64 + platform: linux license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/statsmodels?source=hash-mapping size: 12103203 timestamp: 1727987129263 -- conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h4a8ded7_18.conda - sha256: 23c7ab371c1b74d01a187e05aa7240e3f5654599e364a9adff7f0b02e26f471f - md5: 0ea96f90a10838f58412aa84fdd9df09 +- conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.17-h0157908_18.conda + sha256: 69ab5804bdd2e8e493d5709eebff382a72fab3e9af6adf93a237ccf8f7dbd624 + md5: 460eba7851277ec1fd80a1a24080787a depends: - kernel-headers_linux-64 3.10.0 he073ed8_18 - tzdata license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later AND MPL-2.0 license_family: GPL purls: [] - size: 15500960 - timestamp: 1729794510631 + size: 15166921 + timestamp: 1735290488259 - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.13.0-hceb3a55_1.conda sha256: 65463732129899770d54b1fbf30e1bb82fdebda9d7553caf08d23db4590cd691 md5: ba7726b8df7b9d34ea80e82b097a4893 @@ -3188,11 +3827,26 @@ packages: - libgcc >=13 - libhwloc >=2.11.2,<2.11.3.0a0 - libstdcxx >=13 + arch: x86_64 + platform: linux license: Apache-2.0 license_family: APACHE purls: [] size: 175954 timestamp: 1732982638805 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-devel-2021.13.0-h1f99690_1.conda + sha256: a4f4d9c17057e047406f855a31093183cb4e30bda221506e024cf826e29f9399 + md5: 0200638907d55c2aadc1ca9d39566316 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - tbb 2021.13.0 hceb3a55_1 + arch: x86_64 + platform: linux + purls: [] + size: 1053549 + timestamp: 1732982652385 - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda sha256: 45e402941f6bed094022c5726a2ca494e6224b85180d2367fb6ddd9aea68079d md5: df68d78237980a159bd7149f33c0e8fd @@ -3210,6 +3864,8 @@ packages: depends: - libgcc-ng >=12 - libzlib >=1.2.13,<2.0.0a0 + arch: x86_64 + platform: linux license: TCL license_family: BSD purls: [] @@ -3245,28 +3901,25 @@ packages: - libgcc >=13 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux license: Apache-2.0 license_family: Apache purls: - pkg:pypi/tornado?source=hash-mapping size: 840414 timestamp: 1732616043734 -- pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl - name: tqdm - version: 4.67.1 - sha256: 26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2 - requires_dist: - - colorama ; platform_system == 'Windows' - - pytest>=6 ; extra == 'dev' - - pytest-cov ; extra == 'dev' - - pytest-timeout ; extra == 'dev' - - pytest-asyncio>=0.24 ; extra == 'dev' - - nbval ; extra == 'dev' - - requests ; extra == 'discord' - - slack-sdk ; extra == 'slack' - - requests ; extra == 'telegram' - - ipywidgets>=6 ; extra == 'notebook' - requires_python: '>=3.7' +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda + sha256: 11e2c85468ae9902d24a27137b6b39b4a78099806e551d390e394a8c34b48e40 + md5: 9efbfdc37242619130ea42b1cc4ed861 + depends: + - colorama + - python >=3.9 + license: MPL-2.0 or MIT + purls: + - pkg:pypi/tqdm?source=hash-mapping + size: 89498 + timestamp: 1735661472632 - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 md5: 019a7385be9af33791c989871317e1ed @@ -3300,41 +3953,56 @@ packages: - pkg:pypi/typing-extensions?source=hash-mapping size: 39637 timestamp: 1733188758212 -- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - sha256: 4fde5c3008bf5d2db82f2b50204464314cc3c91c1d953652f7bd01d9e52aefdf - md5: 8ac3367aafb1cc0a068483c580af8015 +- conda: https://conda.anaconda.org/conda-forge/linux-64/typst-0.11.0-he8a937b_0.conda + sha256: e0be4b66c486a15341d7309744ca94c51dbf0c3914c05cbf2bd796aac0c510c5 + md5: f6ac8c8ab4a4c9ed0ec710e3f5fa3954 + depends: + - libgcc-ng >=12 + - openssl >=3.2.1,<4.0a0 + arch: x86_64 + platform: linux + license: Apache-2.0 + license_family: Apache + purls: [] + size: 11632673 + timestamp: 1710532616618 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025a-h78e105d_0.conda + sha256: c4b1ae8a2931fe9b274c44af29c5475a85b37693999f8c792dad0f8c6734b1de + md5: dbcace4706afdfb7eb891f7b37d07c04 license: LicenseRef-Public-Domain purls: [] - size: 122354 - timestamp: 1728047496079 -- conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py312h66e93f0_1.conda - sha256: 1fcba6d363d901d9a06381e1aee2d5634f82389965dd7a339f19b3ae81ce6da0 - md5: 588486a61153f94c7c13816f7069e440 + size: 122921 + timestamp: 1737119101255 +- conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-16.0.0-py312h66e93f0_0.conda + sha256: 638916105a836973593547ba5cf4891d1f2cb82d1cf14354fcef93fd5b941cdc + md5: 617f5d608ff8c28ad546e5d9671cbb95 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/unicodedata2?source=hash-mapping - size: 368550 - timestamp: 1729704685856 -- pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl + - pkg:pypi/unicodedata2?source=compressed-mapping + size: 404401 + timestamp: 1736692621599 +- pypi: https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl name: urllib3 - version: 2.2.3 - sha256: ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac + version: 2.3.0 + sha256: 1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df requires_dist: - brotli>=1.0.9 ; platform_python_implementation == 'CPython' and extra == 'brotli' - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'brotli' - h2>=4,<5 ; extra == 'h2' - pysocks>=1.5.6,!=1.5.7,<2.0 ; extra == 'socks' - zstandard>=0.18.0 ; extra == 'zstd' - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/linux-64/viztracer-1.0.0-py312h3a80f7f_0.conda - sha256: a3d79c45b4d4adc4c061f399324a70ef89318690413f98bd5fcbfe170936cd37 - md5: e022a3d098ce2fac2df49ffc1ccd2240 + requires_python: '>=3.9' +- conda: https://conda.anaconda.org/conda-forge/linux-64/viztracer-1.0.2-py312h0f154a2_0.conda + sha256: bf1a01de77a6dfc882ae04773b9b457f52116d2fea6ac931328e0b2221319e5d + md5: 34b7b85b791656cd249e0ad0c1d7ccb2 depends: - __glibc >=2.17,<3.0.a0 - libgcc @@ -3343,12 +4011,36 @@ packages: - orjson - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/viztracer?source=hash-mapping - size: 11361364 - timestamp: 1732425850776 + size: 11356383 + timestamp: 1738891079447 +- pypi: https://files.pythonhosted.org/packages/39/3b/5b918a0da0d6920e7f7328cf0ab00df31b905d709f458596304f09096785/wadler_lindig-0.1.3-py3-none-any.whl + name: wadler-lindig + version: 0.1.3 + sha256: 3018e4e6b115a7ef21c77414a41cbe7e03e83f6b5e25004958e33432a17f3c94 + requires_dist: + - numpy ; extra == 'dev' + - pre-commit ; extra == 'dev' + - pytest ; extra == 'dev' + - jinja2==3.0.3 ; extra == 'docs' + - mkdocs-autorefs==1.0.1 ; extra == 'docs' + - mkdocs-include-exclude-files==0.0.1 ; extra == 'docs' + - mkdocs-material-extensions==1.3.1 ; extra == 'docs' + - mkdocs-material==7.3.6 ; extra == 'docs' + - mkdocs==1.3.0 ; extra == 'docs' + - mkdocstrings==0.17.0 ; extra == 'docs' + - mknotebooks==0.7.1 ; extra == 'docs' + - nbconvert==6.5.0 ; extra == 'docs' + - nbformat==5.4.0 ; extra == 'docs' + - pygments==2.14.0 ; extra == 'docs' + - pymdown-extensions==9.4 ; extra == 'docs' + - pytkdocs-tweaks==0.0.8 ; extra == 'docs' + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/c3/ac/1847959031ce09eb65a70b16d0f07633d7ddaf8a97752cc924f9a8cbe253/watermark-2.5.0-py2.py3-none-any.whl name: watermark version: 2.5.0 @@ -3359,6 +4051,22 @@ packages: - setuptools - py3nvml>=0.2 ; extra == 'gpu' requires_python: '>=3.7' +- conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.1-h3e06ad9_0.conda + sha256: 0884b2023a32d2620192cf2e2fc6784b8d1e31cf9f137e49e00802d4daf7d1c1 + md5: 0a732427643ae5e0486a727927791da1 + depends: + - __glibc >=2.17,<3.0.a0 + - libexpat >=2.6.2,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc-ng >=13 + - libstdcxx-ng >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 321561 + timestamp: 1724530461598 - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda sha256: f21e63e8f7346f9074fd00ca3b079bd3d2fa4d71f1f89d5b6934bf31446dc2a5 md5: b68980f2495d096e71c7fd9d7ccf63e6 @@ -3392,44 +4100,60 @@ packages: - pkg:pypi/widgetsnbextension?source=hash-mapping size: 898402 timestamp: 1733128654300 -- conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2024.11.0-pyhd8ed1ab_0.conda - sha256: 1312af7bc507afdcf24df1599d6aa062ceb252d4c086d5b8e5a022bf8051d980 - md5: 7358eeedbffd742549d372e0066999d3 +- conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.2-py312h66e93f0_0.conda + sha256: ed3a1700ecc5d38c7e7dc7d2802df1bc1da6ba3d6f6017448b8ded0affb4ae00 + md5: 669e63af87710f8d52fdec9d4d63b404 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + arch: x86_64 + platform: linux + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/wrapt?source=hash-mapping + size: 63590 + timestamp: 1736869574299 +- conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2025.1.2-pyhd8ed1ab_0.conda + sha256: 0f59c2718573770b01d849e05a56a7fe1461f55bf7525c4df5552079c5c03427 + md5: b8d9af89c48fa3359f05f3324809fcde depends: - numpy >=1.24 - packaging >=23.2 - pandas >=2.1 - python >=3.10 constrains: + - pint >=0.22 + - netcdf4 >=1.6.0 - cartopy >=0.22 + - iris >=3.7 - h5py >=3.8 - - h5netcdf >=1.3 + - nc-time-axis >=1.4 - sparse >=0.14 - - dask-core >=2023.11 - - cftime >=1.6 - bottleneck >=1.3 - - netcdf4 >=1.6.0 - - iris >=3.7 - - zarr >=2.16 - - seaborn-base >=0.13 - - distributed >=2023.11 - - matplotlib-base >=3.8 - - nc-time-axis >=1.4 - scipy >=1.11 + - numba >=0.57 - toolz >=0.12 + - h5netcdf >=1.3 + - distributed >=2023.11 + - dask-core >=2023.11 - flox >=0.7 - - numba >=0.57 - - pint >=0.22 + - seaborn-base >=0.13 + - zarr >=2.16 + - matplotlib-base >=3.8 + - cftime >=1.6 - hdf5 >=1.12 license: Apache-2.0 license_family: APACHE purls: - pkg:pypi/xarray?source=hash-mapping - size: 826310 - timestamp: 1732532972254 -- conda: https://conda.anaconda.org/conda-forge/noarch/xarray-einstats-0.8.0-pyhd8ed1ab_0.conda - sha256: 8cb41b361184ee06515829e729184716e252c6f661590898242e93c3e87dd415 - md5: 729ecac2a5d024cce0837c25cf28f695 + size: 837969 + timestamp: 1738313762187 +- conda: https://conda.anaconda.org/conda-forge/noarch/xarray-einstats-0.8.0-pyhd8ed1ab_1.conda + sha256: 8928c391750b3376bf579b5b24db306872618765ebfe17c3fafc3bf09977dab0 + md5: 469d83261349ad6f3829a9aeebeb8822 depends: - numpy >=1.23 - python >=3.10 @@ -3439,61 +4163,132 @@ packages: license_family: APACHE purls: - pkg:pypi/xarray-einstats?source=hash-mapping - size: 33815 - timestamp: 1726758642806 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hb9d3cd8_1.conda - sha256: ec276da68d1c4a3d34a63195b35ca5b248d4aff0812464dcd843d74649b5cec4 - md5: 19608a9656912805b2b9a2f6bd257b04 + size: 33933 + timestamp: 1734625062168 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.43-hb9d3cd8_0.conda + sha256: 0d89b5873515a1f05d311f37ea4e087bbccc0418afa38f2f6189e97280db3179 + md5: f725c7425d6d7c15e31f3b99a88ea02f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 389475 + timestamp: 1727840188958 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda + sha256: c12396aabb21244c212e488bbdc4abcdef0b7404b15761d9329f5a4a39113c4b + md5: fb901ff28063514abb6046c9ec2c4a45 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] - size: 58159 - timestamp: 1727531850109 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-he73a12e_1.conda - sha256: 70e903370977d44c9120a5641ab563887bd48446e9ef6fc2a3f5f60531c2cd6c - md5: 05a8ea5f446de33006171a7afe6ae857 + size: 58628 + timestamp: 1734227592886 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.5-he73a12e_0.conda + sha256: 760f43df6c2ce8cbbbcb8f2f3b7fc0f306716c011e28d1d340f3dfa8ccf29185 + md5: 4c3e9fab69804ec6077697922d70c6e2 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libuuid >=2.38.1,<3.0a0 - - xorg-libice >=1.1.1,<2.0a0 + - xorg-libice >=1.1.2,<2.0a0 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] - size: 27516 - timestamp: 1727634669421 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.10-h4f16b4b_1.conda - sha256: f53994d54f0604df881c4e984279b3cf6a1648a22d4b2113e2c89829968784c9 - md5: 125f34a17d7b4bea418a83904ea82ea6 + size: 27198 + timestamp: 1734229639785 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.11-h4f16b4b_0.conda + sha256: a0e7fca9e341dc2455b20cd320fc1655e011f7f5f28367ecf8617cccd4bb2821 + md5: b6eb6d0cb323179af168df8fe16fb0a1 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libxcb >=1.17.0,<2.0a0 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] - size: 837524 - timestamp: 1733324962639 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hb9d3cd8_1.conda - sha256: 532a046fee0b3a402db867b6ec55c84ba4cdedb91d817147c8feeae9766be3d6 - md5: 77cbc488235ebbaab2b6e912d3934bae + size: 835157 + timestamp: 1738613163812 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + sha256: ed10c9283974d311855ae08a16dfd7e56241fac632aec3b92e3cfe73cff31038 + md5: f6ebe2cb3f82ba6c057dde5d9debe4f7 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 14780 + timestamp: 1734229004433 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.6-hb9d3cd8_2.conda + sha256: 753f73e990c33366a91fd42cc17a3d19bb9444b9ca5ff983605fa9e953baf57f + md5: d3c295b50f092ab525ffe3c2aa4b7413 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 13603 + timestamp: 1727884600744 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda + sha256: 832f538ade441b1eee863c8c91af9e69b356cd3e9e1350fff4fe36cc573fc91a + md5: 2ccd714aa2242315acaf0a67faea780b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + - xorg-libxrender >=0.9.11,<0.10.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 32533 + timestamp: 1730908305254 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda + sha256: 43b9772fd6582bf401846642c4635c47a9b0e36ca08116b3ec3df36ab96e0ec0 + md5: b5fcc7172d22516e1f965490e65e33a4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] - size: 14679 - timestamp: 1727034741045 + size: 13217 + timestamp: 1727891438799 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda sha256: 6b250f3e59db07c2514057944a3ea2044d6a8cdde8a47b6497c254520fade1ee md5: 8035c64cb77ed555e3f150b7b3972480 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] @@ -3506,42 +4301,136 @@ packages: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - xorg-libx11 >=1.8.10,<2.0a0 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] size: 50060 timestamp: 1727752228921 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hb9d3cd8_2.conda - sha256: a2f533fe2374789413a9dfa1369322573910f4b010fd24386cdd1c5cd977a087 - md5: eef3132295d92678c17ffc8b114b8371 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda + sha256: 2fef37e660985794617716eb915865ce157004a4d567ed35ec16514960ae9271 + md5: 4bdb303603e9821baf5fe5fdff1dc8f8 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - xorg-libx11 >=1.8.10,<2.0a0 + arch: x86_64 + platform: linux license: MIT license_family: MIT purls: [] - size: 37638 - timestamp: 1733755897245 -- conda: https://conda.anaconda.org/conda-forge/noarch/zarr-2.18.3-pyhd8ed1ab_1.conda - sha256: 02c045d3ab97bd5a713b0f35b05f017603d33bd728694ce3cf843c45c2906535 - md5: 3e9a0fee25417c432c4780b9597fc312 + size: 19575 + timestamp: 1727794961233 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda + sha256: 1a724b47d98d7880f26da40e45f01728e7638e6ec69f35a3e11f92acd05f9e7a + md5: 17dcc85db3c7886650b8908b183d6876 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 47179 + timestamp: 1727799254088 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxinerama-1.1.5-h5888daf_1.conda + sha256: 1b9141c027f9d84a9ee5eb642a0c19457c788182a5a73c5a9083860ac5c20a8c + md5: 5e2eb9bf77394fc2e5918beefec9f9ab + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 13891 + timestamp: 1727908521531 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda + sha256: ac0f037e0791a620a69980914a77cb6bb40308e26db11698029d6708f5aa8e0d + md5: 2de7f99d6581a4a7adbff607b5c278ca + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxrender >=0.9.11,<0.10.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 29599 + timestamp: 1727794874300 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda + sha256: 044c7b3153c224c6cedd4484dd91b389d2d7fd9c776ad0f4a34f099b3389f4a1 + md5: 96d57aba173e878a2089d5638016dc5e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 33005 + timestamp: 1734229037766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda + sha256: 752fdaac5d58ed863bbf685bb6f98092fe1a488ea8ebb7ed7b606ccfce08637a + md5: 7bbe9a0cc0df0ac5f5a8ad6d6a11af2f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxi >=1.7.10,<2.0a0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 32808 + timestamp: 1727964811275 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + sha256: a4e34c710eeb26945bdbdaba82d3d74f60a78f54a874ec10d373811a5d217535 + md5: 4cb3ad778ec2d5a7acbdf254eb1c42ae + depends: + - libgcc-ng >=9.4.0 + arch: x86_64 + platform: linux + license: MIT + license_family: MIT + purls: [] + size: 89141 + timestamp: 1641346969816 +- conda: https://conda.anaconda.org/conda-forge/noarch/zarr-2.18.4-pyhd8ed1ab_0.conda + sha256: a189f686ad211bd20dd303df9f446bdb03b13387be86c4281e66a7830e4f04ff + md5: 82725d5fde7cc349b62e5f0ff47f9319 depends: - asciitree - fasteners - - numcodecs >=0.10.0 - - numpy >=1.24,<3.0 - - python >=3.10 + - numcodecs >=0.10.0,!=0.14.0,!=0.14.1 + - numpy >=1.24 + - python >=3.11 constrains: - - notebook - ipytree >=0.2.2 + - notebook - ipywidgets >=8.0.0 license: MIT license_family: MIT purls: - pkg:pypi/zarr?source=hash-mapping - size: 160013 - timestamp: 1733237313723 + size: 160435 + timestamp: 1734108625474 - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h3b0a872_7.conda sha256: a4dc72c96848f764bb5a5176aa93dd1e9b9e52804137b99daeebba277b31ea10 md5: 3947a35e916fcc6b9825449affbf4214 @@ -3551,6 +4440,8 @@ packages: - libgcc >=13 - libsodium >=1.0.20,<1.0.21.0a0 - libstdcxx >=13 + arch: x86_64 + platform: linux license: MPL-2.0 license_family: MOZILLA purls: [] @@ -3567,15 +4458,17 @@ packages: - pkg:pypi/zipp?source=hash-mapping size: 21809 timestamp: 1732827613585 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda - sha256: c558b9cc01d9c1444031bd1ce4b9cff86f9085765f17627a6cd85fc623c8a02b - md5: 4d056880988120e29d75bfff282e0f45 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_0.conda + sha256: b8f7b4c7264e84fcedce3929239f5c55e86ae90948c9fdee666f93a70ca58e66 + md5: 3fe5420e4da42d8110c28f21de6cc127 depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - libzlib >=1.2.13,<2.0.0a0 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + arch: x86_64 + platform: linux license: BSD-3-Clause - license_family: BSD purls: [] - size: 554846 - timestamp: 1714722996770 + size: 564076 + timestamp: 1740024448267 diff --git a/pixi.toml b/pixi.toml index 3c907c4..a330bb3 100644 --- a/pixi.toml +++ b/pixi.toml @@ -37,15 +37,16 @@ nbclient = ">=0.10.2,<0.11" cmdstanpy = ">=1.2.5,<2" # The jaxlib cuda build seems to be broken around version 0.4.34 #jax = ">=0.4.35,<0.5" -#jaxlib = { version = "*", build = "*cuda12*" } [pypi-dependencies] bridgestan = ">=2.6.0, <3" flowjax = { git = "https://github.com/aseyboldt/flowjax.git", rev = "07e7e32217bcfcaa7d68a304f332c925d26ab76f" } samplerlab = { git = "https://github.com/aseyboldt/samplerlab/" } posteriordb = ">=0.2.0, <0.3" -jax = { version = "<0.4.37, <0.5", extras = ["cuda12"] } +#jax = { version = ">=0.5" } watermark = ">=2.5.0, <3" +equinox = "*" +jaxlib = { version = "*", extras = ["cuda12"] } [system-requirements] #cuda = "12" diff --git a/pyproject.toml b/pyproject.toml index 5703ca3..bd9292f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,6 @@ build-backend = "maturin" [project] name = "nutpie" description = "Sample Stan or PyMC models" -version = "0.14.0" authors = [{ name = "PyMC Developers", email = "pymc.devs@gmail.com" }] readme = "README.md" requires-python = ">=3.10,<3.14" diff --git a/python/nutpie/normalizing_flow.py b/python/nutpie/normalizing_flow.py index 3bdd524..07b87a9 100644 --- a/python/nutpie/normalizing_flow.py +++ b/python/nutpie/normalizing_flow.py @@ -519,15 +519,19 @@ def make_coupling(key, dim, n_untransformed, **kwargs): ) def make_mlp(out_size): - if isinstance(nn_width, tuple): - out = (nn_width[0], out_size) + if isinstance(nn_width, int): + width = [nn_width] + else: + width = nn_width + if isinstance(width[0], tuple): + out = (width[0][0], out_size) else: out = out_size return FactoredMLP( n_untransformed, out, - nn_width, + width, depth=1, key=key, dtype=jnp.float32, diff --git a/python/nutpie/transform_adapter.py b/python/nutpie/transform_adapter.py index 02eef36..64b8a6a 100644 --- a/python/nutpie/transform_adapter.py +++ b/python/nutpie/transform_adapter.py @@ -1,4 +1,5 @@ from functools import partial +import math import numpy as np import equinox as eqx @@ -345,6 +346,11 @@ def update(self, seed, positions, gradients, logps): ) params, static = eqx.partition(flow, eqx.is_inexact_array) if self._verbose: + print( + "number of parameters in flow:", + sum([math.prod(val.shape) for val in jax.tree.leaves(params)]), + ) + print( "loss before optimization: ", self._loss_fn( @@ -615,6 +621,7 @@ def make_transform_adapter( make_flow, householder_layer=householder_layer, dct_layer=dct_layer, + nn_width=nn_width, ), show_progress=show_progress, num_diag_windows=num_diag_windows, From 5dcda60f3c21e6cf2bd4127634a1ad6abfc5f6e4 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Thu, 20 Feb 2025 17:38:08 +0100 Subject: [PATCH 54/55] Disable mvscale in coupling --- python/nutpie/normalizing_flow.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/nutpie/normalizing_flow.py b/python/nutpie/normalizing_flow.py index 07b87a9..631af8b 100644 --- a/python/nutpie/normalizing_flow.py +++ b/python/nutpie/normalizing_flow.py @@ -514,7 +514,7 @@ def make_coupling(key, dim, n_untransformed, **kwargs): transformer = bijections.Chain( [ make_elemwise_trafo(key, n_transformed, count=3), - mvscale, + #mvscale, ] ) From 5b6ec5de597f20325ea9e834e5b47c5b2e924845 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Thu, 20 Feb 2025 17:38:41 +0100 Subject: [PATCH 55/55] Don't wrap bijections in Transformed --- python/nutpie/transform_adapter.py | 44 ++++++++++-------------------- 1 file changed, 14 insertions(+), 30 deletions(-) diff --git a/python/nutpie/transform_adapter.py b/python/nutpie/transform_adapter.py index 64b8a6a..9a05054 100644 --- a/python/nutpie/transform_adapter.py +++ b/python/nutpie/transform_adapter.py @@ -54,7 +54,7 @@ def compute_loss(bijection, draw, grad, logp): return cost costs = jax.vmap(compute_loss, [None, 0, 0, 0])( - flow.bijection, + flow, draws, grads, logps, @@ -69,7 +69,7 @@ def compute_loss(bijection, draw, grad, logp): return cost costs = jax.vmap(compute_loss, [None, 0, 0, 0])( - flow.bijection, + flow, draws, grads, logps, @@ -86,7 +86,7 @@ def compute_loss(bijection, draw, grad, logp): else: def transform(draw, grad, logp): - return flow.bijection.inverse_gradient_and_val_(draw, grad, logp) + return flow.inverse_gradient_and_val_(draw, grad, logp) draws, grads, logps = jax.vmap(transform, [0, 0, 0], (0, 0, 0))( draws, grads, logps @@ -98,9 +98,7 @@ def transform(draw, grad, logp): def fit_flow(key, bijection, loss_fn, draws, grads, logps, **kwargs): - flow = flowjax.flows.Transformed( - flowjax.distributions.StandardNormal(bijection.shape), bijection - ) + flow = bijection key, train_key = jax.random.split(key) @@ -113,7 +111,7 @@ def fit_flow(key, bijection, loss_fn, draws, grads, logps, **kwargs): return_best=True, **kwargs, ) - return fit.bijection, losses, losses["opt_state"] + return fit, losses, losses["opt_state"] @eqx.filter_jit @@ -298,9 +296,7 @@ def update(self, seed, positions, gradients, logps): fit = self._make_flow_fn(seed, positions, gradients, n_layers=0) - flow = flowjax.flows.Transformed( - flowjax.distributions.StandardNormal(fit.shape), fit - ) + flow = fit params, static = eqx.partition(flow, eqx.is_inexact_array) new_loss = self._loss_fn(params, static, positions, gradients, logps) @@ -341,9 +337,7 @@ def update(self, seed, positions, gradients, logps): untransformed_dim=self._untransformed_dim, zero_init=self._zero_init, ) - flow = flowjax.flows.Transformed( - flowjax.distributions.StandardNormal(base.shape), base - ) + flow = base params, static = eqx.partition(flow, eqx.is_inexact_array) if self._verbose: print( @@ -356,9 +350,9 @@ def update(self, seed, positions, gradients, logps): self._loss_fn( params, static, - positions[-100:], - gradients[-100:], - logps[-100:], + positions[-128:], + gradients[-128:], + logps[-128:], ), ) else: @@ -392,10 +386,7 @@ def update(self, seed, positions, gradients, logps): self._opt_state = None return - flow = flowjax.flows.Transformed( - flowjax.distributions.StandardNormal(self._bijection.shape), - self._bijection, - ) + flow = self._bijection params, static = eqx.partition(flow, eqx.is_inexact_array) old_loss = self._loss_fn( params, static, positions[-128:], gradients[-128:], logps[-128:] @@ -420,9 +411,7 @@ def update(self, seed, positions, gradients, logps): max_patience=self._max_patience, ) - flow = flowjax.flows.Transformed( - flowjax.distributions.StandardNormal(fit.shape), fit - ) + flow = fit params, static = eqx.partition(flow, eqx.is_inexact_array) new_loss = self._loss_fn( params, static, positions[-128:], gradients[-128:], logps[-128:] @@ -432,10 +421,7 @@ def update(self, seed, positions, gradients, logps): print(f"Chain {self._chain}: New loss {new_loss}, old loss {old_loss}") if not np.isfinite(old_loss): - flow = flowjax.flows.Transformed( - flowjax.distributions.StandardNormal(self._bijection.shape), - self._bijection, - ) + flow = self._bijection params, static = eqx.partition(flow, eqx.is_inexact_array) print( self._loss_fn( @@ -449,9 +435,7 @@ def update(self, seed, positions, gradients, logps): ) if not np.isfinite(new_loss): - flow = flowjax.flows.Transformed( - flowjax.distributions.StandardNormal(fit.shape), fit - ) + flow = fit params, static = eqx.partition(flow, eqx.is_inexact_array) print( self._loss_fn(