From 4a2dcbe6589c0eb6552d32609c368094c21605b2 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Wed, 5 Mar 2025 13:55:04 +0100 Subject: [PATCH 1/8] feat: Add normalizing flow adaptation --- .gitignore | 13 + Cargo.lock | 884 +++++++++++++++-------- Cargo.toml | 25 +- pyproject.toml | 64 +- python/nutpie/compile_pymc.py | 29 +- python/nutpie/compile_stan.py | 16 +- python/nutpie/compiled_pyfunc.py | 25 +- python/nutpie/normalizing_flow.py | 1064 ++++++++++++++++++++++++++++ python/nutpie/sample.py | 48 +- python/nutpie/transform_adapter.py | 924 ++++++++++++++++++++++++ src/progress.rs | 6 +- src/pyfunc.rs | 213 +++++- src/pymc.rs | 13 +- src/stan.rs | 193 ++++- src/wrapper.rs | 921 ++++++++++++++++++------ tests/test_pymc.py | 27 + 16 files changed, 3808 insertions(+), 657 deletions(-) create mode 100644 python/nutpie/normalizing_flow.py create mode 100644 python/nutpie/transform_adapter.py diff --git a/.gitignore b/.gitignore index f0721f7..bffa4f4 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,20 @@ tvm_libs/* notebooks/*.stan notebooks/*.csv notebooks/*.hpp +notebooks/radon* perf.data* wheels .vscode/ *~ +.zed +.cargo +*traces* +.pyrightconfig.json +*.zarr +book +docs/_site +.quarto +example-iree +posteriordb +.quarto +docs/.quarto diff --git a/Cargo.lock b/Cargo.lock index 4fe15a5..d0ee235 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" @@ -10,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]] @@ -54,15 +71,15 @@ checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anyhow" -version = "1.0.95" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" +checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" [[package]] name = "arrow" -version = "52.2.0" +version = "54.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05048a8932648b63f21c37d88b552ccc8a65afb6dfe9fc9f30ce79174c2e7a85" +checksum = "dc208515aa0151028e464cc94a692156e945ce5126abd3537bb7fd6ba2143ed1" dependencies = [ "arrow-arith", "arrow-array", @@ -78,24 +95,23 @@ dependencies = [ [[package]] name = "arrow-arith" -version = "52.2.0" +version = "54.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d8a57966e43bfe9a3277984a14c24ec617ad874e4c0e1d2a1b083a39cfbf22c" +checksum = "e07e726e2b3f7816a85c6a45b6ec118eeeabf0b2a8c208122ad949437181f49a" dependencies = [ "arrow-array", "arrow-buffer", "arrow-data", "arrow-schema", "chrono", - "half", "num", ] [[package]] name = "arrow-array" -version = "52.2.0" +version = "54.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f4a9468c882dc66862cef4e1fd8423d47e67972377d85d80e022786427768c" +checksum = "a2262eba4f16c78496adfd559a29fe4b24df6088efc9985a873d58e92be022d5" dependencies = [ "ahash", "arrow-buffer", @@ -109,9 +125,9 @@ dependencies = [ [[package]] name = "arrow-buffer" -version = "52.2.0" +version = "54.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c975484888fc95ec4a632cdc98be39c085b1bb518531b0c80c5d462063e5daa1" +checksum = "4e899dade2c3b7f5642eb8366cfd898958bcca099cde6dfea543c7e8d3ad88d4" dependencies = [ "bytes", "half", @@ -120,9 +136,9 @@ dependencies = [ [[package]] name = "arrow-cast" -version = "52.2.0" +version = "54.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da26719e76b81d8bc3faad1d4dbdc1bcc10d14704e63dc17fc9f3e7e1e567c8e" +checksum = "4103d88c5b441525ed4ac23153be7458494c2b0c9a11115848fdb9b81f6f886a" dependencies = [ "arrow-array", "arrow-buffer", @@ -140,9 +156,9 @@ dependencies = [ [[package]] name = "arrow-data" -version = "52.2.0" +version = "54.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd9d6f18c65ef7a2573ab498c374d8ae364b4a4edf67105357491c031f716ca5" +checksum = "0a329fb064477c9ec5f0870d2f5130966f91055c7c5bce2b3a084f116bc28c3b" dependencies = [ "arrow-buffer", "arrow-schema", @@ -152,26 +168,23 @@ dependencies = [ [[package]] name = "arrow-ord" -version = "52.2.0" +version = "54.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42745f86b1ab99ef96d1c0bcf49180848a64fe2c7a7a0d945bc64fa2b21ba9bc" +checksum = "f841bfcc1997ef6ac48ee0305c4dfceb1f7c786fe31e67c1186edf775e1f1160" dependencies = [ "arrow-array", "arrow-buffer", "arrow-data", "arrow-schema", "arrow-select", - "half", - "num", ] [[package]] name = "arrow-row" -version = "52.2.0" +version = "54.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd09a518c602a55bd406bcc291a967b284cfa7a63edfbf8b897ea4748aad23c" +checksum = "1eeb55b0a0a83851aa01f2ca5ee5648f607e8506ba6802577afdda9d75cdedcd" dependencies = [ - "ahash", "arrow-array", "arrow-buffer", "arrow-data", @@ -181,18 +194,18 @@ dependencies = [ [[package]] name = "arrow-schema" -version = "52.2.0" +version = "54.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e972cd1ff4a4ccd22f86d3e53e835c2ed92e0eea6a3e8eadb72b4f1ac802cf8" +checksum = "85934a9d0261e0fa5d4e2a5295107d743b543a6e0484a835d4b8db2da15306f9" dependencies = [ "bitflags", ] [[package]] name = "arrow-select" -version = "52.2.0" +version = "54.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "600bae05d43483d216fb3494f8c32fdbefd8aa4e1de237e790dbb3d9f44690a3" +checksum = "7e2932aece2d0c869dd2125feb9bd1709ef5c445daa3838ac4112dcfa0fda52c" dependencies = [ "ahash", "arrow-array", @@ -204,9 +217,9 @@ dependencies = [ [[package]] name = "arrow-string" -version = "52.2.0" +version = "54.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dc1985b67cb45f6606a248ac2b4a288849f196bab8c657ea5589f47cdd55e6" +checksum = "912e38bd6a7a7714c1d9b61df80315685553b7455e8a6045c27531d8ecd5b458" dependencies = [ "arrow-array", "arrow-buffer", @@ -240,6 +253,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.71.1" @@ -255,16 +274,16 @@ dependencies = [ "proc-macro2", "quote", "regex", - "rustc-hash 2.1.1", + "rustc-hash", "shlex", - "syn 2.0.98", + "syn", ] [[package]] name = "bitflags" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" [[package]] name = "block-buffer" @@ -285,7 +304,7 @@ dependencies = [ "libloading", "log", "path-absolutize", - "thiserror 2.0.11", + "thiserror 2.0.12", ] [[package]] @@ -296,9 +315,9 @@ checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "bytemuck" -version = "1.21.0" +version = "1.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" +checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" dependencies = [ "bytemuck_derive", ] @@ -311,7 +330,7 @@ checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn", ] [[package]] @@ -322,9 +341,29 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.10.0" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "bzip2" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" +checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" +dependencies = [ + "bzip2-sys", + "libc", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.13+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" +dependencies = [ + "cc", + "pkg-config", +] [[package]] name = "cast" @@ -334,10 +373,12 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.14" +version = "1.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3d1b2e905a3a7b00a6141adb0e4c0bb941d11caf55349d863942a1cc44e3c9" +checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" dependencies = [ + "jobserver", + "libc", "shlex", ] @@ -395,6 +436,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" @@ -408,18 +459,18 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.30" +version = "4.5.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92b7b18d71fad5313a1e320fa9897994228ce274b60faa4d694fe0ea89cd9e6d" +checksum = "027bb0d98429ae334a8698531da7077bdf906419543a35a55c2cb1b66437d767" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.5.30" +version = "4.5.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a35db2071778a7344791a4fb4f95308b5673d219dee3ae348b86642574ecc90c" +checksum = "5589e0cba072e0f3d23791efac0fd8627b49c829c196a492e88168e6a669d863" dependencies = [ "anstyle", "clap_lex", @@ -431,17 +482,11 @@ 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" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea3c6ecd8059b57859df5c69830340ed3c41d30e3da0c1cbed90a96ac853041b" +checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" dependencies = [ "encode_unicode", "libc", @@ -465,11 +510,17 @@ 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", ] +[[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" @@ -485,6 +536,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" @@ -563,10 +623,13 @@ dependencies = [ ] [[package]] -name = "dbgf" -version = "0.1.2" +name = "deranged" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ca96b45ca70b8045e0462f191bd209fcb3c3bfe8dbfb1257ada54c4dd59169" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] [[package]] name = "digest" @@ -576,16 +639,7 @@ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", -] - -[[package]] -name = "dyn-stack" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e53799688f5632f364f8fb387488dd05db9fe45db7011be066fc20e7027f8b" -dependencies = [ - "bytemuck", - "reborrow", + "subtle", ] [[package]] @@ -599,9 +653,9 @@ dependencies = [ [[package]] name = "either" -version = "1.13.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "b7914353092ddf589ad78f25c5c1c21b7f80b0ff8621e7c814c3485b5306da9d" [[package]] name = "encode_unicode" @@ -615,10 +669,10 @@ 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.98", + "syn", ] [[package]] @@ -647,7 +701,7 @@ checksum = "3bf679796c0322556351f287a51b49e48f7c4986e727b5dd78c972d30e2e16cc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn", ] [[package]] @@ -658,59 +712,76 @@ checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn", ] [[package]] name = "faer" -version = "0.19.4" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64bc4855cb2792ae3520e8af22051a47a6d6dc8300ebc0ddf51ad73f65bd0dc9" +checksum = "d671941ab57443f46ebe3f153a9fc3ed6cce777926c14e5fdf5da178a35ea476" dependencies = [ "bytemuck", - "coe-rs", - "dbgf", - "dyn-stack 0.10.0", + "dyn-stack", "equator 0.4.2", - "faer-entity", + "faer-macros", + "faer-traits", "gemm", + "generativity", "libm", - "matrixcompare", - "matrixcompare-core", "nano-gemm", "npyz", "num-complex", "num-traits", - "paste", - "rand", - "rand_distr", - "rayon", + "pulp", "reborrow", - "serde", ] [[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", ] +[[package]] +name = "flate2" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + [[package]] name = "gemm" 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", @@ -730,7 +801,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", @@ -745,7 +816,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", @@ -761,16 +832,15 @@ 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", - "rayon", "seq-macro", "sysctl", ] @@ -781,7 +851,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", @@ -789,7 +859,6 @@ dependencies = [ "num-traits", "paste", "raw-cpuid", - "rayon", "seq-macro", ] @@ -799,7 +868,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", @@ -814,7 +883,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", @@ -823,6 +892,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" @@ -841,7 +916,19 @@ checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.13.3+wasi-0.2.2", + "windows-targets", ] [[package]] @@ -864,15 +951,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" - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" [[package]] name = "heck" @@ -886,6 +967,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 = "iana-time-zone" version = "0.1.61" @@ -924,9 +1014,18 @@ dependencies = [ [[package]] name = "indoc" -version = "2.0.5" +version = "2.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" +checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] [[package]] name = "is-terminal" @@ -968,9 +1067,18 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[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" @@ -982,11 +1090,17 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + [[package]] name = "lexical-core" -version = "0.8.5" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cde5de06e8d4c2faabc400238f9ae1c74d5412d03a7bd067645ccbc47070e46" +checksum = "b765c31809609075565a70b4b71402281283aeda7ecaf4818ac14a7b2ade8958" dependencies = [ "lexical-parse-float", "lexical-parse-integer", @@ -997,9 +1111,9 @@ dependencies = [ [[package]] name = "lexical-parse-float" -version = "0.8.5" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683b3a5ebd0130b8fb52ba0bdc718cc56815b6a097e28ae5a6997d0ad17dc05f" +checksum = "de6f9cb01fb0b08060209a057c048fcbab8717b4c1ecd2eac66ebfe39a65b0f2" dependencies = [ "lexical-parse-integer", "lexical-util", @@ -1008,9 +1122,9 @@ dependencies = [ [[package]] name = "lexical-parse-integer" -version = "0.8.6" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d0994485ed0c312f6d965766754ea177d07f9c00c9b82a5ee62ed5b47945ee9" +checksum = "72207aae22fc0a121ba7b6d479e42cbfea549af1479c3f3a4f12c70dd66df12e" dependencies = [ "lexical-util", "static_assertions", @@ -1018,18 +1132,18 @@ dependencies = [ [[package]] name = "lexical-util" -version = "0.8.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5255b9ff16ff898710eb9eb63cb39248ea8a5bb036bea8085b1a767ff6c4e3fc" +checksum = "5a82e24bf537fd24c177ffbbdc6ebcc8d54732c35b50a3f28cc3f4e4c949a0b3" dependencies = [ "static_assertions", ] [[package]] name = "lexical-write-float" -version = "0.8.5" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accabaa1c4581f05a3923d1b4cfd124c329352288b7b9da09e766b0668116862" +checksum = "c5afc668a27f460fb45a81a757b6bf2f43c2d7e30cb5a2dcd3abf294c78d62bd" dependencies = [ "lexical-util", "lexical-write-integer", @@ -1038,9 +1152,9 @@ dependencies = [ [[package]] name = "lexical-write-integer" -version = "0.8.5" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1b6f3d1f4422866b68192d62f77bc5c700bee84f3069f2469d7bc8c77852446" +checksum = "629ddff1a914a836fb245616a7888b62903aae58fa771e1d83943035efa0f978" dependencies = [ "lexical-util", "static_assertions", @@ -1048,9 +1162,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.169" +version = "0.2.170" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" [[package]] name = "libloading" @@ -1068,37 +1182,11 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" -[[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.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" - -[[package]] -name = "matrixcompare" -version = "0.3.0" +version = "0.4.26" 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" +checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" [[package]] name = "matrixmultiply" @@ -1131,11 +1219,20 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +[[package]] +name = "miniz_oxide" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" +dependencies = [ + "adler2", +] + [[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", @@ -1143,13 +1240,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", ] @@ -1225,14 +1322,16 @@ dependencies = [ [[package]] name = "ndarray" -version = "0.15.6" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32" +checksum = "882ed72dce9365842bf196bdeedf5055305f11fc8c03dee7bb0194a6cad34841" dependencies = [ "matrixmultiply", "num-complex", "num-integer", "num-traits", + "portable-atomic", + "portable-atomic-util", "rawpointer", ] @@ -1289,9 +1388,14 @@ checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ "bytemuck", "num-traits", - "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" @@ -1341,9 +1445,9 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] name = "numpy" -version = "0.21.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec170733ca37175f5d75a5bea5911d6ff45d2cd52849ce98b685394e4f2f37f4" +checksum = "b94caae805f998a07d33af06e6a3891e38556051b8045c615470a71590e13e78" dependencies = [ "libc", "ndarray", @@ -1351,12 +1455,12 @@ dependencies = [ "num-integer", "num-traits", "pyo3", - "rustc-hash 1.1.0", + "rustc-hash", ] [[package]] name = "nutpie" -version = "0.13.4" +version = "0.14.0" dependencies = [ "anyhow", "arrow", @@ -1367,33 +1471,34 @@ dependencies = [ "numpy", "nuts-rs", "pyo3", - "rand", - "rand_chacha", + "rand 0.9.0", + "rand_chacha 0.9.0", "rand_distr", "rayon", "smallvec", - "thiserror 1.0.69", + "tch", + "thiserror 2.0.12", "time-humanize", "upon", ] [[package]] name = "nuts-rs" -version = "0.12.1" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8573e3b5c83e8ec0570ebbd75dd6fdc7dfcfa5da9b5f9d9d63fedefebbd9cf8" +checksum = "10e87924d332fce1202087bc67db7ed8f7ef9229da5ec74a5130568f5b7f6ac7" dependencies = [ "anyhow", "arrow", "faer", - "itertools 0.13.0", + "itertools 0.14.0", "multiversion", - "pulp 0.18.22", - "rand", - "rand_chacha", + "pulp", + "rand 0.9.0", + "rand_chacha 0.9.0", "rand_distr", "rayon", - "thiserror 1.0.69", + "thiserror 2.0.12", ] [[package]] @@ -1409,26 +1514,14 @@ 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" +name = "password-hash" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets", + "base64ct", + "rand_core 0.6.4", + "subtle", ] [[package]] @@ -1455,6 +1548,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.15" @@ -1462,7 +1567,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" dependencies = [ "memchr", - "thiserror 2.0.11", + "thiserror 2.0.12", "ucd-trie", ] @@ -1486,7 +1591,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.98", + "syn", ] [[package]] @@ -1500,6 +1605,12 @@ dependencies = [ "sha2", ] +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + [[package]] name = "plotters" version = "0.3.7" @@ -1530,9 +1641,24 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.10.0" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" + +[[package]] +name = "portable-atomic-util" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" @@ -1540,40 +1666,28 @@ 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.29" +version = "0.2.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" +checksum = "f1ccf34da56fc294e7d4ccf69a85992b7dfb826b7cf57bac6a70bba3494cc08a" dependencies = [ "proc-macro2", - "syn 2.0.98", + "syn", ] [[package]] name = "proc-macro2" -version = "1.0.93" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" dependencies = [ "unicode-ident", ] -[[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.21.4" @@ -1603,16 +1717,16 @@ dependencies = [ [[package]] name = "pyo3" -version = "0.21.2" +version = "0.23.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e00b96a521718e08e03b1a622f01c8a8deb50719335de3f60b3b3950f069d8" +checksum = "7778bffd85cf38175ac1f545509665d0b9b92a198ca7941f131f85f7a4f9a872" dependencies = [ "anyhow", "cfg-if", "indoc", "libc", "memoffset", - "parking_lot", + "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", @@ -1622,9 +1736,9 @@ dependencies = [ [[package]] name = "pyo3-build-config" -version = "0.21.2" +version = "0.23.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7883df5835fafdad87c0d888b266c8ec0f4c9ca48a5bed6bbb592e8dedee1b50" +checksum = "94f6cbe86ef3bf18998d9df6e0f3fc1050a8c5efa409bf712e661a4366e010fb" dependencies = [ "once_cell", "target-lexicon", @@ -1632,9 +1746,9 @@ dependencies = [ [[package]] name = "pyo3-ffi" -version = "0.21.2" +version = "0.23.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01be5843dc60b916ab4dad1dca6d20b9b4e6ddc8e15f50c47fe6d85f1fb97403" +checksum = "e9f1b4c431c0bb1c8fb0a338709859eed0d030ff6daa34368d3b152a63dfdd8d" dependencies = [ "libc", "pyo3-build-config", @@ -1642,34 +1756,34 @@ dependencies = [ [[package]] name = "pyo3-macros" -version = "0.21.2" +version = "0.23.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77b34069fc0682e11b31dbd10321cbf94808394c56fd996796ce45217dfac53c" +checksum = "fbc2201328f63c4710f68abdf653c89d8dbc2858b88c5d88b0ff38a75288a9da" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", - "syn 2.0.98", + "syn", ] [[package]] name = "pyo3-macros-backend" -version = "0.21.2" +version = "0.23.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08260721f32db5e1a5beae69a55553f56b99bd0e1c3e6e0a5e8851a9d0f5a85c" +checksum = "fca6726ad0f3da9c9de093d6f116a93c1a38e417ed73bf138472cf4064f72028" dependencies = [ - "heck 0.4.1", + "heck", "proc-macro2", "pyo3-build-config", "quote", - "syn 2.0.98", + "syn", ] [[package]] name = "quote" -version = "1.0.38" +version = "1.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +checksum = "c1f1914ce909e1658d9907913b4b91947430c7d9be598b15a1912935b8c04801" dependencies = [ "proc-macro2", ] @@ -1681,8 +1795,19 @@ 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]] +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.3", + "zerocopy 0.8.21", ] [[package]] @@ -1692,7 +1817,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.3", ] [[package]] @@ -1701,24 +1836,33 @@ 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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.1", ] [[package]] name = "rand_distr" -version = "0.4.3" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" +checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463" dependencies = [ "num-traits", - "rand", + "rand 0.9.0", ] [[package]] name = "raw-cpuid" -version = "11.4.0" +version = "11.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "529468c1335c1c03919960dfefdb1b3648858c20d7ec2d0663e728e4a717efbc" +checksum = "c6df7ab838ed27997ba19a4664507e6f82b41fe6e20be42929332156e5e85146" dependencies = [ "bitflags", ] @@ -1755,15 +1899,6 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430" -[[package]] -name = "redox_syscall" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" -dependencies = [ - "bitflags", -] - [[package]] name = "regex" version = "1.11.1" @@ -1793,12 +1928,6 @@ 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.1" @@ -1807,15 +1936,25 @@ checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" [[package]] name = "rustversion" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" [[package]] name = "ryu" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[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" @@ -1826,43 +1965,37 @@ 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" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3f0bf26fd526d2a95683cd0f87bf103b8539e2ca1ef48ce002d67aad59aa0b4" +checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" [[package]] name = "serde" -version = "1.0.217" +version = "1.0.218" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" +checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.217" +version = "1.0.218" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" +checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn", ] [[package]] name = "serde_json" -version = "1.0.138" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", "memchr", @@ -1870,6 +2003,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" @@ -1900,21 +2044,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] -name = "syn" -version = "1.0.109" +name = "subtle" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.98" +version = "2.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" +checksum = "e02e925281e18ffd9d640e234264753c43edc62d64b2d4cf898f1bc5e75f3fc2" dependencies = [ "proc-macro2", "quote", @@ -1947,6 +2086,23 @@ version = "0.12.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" +[[package]] +name = "tch" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa1ed622c8f13b0c42f8b1afa0e5e9ccccd82ecb6c0e904120722ab52fdc5234" +dependencies = [ + "half", + "lazy_static", + "libc", + "ndarray", + "rand 0.8.5", + "safetensors", + "thiserror 1.0.69", + "torch-sys", + "zip", +] + [[package]] name = "thiserror" version = "1.0.69" @@ -1958,11 +2114,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.11" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" dependencies = [ - "thiserror-impl 2.0.11", + "thiserror-impl 2.0.12", ] [[package]] @@ -1973,20 +2129,39 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn", ] [[package]] name = "thiserror-impl" -version = "2.0.11" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn", +] + +[[package]] +name = "time" +version = "0.3.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb041120f25f8fbe8fd2dbe4671c7c2ed74d83be2e7a77529bf7e0790ae3f472" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde", + "time-core", ] +[[package]] +name = "time-core" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "765c97a5b985b7c11d7bc27fa927dc4fe6af3a6dfb021d28deb60d3bf51e76ef" + [[package]] name = "time-humanize" version = "0.1.3" @@ -2012,6 +2187,18 @@ dependencies = [ "serde_json", ] +[[package]] +name = "torch-sys" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef14f5d239e3d60f4919f536a5dfe1d4f71b27b7abf6fe6875fd3a4b22c2dcd5" +dependencies = [ + "anyhow", + "cc", + "libc", + "zip", +] + [[package]] name = "typenum" version = "1.18.0" @@ -2026,9 +2213,9 @@ checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "unicode-ident" -version = "1.0.16" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-width" @@ -2038,15 +2225,15 @@ checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" [[package]] name = "unindent" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7de7d73e1754487cb58364ee906a499937a0dfabd86bcb980fa99ec8c8fa2ce" +checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3" [[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" @@ -2070,6 +2257,15 @@ 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.100" @@ -2092,7 +2288,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.98", + "syn", "wasm-bindgen-shared", ] @@ -2114,7 +2310,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2239,6 +2435,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" @@ -2246,7 +2451,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.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf01143b2dd5d134f11f545cf9f1431b13b749695cb33bcce051e7568f99478" +dependencies = [ + "zerocopy-derive 0.8.21", ] [[package]] @@ -2257,5 +2471,65 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712c8386f4f4299382c9abee219bee7084f78fb939d88b6840fcc1320d5f6da2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[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.14+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fb060d4926e4ac3a3ad15d864e99ceb5f343c6b34f5bd6d81ae6ed417311be5" +dependencies = [ + "cc", + "pkg-config", ] diff --git a/Cargo.toml b/Cargo.toml index cc452c4..587aa2f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nutpie" -version = "0.13.4" +version = "0.14.0" authors = [ "Adrian Seyboldt ", "PyMC Developers ", @@ -22,25 +22,26 @@ name = "_lib" crate-type = ["cdylib"] [dependencies] -nuts-rs = "0.12.1" -numpy = "0.21.0" -rand = "0.8.5" -thiserror = "1.0.44" -rand_chacha = "0.3.1" -rayon = "1.9.0" +nuts-rs = "0.15.0" +numpy = "0.23.0" +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 = "52.0.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" -smallvec = "1.11.0" -upon = { version = "0.8.1", default-features = false, features = [] } +rand_distr = "0.5.0" +smallvec = "1.13.0" +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.19.0", optional = true } [dependencies.pyo3] -version = "0.21.0" +version = "0.23.4" features = ["extension-module", "anyhow"] [dev-dependencies] diff --git a/pyproject.toml b/pyproject.toml index 6ef4dff..12c5445 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,17 +2,12 @@ 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" 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", @@ -32,56 +27,41 @@ 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.1.0", "equinox >= 0.11.12"] +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.1.0", + "equinox >= 0.11.12", ] [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"] diff --git a/python/nutpie/compile_pymc.py b/python/nutpie/compile_pymc.py index 53f3176..9daec90 100644 --- a/python/nutpie/compile_pymc.py +++ b/python/nutpie/compile_pymc.py @@ -7,7 +7,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 @@ -274,7 +274,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) @@ -287,7 +287,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) @@ -377,14 +377,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 = {} @@ -396,9 +406,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]) @@ -407,7 +414,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 @@ -433,6 +441,7 @@ def expand(x, **shared): shared_data=shared_data, dims=dims, coords=coords, + raw_logp_fn=orig_logp_fn, ) @@ -635,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) @@ -726,7 +735,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/compile_stan.py b/python/nutpie/compile_stan.py index 7a28052..138652d 100644 --- a/python/nutpie/compile_stan.py +++ b/python/nutpie/compile_stan.py @@ -1,6 +1,7 @@ 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 @@ -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 fb6553d..304d50f 100644 --- a/python/nutpie/compiled_pyfunc.py +++ b/python/nutpie/compiled_pyfunc.py @@ -5,8 +5,9 @@ import numpy as np -from nutpie import _lib +from nutpie import _lib # type: ignore from nutpie.sample import CompiledModel +from nutpie.transform_adapter import make_transform_adapter SeedType = int @@ -20,6 +21,8 @@ class PyFuncModel(CompiledModel): _n_dim: int _variables: list[_lib.PyVariable] _coords: dict[str, Any] + _raw_logp_fn: Callable | None + _transform_adapt_args: dict | None = None @property def shapes(self) -> dict[str, tuple[int, ...]]: @@ -42,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( @@ -60,12 +66,24 @@ 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._raw_logp_fn is not None: + 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 + return _lib.PyModel( make_logp_func, make_expand_func, self._variables, self.n_dim, - self._make_initial_points, + init_point_func=self._make_initial_points, + transform_adapter=make_adapter, ) @@ -81,6 +99,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 = None, + make_transform_adapter=None, + raw_logp_fn=None, ): variables = [] for name, shape, dtype in zip( @@ -111,4 +131,5 @@ def from_pyfunc( _make_initial_points=make_initial_point_fn, _variables=variables, _shared_data=shared_data, + _raw_logp_fn=raw_logp_fn, ) diff --git a/python/nutpie/normalizing_flow.py b/python/nutpie/normalizing_flow.py new file mode 100644 index 0000000..e92f7b0 --- /dev/null +++ b/python/nutpie/normalizing_flow.py @@ -0,0 +1,1064 @@ +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 NonTrainable, Parameterize +from equinox.nn import Linear +from paramax.wrappers import AbstractUnwrappable + + +_NN_ACTIVATION = jax.nn.gelu + + +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) + + +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 `()`. + """ + 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) + 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 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 + 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(())) + + 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() + # 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(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.0, 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.0, 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() + # x, jac = jax.value_and_grad(inverse, argnums=0)(y, mu, sigma, theta) + # return x, jnp.log(jac) + + +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 = 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 = 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 bijections.Invert(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_coupling(key, dim, n_untransformed, *, inner_mvscale=False, **kwargs): + n_transformed = dim - n_untransformed + + nn_width = kwargs.get("nn_width", None) + nn_depth = kwargs.get("nn_depth", None) + + if nn_width is None: + if dim > 128: + nn_width = (64, 2 * dim) + else: + nn_width = 2 * dim + + if nn_depth is None: + if isinstance(nn_width, int): + nn_depth = 1 + else: + nn_depth = len(nn_width) + + 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): + out = (nn_width[0], out_size) + else: + out = out_size + + return FactoredMLP( + n_untransformed, + out, + nn_width, + depth=nn_depth, + key=key, + dtype=jnp.float32, + activation=_NN_ACTIVATION, + ) + + return Coupling( + key, + transformer=transformer, + untransformed_dim=n_untransformed, + dim=dim, + conditioner=make_mlp, + **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, + nn_depth=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) + + 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=_NN_ACTIVATION, + nn_width=nn_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, + ) + + flow = coupling + + if householder_layer: + hh = make_hh(key_hh, n_dim, 1, randomize_base=False) + flow = bijections.Sandwich(flow, hh) + + 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(bijection, outer) + + if permutation is None: + flow = add_default_permute(flow, n_dim, key_permute) + else: + flow = bijections.Sandwich(flow, bijections.Permute(permutation)) + + 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(inner, outer)) + + 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, + nn_width=None, + nn_depth=None, +): + 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=_NN_ACTIVATION, + 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=_NN_ACTIVATION, + 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(coupling, inner_permute) + + 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=_NN_ACTIVATION, + 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( + bijections.Chain( + [ + 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,)), + ) + else: + new_layer = bijections.Sandwich(inner, permute) + + 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( + affine, + bijections.Chain( + [ + *pre, + bijections.Vmap(bijections.SoftPlusX(), axis_size=n_dim), + ] + ), + ) + 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/sample.py b/python/nutpie/sample.py index 6c5bfc6..356b8d0 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 ( @@ -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,14 +455,15 @@ 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], 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], @@ -472,14 +475,15 @@ 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], 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], @@ -490,14 +494,15 @@ 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, 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, @@ -510,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. @@ -585,6 +590,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,12 +602,22 @@ 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 + + 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(): @@ -608,10 +626,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) diff --git a/python/nutpie/transform_adapter.py b/python/nutpie/transform_adapter.py new file mode 100644 index 0000000..30ca9a6 --- /dev/null +++ b/python/nutpie/transform_adapter.py @@ -0,0 +1,924 @@ +from functools import partial +from typing import Callable +import time + +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, NonTrainable + +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, + verbose: bool = False, +): + 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 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 = [] + + 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, + 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): + 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)) + + 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 + + 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_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_and_log_det(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 + 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): + draw, grad, logp = 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 = inverse_gradient_and_val(bijection, 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()) + + else: + + def transform(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 + ) + 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, opt_state = fit_to_data( + key=train_key, + dist=flow, + x=(draws, grads, logps), + loss_fn=loss_fn, + max_epochs=500, + return_best=True, + **kwargs, + ) + return fit.bijection, losses, opt_state + + +@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 = inverse_gradient_and_val( + bijection, 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, + 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, + ): + 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 + ) + 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)}, seed {seed}" + ) + 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(new_loss): + self._bijection = fit + self._opt_state = None + + 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 :]) + + 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=self._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[-128:], + gradients[-128:], + logps[-128:], + ), + ) + 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 + + if self._debug_save_bijection: + _BIJECTION_TRACE.append( + (self.index, fit, (positions, gradients, logps)) + ) + return + + flow = flowjax.flows.Transformed( + flowjax.distributions.StandardNormal(self._bijection.shape), + 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: + 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, + verbose=self._verbose, + 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( + 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}") + + 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, + ) + ) + + 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() + ) + + 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 np.isfinite(new_loss): + if self._verbose: + print("Invalid new loss. Skipping update.") + return + + if new_loss > old_loss: + return + + self._bijection = fit + self._opt_state = opt_state + + 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 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, + window_size=window_size, + make_flow_fn=partial( + make_flow, + householder_layer=householder_layer, + dct_layer=dct_layer, + nn_width=nn_width, + ), + 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, + 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, + ) 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 f914974..f23145e 100644 --- a/src/pyfunc.rs +++ b/src/pyfunc.rs @@ -8,9 +8,10 @@ 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::{ + exceptions::PyRuntimeError, pyclass, pymethods, types::{PyAnyMethods, PyDict, PyDictMethods}, Bound, Py, PyAny, PyErr, Python, @@ -20,6 +21,8 @@ use rand_distr::{Distribution, Uniform}; use smallvec::SmallVec; use thiserror::Error; +use crate::wrapper::PyTransformAdapt; + #[pyclass] #[derive(Debug, Clone)] #[non_exhaustive] @@ -71,29 +74,33 @@ impl PyVariable { #[pyclass] #[derive(Debug, Clone)] pub struct PyModel { - make_logp_func: Py, - make_expand_func: Py, - init_point_func: Option>, - variables: Vec, + make_logp_func: Arc>, + make_expand_func: Arc>, + init_point_func: Option>>, + variables: Arc>, + transform_adapter: Option, ndim: usize, } #[pymethods] impl PyModel { #[new] + #[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, variables: Vec, ndim: usize, init_point_func: Option>, + 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: init_point_func.map(|x| x.into()), + variables: Arc::new(variables), ndim, + transform_adapter: transform_adapter.map(PyTransformAdapt::new), } } } @@ -103,9 +110,13 @@ 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), + #[error("Unknown error: {0}")] + Anyhow(#[from] anyhow::Error), } impl LogpError for PyLogpError { @@ -113,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 @@ -121,20 +132,29 @@ impl LogpError for PyLogpError { .expect("Could not access is_recoverable in error check"); }), Self::ReturnTypeError() => false, + Self::NotContiguousError(_) => false, + Self::Anyhow(_) => 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<&PyTransformAdapt>, + ) -> Result { let logp_func = Python::with_gil(|py| logp_clone_func.call0(py))?; + let transform_adapter = transform_adapter.map(|val| val.clone()); Ok(Self { logp: logp_func, + transform_adapter, dim, }) } @@ -142,10 +162,11 @@ 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| { - 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) => { @@ -172,11 +193,122 @@ impl CpuLogpFunc for PyDensity { fn dim(&self) -> usize { self.dim } + + 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, + )?; + 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 (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: &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, 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>( + &'a mut self, + 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 + .as_mut() + .ok_or_else(|| PyRuntimeError::new_err("No transformation adapter specified"))? + .update_transformation( + rng, + untransformed_positions, + untransformed_gradients, + untransformed_logp, + params, + )?; + 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)?; + 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, } @@ -184,7 +316,7 @@ impl PyTrace { pub fn new( rng: &mut R, chain: u64, - variables: Vec, + variables: Arc>, make_expand_func: &Py, capacity: usize, ) -> Result { @@ -234,6 +366,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() { @@ -318,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,)) @@ -344,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 LargeListBuilder> = self.builder.field_builder(i).context( "Builder has incorrect type. Expected LargeListBuilder of Bool", )?; - 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"); @@ -387,7 +535,11 @@ impl DrawStorage for PyTrace { self.builder.field_builder(i).context( "Builder has incorrect type. Expected LargeListBuilder of Float64", )?; - 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"); @@ -400,7 +552,11 @@ impl DrawStorage for PyTrace { self.builder.field_builder(i).context( "Builder has incorrect type. Expected LargeListBuilder of Float32", )?; - 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"); @@ -413,7 +569,11 @@ impl DrawStorage for PyTrace { self.builder.field_builder(i).context( "Builder has incorrect type. Expected LargeListBuilder of Int64", )?; - 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"); @@ -471,6 +631,7 @@ impl Model for PyModel { Ok(CpuMath::new(PyDensity::new( &self.make_logp_func, self.ndim, + self.transform_adapter.as_ref(), )?)) } @@ -480,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/pymc.rs b/src/pymc.rs index 98426c7..b33b821 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, } @@ -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 @@ -233,7 +234,7 @@ pub(crate) struct PyMcModel { dim: usize, density: LogpFunc, expand: ExpandFunc, - init_func: Py, + init_func: Arc>, var_sizes: Vec, var_names: Vec, } @@ -253,7 +254,7 @@ impl PyMcModel { dim, density, expand, - init_func, + init_func: init_func.into(), var_names: var_names.extract()?, var_sizes: var_sizes.extract()?, }) diff --git a/src/stan.rs b/src/stan.rs index 0564cd2..e258096 100644 --- a/src/stan.rs +++ b/src/stan.rs @@ -7,16 +7,19 @@ 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}; use rand::prelude::Distribution; -use rand::{thread_rng, RngCore}; +use rand::{rng, RngCore}; use rand_distr::StandardNormal; use smallvec::{SmallVec, ToSmallVec}; use thiserror::Error; +use crate::wrapper::PyTransformAdapt; + type InnerModel = bridgestan::Model>; #[pyclass] @@ -53,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] @@ -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,25 +140,41 @@ 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(), + None => rng().next_u32(), }; let data: Option = data.map(CString::new).transpose()?; let model = Arc::new( 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> { - 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) @@ -195,7 +215,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 +226,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,9 +240,12 @@ impl LogpError for StanLogpError { impl<'model> CpuLogpFunc for StanDensity<'model> { type LogpError = StanLogpError; + 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)); } @@ -223,7 +253,143 @@ 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, + untransformed_logp: 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, + untransformed_logp, + 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) } } @@ -387,7 +553,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 6f9ad49..bb1a523 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}, }; @@ -13,17 +14,19 @@ use crate::{ use anyhow::{bail, Context, Result}; use arrow::array::Array; +use numpy::{PyArray1, PyReadonlyArray1}; 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, ffi::Py_uintptr_t, + intern, prelude::*, types::{PyList, PyTuple}, }; -use rand::{thread_rng, RngCore}; +use rand::{rng, RngCore}; #[pyclass] struct PyChainProgress(ChainProgress); @@ -66,100 +69,23 @@ 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(); + let mut rng = rng(); rng.next_u64() }); let settings = DiagGradNutsSettings { @@ -167,17 +93,14 @@ impl PyNutsSettings { ..Default::default() }; - let (settings, inner) = split_settings(settings); - Self { - settings, - adapt: InnerSettings::Diag(inner), + inner: Settings::Diag(settings), } } 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 { @@ -185,229 +108,467 @@ 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 = 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] #[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) + } + #[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(nuts_settings) => { + Ok(nuts_settings.adapt_options.transform_update_freq) + } + } } #[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(nuts_settings) => { + nuts_settings.adapt_options.transform_update_freq = val; + Ok(()) + } + } } #[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(()) + } + Settings::Diag(settings) => { + settings.adapt_options.mass_matrix_options.store_mass_matrix = val; + Ok(()) } - InnerSettings::Diag(diag) => { - diag.store_mass_matrix = val; + 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"); + } + Settings::Transforming(_) => { + bail!("non-grad based mass matrix not available for transforming adaptation"); } - InnerSettings::Diag(diag) => { - diag.use_grad_based_estimate = val; + 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,21 +576,56 @@ 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(()) + } + + #[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(()) } @@ -442,13 +638,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, @@ -456,10 +651,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, @@ -470,11 +669,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), } } } @@ -484,28 +683,28 @@ 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, - } + }) } } #[pyclass] -struct PySampler(SamplerState); +struct PySampler(Mutex); #[pymethods] impl PySampler { @@ -517,14 +716,18 @@ 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))) + 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).into())) } } } @@ -537,14 +740,18 @@ 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))) + 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).into())) } } } @@ -557,38 +764,45 @@ 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))) + 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).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()) } } @@ -597,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(()) @@ -606,24 +825,33 @@ 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(()) }) } + #[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(()); }; @@ -664,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"))?; }; @@ -703,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, @@ -712,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"))?; }; @@ -723,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(); @@ -755,12 +990,252 @@ 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] +#[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(py, untransformed_position); + let untransformed_gradient = PyArray1::from_slice(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(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(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(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(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, + untransformed_logp: impl ExactSizeIterator, + params: &'a mut Py, + ) -> Result<()> { + Python::with_gil(|py| { + let positions = PyList::new( + py, + untransformed_positions.map(|pos| PyArray1::from_slice(py, pos)), + )?; + let gradients = PyList::new( + py, + untransformed_gradients.map(|grad| PyArray1::from_slice(py, grad)), + )?; + + let logps = PyArray1::from_iter(py, untransformed_logp.copied()); + let seed = rng.next_u64(); + + params + .getattr(py, intern!(py, "update"))? + .call1(py, (seed, positions, gradients, logps))?; + 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(py, untransformed_position); + let gradient = PyArray1::from_slice(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. diff --git a/tests/test_pymc.py b/tests/test_pymc.py index a586e24..4d77652 100644 --- a/tests/test_pymc.py +++ b/tests/test_pymc.py @@ -1,6 +1,7 @@ import numpy as np import pymc as pm import pytest +from scipy import stats import nutpie import nutpie.compile_pymc @@ -243,6 +244,32 @@ def test_pymc_var_names(backend, gradient_backend): assert not hasattr(trace.posterior, "c") +def test_normalizing_flow(): + with pm.Model() as model: + pm.HalfNormal("x", shape=2) + + compiled = nutpie.compile_pymc_model( + model, backend="jax", gradient_backend="jax" + ).with_transform_adapt( + num_diag_windows=6, + ) + trace = nutpie.sample( + compiled, + chains=1, + transform_adapt=True, + window_switch_freq=150, + tune=400, + seed=1, + ) + draws = trace.posterior.x.isel(x_dim_0=0, chain=0) + kstest = stats.ks_1samp(draws, stats.halfnorm.cdf) + assert kstest.pvalue > 0.01 + + draws = trace.posterior.x.isel(x_dim_0=1, chain=0) + kstest = stats.ks_1samp(draws, stats.halfnorm.cdf) + assert kstest.pvalue > 0.01 + + @pytest.mark.parametrize( ("backend", "gradient_backend"), [ From 392f6d0dcd0c0ad0f17bc35a114f8b13cd0b952c Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Wed, 5 Mar 2025 13:57:24 +0100 Subject: [PATCH 2/8] docs: add nutpie website source --- docs/_quarto.yml | 34 ++++++ docs/about.qmd | 17 +++ docs/index.qmd | 90 +++++++++++++++ docs/nf-adapt.qmd | 139 +++++++++++++++++++++++ docs/pymc-usage.qmd | 195 ++++++++++++++++++++++++++++++++ docs/sample-stats.qmd | 221 ++++++++++++++++++++++++++++++++++++ docs/sampling-options.qmd | 156 ++++++++++++++++++++++++++ docs/stan-usage.qmd | 230 ++++++++++++++++++++++++++++++++++++++ docs/styles.css | 1 + 9 files changed, 1083 insertions(+) create mode 100644 docs/_quarto.yml create mode 100644 docs/about.qmd create mode 100644 docs/index.qmd create mode 100644 docs/nf-adapt.qmd create mode 100644 docs/pymc-usage.qmd create mode 100644 docs/sample-stats.qmd create mode 100644 docs/sampling-options.qmd create mode 100644 docs/stan-usage.qmd create mode 100644 docs/styles.css diff --git a/docs/_quarto.yml b/docs/_quarto.yml new file mode 100644 index 0000000..bf0f442 --- /dev/null +++ b/docs/_quarto.yml @@ -0,0 +1,34 @@ +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 + tools: + - icon: github + href: https://github.com/pymc-devs/nutpie + +format: + html: + theme: + - cosmo + - brand + css: styles.css + toc: true + +execute: + freeze: auto diff --git a/docs/about.qmd b/docs/about.qmd new file mode 100644 index 0000000..16fc02f --- /dev/null +++ b/docs/about.qmd @@ -0,0 +1,17 @@ +--- +title: "About" +--- + +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, visit the following links: + +- [PyMC Website](https://www.pymc.io) +- [PyMC GitHub Organization](https://github.com/pymc-devs) diff --git a/docs/index.qmd b/docs/index.qmd new file mode 100644 index 0000000..6de4796 --- /dev/null +++ b/docs/index.qmd @@ -0,0 +1,90 @@ +# 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: PyMC + +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) +``` + +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: + +```bash +# One of +pip install "nutpie[stan]" +uv add "nutpie[stan]" +``` + +```{python} +#| echo: false +import os +os.environ["TBB_CXX_TYPE"] = "clang" +``` + +```{python} +import nutpie + +model = """ +data { + int N; + vector[N] y; +} +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) +``` + +For more information, see the detailed [Stan usage guide](stan-usage.qmd). diff --git a/docs/nf-adapt.qmd b/docs/nf-adapt.qmd new file mode 100644 index 0000000..7900c5d --- /dev/null +++ b/docs/nf-adapt.qmd @@ -0,0 +1,139 @@ +# 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 (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. +Hopefully, we will be able to reduce this overhead in the future. + +## Requirements + +Install the optional dependencies for normalizing flow adaptation: + +``` +pip install 'nutpie[nnflow]' +``` + +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 +import arviz + +# Define a 100-dimensional funnel model +with pm.Model() as model: + log_sigma = pm.Normal("log_sigma") + 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( + model, backend="jax", gradient_backend="jax" +) +``` + +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, 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=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, # 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) > 1000).all().to_array().all() +``` + +The sampler used fewer gradient evaluations with the normalizing flow adaptation, +but still converged, and produce a good effective sample size: + +```{python} +n_steps = int(trace_nf.sample_stats.n_steps.sum() + trace_nf.warmup_sample_stats.n_steps.sum()) +ess = float(arviz.ess(trace_nf).min().to_array().min()) +print(f"Number of gradient evaluations: {n_steps}") +print(f"Minimum effective sample size: {ess}") +``` + +Without normalizing flow, it used more gradient evaluations, and still wasn't able +to get a good effective sample size: + +```{python} +n_steps = int(trace_no_nf.sample_stats.n_steps.sum() + trace_no_nf.warmup_sample_stats.n_steps.sum()) +ess = float(arviz.ess(trace_no_nf).min().to_array().min()) +print(f"Number of gradient evaluations: {n_steps}") +print(f"Minimum effective sample size: {ess}") +``` + +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. diff --git a/docs/pymc-usage.qmd b/docs/pymc-usage.qmd new file mode 100644 index 0000000..56d81d7 --- /dev/null +++ b/docs/pymc-usage.qmd @@ -0,0 +1,195 @@ +# 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 + 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} +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: + +- 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 take 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) +``` + +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 + +```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() 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 + y = pm.Normal("y", mu=mu, sigma=0.1, 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/sample-stats.qmd b/docs/sample-stats.qmd new file mode 100644 index 0000000..7cf92c9 --- /dev/null +++ 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") +) +``` diff --git a/docs/sampling-options.qmd b/docs/sampling-options.qmd new file mode 100644 index 0000000..270fe69 --- /dev/null +++ b/docs/sampling-options.qmd @@ -0,0 +1,156 @@ +# 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 + max_energy_error=1000 # Error at witch to count the trajectory as a divergent transition +) +``` + +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. + +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 +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 +) +``` 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 */ From d4daf19766b9fd250cd0266e928a9a2fdc866872 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Wed, 5 Mar 2025 13:58:09 +0100 Subject: [PATCH 3/8] ci: run python 3.13 in ci --- .github/workflows/ci.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bbf2c71..b3edeb2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -34,7 +34,7 @@ jobs: 3.10 3.11 3.12 - # Leave out 3.13 on aarch due to an issue in pyo3/rust-numpy 0.23.4 + 3.13 - name: Build wheels uses: PyO3/maturin-action@v1 if: ${{ matrix.platform.target == 'aarch64' }} @@ -50,8 +50,7 @@ jobs: if: ${{ matrix.platform.target == 'x86_64' }} with: target: ${{ matrix.platform.target }} - # No py3.13 yet... - args: --release --out dist --interpreter 3.10 3.11 3.12 --zig + 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: | @@ -73,7 +72,7 @@ jobs: pytest - name: pytest if: ${{ !startsWith(matrix.platform.target, 'x86') && matrix.platform.target != 'ppc64' }} - uses: uraimo/run-on-arch-action@v3 + uses: uraimo/run-on-arch-action@v2 with: arch: ${{ matrix.platform.target }} distro: ubuntu22.04 @@ -141,7 +140,7 @@ jobs: # pytest # - name: pytest # if: ${{ !startsWith(matrix.platform.target, 'x86') }} - # uses: uraimo/run-on-arch-action@v3 + # uses: uraimo/run-on-arch-action@v2 # with: # arch: ${{ matrix.platform.target }} # distro: alpine_latest @@ -175,7 +174,7 @@ jobs: 3.10 3.11 3.12 - # 3.13 leave out 3.13 due to a segfault + 3.13 architecture: ${{ matrix.platform.target }} - name: Install uv uses: astral-sh/setup-uv@v5 @@ -230,6 +229,7 @@ jobs: 3.10 3.11 3.12 + 3.13 - name: Install uv uses: astral-sh/setup-uv@v5 - uses: maxim-lobanov/setup-xcode@v1 From 08c13e2318551674cce5ab581ba6168a9f756a16 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Wed, 5 Mar 2025 14:01:24 +0100 Subject: [PATCH 4/8] docs: include frozen cell output in docs --- docs/_freeze/index/execute-results/html.json | 16 ++++++++++++++++ .../_freeze/nf-adapt/execute-results/html.json | 16 ++++++++++++++++ .../pymc-usage/execute-results/html.json | 16 ++++++++++++++++ .../pymc-usage/figure-html/cell-5-output-1.png | Bin 0 -> 188810 bytes .../sample-stats/execute-results/html.json | 16 ++++++++++++++++ .../figure-html/cell-3-output-1.png | Bin 0 -> 45337 bytes .../figure-html/cell-4-output-1.png | Bin 0 -> 157496 bytes .../figure-html/cell-5-output-1.png | Bin 0 -> 42329 bytes .../figure-html/cell-7-output-2.png | Bin 0 -> 16510 bytes .../figure-html/cell-8-output-1.png | Bin 0 -> 13154 bytes .../figure-html/cell-9-output-1.png | Bin 0 -> 12983 bytes .../site_libs/clipboard/clipboard.min.js | 7 +++++++ .../stan-usage/execute-results/html.json | 16 ++++++++++++++++ .../figure-html/cell-11-output-1.png | Bin 0 -> 103736 bytes 14 files changed, 87 insertions(+) create mode 100644 docs/_freeze/index/execute-results/html.json create mode 100644 docs/_freeze/nf-adapt/execute-results/html.json create mode 100644 docs/_freeze/pymc-usage/execute-results/html.json create mode 100644 docs/_freeze/pymc-usage/figure-html/cell-5-output-1.png create mode 100644 docs/_freeze/sample-stats/execute-results/html.json create mode 100644 docs/_freeze/sample-stats/figure-html/cell-3-output-1.png create mode 100644 docs/_freeze/sample-stats/figure-html/cell-4-output-1.png create mode 100644 docs/_freeze/sample-stats/figure-html/cell-5-output-1.png create mode 100644 docs/_freeze/sample-stats/figure-html/cell-7-output-2.png create mode 100644 docs/_freeze/sample-stats/figure-html/cell-8-output-1.png create mode 100644 docs/_freeze/sample-stats/figure-html/cell-9-output-1.png create mode 100644 docs/_freeze/site_libs/clipboard/clipboard.min.js create mode 100644 docs/_freeze/stan-usage/execute-results/html.json create mode 100644 docs/_freeze/stan-usage/figure-html/cell-11-output-1.png diff --git a/docs/_freeze/index/execute-results/html.json b/docs/_freeze/index/execute-results/html.json new file mode 100644 index 0000000..37d29d5 --- /dev/null +++ b/docs/_freeze/index/execute-results/html.json @@ -0,0 +1,16 @@ +{ + "hash": "94e4388705073729b94725a15410d650", + "result": { + "engine": "jupyter", + "markdown": "---\ntitle: Nutpie Documentation\n---\n\n\n\n`nutpie` is a high-performance library designed for Bayesian inference, that\nprovides efficient sampling algorithms for probabilistic models. It can sample\nmodels that are defined in PyMC or Stan (numpyro and custom hand-coded\nlikelihoods with gradient are coming soon).\n\n- Faster sampling than either the PyMC or Stan default samplers. (An average\n ~2x speedup on `posteriordb` compared to Stan)\n- All the diagnostic information of PyMC and Stan and some more.\n- GPU support for PyMC models through jax.\n- A more informative progress bar.\n- Access to the incomplete trace during sampling.\n- *Experimental* normalizing flow adaptation for more efficient sampling of\n difficult posteriors.\n\n## Quickstart: PyMC\n\nInstall `nutpie` with pip, uv, pixi, or conda:\n\nFor usage with pymc:\n\n```bash\n# One of\npip install \"nutpie[pymc]\"\nuv add \"nutpie[pymc]\"\npixi add nutpie pymc numba\nconda install -c conda-forge nutpie pymc numba\n```\n\nAnd then sample with\n\n\n::: {#1c2d97ba .cell execution_count=1}\n``` {.python .cell-code}\nimport nutpie\nimport pymc as pm\n\nwith pm.Model() as model:\n mu = pm.Normal(\"mu\", mu=0, sigma=1)\n obs = pm.Normal(\"obs\", mu=mu, sigma=1, observed=[1, 2, 3])\n\ncompiled = nutpie.compile_pymc_model(model)\ntrace = nutpie.sample(compiled)\n```\n\n::: {.cell-output .cell-output-display}\n```{=html}\n\n\n```\n:::\n\n::: {.cell-output .cell-output-display}\n```{=html}\n\n
\n

