From 835febd757f9b55d00e5253f0fa081e2643482f9 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Thu, 17 Oct 2024 11:38:19 +0200 Subject: [PATCH 01/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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/64] 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 9a4f794a902eda27bc2fa8331a2a5ac3180dc466 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Mon, 3 Mar 2025 12:44:38 +0100 Subject: [PATCH 53/64] Improve docs --- docs/_quarto.yml | 3 + docs/index.qmd | 8 +- docs/sample-stats.qmd | 221 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 231 insertions(+), 1 deletion(-) diff --git a/docs/_quarto.yml b/docs/_quarto.yml index d443541..8781265 100644 --- a/docs/_quarto.yml +++ b/docs/_quarto.yml @@ -18,6 +18,9 @@ website: - href: sample-stats.qmd text: Diagnostic information - about.qmd + tools: + - icon: github + href: https://github.com/pymc-devs/nutpie format: html: diff --git a/docs/index.qmd b/docs/index.qmd index 752d937..6de4796 100644 --- a/docs/index.qmd +++ b/docs/index.qmd @@ -14,7 +14,7 @@ likelihoods with gradient are coming soon). - *Experimental* normalizing flow adaptation for more efficient sampling of difficult posteriors. -## Quickstart +## Quickstart: PyMC Install `nutpie` with pip, uv, pixi, or conda: @@ -42,6 +42,10 @@ compiled = nutpie.compile_pymc_model(model) trace = nutpie.sample(compiled) ``` +For more information, see the detailed [PyMC usage guide](pymc-usage.qmd). + +## Quickstart: Stan + 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: @@ -82,3 +86,5 @@ compiled = ( ) trace = nutpie.sample(compiled) ``` + +For more information, see the detailed [Stan usage guide](stan-usage.qmd). diff --git a/docs/sample-stats.qmd b/docs/sample-stats.qmd index e69de29..7cf92c9 100644 --- a/docs/sample-stats.qmd +++ b/docs/sample-stats.qmd @@ -0,0 +1,221 @@ +# Understanding Sampler Statistics in Nutpie + +This guide explains the various statistics that nutpie collects during sampling. We'll use Neal's funnel distribution as an example, as it's a challenging model that demonstrates many important sampling concepts. + +## Example Model: Neal's Funnel + +Let's start by implementing Neal's funnel in PyMC: + +```{python} +import pymc as pm +import nutpie +import numpy as np +import matplotlib.pyplot as plt +import seaborn as sns +import pandas as pd +import arviz as az + +# Create the funnel model +with pm.Model() as model: + log_sigma = pm.Normal('log_sigma') + pm.Normal('x', sigma=pm.math.exp(log_sigma), shape=5) + +# Sample with detailed statistics +compiled = nutpie.compile_pymc_model(model) +trace = nutpie.sample( + compiled, + tune=1000, + store_mass_matrix=True, + store_gradient=True, + store_unconstrained=True, + store_divergences=True, + seed=42, +) +``` + +## Sampler Statistics Overview + +The sampler statistics can be grouped into several categories: + +### Basic HMC Statistics + +These statistics are always collected and are essential for basic diagnostics: + +```{python} +# Access through trace.sample_stats +basic_stats = [ + 'depth', # Tree depth for current draw + 'maxdepth_reached', # Whether max tree depth was hit + 'logp', # Log probability of current position + 'energy', # Hamiltonian energy + 'diverging', # Whether the transition diverged + 'step_size', # Current step size + 'step_size_bar', # Current estimate of an ideal step size + 'n_steps' # Number of leapfrog steps + +] + +# Plot step size evolution during warmup +trace.warmup_sample_stats.step_size_bar.plot.line(x="draw", yscale="log") +``` + +### Mass Matrix Adaptation + +These statistics track how the mass matrix evolves: + +```{python} +( + trace + .warmup_sample_stats + .mass_matrix_inv + .plot + .line( + x="draw", + yscale="log", + col="chain", + col_wrap=2, + ) +) +``` + +Variables that are a source of convergence issues, will often show high variance +in the final mass matrix estimate across chains. + +The mass matrix will always be fixed for 10% of draws at the end, because we +only run final step size adaptation during that time, but high variance in the +mass matrix before this final window and indicate that more tuning steps might +be needed. + +### Detailed Diagnostics + +These are only available when explicitly requested: + +```python +detailed_stats = [ + 'gradient', # Gradient at current position + 'unconstrained_draw', # Parameters in unconstrained space + 'divergence_start', # Position where divergence started + 'divergence_end', # Position where divergence ended + 'divergence_momentum', # Momentum at divergence + 'divergence_message' # Description of divergence +] +``` + +#### Idintify Divergences + +We can for instance use this to identify the sources of divergences: + +```{python} +import xarray as xr + +draws = ( + trace + .sample_stats + .unconstrained_draw + .assign_coords(kind="draw") +) +divergence_locations = ( + trace + .sample_stats + .divergence_start + .assign_coords(kind="divergence") +) + +points = xr.concat([draws, divergence_locations], dim="kind") +points.to_dataset("unconstrained_parameter").plot.scatter(x="log_sigma", y="x_0", hue="kind") +``` + +#### Covariance of gradients and draws + +TODO this section should really use the transformed gradients and draws, not the +unconstrained ones, as that avoids the manual mass matrix correction. This +is only available for the normalizing flow adaptation at the moment though. + +In models with problematic posterior correlations, the singular value +decomposition of gradients and draws can often point us to the source of the +issue. + +Let's build a little model with correlations between parameters: + +```{python} +with pm.Model() as model: + x = pm.Normal('x') + y = pm.Normal("y", mu=x, sigma=0.01) + z = pm.Normal("z", mu=y, shape=100) + +compiled = nutpie.compile_pymc_model(model) +trace = nutpie.sample( + compiled, + tune=1000, + store_gradient=True, + store_unconstrained=True, + store_mass_matrix=True, + seed=42, +) +``` + +Now we can compute eigenvalues of the covariance matrix of the gradient and +draws (using the singular value decomposition to avoid quadratic cost): + +```{python} +def covariance_eigenvalues(x, mass_matrix): + assert x.dims == ("chain", "draw", "unconstrained_parameter") + x = x.stack(sample=["draw", "chain"]) + x = (x - x.mean("sample")) / np.sqrt(mass_matrix) + u, s, v = np.linalg.svd(x.T / np.sqrt(x.shape[1]), full_matrices=False) + print(u.shape, s.shape, v.shape) + s = xr.DataArray( + s, + dims=["eigenvalue"], + coords={"eigenvalue": range(s.size)}, + ) + v = xr.DataArray( + v, + dims=["eigenvalue", "unconstrained_parameter"], + coords={ + "eigenvalue": s.eigenvalue, + "unconstrained_parameter": x.unconstrained_parameter, + }, + ) + return s ** 2, v + +mass_matrix = trace.sample_stats.mass_matrix_inv.isel(draw=-1, chain=0) +draws_eigs, draws_eigv = covariance_eigenvalues(trace.sample_stats.unconstrained_draw, mass_matrix) +grads_eigs, grads_eigv = covariance_eigenvalues(trace.sample_stats.gradient, 1 / mass_matrix) + +draws_eigs.plot.line(x="eigenvalue", yscale="log") +grads_eigs.plot.line(x="eigenvalue", yscale="log") +``` + +We can see one very large and one very small eigenvalue in both covariances. +Large eigenvalues for the draws, and small eigenvalues for the gradients prevent +the sampler from taking larger steps. Small eigenvalues in the draws, and large +eigenvalues in the grads mean, that the sampler has to move far in parameter +space to get independent draws. So both lead to problems during sampling. For +models with many parameters, typically only the large eigenvalues of each are +meaningful, because of estimation issues with the small eigenvalues. + +We can also look at the eigenvectors to see which parameters are responsible for +the correlations: + +```{python} +( + draws_eigv + .sel(eigenvalue=0) + .to_pandas() + .sort_values(key=abs) + .tail(10) + .plot.bar(x="unconstrained_parameter") +) +``` + +```{python} +( + grads_eigv + .sel(eigenvalue=0) + .to_pandas() + .sort_values(key=abs) + .tail(10) + .plot.bar(x="unconstrained_parameter") +) +``` From ee74093c55832d21c508cd0bff0eab7e2a0347e7 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Mon, 3 Mar 2025 12:45:41 +0100 Subject: [PATCH 54/64] Fix nn_depth in normalizing flow --- python/nutpie/normalizing_flow.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/python/nutpie/normalizing_flow.py b/python/nutpie/normalizing_flow.py index 3bdd524..e64de80 100644 --- a/python/nutpie/normalizing_flow.py +++ b/python/nutpie/normalizing_flow.py @@ -504,6 +504,7 @@ def make_coupling(key, dim, n_untransformed, **kwargs): mvscale = make_mvscale(key, n_transformed, 1, randomize_base=True) nn_width = kwargs.get("nn_width", None) + nn_depth = kwargs.get("nn_depth", None) if nn_width is None: if dim > 128: @@ -511,6 +512,9 @@ def make_coupling(key, dim, n_untransformed, **kwargs): else: nn_width = 2 * dim + if nn_depth is None: + nn_depth = len(nn_width) + transformer = bijections.Chain( [ make_elemwise_trafo(key, n_transformed, count=3), @@ -528,7 +532,7 @@ def make_mlp(out_size): n_untransformed, out, nn_width, - depth=1, + depth=nn_depth, key=key, dtype=jnp.float32, activation=jax.nn.gelu, @@ -540,7 +544,6 @@ def make_mlp(out_size): untransformed_dim=n_untransformed, dim=dim, conditioner=make_mlp, - nn_depth=1, **kwargs, ) @@ -556,6 +559,7 @@ def make_flow( untransformed_dim: int | list[int | None] | None = None, n_layers, nn_width=None, + nn_depth=None, ): from flowjax import bijections @@ -620,6 +624,7 @@ def make_layer(key, untransformed_dim: int | None, permutation=None): untransformed_dim, nn_activation=jax.nn.gelu, nn_width=nn_width, + nn_depth=nn_depth, ) if zero_init: From d4581cff066706369a4ff68f8f272b514eff9fb7 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Mon, 3 Mar 2025 12:47:29 +0100 Subject: [PATCH 55/64] Add sampling options to docs --- .gitignore | 2 + docs/sampling-options.qmd | 150 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 152 insertions(+) create mode 100644 docs/sampling-options.qmd diff --git a/.gitignore b/.gitignore index 088a555..bffa4f4 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,5 @@ docs/_site .quarto example-iree posteriordb +.quarto +docs/.quarto diff --git a/docs/sampling-options.qmd b/docs/sampling-options.qmd new file mode 100644 index 0000000..b620431 --- /dev/null +++ b/docs/sampling-options.qmd @@ -0,0 +1,150 @@ +# Sampling Configuration Guide + +This guide covers the configuration options for `nutpie.sample` and provides +practical advice for tuning your sampler. We'll start with basic usage and move +to advanced topics like mass matrix adaptation. + +## Quick Start + +For most models, don't think too much about the options of the sampler, and just +use the defaults. Most sampling problems can't easily be solved by changing the +sampler, most of the time they require model changes. So in most cases, simply use + +```python +trace = nutpie.sample(compiled_model) +``` + +## Core Sampling Parameters + +### Drawing Samples + +```python +trace = nutpie.sample( + model, + draws=1000, # Number of post-warmup draws per chain + tune=500, # Number of warmup draws for adaptation + chains=6, # Number of independent chains + cores=None, # Number chains that are allowed to run simultainiously + seed=12345 # Random seed for reproducibility +) +``` + +The number of draws affects both accuracy and computational cost: +- Too few draws (< 500) may not capture the posterior well +- Too many draws (> 10000) may waste computation time + +If a model is sampling without divergences, but with effective sample sizes that +are not as large as necessary to accieve the markov-error for your estimates, +you can increase the number of chains and/or draws. + +If the effective sample size is much smaller than the number of draws, you might +want to consider reparameterizing the model instead, to for instance remove +posterior correlations. + +## Sampler Diagnostics + +You can enable more detailed diagnostics when troubleshooting: + +```python +trace = nutpie.sample( + model, + save_warmup=True, # Keep warmup draws, default is True + store_divergences=True, # Track divergent transitions + store_unconstrained=True, # Store transformed parameters + store_gradient=True, # Store gradient information + store_mass_matrix=True # Track mass matrix adaptation +) +``` + +For each of the `store_*` arguments, additional arrays will be availbale in the +`trace.sample_stats`. + +## Non-blocking sampling + + + +### Settings for HMC and NUTS + +```python +trace = nutpie.sample( + model, + target_accept=0.8, # Target acceptance rate + maxdepth=10 # Maximum tree depth +) +``` + +The `target_accept` parameter implicitly controls the step size of the leapfrog +steps in the HMC sampler. During tuning, the sampler will try to choose a step +size, such that the acceptance statistic is `target_accept`. It has to be +between 0 and 1. + +The default is 0.8. Larger values will increase the computational cost, but +might avoid divergences during sampling. In many diverging models increasing +`target_accept` will only make divergences less frequent however, and not solve +the underlying problem. + +## Mass Matrix Adaptation + +Nutpie offers several strategies for adapting the mass matrix, which determines +how the sampler navigates the parameter space. + +### Standard Adaptation + +By setting `use_grad_based_mass_matrix=False`, the sampling algorithm will more +closely resemble the algorithm in Stan and PyMC. Usually, this will result in +less efficient sampling, but the total number of effective samples is sometimes +higher. If this is set to `True` (the default), nutpie will use diagonal mass +matrix estimates that are based on the posterior draws and the scores at those +positions. + +```python +trace = nutpie.sample( + model, + use_grad_based_mass_matrix=False +) +``` + +### Low-Rank Updates + +For models with strong parameter correlations you can enable a low rank modified +mass matrix. The `mass_matrix_gamma` parameter is a regularization parameter. +More regularization will lead to a smaller effect of the low-rank components, +but might work better for hiegher dimensional problems. + +`mass_matrix_eigval_cutoff` should be greater than one, and controls how large +an eigenvalue of the full mass matrix has to be, to be included into the +low-rank mass matirx. + +```python +trace = nutpie.sample( + model, + low_rank_modified_mass_matrix=True, + mass_matrix_eigval_cutoff=3, + mass_matrix_gamma=1e-5 +) +``` + +### Experimental Features + +`trasform_adapt` is an experimental feature that allows sampling from many +posteriors, where current methods diverge. It is described in more detail +[here](nf-adapt.qmd). + +```python +trace = nutpie.sample( + model, + transform_adapt=True # Experimental reparameterization +) +``` + +## Progress Monitoring + +Customize the sampling progress display: + +```python +trace = nutpie.sample( + model, + progress_bar=True, + progress_rate=500, # Update every 500ms +) +``` From 943e5fc7a6599fac39951eb10bfda84b001b1921 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Mon, 3 Mar 2025 12:50:48 +0100 Subject: [PATCH 56/64] Remove equinox linear workaround --- python/nutpie/normalizing_flow.py | 97 +------------------------------ 1 file changed, 1 insertion(+), 96 deletions(-) diff --git a/python/nutpie/normalizing_flow.py b/python/nutpie/normalizing_flow.py index e64de80..20b955b 100644 --- a/python/nutpie/normalizing_flow.py +++ b/python/nutpie/normalizing_flow.py @@ -10,6 +10,7 @@ import flowjax.flows import numpy as np from paramax import Parameterize +from equinox.nn import Linear def _generate_sequences(k, r_vals): @@ -115,102 +116,6 @@ def _generate_permutations(rng, n_dim, n_layers, max_run=3): 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 = 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. From 5674d16909cdb498784ee1978e4b915c9d66ec07 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Tue, 4 Mar 2025 13:51:23 +0100 Subject: [PATCH 57/64] Mention energy error in docs --- docs/sampling-options.qmd | 10 +- pixi.lock | 3581 ------------------------------------- 2 files changed, 8 insertions(+), 3583 deletions(-) delete mode 100644 pixi.lock diff --git a/docs/sampling-options.qmd b/docs/sampling-options.qmd index b620431..270fe69 100644 --- a/docs/sampling-options.qmd +++ b/docs/sampling-options.qmd @@ -68,8 +68,9 @@ For each of the `store_*` arguments, additional arrays will be availbale in the ```python trace = nutpie.sample( model, - target_accept=0.8, # Target acceptance rate - maxdepth=10 # Maximum tree depth + target_accept=0.8, # Target acceptance rate + maxdepth=10 # Maximum tree depth + max_energy_error=1000 # Error at witch to count the trajectory as a divergent transition ) ``` @@ -83,6 +84,11 @@ might avoid divergences during sampling. In many diverging models increasing `target_accept` will only make divergences less frequent however, and not solve the underlying problem. +Lowering the maximum energy error to for instance 10 will often increase the +number of divergences, and make it easier to diagnose their cause. With lower +value the divergences often are reported closer to the critical points in the +parameter space, where the model is most likely to diverge. + ## Mass Matrix Adaptation Nutpie offers several strategies for adapting the mass matrix, which determines diff --git a/pixi.lock b/pixi.lock deleted file mode 100644 index 7230225..0000000 --- a/pixi.lock +++ /dev/null @@ -1,3581 +0,0 @@ -version: 6 -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/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/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-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_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_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_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_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/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.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_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 - - 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_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/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/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/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 - - 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/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.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 - - 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/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.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 - - 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/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/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/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-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.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_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 - - 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_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/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/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/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/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-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_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-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.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/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_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_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_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/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 - - 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/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: 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 - license: None - purls: [] - size: 2562 - timestamp: 1578324546067 -- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2 - build_number: 2 - 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 -- 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 - 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 - 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 -- conda: 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 -- conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda - sha256: 93b14414b3b3ed91e286e1cbe4e7a60c4e1b1c730b0814d1e452a8ac4b9af593 - md5: 8f587de4bcf981e26228f268df374a9b - depends: - - python >=3.9 - constrains: - - astroid >=2,<4 - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/asttokens?source=hash-mapping - 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: - - 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 -- 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 - license: GPL-3.0-only - license_family: GPL - purls: [] - size: 5682777 - timestamp: 1729655371045 -- 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 - 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 - 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 - 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 -- pypi: https://files.pythonhosted.org/packages/8c/ce/b9a154415fe7f51a481bece2bd998c679ce0ef93833ad4e7c87c60f0e461/bridgestan-2.6.1-py3-none-any.whl - name: bridgestan - version: 2.6.1 - sha256: 142ea79542db6022e8d85b8d5eaed7817f0429ad0156dbef7e147c72e72bcd98 - requires_dist: - - numpy - - dllist - - pandas ; extra == 'test' - - pytest ; extra == 'test' - - pytest-cov ; extra == 'test' - requires_python: '>=3.9' -- conda: 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 -- conda: 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 -- 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 - 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 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - 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 - license: ISC - purls: [] - size: 159003 - timestamp: 1725018903918 -- conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - noarch: python - 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 -- conda: 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 -- conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-5.5.0-pyhd8ed1ab_1.conda - sha256: d67d8683b34d7074bf99683aa1d71b2e42cee44da70ccd02a2863fb2c3df005b - md5: 0a99af03ccbd19113c1de1c7f16a53d2 - depends: - - python >=3.9 - license: MIT - license_family: MIT - purls: - - pkg:pypi/cachetools?source=hash-mapping - 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.15.0,<3.0a0 - - fonts-conda-ecosystem - - freetype >=2.12.1,<3.0a0 - - icu >=75.1,<76.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.44.2,<1.0a0 - - xorg-libice >=1.1.1,<2.0a0 - - xorg-libsm >=1.2.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 - 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 - name: charset-normalizer - version: 3.4.0 - sha256: 8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15 - requires_python: '>=3.7.0' -- pypi: https://files.pythonhosted.org/packages/58/a0/e4bebe76bdd0a68077030f1b5e48b545597473ae1b773c84150311152efc/chex-0.1.88-py3-none-any.whl - name: chex - 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 - - 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 - depends: - - python >=3.8 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/cloudpickle?source=hash-mapping - size: 25952 - timestamp: 1729059365471 -- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 - md5: 962b9857ee8e7018c22f2776ffa0b2d7 - depends: - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/colorama?source=hash-mapping - 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.9 - - traitlets >=5.3 - license: BSD-3-Clause - license_family: BSD - purls: - - 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 - 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 -- conda: 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 -- conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda - sha256: 9827efa891e507a91a8a2acf64e210d2aff394e1cde432ad08e1f8c66b12293c - md5: 44600c4667a319d67dbe0681fc0bc833 - depends: - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - purls: - - 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 - 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: 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.9 - license: BSD-2-Clause - license_family: BSD - purls: - - 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 - name: dllist - version: 1.2.0 - sha256: f2ca5fd60d12161b6a472bc340bbae5de53ddd40c5923d9df84e85170b9a8629 - 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 - name: equinox - 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' -- pypi: https://files.pythonhosted.org/packages/4f/4a/ff8aa2c57300613b69905308c5afe92c5b01112d766c25a305fd6796170a/etils-1.11.0-py3-none-any.whl - name: etils - version: 1.11.0 - sha256: a394cf3476bcec51c221426a70c39cd1006e889456ba41e4d7f12fd6814be7a5 - 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' -- conda: 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 -- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_1.conda - sha256: cbde2c64ec317118fc06b223c5fd87c8a680255e7348dd60e7b292d2e103e701 - md5: a16662747cdeb9abbac74d0057cc976e - depends: - - python >=3.9 - license: MIT and PSF-2.0 - purls: - - pkg:pypi/exceptiongroup?source=hash-mapping - 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 >=3.9 - license: MIT - license_family: MIT - purls: - - 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 - depends: - - python >=3.6 - 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 - depends: - - python >=3.9 - license: Unlicense - purls: - - pkg:pypi/filelock?source=hash-mapping - size: 17441 - timestamp: 1733240909987 -- pypi: git+https://github.com/aseyboldt/flowjax?rev=07e7e32217bcfcaa7d68a304f332c925d26ab76f#07e7e32217bcfcaa7d68a304f332c925d26ab76f - name: flowjax - version: 17.0.2 - 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' -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b - md5: 0c96522c6bdaed4b1566d11387caaf45 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 397370 - timestamp: 1566932522327 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c - md5: 34893075a5c9e55cdafac56607368fc6 - license: OFL-1.1 - license_family: Other - purls: [] - size: 96530 - timestamp: 1620479909603 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 - md5: 4d59c254e01d9cde7957100457e2d5fb - license: OFL-1.1 - license_family: Other - purls: [] - size: 700814 - timestamp: 1620479612257 -- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 - md5: 49023d73832ef61042f6a237cb2687e7 - license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 - license_family: Other - purls: [] - size: 1620504 - timestamp: 1727511233259 -- conda: 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 -- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 - md5: fee5683a3f04bd15cbd8318b096a27ab - depends: - - fonts-conda-forge - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 3667 - timestamp: 1566974674465 -- conda: 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 -- 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 - - 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: 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 - license: GPL-2.0-only OR FTL - purls: [] - size: 634972 - timestamp: 1694615932610 -- 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 - license: LGPL-2.1 - purls: [] - size: 114383 - timestamp: 1604416621168 -- 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.* - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 53864 - timestamp: 1724801360210 -- conda: 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 -- 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 - license: BSD-3-Clause - license_family: BSD - purls: [] - 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: - - 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 -- 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 - 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 - 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 -- conda: 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 -- 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 - license: LGPL-2.0-or-later - license_family: LGPL - purls: [] - size: 318312 - timestamp: 1686545244763 -- 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.* - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 53338 - timestamp: 1724801498389 -- conda: 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 -- 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_7 - - gxx_impl_linux-64 13.3.0.* - - sysroot_linux-64 - 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 - depends: - - h5py - - packaging - - python >=3.9 - license: BSD-3-Clause - 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 - 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 -- conda: 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 -- 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.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 - license: BSD-3-Clause - license_family: BSD - purls: [] - 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 - license: MIT - license_family: MIT - purls: [] - size: 12129203 - timestamp: 1720853576813 -- pypi: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl - name: idna - version: '3.10' - 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' -- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_1.conda - sha256: 13766b88fc5b23581530d3a0287c0c58ad82f60401afefab283bf158d2be55a9 - md5: 315607a3030ad5d5227e76e0733798ff - 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 -- conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda - sha256: 0ec8f4d02053cd03b0f3e63168316530949484f80e16f5e2fb199a1d117a89ca - md5: 6837f3eff7dcea42ecd714ce1ac2b108 - depends: - - python >=3.9 - license: MIT - license_family: MIT - purls: - - pkg:pypi/iniconfig?source=hash-mapping - size: 11474 - timestamp: 1733223232820 -- conda: 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 -- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-8.30.0-pyh707e725_0.conda - sha256: 65cdc105e5effea2943d3979cc1592590c923a589009b484d07672faaf047af1 - md5: 5d6e5cb3a4b820f61b2073f0ad5431f1 - depends: - - __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 - - stack_data - - traitlets >=5.13.0 - - typing_extensions >=4.6 - license: BSD-3-Clause - license_family: BSD - purls: - - 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/62/20/6c57c50c0ccc645fea1895950f1e5cd02f961ee44b3ffe83617fa46b0c1d/jax-0.4.35-py3-none-any.whl - name: jax - version: 0.4.35 - 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' -- 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 - name: jaxlib - version: 0.4.34 - 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' -- pypi: https://files.pythonhosted.org/packages/94/99/c83c6a97f4382caf1c9bfeeeca935d3eb1f479f711665aeadf4408048107/jaxtyping-0.2.36-py3-none-any.whl - name: jaxtyping - version: 0.2.36 - sha256: b19bcbd4009df8734602203402483a4066ad2eb3382904432e370588e9c9707d - requires_dist: - - 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: 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.9 - - 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: 106342 - timestamp: 1733441040958 -- conda: 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 -- 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: - - 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 -- 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 - 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 - 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 -- conda: 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 -- 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 - license: MIT - license_family: MIT - purls: [] - size: 245247 - timestamp: 1701647787198 -- 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 - license: GPL-3.0-only - license_family: GPL - purls: [] - size: 669211 - timestamp: 1729655358674 -- 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 - license: Apache-2.0 - license_family: Apache - purls: [] - size: 281798 - timestamp: 1657977462600 -- 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 - 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 - 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 -- 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 - license: MIT - license_family: MIT - purls: [] - size: 68851 - timestamp: 1725267660471 -- 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 - license: MIT - license_family: MIT - purls: [] - size: 32696 - timestamp: 1725267669305 -- 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 - 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 - 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 -- 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.64.0,<2.0a0 - - libssh2 >=1.11.1,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.4.0,<4.0a0 - - zstd >=1.5.6,<1.6.0a0 - 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 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - 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 - depends: - - libgcc-ng >=7.5.0 - - ncurses >=6.2,<7.0.0a0 - license: BSD-2-Clause - license_family: BSD - purls: [] - size: 123878 - timestamp: 1597616541093 -- conda: 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 -- conda: 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 -- 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 - license: MIT - license_family: MIT - purls: [] - size: 58292 - timestamp: 1636488182923 -- conda: 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 -- conda: 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 -- 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 - 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 - 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 -- 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 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 53997 - timestamp: 1729027752995 -- 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 - 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 - 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 -- 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 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 460992 - timestamp: 1729027639220 -- 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 >=13 - - libstdcxx >=13 - - libxml2 >=2.13.4,<3.0a0 - 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 - depends: - - libgcc-ng >=12 - license: LGPL-2.1-only - purls: [] - size: 705775 - timestamp: 1702682170569 -- 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 - 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 - 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 -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.9.0-25_linux64_openblas.conda - build_number: 25 - 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 -- 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 - 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 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - 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: - - __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 -- conda: 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 -- 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 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libzlib >=1.3.1,<2.0a0 - 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 - 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 -- 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 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 4133922 - timestamp: 1724801171589 -- conda: 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 -- 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 - license: Unlicense - purls: [] - 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: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.4.0,<4.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - 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 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 3893695 - timestamp: 1729027746910 -- conda: 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 -- 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 - 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 - 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 - - zstd >=1.5.6,<1.6.0a0 - license: HPND - purls: [] - 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 - 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 - depends: - - libgcc-ng >=12 - constrains: - - libwebp 1.4.0 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 438953 - timestamp: 1713199854503 -- conda: 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 -- conda: 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 -- 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 - license: MIT - license_family: MIT - purls: [] - 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: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - constrains: - - zlib 1.3.1 *_2 - 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 - depends: - - __glibc >=2.17,<3.0.a0 - constrains: - - openmp 19.1.5|19.1.5.* - license: Apache-2.0 WITH LLVM-exception - license_family: APACHE - purls: [] - 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: - - __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 -- conda: 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 -- 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.9 - license: MIT - license_family: MIT - purls: - - 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 - 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: 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.9 - - traitlets - license: BSD-3-Clause - license_family: BSD - purls: - - 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 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - openssl >=3.4.0,<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: 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.9 - license: MIT - license_family: MIT - purls: - - 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 - 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 -- conda: 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 -- conda: 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 -- 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 - 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' -- conda: 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 -- conda: 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 -- conda: 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 -- 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 - license: X11 AND BSD-3-Clause - purls: [] - size: 889086 - timestamp: 1724658547447 -- conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - sha256: bb7b21d7fd0445ddc0631f64e66d91a179de4ba920b8381f29b9d006a42788c0 - md5: 598fd7d4d0de2455fb74f56063969a97 - depends: - - python >=3.9 - license: BSD-2-Clause - license_family: BSD - purls: - - pkg:pypi/nest-asyncio?source=hash-mapping - 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: - - _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 -- 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 - - 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: 841354 - timestamp: 1732243783870 -- conda: 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 -- 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 - 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 - 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 - depends: - - __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 - 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 - depends: - - __glibc >=2.17,<3.0.a0 - - ca-certificates - - libgcc >=13 - license: Apache-2.0 - license_family: Apache - purls: [] - size: 2947466 - timestamp: 1731377666602 -- 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 - sha256: 69bb92469f86a1565195ece4ac0323943e83477171b91d24c35afe028a90d7cd - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/5c/24/28d0bb21600a78e46754947333ec9a297044af884d360092eb8561575fe9/optax-0.2.4-py3-none-any.whl - name: optax - version: 0.2.4 - 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' -- 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 - 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: 60164 - timestamp: 1733203368787 -- conda: 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 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.54.0-h3a902e7_3.conda - sha256: b04f43a7968cedb93cc0b52854f2cac21d8b8ac150b40305865d9ff3c3d4da72 - md5: 8c12547e7b143fb70873fb732a4056b9 - depends: - - __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 - - libexpat >=2.6.4,<3.0a0 - - libgcc >=13 - - libglib >=2.82.2,<3.0a0 - - libpng >=1.6.44,<1.7.0a0 - license: LGPL-2.1-or-later - purls: [] - 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 - 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' -- conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda - sha256: 17131120c10401a99205fc6fe436e7903c0fa092f1b3e80452927ab377239bcc - md5: 5c092057b6badd30f75b06244ecd01c9 - depends: - - python >=3.9 - license: MIT - license_family: MIT - purls: - - pkg:pypi/parso?source=hash-mapping - 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 - license: BSD-2-Clause AND PSF-2.0 - license_family: BSD - purls: - - pkg:pypi/patsy?source=hash-mapping - size: 186594 - timestamp: 1733792482894 -- conda: 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 -- conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - sha256: 202af1de83b585d36445dc1fda94266697341994d1a3328fabde4989e1b3d07a - md5: d0d408b1f18883a944376da5cf8101ea - depends: - - ptyprocess >=0.5 - - python >=3.9 - license: ISC - purls: - - pkg:pypi/pexpect?source=hash-mapping - 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.9 - license: MIT - license_family: MIT - purls: - - 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 - 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 -- conda: 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 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.44.2-h29eaf8c_0.conda - sha256: 747c58db800d5583fee78e76240bf89cbaeedf7ab1ef339c2990602332b9c4be - md5: 5e2a7acfa2c24188af39e7944e1b3604 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libstdcxx >=13 - license: MIT - license_family: MIT - purls: [] - 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.9 - license: MIT - license_family: MIT - purls: - - pkg:pypi/platformdirs?source=hash-mapping - 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.9 - license: MIT - license_family: MIT - purls: - - 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 - 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: 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 - 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 - depends: - - python >=3.9 - - wcwidth - constrains: - - prompt_toolkit 3.0.48 - 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 - 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 -- 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 - license: MIT - license_family: MIT - purls: [] - size: 8252 - timestamp: 1726802366959 -- conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda - sha256: a7713dfe30faf17508ec359e0bc7e0983f5d94682492469bd462cdaae9c64d83 - md5: 7d9daffbb8d8e0af0f769dbbcd173a54 - depends: - - python >=3.9 - license: ISC - purls: - - pkg:pypi/ptyprocess?source=hash-mapping - size: 19457 - timestamp: 1733302371990 -- conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - sha256: 71bd24600d14bb171a6321d523486f6a06f855e75e547fa0cb2a0953b02047f0 - md5: 3bfdfb8dbcdc4af1ae3f9a8eb3948f04 - depends: - - python >=3.9 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pure-eval?source=hash-mapping - 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.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 - noarch: python - sha256: 4d157090014b3890a4feb1652ab07c8ef839cd2b063f58bf6cf94c4229735100 - md5: 1759ccce965ff0a1f8f1c82dc3cb0866 - depends: - - pymc-base 5.19.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 - 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 - - 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: 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: 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.4 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: 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 - - 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: 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.9 - - tomli >=1 - constrains: - - pytest-faulthandler >=2 - license: MIT - license_family: MIT - purls: - - 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 - depends: - - __glibc >=2.17,<3.0.a0 - - bzip2 >=1.0.8,<2.0a0 - - ld_impl_linux-64 >=2.36.1 - - 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.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.4.0,<4.0a0 - - readline >=8.2,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - constrains: - - python_abi 3.12.* *_cp312 - license: Python-2.0 - purls: [] - 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.9 - - six >=1.5 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/python-dateutil?source=hash-mapping - 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.9 - license: MIT - license_family: MIT - purls: - - 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 - depends: - - python >=3.9 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/tzdata?source=hash-mapping - size: 142235 - timestamp: 1733235414217 -- 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 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 6238 - timestamp: 1723823388266 -- conda: 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 -- conda: 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 -- conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda - sha256: 776363493bad83308ba30bcb88c2552632581b143e8ee25b1982c8c743e73abc - md5: 353823361b1d27eb3960efb076dfcaf6 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc-ng >=12 - - libstdcxx-ng >=12 - license: LicenseRef-Qhull - purls: [] - size: 552937 - timestamp: 1720813982144 -- 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 - license: GPL-3.0-only - license_family: GPL - purls: [] - size: 281456 - timestamp: 1679532220005 -- pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl - name: requests - version: 2.32.3 - 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' -- 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.9 - - typing_extensions >=4.0.0,<5.0.0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/rich?source=hash-mapping - size: 185646 - timestamp: 1733342347277 -- pypi: git+https://github.com/aseyboldt/samplerlab#5ae57577f2a586fd941d77afd1f450bbdda796ac - name: samplerlab - version: '0.1' - requires_dist: - - numpy - - 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 - 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: 17444442 - timestamp: 1733621582568 -- conda: https://conda.anaconda.org/conda-forge/noarch/seaborn-0.13.2-hd8ed1ab_3.conda - noarch: python - sha256: ea29a69b14dd6be5cdeeaa551bf50d78cafeaf0351e271e358f9b820fcab4cb0 - md5: 62afb877ca2c2b4b6f9ecb37320085b6 - depends: - - seaborn-base 0.13.2 pyhd8ed1ab_3 - - statsmodels >=0.12 - license: BSD-3-Clause - license_family: BSD - purls: [] - 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.9 - - scipy >=1.7 - constrains: - - seaborn =0.13.2=*_3 - license: BSD-3-Clause - license_family: BSD - purls: - - 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 - depends: - - python >=3.9 - license: MIT - license_family: MIT - purls: - - pkg:pypi/setuptools?source=hash-mapping - 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 >=3.9 - license: MIT - license_family: MIT - purls: - - pkg:pypi/six?source=hash-mapping - 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.9 - license: MIT - license_family: MIT - purls: - - pkg:pypi/stack-data?source=hash-mapping - 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: - - __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 -- conda: 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 -- 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.2,<2.11.3.0a0 - - libstdcxx >=13 - license: Apache-2.0 - license_family: APACHE - purls: [] - size: 175954 - timestamp: 1732982638805 -- conda: 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 -- 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 - license: TCL - license_family: BSD - purls: [] - size: 3318875 - timestamp: 1699202167581 -- 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: 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.9 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/toolz?source=hash-mapping - 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 - 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/traitlets-5.14.3-pyhd8ed1ab_1.conda - sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 - md5: 019a7385be9af33791c989871317e1ed - depends: - - python >=3.9 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/traitlets?source=hash-mapping - size: 110051 - timestamp: 1733367480074 -- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_1.conda - noarch: python - sha256: c8e9c1c467b5f960b627d7adc1c65fece8e929a3de89967e91ef0f726422fd32 - md5: b6a408c64b78ec7b779a3e5c7a902433 - depends: - - typing_extensions 4.12.2 pyha770c72_1 - license: PSF-2.0 - license_family: PSF - purls: [] - 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.9 - license: PSF-2.0 - license_family: PSF - purls: - - 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 - 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 - 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 -- pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - name: urllib3 - version: 2.2.3 - 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' -- 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 - 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 - sha256: d775afa075f5ea15152ad9f4c82dfc95bffb9d0cb4341c9b62073b627191464d - requires_dist: - - ipython>=6.0 - - importlib-metadata>=1.4 - - setuptools - - py3nvml>=0.2 ; extra == 'gpu' - requires_python: '>=3.7' -- conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.13-pyhd8ed1ab_1.conda - sha256: f21e63e8f7346f9074fd00ca3b079bd3d2fa4d71f1f89d5b6934bf31446dc2a5 - md5: b68980f2495d096e71c7fd9d7ccf63e6 - depends: - - python >=3.9 - license: MIT - license_family: MIT - purls: - - pkg:pypi/wcwidth?source=hash-mapping - 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.9 - license: MIT - license_family: MIT - purls: - - pkg:pypi/wheel?source=hash-mapping - 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.2 - - pandas >=2.1 - - python >=3.10 - constrains: - - 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 - - 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 - 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 -- 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 - 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 - 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 -- 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 - 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 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - license: MIT - license_family: MIT - purls: [] - size: 14679 - timestamp: 1727034741045 -- 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 - license: MIT - license_family: MIT - purls: [] - size: 19901 - timestamp: 1727794976192 -- 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 - 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 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - xorg-libx11 >=1.8.10,<2.0a0 - 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 - depends: - - asciitree - - fasteners - - numcodecs >=0.10.0 - - numpy >=1.24,<3.0 - - python >=3.10 - constrains: - - notebook - - ipytree >=0.2.2 - - ipywidgets >=8.0.0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/zarr?source=hash-mapping - 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: - - __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 - license_family: MOZILLA - purls: [] - size: 335400 - timestamp: 1731585026517 -- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda - sha256: 567c04f124525c97a096b65769834b7acb047db24b15a56888a322bf3966c3e1 - md5: 0c3cc595284c5e8f0f9900a9b228a332 - depends: - - python >=3.9 - license: MIT - license_family: MIT - purls: - - 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 - 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 From 451eac450886c3ba22657dc048a233c6834420a8 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Tue, 4 Mar 2025 13:51:45 +0100 Subject: [PATCH 58/64] Fix dependencies --- pixi.toml | 9 +++++---- pyproject.toml | 6 +++--- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/pixi.toml b/pixi.toml index 3c907c4..e0d6eb5 100644 --- a/pixi.toml +++ b/pixi.toml @@ -18,7 +18,7 @@ cmd = "python -m samplerlab -m posteriordb-fast --posteriordb posteriordb/poster [dependencies] python = ">=3.12.7,<3.13" pymc = ">=5.19.0,<6" -numba = ">=0.60.0,<0.61" +numba = ">=0.61.0,<0.62" pytest = ">=8.3.4,<9" maturin = ">=1.7.7,<2" pip = ">=24.3.1,<25" @@ -41,11 +41,12 @@ cmdstanpy = ">=1.2.5,<2" [pypi-dependencies] bridgestan = ">=2.6.0, <3" -flowjax = { git = "https://github.com/aseyboldt/flowjax.git", rev = "07e7e32217bcfcaa7d68a304f332c925d26ab76f" } -samplerlab = { git = "https://github.com/aseyboldt/samplerlab/" } +#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, <0.5.1", extras = ["cuda12"] } watermark = ">=2.5.0, <3" +flowjax = { git = "https://github.com/danielward27/flowjax.git" } [system-requirements] #cuda = "12" diff --git a/pyproject.toml b/pyproject.toml index 5703ca3..12c5445 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" @@ -28,7 +27,7 @@ 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"] +nnflow = ["flowjax >= 17.1.0", "equinox >= 0.11.12"] dev = [ "bridgestan >= 2.6.1", "pymc >= 5.20.1", @@ -42,7 +41,8 @@ all = [ "pymc >= 5.20.1", "numba >= 0.60.0", "jax >= 0.4.27", - "flowjax >= 17.0.2", + "flowjax >= 17.1.0", + "equinox >= 0.11.12", ] [tool.ruff] From b9a8e8ec899fb203f385a9393b7e724d533aed13 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Tue, 4 Mar 2025 13:52:27 +0100 Subject: [PATCH 59/64] Some fixes for the normalizing flow --- python/nutpie/normalizing_flow.py | 348 ++++++++++++++++++++++++----- python/nutpie/transform_adapter.py | 287 ++++++++++++++++++++++-- tests/test_pymc.py | 15 ++ 3 files changed, 567 insertions(+), 83 deletions(-) diff --git a/python/nutpie/normalizing_flow.py b/python/nutpie/normalizing_flow.py index 20b955b..c8029f1 100644 --- a/python/nutpie/normalizing_flow.py +++ b/python/nutpie/normalizing_flow.py @@ -1,18 +1,24 @@ -from typing import Union, Literal, Callable +from typing import ClassVar, Union, Literal, Callable import math import itertools +from flowjax.bijections.coupling import get_ravelled_pytree_constructor +from flowjax.utils import arraylike_to_array import jax import jax.numpy as jnp import equinox as eqx from flowjax import bijections import flowjax.distributions import flowjax.flows +from jaxtyping import Array, ArrayLike import numpy as np -from paramax import Parameterize +from paramax import NonTrainable, Parameterize from equinox.nn import Linear +from paramax.wrappers import AbstractUnwrappable +_NN_ACTIVATION = jax.nn.leaky_relu + def _generate_sequences(k, r_vals): """ Generate all binary sequences of length k with exactly r 1's. @@ -287,12 +293,268 @@ def __call__(self, x: jax.Array, *, key=None) -> jax.Array: return x +class AsymmetricAffine(bijections.AbstractBijection): + """An asymmetric bijection that applies different scaling factors for + positive and negative inputs. + + This bijection implements a continuous, differentiable transformation that + scales positive and negative inputs differently while maintaining smoothness + at zero. It's particularly useful for modeling data with different variances + in positive and negative regions. + + The forward transformation is defined as: + y = σ θ x for x ≥ 0 + y = σ x/θ for x < 0 + where: + - σ (scale) controls the overall scaling + - θ (theta) controls the asymmetry between positive and negative regions + - μ (loc) controls the location shift + + The transformation uses a smooth transition between the two regions to + maintain differentiability. + + For θ = 0, this is exactly an affine function with the specified location + and scale. + + Attributes: + shape: The shape of the transformation parameters + cond_shape: Shape of conditional inputs (None as this bijection is + unconditional) + loc: Location parameter μ for shifting the distribution + scale: Scale parameter σ (positive) + theta: Asymmetry parameter θ (positive) + """ + shape: tuple[int, ...] = () + cond_shape: ClassVar[None] = None + loc: Array + scale: Array | AbstractUnwrappable[Array] + theta: Array | AbstractUnwrappable[Array] + + def __init__( + self, + loc: ArrayLike = 0, + scale: ArrayLike = 1, + theta: ArrayLike = 1, + ): + self.loc, scale, theta = jnp.broadcast_arrays( + *(arraylike_to_array(a, dtype=float) for a in (loc, scale, theta)), + ) + self.shape = scale.shape + self.scale = Parameterize(lambda x: x + jnp.sqrt(1 + x**2), jnp.zeros(())) + self.theta = Parameterize(lambda x: x + jnp.sqrt(1 + x**2), jnp.zeros(())) + + def _log_derivative_f(self, x, mu, sigma, theta): + abs_x = jnp.abs(x) + theta = jnp.log(theta) + + sinh_theta = jnp.sinh(theta) + #sinh_theta = (theta - 1 / theta) / 2 + cosh_theta = jnp.cosh(theta) + #cosh_theta = (theta + 1 / theta) / 2 + numerator = sinh_theta * x * (abs_x + 2.0) + denominator = (abs_x + 1.0)**2 + term = numerator / denominator + dy_dx = sigma * (cosh_theta + term) + return jnp.log(dy_dx) + + def transform_and_log_det(self, x: ArrayLike, condition: ArrayLike | None = None) -> tuple[Array, Array]: + + def transform(x, mu, sigma, theta): + weight = (jax.nn.soft_sign(x) + 1) / 2 + z = x * sigma + y_pos = z * theta + y_neg = z / theta + y = weight * y_pos + (1.0 - weight) * y_neg + mu + return y + + mu, sigma, theta = self.loc, self.scale, self.theta + + y = transform(x, mu, sigma, theta) + logjac = self._log_derivative_f(x, mu, sigma, theta) + return y, logjac.sum() + + def inverse_and_log_det(self, y: ArrayLike, condition: ArrayLike | None = None) -> tuple[Array, Array]: + + def inverse(y, mu, sigma, theta): + delta = y - mu + inv_theta = 1 / theta + + # Case 1: y >= mu (delta >= 0) + a = sigma * (theta + inv_theta) + discriminant_pos = jnp.square(a - 2.0 * delta) + 16.0 * sigma * theta * delta + discriminant_pos = jnp.where(discriminant_pos < 0, 1., discriminant_pos) + sqrt_pos = jnp.sqrt(discriminant_pos) + numerator_pos = 2.0 * delta - a + sqrt_pos + denominator_pos = 4.0 * sigma * theta + x_pos = numerator_pos / denominator_pos + + # Case 2: y < mu (delta < 0) + sigma_part = sigma * (1.0 + theta * theta) + term2 = 2.0 * delta * theta + inside_sqrt_neg = jnp.square(sigma_part + term2) - 16.0 * sigma * delta * theta + inside_sqrt_neg = jnp.where(inside_sqrt_neg < 0, 1., inside_sqrt_neg) + sqrt_neg = jnp.sqrt(inside_sqrt_neg) + numerator_neg = sigma_part + term2 - sqrt_neg + denominator_neg = 4.0 * sigma + x_neg = numerator_neg / denominator_neg + + # Combine cases based on delta + x = jnp.where(delta >= 0.0, x_pos, x_neg) + return x + + mu, sigma, theta = self.loc, self.scale, self.theta + + x = inverse(y, mu, sigma, theta) + logjac = self._log_derivative_f(x, mu, sigma, theta) + return x, -logjac.sum() + + +class MvScale(bijections.AbstractBijection): + shape: tuple[int, ...] + params: Array + cond_shape = None + base_index: int + + def __init__(self, params: Array, base_index: int = 0): + self.shape = (params.shape[-1],) + self.params = params + self.base_index = base_index + + def transform_and_log_det(self, x: jnp.ndarray, condition: Array | None = None): + scale = jnp.linalg.norm(self.params) + v = self.params / scale + y = x + ((v @ x) * (scale - 1)) * v + return y, jnp.log(scale) + + def inverse_and_log_det(self, y: Array, condition: Array | None = None): + scale = jnp.linalg.norm(self.params) + v = self.params / scale + x = y + ((v @ y) * (1 / scale - 1)) * v + return x, -jnp.log(scale) + + +class Coupling(bijections.AbstractBijection): + """Coupling layer implementation (https://arxiv.org/abs/1605.08803). + + Args: + key: Jax key + transformer: Unconditional bijection with shape () to be parameterised by the + conditioner neural netork. Parameters wrapped with ``NonTrainable`` + are excluded from being parameterized. + untransformed_dim: Number of untransformed conditioning variables (e.g. dim//2). + dim: Total dimension. + cond_dim: Dimension of additional conditioning variables. Defaults to None. + nn_width: Neural network hidden layer width. + nn_depth: Neural network hidden layer size. + nn_activation: Neural network activation function. Defaults to jnn.relu. + """ + + shape: tuple[int, ...] + cond_shape: tuple[int, ...] | None + untransformed_dim: int + dim: int + transformer_constructor: Callable + requires_vmap: bool + conditioner: eqx.nn.MLP | eqx.Module + + def __init__( + self, + key, + *, + transformer: bijections.AbstractBijection, + untransformed_dim: int, + dim: int, + cond_dim: int | None = None, + nn_width: int, + nn_depth: int, + nn_activation: Callable = jax.nn.relu, + conditioner: eqx.Module | None = None, + ): + if transformer.cond_shape is not None: + raise ValueError( + "Only unconditional transformers are supported.", + ) + n_transformed = dim - untransformed_dim + if n_transformed < 0: + raise ValueError( + "The number of untransformed variables must be less than the total " + "dimension.", + ) + if transformer.shape != () and transformer.shape != (n_transformed,): + raise ValueError( + "The transformer must have shape () or (n_transformed,), " + f"got {transformer.shape}.", + ) + + constructor, num_params = get_ravelled_pytree_constructor( + transformer, + filter_spec=eqx.is_inexact_array, + is_leaf=lambda leaf: isinstance(leaf, NonTrainable), + ) + + if transformer.shape == (): + self.requires_vmap = True + conditioner_output_size = num_params * n_transformed + else: + self.requires_vmap = False + conditioner_output_size = num_params + + + self.transformer_constructor = constructor + self.untransformed_dim = untransformed_dim + self.dim = dim + self.shape = (dim,) + self.cond_shape = (cond_dim,) if cond_dim is not None else None + + if conditioner is None: + conditioner = eqx.nn.MLP( + in_size=( + untransformed_dim if cond_dim is None else untransformed_dim + cond_dim + ), + out_size=conditioner_output_size, + width_size=nn_width, + depth=nn_depth, + activation=nn_activation, + key=key, + ) + self.conditioner = conditioner(conditioner_output_size) + + def transform_and_log_det(self, x, condition=None): + x_cond, x_trans = x[: self.untransformed_dim], x[self.untransformed_dim :] + nn_input = x_cond if condition is None else jnp.hstack((x_cond, condition)) + transformer_params = self.conditioner(nn_input) + transformer = self._flat_params_to_transformer(transformer_params) + y_trans, log_det = transformer.transform_and_log_det(x_trans) + y = jnp.hstack((x_cond, y_trans)) + return y, log_det + + def inverse_and_log_det(self, y, condition=None): + x_cond, y_trans = y[: self.untransformed_dim], y[self.untransformed_dim :] + nn_input = x_cond if condition is None else jnp.concatenate((x_cond, condition)) + transformer_params = self.conditioner(nn_input) + transformer = self._flat_params_to_transformer(transformer_params) + x_trans, log_det = transformer.inverse_and_log_det(y_trans) + x = jnp.hstack((x_cond, x_trans)) + return x, log_det + + def _flat_params_to_transformer(self, params: Array): + """Reshape to dim X params_per_dim, then vmap.""" + if self.requires_vmap: + dim = self.dim - self.untransformed_dim + transformer_params = jnp.reshape(params, (dim, -1)) + transformer = eqx.filter_vmap(self.transformer_constructor)(transformer_params) + return bijections.Vmap(transformer, in_axes=eqx.if_array(0)) + else: + transformer = self.transformer_constructor(params) + return transformer + + 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) + mvscale = MvScale(params) return mvscale keys = jax.random.split(key, size) @@ -333,7 +595,7 @@ def make_elemwise(key, loc): 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( + affine = AsymmetricAffine( loc, jnp.ones(()), jnp.ones(()), @@ -364,45 +626,6 @@ def make(key): 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 @@ -418,12 +641,15 @@ def make_coupling(key, dim, n_untransformed, **kwargs): nn_width = 2 * dim if nn_depth is None: - nn_depth = len(nn_width) + if isinstance(nn_width, int): + nn_depth = 1 + else: + nn_depth = len(nn_width) transformer = bijections.Chain( [ make_elemwise_trafo(key, n_transformed, count=3), - mvscale, + #mvscale, ] ) @@ -440,10 +666,10 @@ def make_mlp(out_size): depth=nn_depth, key=key, dtype=jnp.float32, - activation=jax.nn.gelu, + activation=_NN_ACTIVATION, ) - return bijections.Coupling( + return Coupling( key, transformer=transformer, untransformed_dim=n_untransformed, @@ -527,7 +753,7 @@ def make_layer(key, untransformed_dim: int | None, permutation=None): key_couple, n_dim, untransformed_dim, - nn_activation=jax.nn.gelu, + nn_activation=_NN_ACTIVATION, nn_width=nn_width, nn_depth=nn_depth, ) @@ -542,7 +768,7 @@ def make_layer(key, untransformed_dim: int | None, permutation=None): if householder_layer: hh = make_hh(key_hh, n_dim, 1, randomize_base=False) - flow = bijections.Sandwich(hh, flow) + flow = bijections.Sandwich(flow, hh) def add_default_permute(bijection, dim, key): if dim == 1: @@ -552,12 +778,12 @@ def add_default_permute(bijection, dim, key): else: outer = bijections.Permute(jax.random.permutation(key, jnp.arange(dim))) - return bijections.Sandwich(outer, bijection) + return bijections.Sandwich(bijection, outer) if permutation is None: flow = add_default_permute(flow, n_dim, key_permute) else: - flow = bijections.Sandwich(bijections.Permute(permutation), flow) + flow = bijections.Sandwich(flow, bijections.Permute(permutation)) mvscale = make_mvscale(key, n_dim, 1, randomize_base=True) @@ -594,7 +820,7 @@ def add_default_permute(bijection, dim, key): inner = make_layer(key, num_untrafo) outer = bijections.DCT(inner.shape) - layers.append(bijections.Sandwich(outer, inner)) + layers.append(bijections.Sandwich(inner, outer)) bijection = bijections.Chain(layers) @@ -692,7 +918,7 @@ def extend_flow( transformer=affine, untransformed_dim=n_dim - extension_var_trafo_count, dim=n_dim, - nn_activation=jax.nn.gelu, + nn_activation=_NN_ACTIVATION, nn_width=width, nn_depth=nn_depth, ) @@ -713,7 +939,7 @@ def extend_flow( transformer=affine, untransformed_dim=extension_var_trafo_count, dim=n_dim, - nn_activation=jax.nn.gelu, + nn_activation=_NN_ACTIVATION, nn_width=width, nn_depth=nn_depth, ) @@ -735,7 +961,7 @@ def extend_flow( coupling, ) - inner = bijections.Sandwich(inner_permute, coupling) + inner = bijections.Sandwich(coupling, inner_permute) if False: scale = Parameterize( @@ -758,7 +984,7 @@ def extend_flow( transformer=affine, untransformed_dim=extension_var_trafo_count, dim=n_dim, - nn_activation=jax.nn.gelu, + nn_activation=_NN_ACTIVATION, nn_width=width, nn_depth=nn_depth, ) @@ -773,22 +999,22 @@ def extend_flow( print(costs[permute.permutation][inner.outer.permutation]) inner = bijections.Sandwich( - inner.outer, bijections.Chain( [ - bijections.Sandwich(bijections.Flip(shape=(n_dim,)), coupling), + bijections.Sandwich(coupling, bijections.Flip(shape=(n_dim,))), inner.inner, ] ), + inner.outer, ) if dct: new_layer = bijections.Sandwich( + bijections.Sandwich(inner, permute), bijections.DCT(shape=(n_dim,)), - bijections.Sandwich(permute, inner), ) else: - new_layer = bijections.Sandwich(permute, inner) + new_layer = bijections.Sandwich(inner, permute) scale = Parameterize( lambda x: x + jnp.sqrt(1 + x**2), @@ -805,13 +1031,13 @@ def extend_flow( pre.append(bijections.Neg(shape=(n_dim,))) nonlin_layer = bijections.Sandwich( + affine, bijections.Chain( [ *pre, bijections.Vmap(bijections.SoftPlusX(), axis_size=n_dim), ] ), - affine, ) scale = Parameterize( lambda x: x + jnp.sqrt(1 + x**2), diff --git a/python/nutpie/transform_adapter.py b/python/nutpie/transform_adapter.py index 02eef36..9d4fe20 100644 --- a/python/nutpie/transform_adapter.py +++ b/python/nutpie/transform_adapter.py @@ -1,21 +1,276 @@ from functools import partial +from typing import Callable +from flowjax import bijections +from jaxtyping import ArrayLike, PyTree import numpy as np import equinox as eqx import jax import jax.numpy as jnp +import jax.random as jr import traceback import flowjax import flowjax.flows import flowjax.train +from flowjax.train.losses import MaximumLikelihoodLoss, PRNGKeyArray +from flowjax.train.train_utils import ( + count_fruitless, + get_batches, + step, + train_val_split, +) import optax -from paramax import unwrap +from paramax import unwrap, NonTrainable -from nutpie.normalizing_flow import extend_flow, make_flow +from nutpie.normalizing_flow import Coupling, extend_flow, make_flow +import tqdm _BIJECTION_TRACE = [] +def fit_to_data( + key: PRNGKeyArray, + dist: PyTree, # Custom losses may support broader types than AbstractDistribution + x, + *, + condition: ArrayLike | None = None, + loss_fn: Callable | None = None, + max_epochs: int = 100, + max_patience: int = 5, + batch_size: int = 100, + val_prop: float = 0.1, + learning_rate: float = 5e-4, + optimizer: optax.GradientTransformation | None = None, + return_best: bool = True, + show_progress: bool = True, + opt_state=None, +): + r"""Train a distribution (e.g. a flow) to samples from the target distribution. + + The distribution can be unconditional :math:`p(x)` or conditional + :math:`p(x|\text{condition})`. Note that the last batch in each epoch is dropped + if truncated (to avoid recompilation). This function can also be used to fit + non-distribution pytrees as long as a compatible loss function is provided. + + Args: + key: Jax random seed. + dist: The distribution to train. + x: Samples from target distribution. + condition: Conditioning variables. Defaults to None. + loss_fn: Loss function. Defaults to MaximumLikelihoodLoss. + max_epochs: Maximum number of epochs. Defaults to 100. + max_patience: Number of consecutive epochs with no validation loss improvement + after which training is terminated. Defaults to 5. + batch_size: Batch size. Defaults to 100. + val_prop: Proportion of data to use in validation set. Defaults to 0.1. + learning_rate: Adam learning rate. Defaults to 5e-4. + optimizer: Optax optimizer. If provided, this overrides the default Adam + optimizer, and the learning_rate is ignored. Defaults to None. + return_best: Whether the result should use the parameters where the minimum loss + was reached (when True), or the parameters after the last update (when + False). Defaults to True. + show_progress: Whether to show progress bar. Defaults to True. + + Returns: + A tuple containing the trained distribution and the losses. + """ + if not isinstance(x, tuple): + x = (x,) + data = x if condition is None else (*x, condition) + data = tuple(jnp.asarray(a) for a in data) + + if optimizer is None: + optimizer = optax.adam(learning_rate) + + if loss_fn is None: + loss_fn = MaximumLikelihoodLoss() + + params, static = eqx.partition( + dist, + eqx.is_inexact_array, + is_leaf=lambda leaf: isinstance(leaf, NonTrainable), + ) + best_params = params + + if opt_state is None: + opt_state = optimizer.init(params) + + # train val split + key, subkey = jr.split(key) + train_data, val_data = train_val_split(subkey, data, val_prop=val_prop) + losses = {"train": [], "val": []} + + loop = tqdm.tqdm(range(max_epochs), disable=not show_progress) + + for _ in loop: + # Shuffle data + key, *subkeys = jr.split(key, 3) + train_data = [jr.permutation(subkeys[0], a) for a in train_data] + val_data = [jr.permutation(subkeys[1], a) for a in val_data] + + key, subkey = jr.split(key) + batches = get_batches(train_data, batch_size) + batch_losses = [] + + for batch in zip(*batches, strict=True): + key, subkey = jr.split(key) + params, opt_state, batch_loss = step( + params, + static, + *batch, + optimizer=optimizer, + opt_state=opt_state, + loss_fn=loss_fn, + key=subkey, + ) + batch_losses.append(batch_loss) + #params, opt_state, batch_losses = _step_batch_loop( + # params, + # static, + # opt_state, + # optimizer, + # loss_fn, + # subkey, + # *batches, + #) + losses["train"].append((sum(batch_losses) / len(batch_losses)).item()) + + # Val epoch + batch_losses = [] + for batch in zip(*get_batches(val_data, batch_size), strict=True): + key, subkey = jr.split(key) + loss_i = loss_fn(params, static, *batch, key=subkey) + batch_losses.append(loss_i) + losses["val"].append(sum(batch_losses) / len(batch_losses)) + + loop.set_postfix({k: v[-1] for k, v in losses.items()}) + if losses["val"][-1] == min(losses["val"]): + best_params = params + + elif count_fruitless(losses["val"]) > max_patience: + loop.set_postfix_str(f"{loop.postfix} (Max patience reached)") + break + + params = best_params if return_best else params + dist = eqx.combine(params, static) + return dist, losses, opt_state + + +@eqx.filter_jit +def _step_batch_loop(params, static, opt_state, optimizer, loss_fn, key, *batches): + def scan_fn(carry, batch): + params, opt_state, key = carry + key, subkey = jr.split(key) + params, opt_state, loss_i = step( + params, + static, + *batch, + optimizer=optimizer, + opt_state=opt_state, + loss_fn=loss_fn, + key=subkey, + ) + return (params, opt_state, key), loss_i + + (params, opt_state, _), batch_losses = jax.lax.scan( + scan_fn, (params, opt_state, key), batches + ) + + return params, opt_state, batch_losses + + +@eqx.filter_jit +def inverse_gradient_and_val(bijection, draw, grad, logp): + if False: + x = bijection.inverse(draw) + (_, fwd_log_det), pull_grad_fn = jax.vjp( + lambda x: bijection.transform_and_log_det(x), x + ) + (x_grad,) = pull_grad_fn((grad, jnp.ones(()))) + return (x, x_grad, logp + fwd_log_det) + if isinstance(bijection, bijections.Chain): + for b in bijection.bijections[::-1]: + draw, grad, logp = inverse_gradient_and_val(b, draw, grad, logp) + return draw, grad, logp + elif isinstance(bijection, bijections.Permute): + return ( + draw[bijection.inverse_permutation], + grad[bijection.inverse_permutation], + logp, + ) + elif isinstance(bijection, bijections.Affine): + draw, logdet = bijection.inverse_and_log_det(draw) + grad = grad * bijection.scale + return (draw, grad, logp - logdet) + elif isinstance(bijection, bijections.Vmap): + + def inner(bijection, y, y_grad, y_logp): + return inverse_gradient_and_val(bijection, y, y_grad, y_logp) + + y, y_grad, log_det = eqx.filter_vmap( + inner, + in_axes=(bijection.in_axes[0], 0, 0, None), + axis_size=bijection.axis_size, + )(bijection.bijection, draw, grad, jnp.zeros(())) + return y, y_grad, jnp.sum(log_det) + logp + elif isinstance(bijection, bijections.Sandwich): + draw, grad, logp = inverse_gradient_and_val(bijections.Invert(bijection.outer), draw, grad, logp) + draw, grad, logp = inverse_gradient_and_val(bijection.inner, draw, grad, logp) + draw, grad, logp = inverse_gradient_and_val(bijection.outer, draw, grad, logp) + return draw, grad, logp + # Disabeling the Coupling case for now, it slows down compile time for some reason? + elif False and isinstance(bijection, Coupling): + y, y_grad, y_logp = draw, grad, logp + y_cond, y_trans = y[: bijection.untransformed_dim], y[bijection.untransformed_dim :] + x_cond = y_cond + + y_grad_cond, y_grad_trans = ( + y_grad[: bijection.untransformed_dim], + y_grad[bijection.untransformed_dim :], + ) + + def conditioner(x_cond): + return bijection.conditioner(x_cond) + + transformer_params, nn_pull = jax.vjp(conditioner, x_cond) + + def pull_transformer_grad(transformer_params): + transformer = bijection._flat_params_to_transformer(transformer_params) + + x_trans, x_grad_trans, x_logp = inverse_gradient_and_val( + transformer, y_trans, y_grad_trans, y_logp + ) + + return (x_logp, x_trans), x_grad_trans + + ((x_logp, x_trans), pull_pull_transformer_grad, x_grad_trans) = jax.vjp( + pull_transformer_grad, transformer_params, has_aux=True + ) + + (co_transformer_params,) = pull_pull_transformer_grad((1.0, -x_grad_trans)) + (co_x_cond,) = nn_pull(co_transformer_params) + + x = jnp.hstack((x_cond, x_trans)) + x_grad = jnp.hstack((y_grad_cond + co_x_cond, x_grad_trans)) + return x, x_grad, x_logp + + elif isinstance(bijection, bijections.Invert): + inner = bijection.bijection + x = inner.transform(draw) + (_, fwd_log_det), pull_grad_fn = jax.vjp( + lambda x: inner.inverse_and_log_det(x), x + ) + (x_grad,) = pull_grad_fn((grad, jnp.ones(()))) + return (x, x_grad, logp + fwd_log_det) + else: + x = bijection.inverse(draw) + (_, fwd_log_det), pull_grad_fn = jax.vjp( + lambda x: bijection.transform_and_log_det(x), x + ) + (x_grad,) = pull_grad_fn((grad, jnp.ones(()))) + return (x, x_grad, logp + fwd_log_det) + + class FisherLoss: def __init__(self, gamma=None, log_inside_batch=False): self._gamma = gamma @@ -39,16 +294,7 @@ def __call__( 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 = inverse_gradient_and_val(bijection, draw, grad, logp) cost = (draw + grad) ** 2 return cost @@ -63,7 +309,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 = inverse_gradient_and_val(bijection, draw, grad, logp) cost = ((draw + grad) ** 2).sum() return cost @@ -83,9 +329,8 @@ 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) + return inverse_gradient_and_val(flow.bijection, draw, grad, logp) draws, grads, logps = jax.vmap(transform, [0, 0, 0], (0, 0, 0))( draws, grads, logps @@ -103,16 +348,16 @@ def fit_flow(key, bijection, loss_fn, draws, grads, logps, **kwargs): key, train_key = jax.random.split(key) - fit, losses = flowjax.train.fit_to_data( + fit, losses, opt_state = fit_to_data( key=train_key, dist=flow, x=(draws, grads, logps), loss_fn=loss_fn, - max_epochs=1000, + max_epochs=500, return_best=True, **kwargs, ) - return fit.bijection, losses, losses["opt_state"] + return fit.bijection, losses, opt_state @eqx.filter_jit @@ -181,9 +426,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_( - untransformed_position, untransformed_gradient, 0.0 - ) + inverse_gradient_and_val(bijection, untransformed_position, untransformed_gradient, 0.0) ) return logdet, transformed_position, transformed_gradient @@ -270,7 +513,7 @@ def transformation_id(self): def update(self, seed, positions, gradients, logps): self.index += 1 if self._verbose: - print(f"Chain {self._chain}: Total available points: {len(positions)}") + print(f"Chain {self._chain}: Total available points: {len(positions)}, seed {seed}") n_draws = len(positions) assert n_draws == len(positions) assert n_draws == len(gradients) diff --git a/tests/test_pymc.py b/tests/test_pymc.py index a586e24..9b8939f 100644 --- a/tests/test_pymc.py +++ b/tests/test_pymc.py @@ -243,6 +243,21 @@ def test_pymc_var_names(backend, gradient_backend): assert not hasattr(trace.posterior, "c") +def test_normalizing_flow(): + with pm.Model() as model: + a = pm.Uniform("a/b", shape=2) + with pm.Model("foo"): + c = pm.Data("c", np.array([2.0, 3.0])) + pm.Deterministic("b", c * a) + + compiled = nutpie.compile_pymc_model( + model, backend="jax", gradient_backend="jax" + ).with_transform_adapt() + trace = nutpie.sample(compiled, chains=1, transform_adapt=True) + assert trace.posterior["a/b"].shape[-1] == 2 + assert trace.posterior["foo::b"].shape[-1] == 2 + + @pytest.mark.parametrize( ("backend", "gradient_backend"), [ From 2743032703e82198f24234f84829e0b9e24bb931 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Fri, 21 Feb 2025 00:43:05 +0000 Subject: [PATCH 60/64] Fix small issues in nf impl --- python/nutpie/transform_adapter.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/python/nutpie/transform_adapter.py b/python/nutpie/transform_adapter.py index 9d4fe20..3687bf5 100644 --- a/python/nutpie/transform_adapter.py +++ b/python/nutpie/transform_adapter.py @@ -627,6 +627,11 @@ def update(self, seed, positions, gradients, logps): if len(base.bijections) == 1: self._bijection = base self._opt_state = None + + if self._debug_save_bijection: + _BIJECTION_TRACE.append( + (self.index, fit, (positions, gradients, logps)) + ) return flow = flowjax.flows.Transformed( @@ -858,6 +863,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 61e88832cc154bd0147b8d978da1ab313a93eb67 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Tue, 4 Mar 2025 15:45:23 +0100 Subject: [PATCH 61/64] Improve docs --- docs/about.qmd | 14 ++++++- docs/nf-adapt.qmd | 97 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 109 insertions(+), 2 deletions(-) diff --git a/docs/about.qmd b/docs/about.qmd index 07c5e7f..4aa5d45 100644 --- a/docs/about.qmd +++ b/docs/about.qmd @@ -2,4 +2,16 @@ title: "About" --- -About this site +Nutpie is part of the PyMC organization, a collection of open source +probabilistic programming projects. The PyMC organization develops and maintains +tools for Bayesian statistical modeling and probabilistic machine learning. + +Nutpie provides a high-performance implementation of the No-U-Turn Sampler +(NUTS) that can be used with models defined in PyMC, Stan and other frameworks. +It was created to enable faster and more efficient Bayesian inference while +maintaining compatibility with existing probabilistic programming tools. + +For more information about the PyMC organization and its projects, visit: + +- [PyMC Website](https://www.pymc.io) +- [PyMC GitHub Organization](https://github.com/pymc-devs) diff --git a/docs/nf-adapt.qmd b/docs/nf-adapt.qmd index f6fa300..5638346 100644 --- a/docs/nf-adapt.qmd +++ b/docs/nf-adapt.qmd @@ -1,3 +1,98 @@ -# Adaptation with normalizing flows +# Adaptation with Normalizing Flows **Experimental and subject to change** + +Normalizing flow adaptation through Fisher HMC is a new sampling algorithm that +automatically reparameterizes a model. It adds some computational cost outside +model log-density evaluations, but allows sampling from much more difficult +posterior distributions. For models with expensive log-density evaluations, the +normalizing flow adaptation can also be much faster, if it can reduce the number +of log-density evaluations needed to reach a given effective sample size. + +The normalizing flow adaptation works by learning a transformation of the parameter +space that makes the posterior distribution more amenable to sampling. This is done +by fitting a sequence of invertible transformations (the "flow") that maps the +original parameter space to a space where the posterior is closer to a standard +normal distribution. The flow is trained during warmup. + +For more information about the algorithm, see the paper todo + +## Requirements + +Install the optional dependencies for normalizing flow adaptation: + +``` +pip install 'nutpie[flow]' +``` + +If you use with PyMC, this will only work if the model is compiled using the jax +backend, and if the `gradient_backend` is also set to `jax`. + +Training of the normalizing flow can often be accelerated by using a GPU (even +if the model itself is written in Stan, without any GPU support). To enable GPU +you need to make sure your `jax` installation comes with GPU support, for +instance by installing it with `pip install 'jax[cuda12]'`, or selecting the +`jaxlib` version with GPU support, if you are using conda-forge. You can check if +your installation has GPU support by checking the output of: + +```python +import jax +jax.devices() +``` + +### Usage + +To use normalizing flow adaptation in `nutpie`, you need to enable the +`transform_adapt` option during sampling. Here is an example of how we can use +it to sample from a difficult posterior: + +```{python} +import pymc as pm +import nutpie +import numpy as np + +# Define a 100-dimensional funnel model +with pm.Model() as model: + log_sigma = pm.Normal("log_sigma") + x = pm.Normal("x", mu=0, sigma=pm.math.exp(y / 2), shape=100) + +# Compile the model with the jax backend +compiled = nutpie.compile_pymc_model( + model, backend="jax", gradient_backend="jax" +) +``` + +If we sample this model without normalizing flow adaptation, we may encounter +divergences and don't recover the actual posterior distribution: + +```{python} +# Sample without normalizing flow adaptation +trace_no_nf = nutpie.sample(compiled_no_nf, seed=1) +assert trace_no_nf.sample_stats.diverging.sum() > 0 +``` + +```{python} +# We can add further arguments for the normalizing flow: +compiled = compiled.with_transform_adapt(num_layers=9) + +# Sample with normalizing flow adaptation +trace_nf = nutpie.sample(compiled, transform_adapt=True, seed=1) +assert trace_no_nf.sample_stats.diverging.sum() == 0 +``` + +The flow adaptation occurs during warmup, so the number of warmup draws should +be large enough to allow the flow to converge. For more complex posteriors, you +may need to increase the number of layers (using the `num_layers` argument), or +you might want to increase the number of warmup draws. + +To monitor the progress of the flow adaptation, you can set `verbose=True`, or +`show_progress=True`, but the second should only be used if you sample just one +chain. + +All losses are on a log-scale. Negative values smaller -2 are a good sign that +the adaptation was successful. If the loss stays positive, the flow is either +not expressive enough, or the training period is too short. The sampler might +still converge, but will probably need more gradient evaluations per effective +draw. Large losses bigger than 6 tend to indicate that the posterior is too +difficult to sample with the current flow, and the sampler will probably not +converge. From 1ec988a24fcda937e09f3266682f061da862573e Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Tue, 4 Mar 2025 21:55:37 +0100 Subject: [PATCH 62/64] Fix in nnflow docs --- book.toml | 6 ------ docs/nf-adapt.qmd | 25 +++++++++++++++++-------- 2 files changed, 17 insertions(+), 14 deletions(-) delete mode 100644 book.toml diff --git a/book.toml b/book.toml deleted file mode 100644 index 9835ea7..0000000 --- a/book.toml +++ /dev/null @@ -1,6 +0,0 @@ -[book] -authors = ["Adrian Seyboldt"] -language = "en" -multilingual = false -src = "docs" -title = "nutpie" diff --git a/docs/nf-adapt.qmd b/docs/nf-adapt.qmd index 5638346..4911d91 100644 --- a/docs/nf-adapt.qmd +++ b/docs/nf-adapt.qmd @@ -17,12 +17,16 @@ normal distribution. The flow is trained during warmup. For more information about the algorithm, see the paper todo +Currently, a lot of time is spent on compiling various parts of the normalizing +flow, and for small models this can take a large amount of the total time. +Hopefully, we will be able to reduce this overhead in the future. + ## Requirements Install the optional dependencies for normalizing flow adaptation: ``` -pip install 'nutpie[flow]' +pip install 'nutpie[nnflow]' ``` If you use with PyMC, this will only work if the model is compiled using the jax @@ -50,11 +54,12 @@ it to sample from a difficult posterior: import pymc as pm import nutpie import numpy as np +import arviz # Define a 100-dimensional funnel model with pm.Model() as model: log_sigma = pm.Normal("log_sigma") - x = pm.Normal("x", mu=0, sigma=pm.math.exp(y / 2), shape=100) + pm.Normal("x", mu=0, sigma=pm.math.exp(log_sigma / 2), shape=100) # Compile the model with the jax backend compiled = nutpie.compile_pymc_model( @@ -62,22 +67,26 @@ compiled = nutpie.compile_pymc_model( ) ``` -If we sample this model without normalizing flow adaptation, we may encounter -divergences and don't recover the actual posterior distribution: +If we sample this model without normalizing flow adaptation, we will encounter +convergence issues, often divergences and always low effective sample sizes: ```{python} # Sample without normalizing flow adaptation -trace_no_nf = nutpie.sample(compiled_no_nf, seed=1) -assert trace_no_nf.sample_stats.diverging.sum() > 0 +trace_no_nf = nutpie.sample(compiled, seed=1) +assert (arviz.ess(trace_no_nf) < 100).any().to_array().any() ``` ```{python} # We can add further arguments for the normalizing flow: -compiled = compiled.with_transform_adapt(num_layers=9) +compiled = compiled.with_transform_adapt( + num_layers=5, # Use 5 layers in the normalizing flow + nn_width=32, # Use neural networks with 32 hidden units +) # Sample with normalizing flow adaptation -trace_nf = nutpie.sample(compiled, transform_adapt=True, seed=1) +trace_nf = nutpie.sample(compiled, transform_adapt=True, seed=1, chains=2, cores=1) assert trace_no_nf.sample_stats.diverging.sum() == 0 +assert (arviz.ess(trace_no_nf) > 500).all().to_array().all() ``` The flow adaptation occurs during warmup, so the number of warmup draws should From da887e8be2d42511fee9721f070db2709a3292d7 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Tue, 4 Mar 2025 21:57:18 +0100 Subject: [PATCH 63/64] Formatting and minor changes to verbose output --- docs/nf-adapt.qmd | 4 +- python/nutpie/compile_pymc.py | 3 +- python/nutpie/normalizing_flow.py | 63 +++++++++++-------- python/nutpie/transform_adapter.py | 97 +++++++++++++++++++++--------- 4 files changed, 109 insertions(+), 58 deletions(-) diff --git a/docs/nf-adapt.qmd b/docs/nf-adapt.qmd index 4911d91..f430483 100644 --- a/docs/nf-adapt.qmd +++ b/docs/nf-adapt.qmd @@ -85,8 +85,8 @@ compiled = compiled.with_transform_adapt( # Sample with normalizing flow adaptation trace_nf = nutpie.sample(compiled, transform_adapt=True, seed=1, chains=2, cores=1) -assert trace_no_nf.sample_stats.diverging.sum() == 0 -assert (arviz.ess(trace_no_nf) > 500).all().to_array().all() +assert trace_nf.sample_stats.diverging.sum() == 0 +assert (arviz.ess(trace_nf) > 500).all().to_array().all() ``` The flow adaptation occurs during warmup, so the number of warmup draws should diff --git a/python/nutpie/compile_pymc.py b/python/nutpie/compile_pymc.py index bb03091..9daec90 100644 --- a/python/nutpie/compile_pymc.py +++ b/python/nutpie/compile_pymc.py @@ -8,7 +8,6 @@ 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 @@ -645,7 +644,7 @@ def _make_functions( """ import pytensor import pytensor.tensor as pt - from pymc.pytensorf import compile_pymc + from pymc.pytensorf import compile as compile_pymc shapes = _compute_shapes(model) diff --git a/python/nutpie/normalizing_flow.py b/python/nutpie/normalizing_flow.py index c8029f1..e92f7b0 100644 --- a/python/nutpie/normalizing_flow.py +++ b/python/nutpie/normalizing_flow.py @@ -17,7 +17,8 @@ from paramax.wrappers import AbstractUnwrappable -_NN_ACTIVATION = jax.nn.leaky_relu +_NN_ACTIVATION = jax.nn.gelu + def _generate_sequences(k, r_vals): """ @@ -324,6 +325,7 @@ class AsymmetricAffine(bijections.AbstractBijection): scale: Scale parameter σ (positive) theta: Asymmetry parameter θ (positive) """ + shape: tuple[int, ...] = () cond_shape: ClassVar[None] = None loc: Array @@ -340,6 +342,7 @@ def __init__( *(arraylike_to_array(a, dtype=float) for a in (loc, scale, theta)), ) self.shape = scale.shape + assert self.shape == () self.scale = Parameterize(lambda x: x + jnp.sqrt(1 + x**2), jnp.zeros(())) self.theta = Parameterize(lambda x: x + jnp.sqrt(1 + x**2), jnp.zeros(())) @@ -348,17 +351,18 @@ def _log_derivative_f(self, x, mu, sigma, theta): theta = jnp.log(theta) sinh_theta = jnp.sinh(theta) - #sinh_theta = (theta - 1 / theta) / 2 + # sinh_theta = (theta - 1 / theta) / 2 cosh_theta = jnp.cosh(theta) - #cosh_theta = (theta + 1 / theta) / 2 + # cosh_theta = (theta + 1 / theta) / 2 numerator = sinh_theta * x * (abs_x + 2.0) - denominator = (abs_x + 1.0)**2 + denominator = (abs_x + 1.0) ** 2 term = numerator / denominator dy_dx = sigma * (cosh_theta + term) return jnp.log(dy_dx) - def transform_and_log_det(self, x: ArrayLike, condition: ArrayLike | None = None) -> tuple[Array, Array]: - + def transform_and_log_det( + self, x: ArrayLike, condition: ArrayLike | None = None + ) -> tuple[Array, Array]: def transform(x, mu, sigma, theta): weight = (jax.nn.soft_sign(x) + 1) / 2 z = x * sigma @@ -372,17 +376,22 @@ def transform(x, mu, sigma, theta): y = transform(x, mu, sigma, theta) logjac = self._log_derivative_f(x, mu, sigma, theta) return y, logjac.sum() + # y, jac = jax.value_and_grad(transform, argnums=0)(x, mu, sigma, theta) + # return y, jnp.log(jac) - def inverse_and_log_det(self, y: ArrayLike, condition: ArrayLike | None = None) -> tuple[Array, Array]: - + def inverse_and_log_det( + self, y: ArrayLike, condition: ArrayLike | None = None + ) -> tuple[Array, Array]: def inverse(y, mu, sigma, theta): delta = y - mu inv_theta = 1 / theta # Case 1: y >= mu (delta >= 0) a = sigma * (theta + inv_theta) - discriminant_pos = jnp.square(a - 2.0 * delta) + 16.0 * sigma * theta * delta - discriminant_pos = jnp.where(discriminant_pos < 0, 1., discriminant_pos) + discriminant_pos = ( + jnp.square(a - 2.0 * delta) + 16.0 * sigma * theta * delta + ) + discriminant_pos = jnp.where(discriminant_pos < 0, 1.0, discriminant_pos) sqrt_pos = jnp.sqrt(discriminant_pos) numerator_pos = 2.0 * delta - a + sqrt_pos denominator_pos = 4.0 * sigma * theta @@ -391,8 +400,10 @@ def inverse(y, mu, sigma, theta): # Case 2: y < mu (delta < 0) sigma_part = sigma * (1.0 + theta * theta) term2 = 2.0 * delta * theta - inside_sqrt_neg = jnp.square(sigma_part + term2) - 16.0 * sigma * delta * theta - inside_sqrt_neg = jnp.where(inside_sqrt_neg < 0, 1., inside_sqrt_neg) + inside_sqrt_neg = ( + jnp.square(sigma_part + term2) - 16.0 * sigma * delta * theta + ) + inside_sqrt_neg = jnp.where(inside_sqrt_neg < 0, 1.0, inside_sqrt_neg) sqrt_neg = jnp.sqrt(inside_sqrt_neg) numerator_neg = sigma_part + term2 - sqrt_neg denominator_neg = 4.0 * sigma @@ -407,6 +418,8 @@ def inverse(y, mu, sigma, theta): x = inverse(y, mu, sigma, theta) logjac = self._log_derivative_f(x, mu, sigma, theta) return x, -logjac.sum() + # x, jac = jax.value_and_grad(inverse, argnums=0)(y, mu, sigma, theta) + # return x, jnp.log(jac) class MvScale(bijections.AbstractBijection): @@ -499,7 +512,6 @@ def __init__( self.requires_vmap = False conditioner_output_size = num_params - self.transformer_constructor = constructor self.untransformed_dim = untransformed_dim self.dim = dim @@ -509,7 +521,9 @@ def __init__( if conditioner is None: conditioner = eqx.nn.MLP( in_size=( - untransformed_dim if cond_dim is None else untransformed_dim + cond_dim + untransformed_dim + if cond_dim is None + else untransformed_dim + cond_dim ), out_size=conditioner_output_size, width_size=nn_width, @@ -542,7 +556,9 @@ def _flat_params_to_transformer(self, params: Array): if self.requires_vmap: dim = self.dim - self.untransformed_dim transformer_params = jnp.reshape(params, (dim, -1)) - transformer = eqx.filter_vmap(self.transformer_constructor)(transformer_params) + transformer = eqx.filter_vmap(self.transformer_constructor)( + transformer_params + ) return bijections.Vmap(transformer, in_axes=eqx.if_array(0)) else: transformer = self.transformer_constructor(params) @@ -612,7 +628,7 @@ def make_elemwise(key, loc): replace=theta, ) - return affine + return bijections.Invert(affine) def make(key): keys = jax.random.split(key, count + 1) @@ -626,11 +642,9 @@ def make(key): return bijections.Vmap(make_affine, in_axes=eqx.if_array(0)) -def make_coupling(key, dim, n_untransformed, **kwargs): +def make_coupling(key, dim, n_untransformed, *, inner_mvscale=False, **kwargs): n_transformed = dim - n_untransformed - mvscale = make_mvscale(key, n_transformed, 1, randomize_base=True) - nn_width = kwargs.get("nn_width", None) nn_depth = kwargs.get("nn_depth", None) @@ -646,12 +660,11 @@ def make_coupling(key, dim, n_untransformed, **kwargs): else: nn_depth = len(nn_width) - transformer = bijections.Chain( - [ - make_elemwise_trafo(key, n_transformed, count=3), - #mvscale, - ] - ) + transformer = make_elemwise_trafo(key, n_transformed, count=3) + + if inner_mvscale: + mvscale = make_mvscale(key, n_transformed, 1, randomize_base=True) + transformer = bijections.Chain([transformer, mvscale]) def make_mlp(out_size): if isinstance(nn_width, tuple): diff --git a/python/nutpie/transform_adapter.py b/python/nutpie/transform_adapter.py index 3687bf5..30ca9a6 100644 --- a/python/nutpie/transform_adapter.py +++ b/python/nutpie/transform_adapter.py @@ -1,5 +1,6 @@ from functools import partial from typing import Callable +import time from flowjax import bijections from jaxtyping import ArrayLike, PyTree @@ -44,6 +45,7 @@ def fit_to_data( return_best: bool = True, show_progress: bool = True, opt_state=None, + verbose: bool = False, ): r"""Train a distribution (e.g. a flow) to samples from the target distribution. @@ -102,39 +104,56 @@ def fit_to_data( loop = tqdm.tqdm(range(max_epochs), disable=not show_progress) - for _ in loop: + for i in loop: # Shuffle data + start = time.time() key, *subkeys = jr.split(key, 3) train_data = [jr.permutation(subkeys[0], a) for a in train_data] val_data = [jr.permutation(subkeys[1], a) for a in val_data] + if verbose and i == 0: + print("shuffle timing:", time.time() - start) + + start = time.time() key, subkey = jr.split(key) batches = get_batches(train_data, batch_size) batch_losses = [] - for batch in zip(*batches, strict=True): - key, subkey = jr.split(key) - params, opt_state, batch_loss = step( + if verbose and i == 0: + print("batch timing:", time.time() - start) + + start = time.time() + + if True: + for batch in zip(*batches, strict=True): + key, subkey = jr.split(key) + params, opt_state, batch_loss = step( + params, + static, + *batch, + optimizer=optimizer, + opt_state=opt_state, + loss_fn=loss_fn, + key=subkey, + ) + batch_losses.append(batch_loss) + else: + params, opt_state, batch_losses = _step_batch_loop( params, static, - *batch, - optimizer=optimizer, - opt_state=opt_state, - loss_fn=loss_fn, - key=subkey, + opt_state, + optimizer, + loss_fn, + subkey, + *batches, ) - batch_losses.append(batch_loss) - #params, opt_state, batch_losses = _step_batch_loop( - # params, - # static, - # opt_state, - # optimizer, - # loss_fn, - # subkey, - # *batches, - #) + losses["train"].append((sum(batch_losses) / len(batch_losses)).item()) + if verbose and i == 0: + print("step timing:", time.time() - start) + + start = time.time() # Val epoch batch_losses = [] for batch in zip(*get_batches(val_data, batch_size), strict=True): @@ -143,6 +162,9 @@ def fit_to_data( batch_losses.append(loss_i) losses["val"].append(sum(batch_losses) / len(batch_losses)) + if verbose and i == 0: + print("val timing:", time.time() - start) + loop.set_postfix({k: v[-1] for k, v in losses.items()}) if losses["val"][-1] == min(losses["val"]): best_params = params @@ -214,14 +236,19 @@ def inner(bijection, y, y_grad, y_logp): )(bijection.bijection, draw, grad, jnp.zeros(())) return y, y_grad, jnp.sum(log_det) + logp elif isinstance(bijection, bijections.Sandwich): - draw, grad, logp = inverse_gradient_and_val(bijections.Invert(bijection.outer), draw, grad, logp) + draw, grad, logp = inverse_gradient_and_val( + bijections.Invert(bijection.outer), draw, grad, logp + ) draw, grad, logp = inverse_gradient_and_val(bijection.inner, draw, grad, logp) draw, grad, logp = inverse_gradient_and_val(bijection.outer, draw, grad, logp) return draw, grad, logp # Disabeling the Coupling case for now, it slows down compile time for some reason? elif False and isinstance(bijection, Coupling): y, y_grad, y_logp = draw, grad, logp - y_cond, y_trans = y[: bijection.untransformed_dim], y[bijection.untransformed_dim :] + y_cond, y_trans = ( + y[: bijection.untransformed_dim], + y[bijection.untransformed_dim :], + ) x_cond = y_cond y_grad_cond, y_grad_trans = ( @@ -256,14 +283,14 @@ def pull_transformer_grad(transformer_params): elif isinstance(bijection, bijections.Invert): inner = bijection.bijection - x = inner.transform(draw) + x, _ = inner.transform_and_log_det(draw) (_, fwd_log_det), pull_grad_fn = jax.vjp( lambda x: inner.inverse_and_log_det(x), x ) (x_grad,) = pull_grad_fn((grad, jnp.ones(()))) return (x, x_grad, logp + fwd_log_det) else: - x = bijection.inverse(draw) + x, _ = bijection.inverse_and_log_det(draw) (_, fwd_log_det), pull_grad_fn = jax.vjp( lambda x: bijection.transform_and_log_det(x), x ) @@ -329,6 +356,7 @@ def compute_loss(bijection, draw, grad, logp): return jnp.log(costs.mean()) else: + def transform(draw, grad, logp): return inverse_gradient_and_val(flow.bijection, draw, grad, logp) @@ -425,8 +453,8 @@ def _init_from_untransformed_position(logp_fn, bijection, untransformed_position @eqx.filter_jit def _inv_transform(bijection, untransformed_position, untransformed_gradient): bijection = unwrap(bijection) - transformed_position, transformed_gradient, logdet = ( - inverse_gradient_and_val(bijection, untransformed_position, untransformed_gradient, 0.0) + transformed_position, transformed_gradient, logdet = inverse_gradient_and_val( + bijection, untransformed_position, untransformed_gradient, 0.0 ) return logdet, transformed_position, transformed_gradient @@ -513,7 +541,9 @@ def transformation_id(self): def update(self, seed, positions, gradients, logps): self.index += 1 if self._verbose: - print(f"Chain {self._chain}: Total available points: {len(positions)}, seed {seed}") + print( + f"Chain {self._chain}: Total available points: {len(positions)}, seed {seed}" + ) n_draws = len(positions) assert n_draws == len(positions) assert n_draws == len(gradients) @@ -593,9 +623,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: @@ -639,9 +669,13 @@ def update(self, seed, positions, gradients, logps): self._bijection, ) params, static = eqx.partition(flow, eqx.is_inexact_array) + + start = time.time() old_loss = self._loss_fn( params, static, positions[-128:], gradients[-128:], logps[-128:] ) + if self._verbose: + print("loss function time: ", time.time() - start) if np.isfinite(old_loss) and old_loss < -5 and self.index > 10: if self._verbose: @@ -656,6 +690,7 @@ def update(self, seed, positions, gradients, logps): gradients, logps, show_progress=self._show_progress, + verbose=self._verbose, optimizer=self._optimizer, batch_size=self._batch_size, opt_state=self._opt_state if self._reuse_opt_state else None, @@ -666,9 +701,13 @@ def update(self, seed, positions, gradients, logps): flowjax.distributions.StandardNormal(fit.shape), fit ) params, static = eqx.partition(flow, eqx.is_inexact_array) + + start = time.time() new_loss = self._loss_fn( params, static, positions[-128:], gradients[-128:], logps[-128:] ) + if self._verbose: + print("new loss function time: ", time.time() - start) if self._verbose: print(f"Chain {self._chain}: New loss {new_loss}, old loss {old_loss}") From c60e5abfb4e18c75b72693dffa7049f4a448744c Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Wed, 5 Mar 2025 12:00:11 +0100 Subject: [PATCH 64/64] Small doc changes --- docs/about.qmd | 8 ++++---- docs/nf-adapt.qmd | 22 +++++++++++++++++----- docs/pymc-usage.qmd | 18 ++++++++++++++++++ 3 files changed, 39 insertions(+), 9 deletions(-) diff --git a/docs/about.qmd b/docs/about.qmd index 4aa5d45..16fc02f 100644 --- a/docs/about.qmd +++ b/docs/about.qmd @@ -2,16 +2,16 @@ title: "About" --- -Nutpie is part of the PyMC organization, a collection of open source -probabilistic programming projects. The PyMC organization develops and maintains -tools for Bayesian statistical modeling and probabilistic machine learning. +Nutpie is part of the PyMC organization. The PyMC organization develops and +maintains tools for Bayesian statistical modeling and probabilistic machine +learning. Nutpie provides a high-performance implementation of the No-U-Turn Sampler (NUTS) that can be used with models defined in PyMC, Stan and other frameworks. It was created to enable faster and more efficient Bayesian inference while maintaining compatibility with existing probabilistic programming tools. -For more information about the PyMC organization and its projects, visit: +For more information about the PyMC organization, visit the following links: - [PyMC Website](https://www.pymc.io) - [PyMC GitHub Organization](https://github.com/pymc-devs) diff --git a/docs/nf-adapt.qmd b/docs/nf-adapt.qmd index f430483..61b9b44 100644 --- a/docs/nf-adapt.qmd +++ b/docs/nf-adapt.qmd @@ -15,7 +15,9 @@ by fitting a sequence of invertible transformations (the "flow") that maps the original parameter space to a space where the posterior is closer to a standard normal distribution. The flow is trained during warmup. -For more information about the algorithm, see the paper todo +For more information about the algorithm, see the (still work in progress) paper +[If only my posterior were normal: Introducing Fisher +HMC](https://github.com/aseyboldt/covadapt-paper/releases/download/latest/main.pdf). Currently, a lot of time is spent on compiling various parts of the normalizing flow, and for small models this can take a large amount of the total time. @@ -79,14 +81,24 @@ assert (arviz.ess(trace_no_nf) < 100).any().to_array().any() ```{python} # We can add further arguments for the normalizing flow: compiled = compiled.with_transform_adapt( - num_layers=5, # Use 5 layers in the normalizing flow - nn_width=32, # Use neural networks with 32 hidden units + num_layers=5, # Number of layers in the normalizing flow + nn_width=32, # Neural networks with 32 hidden units + num_diag_windows=6, # Number of windows with a diagonal mass matrix intead of a flow + verbose=False, # Whether to print details about the adaptation process + show_progress=False, # Whether to show a progress bar for each optimization step ) # Sample with normalizing flow adaptation -trace_nf = nutpie.sample(compiled, transform_adapt=True, seed=1, chains=2, cores=1) +trace_nf = nutpie.sample( + compiled, + transform_adapt=True, # Enable the normalizing flow adaptation + seed=1, + chains=2, + cores=1, # Running chains in parallel can be slow + window_switch_freq=150, # Optimize the normalizing flow every 150 iterations +) assert trace_nf.sample_stats.diverging.sum() == 0 -assert (arviz.ess(trace_nf) > 500).all().to_array().all() +assert (arviz.ess(trace_nf) > 1000).all().to_array().all() ``` The flow adaptation occurs during warmup, so the number of warmup draws should diff --git a/docs/pymc-usage.qmd b/docs/pymc-usage.qmd index e623eb4..56d81d7 100644 --- a/docs/pymc-usage.qmd +++ b/docs/pymc-usage.qmd @@ -78,6 +78,13 @@ compiled = nutpie.compile_pymc_model(model) trace = nutpie.sample(compiled) ``` +Alternatively, we can also sample through the `pymc` API: + +```python +with model: + trace = pm.sample(model, nuts_sampler="nutpie") +``` + While sampling, nutpie shows a progress bar for each chain. It also includes information about how each chain is doing: @@ -126,6 +133,17 @@ compiled_jax = nutpie.compiled_pymc_model(model, backend="jax") trace = nutpie.sample(compiled_jax) ``` +Or through the pymc API: + +```python +with model: + trace = pm.sample( + model, + nuts_sampler="nutpie", + nuts_sampler_kwargs={"backend": "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