Sampler Progress

\n

Total Chains: 6

\n

Active Chains: 0

\n

\n Finished Chains:\n 6\n

\n

Sampling for now

\n

\n Estimated Time to Completion:\n now\n

\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
ProgressDrawsDivergencesStep SizeGradients/Draw
\n \n \n 140001.351
\n \n \n 140001.283
\n \n \n 140001.293
\n \n \n 140001.233
\n \n \n 140001.403
\n \n \n 140001.281
\n
\n```\n:::\n:::\n\n\nFor more information, see the detailed [PyMC usage guide](pymc-usage.qmd).\n\n## Quickstart: Stan\n\nStan needs access to a compiler toolchain, you can find instructions for those\n[here](https://mc-stan.org/docs/cmdstan-guide/installation.html#cpp-toolchain).\nYou can then install nutpie through pip or uv:\n\n```bash\n# One of\npip install \"nutpie[stan]\"\nuv add \"nutpie[stan]\"\n```\n\n\n\n::: {#700ed270 .cell execution_count=3}\n``` {.python .cell-code}\nimport nutpie\n\nmodel = \"\"\"\ndata {\n int N;\n vector[N] y;\n}\nparameters {\n real mu;\n}\nmodel {\n mu ~ normal(0, 1);\n y ~ normal(mu, 1);\n}\n\"\"\"\n\ncompiled = (\n nutpie\n .compile_stan_model(code=model)\n .with_data(N=3, y=[1, 2, 3])\n)\ntrace = nutpie.sample(compiled)\n```\n\n::: {.cell-output .cell-output-display}\n```{=html}\n\n\n```\n:::\n\n::: {.cell-output .cell-output-display}\n```{=html}\n\n
\n

Sampler Progress

\n

Total Chains: 6

\n

Active Chains: 0

\n

\n Finished Chains:\n 6\n

\n

Sampling for now

\n

\n Estimated Time to Completion:\n now\n

\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
ProgressDrawsDivergencesStep SizeGradients/Draw
\n \n \n 140001.291
\n \n \n 140001.273
\n \n \n 140001.343
\n \n \n 140001.331
\n \n \n 140001.413
\n \n \n 140001.293
\n
\n```\n:::\n:::\n\n\nFor more information, see the detailed [Stan usage guide](stan-usage.qmd).\n\n", + "supporting": [ + "index_files" + ], + "filters": [], + "includes": { + "include-in-header": [ + "\n\n\n" + ] + } + } +} \ No newline at end of file diff --git a/docs/_freeze/nf-adapt/execute-results/html.json b/docs/_freeze/nf-adapt/execute-results/html.json new file mode 100644 index 0000000..fc75744 --- /dev/null +++ b/docs/_freeze/nf-adapt/execute-results/html.json @@ -0,0 +1,16 @@ +{ + "hash": "99a8749bdb41e64f77fd32de347bbc2a", + "result": { + "engine": "jupyter", + "markdown": "---\ntitle: Adaptation with Normalizing Flows\n---\n\n\n\n**Experimental and subject to change**\n\nNormalizing flow adaptation through Fisher HMC is a new sampling algorithm that\nautomatically reparameterizes a model. It adds some computational cost outside\nmodel log-density evaluations, but allows sampling from much more difficult\nposterior distributions. For models with expensive log-density evaluations, the\nnormalizing flow adaptation can also be much faster, if it can reduce the number\nof log-density evaluations needed to reach a given effective sample size.\n\nThe normalizing flow adaptation works by learning a transformation of the parameter\nspace that makes the posterior distribution more amenable to sampling. This is done\nby fitting a sequence of invertible transformations (the \"flow\") that maps the\noriginal parameter space to a space where the posterior is closer to a standard\nnormal distribution. The flow is trained during warmup.\n\nFor more information about the algorithm, see the (still work in progress) paper\n[If only my posterior were normal: Introducing Fisher\nHMC](https://github.com/aseyboldt/covadapt-paper/releases/download/latest/main.pdf).\n\nCurrently, a lot of time is spent on compiling various parts of the normalizing\nflow, and for small models this can take a large amount of the total time.\nHopefully, we will be able to reduce this overhead in the future.\n\n## Requirements\n\nInstall the optional dependencies for normalizing flow adaptation:\n\n```\npip install 'nutpie[nnflow]'\n```\n\nIf you use with PyMC, this will only work if the model is compiled using the jax\nbackend, and if the `gradient_backend` is also set to `jax`.\n\nTraining of the normalizing flow can often be accelerated by using a GPU (even\nif the model itself is written in Stan, without any GPU support). To enable GPU\nyou need to make sure your `jax` installation comes with GPU support, for\ninstance by installing it with `pip install 'jax[cuda12]'`, or selecting the\n`jaxlib` version with GPU support, if you are using conda-forge. You can check if\nyour installation has GPU support by checking the output of:\n\n```python\nimport jax\njax.devices()\n```\n\n### Usage\n\nTo use normalizing flow adaptation in `nutpie`, you need to enable the\n`transform_adapt` option during sampling. Here is an example of how we can use\nit to sample from a difficult posterior:\n\n\n::: {#1e499251 .cell execution_count=1}\n``` {.python .cell-code}\nimport pymc as pm\nimport nutpie\nimport numpy as np\nimport arviz\n\n# Define a 100-dimensional funnel model\nwith pm.Model() as model:\n log_sigma = pm.Normal(\"log_sigma\")\n pm.Normal(\"x\", mu=0, sigma=pm.math.exp(log_sigma / 2), shape=100)\n\n# Compile the model with the jax backend\ncompiled = nutpie.compile_pymc_model(\n model, backend=\"jax\", gradient_backend=\"jax\"\n)\n```\n:::\n\n\nIf we sample this model without normalizing flow adaptation, we will encounter\nconvergence issues, often divergences and always low effective sample sizes:\n\n::: {#f7faabf0 .cell execution_count=2}\n``` {.python .cell-code}\n# Sample without normalizing flow adaptation\ntrace_no_nf = nutpie.sample(compiled, seed=1)\nassert (arviz.ess(trace_no_nf) < 100).any().to_array().any()\n```\n\n::: {.cell-output .cell-output-display}\n```{=html}\n\n\n```\n:::\n\n::: {.cell-output .cell-output-display}\n```{=html}\n\n
\n

Sampler Progress

\n

Total Chains: 6

\n

Active Chains: 0

\n

\n Finished Chains:\n 6\n

\n

Sampling for 16 seconds

\n

\n Estimated Time to Completion:\n now\n

\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
ProgressDrawsDivergencesStep SizeGradients/Draw
\n \n \n 140000.457
\n \n \n 140000.3115
\n \n \n 140000.317
\n \n \n 140000.287
\n \n \n 140000.3915
\n \n \n 140000.347
\n
\n```\n:::\n:::\n\n\n::: {#6cfb99bd .cell execution_count=3}\n``` {.python .cell-code}\n# We can add further arguments for the normalizing flow:\ncompiled = compiled.with_transform_adapt(\n num_layers=5, # Number of layers in the normalizing flow\n nn_width=32, # Neural networks with 32 hidden units\n num_diag_windows=6, # Number of windows with a diagonal mass matrix intead of a flow\n verbose=False, # Whether to print details about the adaptation process\n show_progress=False, # Whether to show a progress bar for each optimization step\n)\n\n# Sample with normalizing flow adaptation\ntrace_nf = nutpie.sample(\n compiled,\n transform_adapt=True, # Enable the normalizing flow adaptation\n seed=1,\n chains=2,\n cores=1, # Running chains in parallel can be slow\n window_switch_freq=150, # Optimize the normalizing flow every 150 iterations\n)\nassert trace_nf.sample_stats.diverging.sum() == 0\nassert (arviz.ess(trace_nf) > 1000).all().to_array().all()\n```\n\n::: {.cell-output .cell-output-display}\n```{=html}\n\n\n```\n:::\n\n::: {.cell-output .cell-output-display}\n```{=html}\n\n
\n

Sampler Progress

\n

Total Chains: 2

\n

Active Chains: 0

\n

\n Finished Chains:\n 2\n

\n

Sampling for 18 minutes

\n

\n Estimated Time to Completion:\n now\n

\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
ProgressDrawsDivergencesStep SizeGradients/Draw
\n \n \n 250000.527
\n \n \n 250000.537
\n
\n```\n:::\n:::\n\n\nThe sampler used fewer gradient evaluations with the normalizing flow adaptation,\nbut still converged, and produce a good effective sample size:\n\n::: {#78aaecea .cell execution_count=4}\n``` {.python .cell-code}\nn_steps = int(trace_nf.sample_stats.n_steps.sum() + trace_nf.warmup_sample_stats.n_steps.sum())\ness = float(arviz.ess(trace_nf).min().to_array().min())\nprint(f\"Number of gradient evaluations: {n_steps}\")\nprint(f\"Minimum effective sample size: {ess}\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nNumber of gradient evaluations: 42527\nMinimum effective sample size: 1835.9674640023168\n```\n:::\n:::\n\n\nWithout normalizing flow, it used more gradient evaluations, and still wasn't able\nto get a good effective sample size:\n\n::: {#820fea9f .cell execution_count=5}\n``` {.python .cell-code}\nn_steps = int(trace_no_nf.sample_stats.n_steps.sum() + trace_no_nf.warmup_sample_stats.n_steps.sum())\ness = float(arviz.ess(trace_no_nf).min().to_array().min())\nprint(f\"Number of gradient evaluations: {n_steps}\")\nprint(f\"Minimum effective sample size: {ess}\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nNumber of gradient evaluations: 124219\nMinimum effective sample size: 31.459420094540565\n```\n:::\n:::\n\n\nThe flow adaptation occurs during warmup, so the number of warmup draws should\nbe large enough to allow the flow to converge. For more complex posteriors, you\nmay need to increase the number of layers (using the `num_layers` argument), or\nyou might want to increase the number of warmup draws.\n\nTo monitor the progress of the flow adaptation, you can set `verbose=True`, or\n`show_progress=True`, but the second should only be used if you sample just one\nchain.\n\nAll losses are on a log-scale. Negative values smaller -2 are a good sign that\nthe adaptation was successful. If the loss stays positive, the flow is either\nnot expressive enough, or the training period is too short. The sampler might\nstill converge, but will probably need more gradient evaluations per effective\ndraw. Large losses bigger than 6 tend to indicate that the posterior is too\ndifficult to sample with the current flow, and the sampler will probably not\nconverge.\n\n", + "supporting": [ + "nf-adapt_files/figure-html" + ], + "filters": [], + "includes": { + "include-in-header": [ + "\n\n\n" + ] + } + } +} \ No newline at end of file diff --git a/docs/_freeze/pymc-usage/execute-results/html.json b/docs/_freeze/pymc-usage/execute-results/html.json new file mode 100644 index 0000000..48635bb --- /dev/null +++ b/docs/_freeze/pymc-usage/execute-results/html.json @@ -0,0 +1,16 @@ +{ + "hash": "fbae7cbc3710a3ccd22e1de17bdfdb36", + "result": { + "engine": "jupyter", + "markdown": "---\ntitle: Usage with PyMC models\n---\n\n\n\nThis document shows how to use `nutpie` with PyMC models. We will use the\n`pymc` package to define a simple model and sample from it using `nutpie`.\n\n## Installation\n\nThe recommended way to install `pymc` is through the `conda` ecosystem. A good\npackage manager for conda packages is `pixi`. See for the [pixi\ndocumentation](https://pixi.sh) for instructions on how to install it.\n\nWe create a new project for this example:\n\n```bash\npixi new pymc-example\n```\n\nThis will create a new directory `pymc-example` with a `pixi.toml` file, that\nyou can edit to add meta information.\n\nWe then add the `pymc` and `nutpie` packages to the project:\n\n```bash\ncd pymc-example\npixi add pymc nutpie arviz\n```\n\nYou can use Visual Studio Code (VSCode) or JupyterLab to write and run our code.\nBoth are excellent tools for working with Python and data science projects.\n\n### Using VSCode\n\n1. Open VSCode.\n2. Open the `pymc-example` directory created earlier.\n3. Create a new file named `model.ipynb`.\n4. Select the pixi kernel to run the code.\n\n### Using JupyterLab\n\n1. Add jupyter labs to the project by running `pixi add jupyterlab`.\n1. Open JupyterLab by running `pixi run jupyter lab` in your terminal.\n3. Create a new Python notebook.\n\n## Defining and Sampling a Simple Model\n\nWe will define a simple Bayesian model using `pymc` and sample from it using\n`nutpie`.\n\n### Model Definition\n\nIn your `model.ipypy` file or Jupyter notebook, add the following code:\n\n\n::: {#dbca6234 .cell execution_count=1}\n``` {.python .cell-code}\nimport pymc as pm\nimport nutpie\nimport pandas as pd\n\ncoords = {\"observation\": range(3)}\n\nwith pm.Model(coords=coords) as model:\n # Prior distributions for the intercept and slope\n intercept = pm.Normal(\"intercept\", mu=0, sigma=1)\n slope = pm.Normal(\"slope\", mu=0, sigma=1)\n\n # Likelihood (sampling distribution) of observations\n x = [1, 2, 3]\n\n mu = intercept + slope * x\n y = pm.Normal(\"y\", mu=mu, sigma=0.1, observed=[1, 2, 3], dims=\"observation\")\n```\n:::\n\n\n### Sampling\n\nWe can now compile the model using the numba backend:\n\n::: {#74540a7e .cell execution_count=2}\n``` {.python .cell-code}\ncompiled = nutpie.compile_pymc_model(model)\ntrace = nutpie.sample(compiled)\n```\n\n::: {.cell-output .cell-output-display}\n```{=html}\n\n\n```\n:::\n\n::: {.cell-output .cell-output-display}\n```{=html}\n\n
\n

Sampler Progress

\n

Total Chains: 6

\n

Active Chains: 0

\n

\n Finished Chains:\n 6\n

\n

Sampling for now

\n

\n Estimated Time to Completion:\n now\n

\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
ProgressDrawsDivergencesStep SizeGradients/Draw
\n \n \n 140000.593
\n \n \n 140000.659
\n \n \n 140000.551
\n \n \n 140000.5815
\n \n \n 140000.677
\n \n \n 140000.583
\n
\n```\n:::\n:::\n\n\nAlternatively, we can also sample through the `pymc` API:\n\n```python\nwith model:\n trace = pm.sample(model, nuts_sampler=\"nutpie\")\n```\n\nWhile sampling, nutpie shows a progress bar for each chain. It also includes\ninformation about how each chain is doing:\n\n- It shows the current number of draws\n- The step size of the integrator (very small stepsizes are typically a bad\n sign)\n- The number of divergences (if there are divergences, that means that nutpie is\n probably not sampling the posterior correctly)\n- The number of gradient evaluation nutpie uses for each draw. Large numbers\n (100 to 1000) are a sign that the parameterization of the model is not ideal,\n and the sampler is very inefficient.\n\nAfter sampling, this returns an `arviz` InferenceData object that you can use to\nanalyze the trace.\n\nFor example, we should check the effective sample size:\n\n::: {#7a0b20fe .cell execution_count=3}\n``` {.python .cell-code}\nimport arviz as az\naz.ess(trace)\n```\n\n::: {.cell-output .cell-output-display execution_count=3}\n```{=html}\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
<xarray.Dataset> Size: 16B\nDimensions:    ()\nData variables:\n    intercept  float64 8B 1.517e+03\n    slope      float64 8B 1.517e+03
\n```\n:::\n:::\n\n\nand take a look at a trace plot:\n\n::: {#181126a5 .cell execution_count=4}\n``` {.python .cell-code}\naz.plot_trace(trace);\n```\n\n::: {.cell-output .cell-output-display}\n![](pymc-usage_files/figure-html/cell-5-output-1.png){}\n:::\n:::\n\n\n### Choosing the backend\n\nRight now, we have been using the numba backend. This is the default backend for\n`nutpie`, when sampling from pymc models. It tends to have relatively long\ncompilation times, but samples small models very efficiently. For larger models\nthe `jax` backend sometimes outperforms `numba`.\n\nFirst, we need to install the `jax` package:\n\n```bash\npixi add jax\n```\n\nWe can select the backend by passing the `backend` argument to the `compile_pymc_model`:\n\n```python\ncompiled_jax = nutpie.compiled_pymc_model(model, backend=\"jax\")\ntrace = nutpie.sample(compiled_jax)\n```\n\nOr through the pymc API:\n\n```python\nwith model:\n trace = pm.sample(\n model,\n nuts_sampler=\"nutpie\",\n nuts_sampler_kwargs={\"backend\": \"jax\"},\n )\n```\n\nIf you have an nvidia GPU, you can also use the `jax` backend with the `gpu`. We\nwill have to install the `jaxlib` package with the `cuda` option\n\n```bash\npixi add jaxlib --build 'cuda12'\n```\n\nRestart the kernel and check that the GPU is available:\n\n```python\nimport jax\n\n# Should list the cuda device\njax.devices()\n```\n\nSampling again, should now use the GPU, which you can observe by checking the\nGPU usage with `nvidia-smi` or `nvtop`.\n\n### Changing the dataset without recompilation\n\nIf you want to use the same model with different datasets, you can modify\ndatasets after compilation. Since jax does not like changes in shapes, this is\nonly recommended with the numba backend.\n\nFirst, we define the model, but put our dataset in a `pm.Data` structure:\n\n::: {#629172a7 .cell execution_count=5}\n``` {.python .cell-code}\nwith pm.Model() as model:\n x = pm.Data(\"x\", [1, 2, 3])\n intercept = pm.Normal(\"intercept\", mu=0, sigma=1)\n slope = pm.Normal(\"slope\", mu=0, sigma=1)\n mu = intercept + slope * x\n y = pm.Normal(\"y\", mu=mu, sigma=0.1, observed=[1, 2, 3])\n```\n:::\n\n\nWe can now compile the model:\n\n::: {#e865b2bd .cell execution_count=6}\n``` {.python .cell-code}\ncompiled = nutpie.compile_pymc_model(model)\ntrace = nutpie.sample(compiled)\n```\n\n::: {.cell-output .cell-output-display}\n```{=html}\n\n\n```\n:::\n\n::: {.cell-output .cell-output-display}\n```{=html}\n\n
\n

Sampler Progress

\n

Total Chains: 6

\n

Active Chains: 0

\n

\n Finished Chains:\n 6\n

\n

Sampling for now

\n

\n Estimated Time to Completion:\n now\n

\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
ProgressDrawsDivergencesStep SizeGradients/Draw
\n \n \n 140000.641
\n \n \n 140000.6111
\n \n \n 140000.683
\n \n \n 140000.559
\n \n \n 140000.579
\n \n \n 140000.653
\n
\n```\n:::\n:::\n\n\nAfter compilation, we can change the dataset:\n\n::: {#070d3016 .cell execution_count=7}\n``` {.python .cell-code}\ncompiled2 = compiled.with_data(x=[4, 5, 6])\ntrace2 = nutpie.sample(compiled2)\n```\n\n::: {.cell-output .cell-output-display}\n```{=html}\n\n\n```\n:::\n\n::: {.cell-output .cell-output-display}\n```{=html}\n\n
\n

Sampler Progress

\n

Total Chains: 6

\n

Active Chains: 0

\n

\n Finished Chains:\n 6\n

\n

Sampling for now

\n

\n Estimated Time to Completion:\n now\n

\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
ProgressDrawsDivergencesStep SizeGradients/Draw
\n \n \n 140000.427
\n \n \n 140000.3527
\n \n \n 140000.4213
\n \n \n 140000.453
\n \n \n 140000.403
\n \n \n 140000.3919
\n
\n```\n:::\n:::\n\n\n", + "supporting": [ + "pymc-usage_files" + ], + "filters": [], + "includes": { + "include-in-header": [ + "\n\n\n" + ] + } + } +} \ No newline at end of file diff --git a/docs/_freeze/pymc-usage/figure-html/cell-5-output-1.png b/docs/_freeze/pymc-usage/figure-html/cell-5-output-1.png new file mode 100644 index 0000000000000000000000000000000000000000..57cea902a2f0ac9cf216e86fe5ddfbca40978ed1 GIT binary patch literal 188810 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.-u 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 WmS(fG%iDP1(!XGIo^bZo!~X%lZwvSU literal 0 HcmV?d00001 diff --git a/docs/_freeze/sample-stats/execute-results/html.json b/docs/_freeze/sample-stats/execute-results/html.json new file mode 100644 index 0000000..a656155 --- /dev/null +++ b/docs/_freeze/sample-stats/execute-results/html.json @@ -0,0 +1,16 @@ +{ + "hash": "1bb39e60c4e9c979109a04b06b7d02e7", + "result": { + "engine": "jupyter", + "markdown": "---\ntitle: Understanding Sampler Statistics in Nutpie\n---\n\n\n\nThis 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.\n\n## Example Model: Neal's Funnel\n\nLet's start by implementing Neal's funnel in PyMC:\n\n\n::: {#9ef0aa6e .cell execution_count=1}\n``` {.python .cell-code}\nimport pymc as pm\nimport nutpie\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport pandas as pd\nimport arviz as az\n\n# Create the funnel model\nwith pm.Model() as model:\n log_sigma = pm.Normal('log_sigma')\n pm.Normal('x', sigma=pm.math.exp(log_sigma), shape=5)\n\n# Sample with detailed statistics\ncompiled = nutpie.compile_pymc_model(model)\ntrace = nutpie.sample(\n compiled,\n tune=1000,\n store_mass_matrix=True,\n store_gradient=True,\n store_unconstrained=True,\n store_divergences=True,\n seed=42,\n)\n```\n\n::: {.cell-output .cell-output-display}\n```{=html}\n\n\n```\n:::\n\n::: {.cell-output .cell-output-display}\n```{=html}\n\n

\n

Sampler Progress

\n

Total Chains: 6

\n

Active Chains: 0

\n

\n Finished Chains:\n 6\n

\n

Sampling for now

\n

\n Estimated Time to Completion:\n now\n

\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
ProgressDrawsDivergencesStep SizeGradients/Draw
\n \n \n 2000210.417
\n \n \n 2000240.357
\n \n \n 200000.357
\n \n \n 2000130.447
\n \n \n 200000.3415
\n \n \n 200050.537
\n
\n```\n:::\n:::\n\n\n## Sampler Statistics Overview\n\nThe sampler statistics can be grouped into several categories:\n\n### Basic HMC Statistics\n\nThese statistics are always collected and are essential for basic diagnostics:\n\n::: {#ffa51d43 .cell execution_count=2}\n``` {.python .cell-code}\n# Access through trace.sample_stats\nbasic_stats = [\n 'depth', # Tree depth for current draw\n 'maxdepth_reached', # Whether max tree depth was hit\n 'logp', # Log probability of current position\n 'energy', # Hamiltonian energy\n 'diverging', # Whether the transition diverged\n 'step_size', # Current step size\n 'step_size_bar', # Current estimate of an ideal step size\n 'n_steps' # Number of leapfrog steps\n\n]\n\n# Plot step size evolution during warmup\ntrace.warmup_sample_stats.step_size_bar.plot.line(x=\"draw\", yscale=\"log\")\n```\n\n::: {.cell-output .cell-output-display}\n![](sample-stats_files/figure-html/cell-3-output-1.png){}\n:::\n:::\n\n\n### Mass Matrix Adaptation\n\nThese statistics track how the mass matrix evolves:\n\n::: {#146dc128 .cell execution_count=3}\n``` {.python .cell-code}\n(\n trace\n .warmup_sample_stats\n .mass_matrix_inv\n .plot\n .line(\n x=\"draw\",\n yscale=\"log\",\n col=\"chain\",\n col_wrap=2,\n )\n)\n```\n\n::: {.cell-output .cell-output-display}\n![](sample-stats_files/figure-html/cell-4-output-1.png){}\n:::\n:::\n\n\nVariables that are a source of convergence issues, will often show high variance\nin the final mass matrix estimate across chains.\n\nThe mass matrix will always be fixed for 10% of draws at the end, because we\nonly run final step size adaptation during that time, but high variance in the\nmass matrix before this final window and indicate that more tuning steps might\nbe needed.\n\n### Detailed Diagnostics\n\nThese are only available when explicitly requested:\n\n```python\ndetailed_stats = [\n 'gradient', # Gradient at current position\n 'unconstrained_draw', # Parameters in unconstrained space\n 'divergence_start', # Position where divergence started\n 'divergence_end', # Position where divergence ended\n 'divergence_momentum', # Momentum at divergence\n 'divergence_message' # Description of divergence\n]\n```\n\n#### Idintify Divergences\n\nWe can for instance use this to identify the sources of divergences:\n\n::: {#44f63008 .cell execution_count=4}\n``` {.python .cell-code}\nimport xarray as xr\n\ndraws = (\n trace\n .sample_stats\n .unconstrained_draw\n .assign_coords(kind=\"draw\")\n)\ndivergence_locations = (\n trace\n .sample_stats\n .divergence_start\n .assign_coords(kind=\"divergence\")\n)\n\npoints = xr.concat([draws, divergence_locations], dim=\"kind\")\npoints.to_dataset(\"unconstrained_parameter\").plot.scatter(x=\"log_sigma\", y=\"x_0\", hue=\"kind\")\n```\n\n::: {.cell-output .cell-output-display}\n![](sample-stats_files/figure-html/cell-5-output-1.png){}\n:::\n:::\n\n\n#### Covariance of gradients and draws\n\nTODO this section should really use the transformed gradients and draws, not the\nunconstrained ones, as that avoids the manual mass matrix correction. This\nis only available for the normalizing flow adaptation at the moment though.\n\nIn models with problematic posterior correlations, the singular value\ndecomposition of gradients and draws can often point us to the source of the\nissue.\n\nLet's build a little model with correlations between parameters:\n\n::: {#32313889 .cell execution_count=5}\n``` {.python .cell-code}\nwith pm.Model() as model:\n x = pm.Normal('x')\n y = pm.Normal(\"y\", mu=x, sigma=0.01)\n z = pm.Normal(\"z\", mu=y, shape=100)\n\ncompiled = nutpie.compile_pymc_model(model)\ntrace = nutpie.sample(\n compiled,\n tune=1000,\n store_gradient=True,\n store_unconstrained=True,\n store_mass_matrix=True,\n seed=42,\n)\n```\n\n::: {.cell-output .cell-output-display}\n```{=html}\n\n\n```\n:::\n\n::: {.cell-output .cell-output-display}\n```{=html}\n\n
\n

Sampler Progress

\n

Total Chains: 6

\n

Active Chains: 0

\n

\n Finished Chains:\n 6\n

\n

Sampling for now

\n

\n Estimated Time to Completion:\n now\n

\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
ProgressDrawsDivergencesStep SizeGradients/Draw
\n \n \n 200000.1331
\n \n \n 200000.1631
\n \n \n 200000.2215
\n \n \n 200000.1431
\n \n \n 200000.1531
\n \n \n 200000.1531
\n
\n```\n:::\n:::\n\n\nNow we can compute eigenvalues of the covariance matrix of the gradient and\ndraws (using the singular value decomposition to avoid quadratic cost):\n\n::: {#be02c1fa .cell execution_count=6}\n``` {.python .cell-code}\ndef covariance_eigenvalues(x, mass_matrix):\n assert x.dims == (\"chain\", \"draw\", \"unconstrained_parameter\")\n x = x.stack(sample=[\"draw\", \"chain\"])\n x = (x - x.mean(\"sample\")) / np.sqrt(mass_matrix)\n u, s, v = np.linalg.svd(x.T / np.sqrt(x.shape[1]), full_matrices=False)\n print(u.shape, s.shape, v.shape)\n s = xr.DataArray(\n s,\n dims=[\"eigenvalue\"],\n coords={\"eigenvalue\": range(s.size)},\n )\n v = xr.DataArray(\n v,\n dims=[\"eigenvalue\", \"unconstrained_parameter\"],\n coords={\n \"eigenvalue\": s.eigenvalue,\n \"unconstrained_parameter\": x.unconstrained_parameter,\n },\n )\n return s ** 2, v\n\nmass_matrix = trace.sample_stats.mass_matrix_inv.isel(draw=-1, chain=0)\ndraws_eigs, draws_eigv = covariance_eigenvalues(trace.sample_stats.unconstrained_draw, mass_matrix)\ngrads_eigs, grads_eigv = covariance_eigenvalues(trace.sample_stats.gradient, 1 / mass_matrix)\n\ndraws_eigs.plot.line(x=\"eigenvalue\", yscale=\"log\")\ngrads_eigs.plot.line(x=\"eigenvalue\", yscale=\"log\")\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n(6000, 102) (102,) (102, 102)\n(6000, 102) (102,) (102, 102)\n```\n:::\n\n::: {.cell-output .cell-output-display}\n![](sample-stats_files/figure-html/cell-7-output-2.png){}\n:::\n:::\n\n\nWe can see one very large and one very small eigenvalue in both covariances.\nLarge eigenvalues for the draws, and small eigenvalues for the gradients prevent\nthe sampler from taking larger steps. Small eigenvalues in the draws, and large\neigenvalues in the grads mean, that the sampler has to move far in parameter\nspace to get independent draws. So both lead to problems during sampling. For\nmodels with many parameters, typically only the large eigenvalues of each are\nmeaningful, because of estimation issues with the small eigenvalues.\n\nWe can also look at the eigenvectors to see which parameters are responsible for\nthe correlations:\n\n::: {#202af166 .cell execution_count=7}\n``` {.python .cell-code}\n(\n draws_eigv\n .sel(eigenvalue=0)\n .to_pandas()\n .sort_values(key=abs)\n .tail(10)\n .plot.bar(x=\"unconstrained_parameter\")\n)\n```\n\n::: {.cell-output .cell-output-display}\n![](sample-stats_files/figure-html/cell-8-output-1.png){}\n:::\n:::\n\n\n::: {#52404958 .cell execution_count=8}\n``` {.python .cell-code}\n(\n grads_eigv\n .sel(eigenvalue=0)\n .to_pandas()\n .sort_values(key=abs)\n .tail(10)\n .plot.bar(x=\"unconstrained_parameter\")\n)\n```\n\n::: {.cell-output .cell-output-display}\n![](sample-stats_files/figure-html/cell-9-output-1.png){}\n:::\n:::\n\n\n", + "supporting": [ + "sample-stats_files" + ], + "filters": [], + "includes": { + "include-in-header": [ + "\n\n\n" + ] + } + } +} \ No newline at end of file diff --git a/docs/_freeze/sample-stats/figure-html/cell-3-output-1.png b/docs/_freeze/sample-stats/figure-html/cell-3-output-1.png new file mode 100644 index 0000000000000000000000000000000000000000..f9351aa616d402f82875ceb317ba671f00fda279 GIT binary patch literal 45337 zcmZ^~1yqz#*ES3yARwWX(ug$DIka>$lr$?Q7ozDJx20q7$JbARu7MNQ2qI^%(xNl%CVAU$_Xxj%$%bcR3na@wN$ZS8A93<5P}CW`t~GFfTb`pWj9!)rF2 zKr~ra+~?m<-CU)!lS)k^yS{6AY?tG!tE+#+dHH}+Jj1N#1mW)29*M`|Xq4dBBt*3I zzwh|ohk|Q9;+Tqjpo4!B$Uz|*4ZrR8(=QaV@J|*Vu7Ue|2;w>=-o2xzi9(Zr_MF(l z@80M624mpj;<|tTep-JLWY%#81)7zWbsrTqb^FcTtv0aS+`zQ7G*x{c@EN$*R#;SD zU*FV?6aJ-VwLdhOz}2Iz=sEV_^R}G5y1KgOfsf(47WC2Bq4Hn;e{GJ}#^UY-`)z9K zE$fa8j*#9H<%DRBe2M(wn`Hv2zXwextDROB3WP5KfEf-fzh1F!rzG2i~Q#g%TawjR$_V@R{ zD8c;FZuBx|Fd{bg)3kNlYu2QGyUZWD@Ka-6WV}%7acUz^guzU`KW7ttzO(1K`2Vu7 zz)CZ=@N))+4Hi)Zq61JIMcKL9r{d1r^h?Wq-QT^NF zQ3G5;LMagugu!fuX7ln9{nLdImVshJsV)-^tI3LGa6ys7)~wPheekaUa_>L6&7^;{5bck53_ z$QYTK!NdINLb8^a_fn+crb1s-p6h*X|jW z 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%0DNI4n@TeF&xF@U=ze5sWBg*Dt~u=q{Ygda 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 IB#b`)A7z%?&;S4c literal 0 HcmV?d00001 diff --git a/docs/_freeze/sample-stats/figure-html/cell-5-output-1.png b/docs/_freeze/sample-stats/figure-html/cell-5-output-1.png new file mode 100644 index 0000000000000000000000000000000000000000..e9016f45eaa0bc10b1abe1a76cfc40ed4eb36b32 GIT binary patch literal 42329 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 bIlGd0Lr|srBo=g*gZ6VtrKct0#xMRKsg-kI literal 0 HcmV?d00001 diff --git a/docs/_freeze/sample-stats/figure-html/cell-8-output-1.png b/docs/_freeze/sample-stats/figure-html/cell-8-output-1.png new file mode 100644 index 0000000000000000000000000000000000000000..185762a4637e9af905800bcd7b06b782b43c6963 GIT binary patch literal 13154 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 Ww`n?Dz^}Vd$x17oNtU{N<9`7FFjQFp literal 0 HcmV?d00001 diff --git a/docs/_freeze/sample-stats/figure-html/cell-9-output-1.png b/docs/_freeze/sample-stats/figure-html/cell-9-output-1.png new file mode 100644 index 0000000000000000000000000000000000000000..053bc20cd72eadb50ee598b66885062a19e5f394 GIT binary patch literal 12983 zcmdsdcUaVEwq|wP=2lt-MN}|=0um%kRur`eN=A|>NE9d}XKZ6j5G_F@OU|HVie!s` zWEBv}Dw!fk77*C?=gi!hy*u;l{bTR$v(ry^*`k%c@0|0db6@5B*)5w`HjzlAE#z~j z)kvhDNUUT#>2pQO?Eis2Ut2lJ(E4=PPz5B;_j(wpJ7eD+{CjP9}Et78DyH zK7nI=0zCW89UN@!CHVQR|Ko4)QS8k4?I|n$c$JN|=XC5zq^+-s|9%QOx^)kUBzTB? z`lN#1EWdl>g0uc!elW$cJ`A_YZN~IvWESW{sAlQV}ft~NaEz)uuD$(mfxkT z8#kOe=u%?!Wi8`xnft%!?=?}~cGKks`C*I6hHDQu-@bj~#L#b9Qf0EoXBt_zzmZFP zJg_X0*g$TX)@Yd@4(#h~YH8VN?6-|XdTHHI)wC8LP2-o_2l2}`A3U)Ct4DHaB;O}3 zE>2DrEv+ZtmzPamT$D1{N+Kog_YN6e>TW`mtrSYs?x6Y0BD~Y6X z(!|s>#c8ZvKF?j5b83D**un9oXjpxD3yE~Y=b)sd-tWKv-jJrkn7L8DwOcT|&5HOe zwh>`nm&*M=-~%0G{E0+5_kZe<>LG1_7tK#S-2354t*hFOMLcp#ni60AH0RGG(!>9o zj~ZK}IS(8-IXlwwxXVVn%xgLD$rGpYm7`i|Z%gL8kIKr*wxnub5Hf3UaK4WZIKD+* z@d?knJ(S{T*XaR^jy!9c?dO~8wy~JSQL^z#{3C=C#njD_tl1%svSRTQlN$ zRCYsWR*&({LLYzsmK#5n%R4O%tUS>adK0?M*x3I9#vWu3>B5IXn z7UiiG5)yKURaQ()yREH_Z!?K>!lICuktl&@&rbaL=bwBXw{G4HjEwX$SZ!|BAZt&Y z3>7fGtCgXjyu36|uRapRGxKe7ax$x9tbya$v9C`8aQU4wojZN}1UN=n|JXw-`%pu;rq8q`r?JB$4+j&S6;{{68j74Zm&&IV$%5tiK)rSLK`j4 zLx*~4ZHLI4Hg0^xE<)+Qp($_PyrD1VQ+h6GrE1>Wy3fw0XwE+NjDM%*VH7gEm^ZuZ;lpRL z%^E+9w4~-bPh8rvM^uSH>g$d6+-r$Dj-2P@;ZdrtuBOJ_xIvPh@3i;v^=+E(@y_&I zn&Xm?(8UpJ-CDP$Q-^ppcUh{e!;lJby6@h-tEs6`YmAi6HGg-ItSu}3gi1Ylul)0< ztoxjm|8Ai(%Zsy*Gcz+;y}n(kkCg6+;6M?dqw*xgIiJ>6!6o1*?T+uwYO{*uTTi+X zW+`Z6T^N2uB$`qfo*2VzbLLY~olc!^6o%=SRyWd_|=`wEW+k*mFL|jD|WTS$ZvLj0zmlmDm~i#?`_naVIawS zsraH^p4GcZX?LGaGcEUbu{OZBWKY(n)Bmb5gl@;PPN35cW`iUFwq)^ zn-ZD!>`9GR3{Fu9;ue$gLK9|XXB(jPZoIeCQtZ_nWtF8RV^ByOv8@y5z0r zT?V#{;7e}F7by`HRaLb%`I5meU%u2+15g!6qt$jBD>QpoQ#mB;2mCH!5*W=!9lLUK z@78NgQ-Fi=XU^=TH5S?rHm7Ry-?@9&a`=7x)Z}LY1yry{fr#Vl*RRdzM%#2t z+;Zo}yHc-|-yQykj=6K^4wtyN4%OlFtF_WIZ%<|EriTidJ!l9QkIl&u#^)-?K8@lg z+juM~QSWZum(rAY;V3XiM@NVFq&sRmbq3F=U7sL;o{;_ z;5I*={_UF!`Te6qXPa{@)W^C@^ibCJ!|vmq;%nEgwE))RBL%ZtOn#|wn{Cl{T%57c zOjhf^J6O}u@TAKoxcu|OdQ;e_p$OeUTNzrcG*YZi|k~O-)Tqzx}p9wPob}ylzL?-57kQl9ffeP10Uc@xA=z z>t<3+dL|6%1VM|NsA2lhWAuWt&HL5ujTqYv9700buSL+n`n`D}F%pg=Z>p*WX*$t< zetvY*0Cp~R_R}cbn)-UjhMfi-`OjChQd>;4Hlhr9Kv(+)2NUzGJGcb|-W84wy^BTZ zYF@qC=eS&6UJk`F)8*VFo^RcrLx$?G{E!y%7gXvS2#$Zj$8Hd?}SF()QAHYg}49^}CCU5q?6!^@3_gF_x9 zwat6w`-0E?`>G&z{d9Wjfm3%m`S=?CLf-7A?R{!?G;;k+dYR2VlGylf4^M>xKL{Aq z1!(F>dv5C1y~kCq_H=gYmn@E?TDGJFVM4QrSjG`l;eEW~I5z{-$sIkpcfc%Rqt_cs z=Gw2dzc9Wx@*zF7)N^U1Cg|v$Ip^bh+w&<=3FjkHz^+Hi8DyKm#b>|x^3!6a(0KHV zegXqpYz{AP{Dik%{MH-5K@R3KP*YKP_=MjuV`X`17oC}qVkjd=Okbnf#(!wCqt?SH zxxl|SS@dN=C<1x9|ld+9@f>V{#v)bM`ty1Ej2wM08`ZB6&`t}Yo(@XUE7!fu;bLdFQ;WqQ`LSy;FNctsa(@d6N~^;Hf+E zJJp5VX3W#|3)R>>zW(mDvS7AlpM(a6nK~dg-1F6|S2=F8mSk;8sMqL=DuLXRp4t83^>yUo14xpuR#K|x^s9Iqxu$-JRR4u^!)!7f!@6P$if1~o&c^j^78jJ747`|{1^5~It5l3y^B6|uTvApd1Eum52VcE^&i{Z z#&TP8jH|Y`r0Z!zk+uXK)wZEcpfVVlnTH+_yx*tqiHb0#TS|K6TQ7@@M}cm>O?rjz zF8b^HJMh0~c9E==Cj-(RK!7Q4XxG7YM{P^RDh;$4*^FME{ zO;L@lRBn6}7M2Qh35FN-ET?n3&wBvK-o2w)yquiphKGmc$EQb9GgHn6u<~6QIrGiF6~2Q%V=)nrgDj}#bv&4R+ zV)f%Avu{r^4A=6PX#nZT3SbPJLFnW!1OX?syCeOBa)gBAdz`sO<|XOb;ijs#Bk&Bs z)mmc%WKuqTx*Y8OFhx6)k4#${FJjuh{mX;x7$W)w{b%T`(r(0QhKgE;V&rA2C!V(e zZy=;x_5}q6pN1&ei3d&S#K5N&%*Ij%uhSn!MDP}M@!cyw09iL|2f8pO{2z?_^s?{2 zyCC{!h-2I2S-L!@2QFUI(_?t@N2!7rrU=N!(uqH$VZFdNsU%M8JHyPDlLGg-x^ zNaZu2#X*kn8kXwA_TqPlnj7m#H7xTAm2$O9ZV35@%h76o{}bs1*WcyPkIU&4R1XXf zPlKA0Y)#cnO?dO>9APQ6%kuIngTAX_PD?nACP_{dtHT#e0-M+B6SuRs4~mEw`-_Oz zlT&qbqy4ZJKrDY)3oFUV$<#Qp9uIZnss}B*3_YR&z_a6BdakancgA{uxnp4QQ5m7fk3_o2Vc0a^WAjQ{vwo{Ng#Mjz zp)0R`fx;W4hJ@&(*yB{sQ7L4JBkb(vUtZsr&s$npAXD*qGQ*f^-n>zPIk~xuA6$>x zT@rMd5J2--e$)J)T zwrW;ZR?*87G&&!;oc=cYRD(6hBjJsJPH0ex22!ZtooDn1Lnm1IdNz+|QQj*$Fc&nT zmYWkVu$e_Ye|{|eQpuv_HW?YhKuy!h&T$&k9qTDG1VrD|&9h2wh>$FbB{bG9j!-V{ zjK8&`gkuV@i*fhvWSFce7=aBk@Fpa@SBmXDI}5JU9EN|$F`%a7@O$}dAJSBVxHUUf z301H;Un=p<4wv(==_4!b33s}f^aG!66R<`8?|!6aCc?WVbsrFk&P-I~-0|P$kFzhh z(QfEfFdrgA!OYom009mbKG~9Cawo<`nUlyB*tw1!ds`laGw~S$Nr9aypQl$>Z=}wl zs-p4?*3ZJy65PCkF)5gxn|}RO!_+jvN;IsaLH$y(wG?&U|Nf+gm0zNfF+_)}e-(3V zZ7~1Q{rgYI$jJAI_lXF}L%ydN6gd?}G@53+R;+dP&-Xt&RVpA5>Er*GXC4ih>@>eS z#A1^J0QnnNNO}#IOvH8S>cXO1m1ID-C~Ngn_e zEBLzHS!1Zle(g8BSthkRF9h43A}*FYNh@8~qKoF(Y8@qV?FmS$_R88IRWK!>dP+e- z!KU3K8|1}oA^w5`L3f?Du*v8%$bNr*#*aA~edm%X`)igZ)ZFx&jc)ovC$M>Gq<*36-PoLRz z(URqTcM=4A1@hJM^Q${GwYAd@uJLv=L#l+5{V_5KKPA(9ITg05HrHysSAUSUubnxK8Iw)*Efl3cB(aP4=R;k6ISW|S&z>6wYA<)+Wi12yapo-wAD9YgrkybZv z-t>d__~If@0|zJP8>JAz3J5`WTAfjCW1|>miO^U_z8D%>Fv@E&S<(H>nY)Gbj3Oxw zgKFN3&tG0l*J>*DbXQN+;+=kXmM!GQ4U!O4g^*p}Iph3}dW_NDVL{*ej!JtW_qkC4 z6ig&v?8nm86?gR#H^-*vQ|p`J6?dt}D=XQn^r?_ zYlLRXmoGni(J?ka&ny!?aNt0KcIKr7@S4iT#zw35oND~dkI)^;iRUAfkOnCEvxw9+ zU68fLd>I_hsu{(rh=34?@#^IXudJ+?;`U7ILq!svJ$q>^vdzclrA>Yq{8$!azu~vh zw?a@nic2x_zI6zb=)cz}nAJTMNVrtuW(xaY;NuJ9%Fnh>!Mp57KMG{KOd6?|d3jDx z)$$YP76vM@aqCu5;@toTBDt0=g2*Bo=5lg!6lTwI^YGO17|@!T?PnRDzzx>PF@Kc3 z+#4V(3iD%L!P39K7%6CtQAy z0ndovzI(Stf>MZ)U!g=KE?~#5U4vEuzP>_TMb5+@JHZ;B{&b5WRC2ta92W*WGE81s zKX;~dXfwyANY7Egs>wsAGDDTUD0*8+u{|L{sDt;Ng zQE8L!9+RV%te*IQtfa(~<%u#meC*is@0++|aj4>EQ;>&WKbIfISN(Oj;A<3=HcbT( zUiZSdDx412;X5w7VHW4Dl|n~xOut;i&}qAofg#hOwF3$*oDO8Iw9E|!9ouc}*H-MB zy>Zi~DSQ_-RE<3-rg7aWTjRuP*Ghk|A$Ql)jQZygzHhHyz4{c+x_zsGbI2cmY{>Rr z^+L;Vuiv`&7;+?GI($e2At9r>B2bx)(= z%n~6>$ze4+-eExjBxHwhAJRaiDZ$9k#Q(7%F8Zq6<;55+T>qun+(}&Zl2_ZW*^$V zZQJMJ?TT?HZ>?LzR|}^D^#~gloRou%T&x+wL0a=t^0&oBiPbIH7kQ?pr`1vG;bSQ3 zARDC@FJ8FKcR9}vCq|_p!SnI)c^@FVLg;5MDXGq;{-BG{)w;Qs@oZk-PD0j7xK71& zd(ImSddni5!@&?gFxxb9jxm)TT0)urA-x`%n{lM;!0z6O2?~abDZDmo;ylpcM_ZPf z8l~sMEpP;F1=nM%YisRo8f$BX_K4XCV@QfN%B~i#Kgtt=vIxn9xS)-}a29~Moq($i z8d>e^@t9Ut&o)(_9*PYJ1v3oI?{=$&_xDmMOtijuVIb@Qg5B8=Gv|Idx~+NcOL1V&Y^$ATT1V2*LAjekDB$m52$7V%#3K~##RX@stv>Z=9|8)-@m`10k; z)m&X^1Jf6-O)d~{K~Yhez%jXw05;i-f`a1^`*Gn%kCqUrc7+d9O?5S4j4|!n1^1P2 zcx3dFmscsGiQdoLz7%+%n>K7v0fKF|j)Ki?XJeUtSnpeg5CD<7aKH~i=tlE#_aF-8S0lQB-? zoyqXc7ruStL_44kqYx1+JxK$0ngf(AKR%C6R4nA+rn?9V2{Az*4+|=c)`bYAV3H)( zetlZwR-$Q|za(-mYkItF#3V2{IPv4hi{PJx5+)=93S+mLxA4-9YbLV}k2 zzAMe+5R<1A5vugp26K>cTMz_UfZuqiKk!cV-l~914a(ZPw{It*sdbB8uE!S@&T1tM zwRY5xb`@!Brf5t$?B=j5GPLKElzX?u55yln4O%5g)av82q$EziDqWXO2q0-LZ(%&(Rh)tPf#66z~L>XkhomibUTke4y3c(IJ*6`_*S6&skZoW7QWX>$I~g}Y1K2tY)a`Dw5-nMt z>(G5+bZ7eLuf@vf`5fnoZUsl71%Hj1$!|DvC>X2>(2zzl?${BFq(i(zcA;+v@wsJJ zzh|#cLDA>k;zd3b;j$I=D~9U3$AbexfxRT;_~^GrS2 z^ay4C+E$Y)rFUEU`uhuuWj(9*IS;`qY_Mp9!(S*hxQ6qnZ^gmk5oa}n&AqJ-BhA$d zp67$^BLyW&Iwtx2jdAWO_oz0x0y1R1vgC3>YCO;J!FqDt2 zg{1R%IH-cOhE6rpoLg(Ap&_ol_1k1`E~p-mziv%XP=JqDNv?H=7FIk|l$4aB$G}V8 zA+)Y7Ovx(j$`lXWCnPWSwLx-%Q$Rpf33m}_EN?QH-nzGjVV<$;cKPSG;CeyWC4p2OqtV?Dwy?2sa86 z4mj^dixZs8n`As|LhJU474*MHua|V`eX1gQJEr4p?&{-BTep6|v}R;tir>0VVkkAU zbjsEwzL&^KDreWZ@XL5Q?O9y5zKS+|*I8)a^1}EmI-us3W>93l|9Yl9t$RL|5F-re zkCe2-q~qa%Qx3pmi`EPS)|8YPAV<>2f^O1;JSXiAckK~YpT!T~FqV?g9sT;sZLS?I zKB-yylnPCq%JSI(>Ei23oO{N(xYto!`8IN|rxbPL6}l_;c*}MlKODH@Rv5H9K|PhC zWV%e;;k3f#npDyJs@3gOg4Zhc7hCZnUW2WUk*R6yoBno}2l)mRNF7SAe;FHP?~cv@ z6%D2QUVHK<@&EZLwz6`n0$=sF2OjxPZ^}@*l*a7g;ekb`1PryoJd@fd7Pwg`J;5Hw z+j=z}8Df+@0r``axQquI`)>vG?OM~wanf}vkKkCn*2R3zriJ&$bg@?!U+! zpZ#osRi$q4RnPp$UNDId_KnhmAM8m<;Tz;hH3T=&g#hOj{{VMH*yZadJv*KP_~SA7 zN6KKGN;ES60)zAC&%ap29IiIaE-Yke9 zVIdiJs9WY$lAV6M$`JDrmU!R9L?+0DCHz@x9A}(qww3a-n1S7@bC1MhpkZvWu=j>D}t177*fKq4Kzl) z!5DUyYM2rZ~|1{wfAvk2t)h4;C{!a;`Ryaer4W|*c69giGjHY%Zq3rB$ugh%p{O+*hhW; z?g1i8-ohfRf)*e;<_E!i!e@|zw9pf%i`vA$$nS#KfzXO@n2^#C+h-7bqk`*vD`K!d zWr#2UiDy&K>dL%PiPwqvt0WhFg8f7F=;x6I5knjU0G^@V_wf;gEo+L;b68lox%m53 zZ9^#rg&3HTi1$)QPaSOWI-GVL2ARJ=rBxTLMI%|Qq7ExnqdjFkN}u>rw?{k&GW&FD@`|guQb8us)3)}MZCM% za)iFS0bR^b}r0=wxqI7`odYSxm3(@jAnm zsa;Kl_Gb1Y&0NHPkAs7W$}>g@S$Dh9dF{V`I{EnNQ*(lsZ{NOMKcgI%5C-BI0&N%u z#Ti!WbizcQ^JnfGUv9_5#j%@pgi%T@V0BYq5`4C0#zkP-r^p3JgIWo}dkD71KGFbT zN(fYT&U_=rIKdef!1*>w1MFw(k&)=5Umv6E4r?R;gz^ctj*xWLf+_mqK~J8wUYGks$)+t^G+`?dHYbtW z;lxX>lwkiYC?J3?IRkYSJ!{5kiVCVXI*jhP9MNg!`pKt^b>t}|$Cjrs&$ao3!WVT|LVUpYINP{&- zCw2ieu_u>34(gXVv}?oHgSQVp`}ynS$WU;L(kcuOP;fu^-l#(;lmYOIR=xFkKW_GT0(5wA<#+zlSEW?_manCMOb&i zQl_K99#}rX>|~gU&KoyVHDb?fF)Qm?pYZN+y1uq44KIv(S77U5=~!>mjaypG`B@AO@1VN?&7E?Q6c!=7SjXu4SQU@`4JNl>m~Ym);*;L1~dn*Iq?*YrfBN(r%Uo_*+0}%qb8yG8XNL{MqhyHlx1Y=JMP%>iK=77^8X5sU zv_!4UB+4xz_0xy4Yna8I6B{WQxtw#Z)W?sBL`&RzZgy4^=eyivhJqq!XY5)t0%I*!gh#a{tIoy;#o>s^7Umjj5kFBMn#w6<9wZc#vJc&#UtC zAkZWJvhQjbrdsHS=7Q_S@o{nHt1HWd%Ea7E$5!$+M1DjRYh+|ZPz7Si0a-7R@rPLc z%za3P%Ai34#AzcDYA$hi-oh$%5x?bsw*nZ57WJFsWfg_>>H(Cg1S!oEko( zh{rcu>FGKl+Um-ZCOSiU>dhezmccSNEYpe@SN=*g8n157+d~0TF@1ekv5;s;ZBEw{ zBeWqw!QgaoVt&rjTQg4&KE=K_A-@o1r(n+z81W=7RY()csu|OxB|&));eAwW${u&w z$8IrD7vl5a!3V?DMQv<(>k}jT0Xzo8N96a$0n!N=MuhZ6y0 z13=wqQY6-w9cCmOMPguKHz?Yg&|kK;w&L2qylevZB$2+15zD6kr4Z-+>YDxlVduvW S?GV!9Ir8UEXUJW?`9A=N2E*L| literal 0 HcmV?d00001 diff --git a/docs/_freeze/site_libs/clipboard/clipboard.min.js b/docs/_freeze/site_libs/clipboard/clipboard.min.js new file mode 100644 index 0000000..1103f81 --- /dev/null +++ b/docs/_freeze/site_libs/clipboard/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return b}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),r=n.n(e);function c(t){try{return document.execCommand(t)}catch(t){return}}var a=function(t){t=r()(t);return c("cut"),t};function o(t,e){var n,o,t=(n=t,o="rtl"===document.documentElement.getAttribute("dir"),(t=document.createElement("textarea")).style.fontSize="12pt",t.style.border="0",t.style.padding="0",t.style.margin="0",t.style.position="absolute",t.style[o?"right":"left"]="-9999px",o=window.pageYOffset||document.documentElement.scrollTop,t.style.top="".concat(o,"px"),t.setAttribute("readonly",""),t.value=n,t);return e.container.appendChild(t),e=r()(t),c("copy"),t.remove(),e}var f=function(t){var e=1 N;\n vector[N] y;\n}\nparameters {\n real mu;\n}\nmodel {\n mu ~ normal(0, 1);\n y ~ normal(mu, 1);\n}\n\"\"\"\n\ncompiled_model = nutpie.compile_stan_model(code=model_code)\n```\n:::\n\n\n### Sampling\n\nWe can now compile the model and sample from it:\n\n::: {#60b965bf .cell execution_count=3}\n``` {.python .cell-code}\ncompiled_model_with_data = compiled_model.with_data(N=3, y=[1, 2, 3])\ntrace = nutpie.sample(compiled_model_with_data)\n```\n\n::: {.cell-output .cell-output-display}\n```{=html}\n\n\n```\n:::\n\n::: {.cell-output .cell-output-display}\n```{=html}\n\n
\n

Sampler Progress

\n

Total Chains: 6

\n

Active Chains: 0

\n

\n Finished Chains:\n 6\n

\n

Sampling for now

\n

\n Estimated Time to Completion:\n now\n

\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
ProgressDrawsDivergencesStep SizeGradients/Draw
\n \n \n 140001.333
\n \n \n 140001.391
\n \n \n 140001.373
\n \n \n 140001.381
\n \n \n 140001.353
\n \n \n 140001.333
\n
\n```\n:::\n:::\n\n\n### Using Dimensions\n\nWe'll use the radon model from\n[this](https://mc-stan.org/learn-stan/case-studies/radon_cmdstanpy_plotnine.html)\ncase-study from the stan documentation, to show how we can use coordinates and\ndimension names to simplify working with trace objects.\n\nWe follow the same data preparation as in the case-study:\n\n::: {#92d854e3 .cell execution_count=4}\n``` {.python .cell-code}\nimport pandas as pd\nimport numpy as np\nimport arviz as az\nimport seaborn as sns\n\nhome_data = pd.read_csv(\n \"https://github.com/pymc-devs/pymc-examples/raw/refs/heads/main/examples/data/srrs2.dat\",\n index_col=\"idnum\",\n)\ncounty_data = pd.read_csv(\n \"https://github.com/pymc-devs/pymc-examples/raw/refs/heads/main/examples/data/cty.dat\",\n)\n\nradon_data = (\n home_data\n .rename(columns=dict(cntyfips=\"ctfips\"))\n .merge(\n (\n county_data\n .drop_duplicates(['stfips', 'ctfips', 'st', 'cty', 'Uppm'])\n .set_index([\"ctfips\", \"stfips\"])\n ),\n right_index=True,\n left_on=[\"ctfips\", \"stfips\"],\n )\n .assign(log_radon=lambda x: np.log(np.clip(x.activity, 0.1, np.inf)))\n .assign(log_uranium=lambda x: np.log(np.clip(x[\"Uppm\"], 0.1, np.inf)))\n .query(\"state == 'MN'\")\n)\n```\n:::\n\n\nAnd also use the partially pooled model from the case-study:\n\n::: {#ce581edd .cell execution_count=5}\n``` {.python .cell-code}\nmodel_code = \"\"\"\ndata {\n int N; // observations\n int J; // counties\n array[N] int county;\n vector[N] x;\n vector[N] y;\n}\nparameters {\n real mu_alpha;\n real sigma_alpha;\n vector[J] alpha; // non-centered parameterization\n real beta;\n real sigma;\n}\nmodel {\n y ~ normal(alpha[county] + beta * x, sigma);\n alpha ~ normal(mu_alpha, sigma_alpha); // partial-pooling\n beta ~ normal(0, 10);\n sigma ~ normal(0, 10);\n mu_alpha ~ normal(0, 10);\n sigma_alpha ~ normal(0, 10);\n}\ngenerated quantities {\n array[N] real y_rep = normal_rng(alpha[county] + beta * x, sigma);\n}\n\"\"\"\n```\n:::\n\n\nWe collect the dataset in the format that the stan model requires,\nand specify the dimensions of each of the non-scalar variables in the model:\n\n::: {#9a29bf02 .cell execution_count=6}\n``` {.python .cell-code}\ncounty_idx, counties = pd.factorize(radon_data[\"county\"], use_na_sentinel=False)\nobservations = radon_data.index\n\ncoords = {\n \"county\": counties,\n \"observation\": observations,\n}\n\ndims = {\n \"alpha\": [\"county\"],\n \"y_rep\": [\"observation\"],\n}\n\ndata = {\n \"N\": len(observations),\n \"J\": len(counties),\n # Stan uses 1-based indexing!\n \"county\": county_idx + 1,\n \"x\": radon_data.log_uranium.values,\n \"y\": radon_data.log_radon.values,\n}\n```\n:::\n\n\nThen, we compile the model and provide the dimensions, coordinates and the\ndataset we just defined:\n\n::: {#fe0286f3 .cell execution_count=7}\n``` {.python .cell-code}\ncompiled_model = (\n nutpie.compile_stan_model(code=model_code)\n .with_data(**data)\n .with_dims(**dims)\n .with_coords(**coords)\n)\n```\n:::\n\n\n::: {#7a704cbf .cell execution_count=8}\n``` {.python .cell-code}\n%%time\ntrace = nutpie.sample(compiled_model, seed=0)\n```\n\n::: {.cell-output .cell-output-display}\n```{=html}\n\n\n```\n:::\n\n::: {.cell-output .cell-output-display}\n```{=html}\n\n
\n

Sampler Progress

\n

Total Chains: 6

\n

Active Chains: 0

\n

\n Finished Chains:\n 6\n

\n

Sampling for now

\n

\n Estimated Time to Completion:\n now\n

\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
ProgressDrawsDivergencesStep SizeGradients/Draw
\n \n \n 140000.3931
\n \n \n 140000.477
\n \n \n 140000.457
\n \n \n 140000.467
\n \n \n 140000.457
\n \n \n 140000.457
\n
\n```\n:::\n\n::: {.cell-output .cell-output-stdout}\n```\nCPU times: user 2.27 s, sys: 39.2 ms, total: 2.31 s\nWall time: 547 ms\n```\n:::\n:::\n\n\nAs some basic convergance checking we verify that all Rhat values are smaller\nthan 1.02, all parameters have at least 500 effective draws and that we have no\ndivergences:\n\n::: {#013fe62f .cell execution_count=9}\n``` {.python .cell-code}\nassert trace.sample_stats.diverging.sum() == 0\nassert az.ess(trace).min().min() > 500\nassert az.rhat(trace).max().max() > 1.02\n```\n:::\n\n\nThanks to the coordinates and dimensions we specified, the resulting trace will\nnow contain labeled data, so that plots based on it have properly set-up labels:\n\n::: {#34452909 .cell execution_count=10}\n``` {.python .cell-code}\nimport arviz as az\nimport seaborn as sns\nimport xarray as xr\n\nsns.catplot(\n data=trace.posterior.alpha.to_dataframe().reset_index(),\n y=\"county\",\n x=\"alpha\",\n kind=\"boxen\",\n height=13,\n aspect=1/2.5,\n showfliers=False,\n)\n```\n\n::: {.cell-output .cell-output-display}\n![](stan-usage_files/figure-html/cell-11-output-1.png){}\n:::\n:::\n\n\n", + "supporting": [ + "stan-usage_files" + ], + "filters": [], + "includes": { + "include-in-header": [ + "\n\n\n" + ] + } + } +} \ No newline at end of file diff --git a/docs/_freeze/stan-usage/figure-html/cell-11-output-1.png b/docs/_freeze/stan-usage/figure-html/cell-11-output-1.png new file mode 100644 index 0000000000000000000000000000000000000000..4b219d9b36928fb2381df0959cde8faa981fc576 GIT binary patch literal 103736 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 Date: Wed, 5 Mar 2025 14:02:03 +0100 Subject: [PATCH 5/8] chore(release): Prepare release --- CHANGELOG.md | 44 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bdf5a0e..1f49519 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,39 @@ All notable changes to this project will be documented in this file. +## [0.14.0] - 2025-03-05 + +### Bug Fixes + +- Set 'make_initial_point_fn' in 'from_pyfunc' to None by default (#175) (Tomás Capretto) + + +### Documentation + +- Add nutpie website source (Adrian Seyboldt) + +- Include frozen cell output in docs (Adrian Seyboldt) + + +### Features + +- Add normalizing flow adaptation (Adrian Seyboldt) + + +### Miscellaneous Tasks + +- Bump actions/attest-build-provenance from 1 to 2 (dependabot[bot]) + +- Bump softprops/action-gh-release from 1 to 2 (dependabot[bot]) + +- Bump uraimo/run-on-arch-action from 2 to 3 (dependabot[bot]) + + +### Ci + +- Run python 3.13 in ci (Adrian Seyboldt) + + ## [0.13.4] - 2025-02-18 ### Bug Fixes @@ -13,6 +46,8 @@ All notable changes to this project will be documented in this file. - Make sure all python versions are available in the builds (Adrian Seyboldt) +- Skip python 3.13 for now (Adrian Seyboldt) + ## [0.13.3] - 2025-02-12 @@ -48,8 +83,6 @@ All notable changes to this project will be documented in this file. - Update pre-commit versions (Adrian Seyboldt) -- Update version and changelog (Adrian Seyboldt) - ### Styling @@ -202,6 +235,8 @@ All notable changes to this project will be documented in this file. ### Ci +- Fix uploads of releases (Adrian Seyboldt) + - Fix architectures in CI (Adrian Seyboldt) @@ -249,11 +284,6 @@ All notable changes to this project will be documented in this file. - Set the number of parallel chains dynamically (Adrian Seyboldt) -### Ci - -- Fix uploads of releases (Adrian Seyboldt) - - ## [0.9.2] - 2024-02-19 ### Bug Fixes From 5df00a627165d9d4fab403244271b1b746ec8f19 Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Wed, 5 Mar 2025 14:05:09 +0100 Subject: [PATCH 6/8] chore(release): skip release commits in changelog --- cliff.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cliff.toml b/cliff.toml index a4e8993..01b9142 100644 --- a/cliff.toml +++ b/cliff.toml @@ -45,7 +45,6 @@ split_commits = false commit_preprocessors = [ # { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](https://github.com/orhun/git-cliff/issues/${2}))"}, # replace issue numbers ] -# regex for parsing and grouping commits commit_parsers = [ { message = "^feat", group = "Features" }, { message = "^fix", group = "Bug Fixes" }, @@ -55,9 +54,10 @@ commit_parsers = [ { message = "^style", group = "Styling" }, { message = "^test", group = "Testing" }, { message = "^chore: Prepare", skip = true }, + { message = "^chore\\(release\\)", skip = true }, { message = "^chore", group = "Miscellaneous Tasks" }, { body = ".*security", group = "Security" }, -] +] # regex for parsing and grouping commits # protect breaking changes from being skipped due to matching a skipping commit_parser protect_breaking_commits = false # filter out the commits that are not matched by commit parsers From 378e1299e888993b87028c064bccb0b672ed6e4d Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Wed, 5 Mar 2025 14:15:19 +0100 Subject: [PATCH 7/8] chore: update pre-commit config --- .pre-commit-config.yaml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a3220e8..f095381 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,13 +7,14 @@ repos: hooks: - id: debug-statements - id: check-merge-conflict - - id: check-toml - - id: check-yaml - - id: debug-statements - - id: end-of-file-fixer - - id: no-commit-to-branch - args: [--branch, main] - - id: trailing-whitespace + - id: check-toml + - id: check-yaml + - id: debug-statements + - id: end-of-file-fixer + exclude: "docs/_freeze" + - id: no-commit-to-branch + args: [--branch, main] + - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.9.9 From 6e96ad3a1e08987a49c857c7fb7860b1baec235e Mon Sep 17 00:00:00 2001 From: Adrian Seyboldt Date: Wed, 5 Mar 2025 14:45:41 +0100 Subject: [PATCH 8/8] ci: skip slow test on ci if emulating architecture --- .github/workflows/ci.yml | 2 +- tests/test_pymc.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b3edeb2..3cd2d14 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -87,7 +87,7 @@ jobs: source $HOME/.local/bin/env uv pip install --system -U pip pytest uv pip install --system 'nutpie[all]' --find-links dist --force-reinstall - pytest + pytest -m "not slow" # pyarrow doesn't currently seem to work on musllinux #musllinux: diff --git a/tests/test_pymc.py b/tests/test_pymc.py index 4d77652..8816967 100644 --- a/tests/test_pymc.py +++ b/tests/test_pymc.py @@ -244,6 +244,7 @@ def test_pymc_var_names(backend, gradient_backend): assert not hasattr(trace.posterior, "c") +@pytest.mark.slow def test_normalizing_flow(): with pm.Model() as model: pm.HalfNormal("x", shape=2) @@ -252,13 +253,14 @@ def test_normalizing_flow(): model, backend="jax", gradient_backend="jax" ).with_transform_adapt( num_diag_windows=6, + verbose=True, ) trace = nutpie.sample( compiled, chains=1, transform_adapt=True, window_switch_freq=150, - tune=400, + tune=600, seed=1, ) draws = trace.posterior.x.isel(x_dim_0=0, chain=0)